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