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; |