73 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			73 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								const { preFormatted, stopWords } = require('./formatting');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const prototypeRE = /prototype/i;
							 | 
						||
| 
								 | 
							
								const prototypesRE = /prototypes/i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const removeProto = x => x !== 'prototype';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function titleCase(word) {
							 | 
						||
| 
								 | 
							
								  return word[0].toUpperCase() + word.slice(1);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function prototyper(str) {
							 | 
						||
| 
								 | 
							
								  const formatted = str
							 | 
						||
| 
								 | 
							
								    .replace(/javascript/i, '')
							 | 
						||
| 
								 | 
							
								    .split('-')
							 | 
						||
| 
								 | 
							
								    .map(str => {
							 | 
						||
| 
								 | 
							
								      if (prototypeRE.test(str)) {
							 | 
						||
| 
								 | 
							
								        if (str.length > 9) {
							 | 
						||
| 
								 | 
							
								          return prototyper(
							 | 
						||
| 
								 | 
							
								            str.trim().split('prototype').join('-prototype-')
							 | 
						||
| 
								 | 
							
								          );
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return str;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return titleify(str);
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								    .join(' ')
							 | 
						||
| 
								 | 
							
								    .split(' ');
							 | 
						||
| 
								 | 
							
								  const noProto = formatted
							 | 
						||
| 
								 | 
							
								    .filter(removeProto)
							 | 
						||
| 
								 | 
							
								    .filter(x => !!x);
							 | 
						||
| 
								 | 
							
								  if (noProto.length === 2) {
							 | 
						||
| 
								 | 
							
								    const [ first, second ] = noProto;
							 | 
						||
| 
								 | 
							
								    const secondLC = second.toLowerCase();
							 | 
						||
| 
								 | 
							
								    const finalSecond = preFormatted[secondLC] ?
							 | 
						||
| 
								 | 
							
								      preFormatted[secondLC] :
							 | 
						||
| 
								 | 
							
								      secondLC;
							 | 
						||
| 
								 | 
							
								    return `${titleify(first)}.prototype.${finalSecond}`;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (noProto.length === 1) {
							 | 
						||
| 
								 | 
							
								    return prototyper(
							 | 
						||
| 
								 | 
							
								      noProto[0]
							 | 
						||
| 
								 | 
							
								        .toLowerCase()
							 | 
						||
| 
								 | 
							
								        .split('.')
							 | 
						||
| 
								 | 
							
								        .join('-')
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return titleify(str, true);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function titleify(str, triedPrototyper) {
							 | 
						||
| 
								 | 
							
								  if (str.match(prototypeRE) && !triedPrototyper && !prototypesRE.test(str)) {
							 | 
						||
| 
								 | 
							
								    return prototyper(str);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return str
							 | 
						||
| 
								 | 
							
								    .toLowerCase()
							 | 
						||
| 
								 | 
							
								    .split('-')
							 | 
						||
| 
								 | 
							
								    .map((word, i) => {
							 | 
						||
| 
								 | 
							
								      if (!word) {
							 | 
						||
| 
								 | 
							
								        return '';
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (stopWords.some(x => x === word) && i !== 0) {
							 | 
						||
| 
								 | 
							
								        return word;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return preFormatted[word] ?
							 | 
						||
| 
								 | 
							
								        preFormatted[word] :
							 | 
						||
| 
								 | 
							
								        titleCase(word);
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								    .join(' ');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = titleify;
							 |