glad
Version:
A robust Node Js API framework.
201 lines (166 loc) • 6.02 kB
JavaScript
/*
Attributions:
Portions of this are from Ember.JS. License MIT.
*/
const chalk = require('chalk');
const CAPITALIZE = (/(^|\/)([a-z])/g);
const CAMELIZE_REGEXP_1 = (/(\-|\_|\.|\s)+(.)?/g);
const CAMELIZE_REGEXP_2 = (/(^|\/)([A-Z])/g);
const DECAMELIZE_REGEXP = (/([a-z\d])([A-Z])/g);
const DASHERIZE_REGEXP = (/[ _]/g);
const UNDERSCORE_REGEXP_1 = (/([a-z\d])([A-Z]+)/g);
const UNDERSCORE_REGEXP_2 = (/\-|\s+/g);
const WHITE_SPACES = /\s+/g;
const lodash = require('lodash');
const REPLACEMENTS = {
//url-unsafe
'&' : 'and',
'?' : 'q',
// currency
'€': 'euro', '₢': 'cruzeiro', '₣': 'french franc', '£': 'pound',
'₤': 'lira', '₥': 'mill', '₦': 'naira', '₧': 'peseta', '₨': 'rupee',
'₩': 'won', '₪': 'new shequel', '₫': 'dong', '₭': 'kip', '₮': 'tugrik',
'₯': 'drachma', '₰': 'penny', '₱': 'peso', '₲': 'guarani', '₳': 'austral',
'₴': 'hryvnia', '₵': 'cedi', '¢': 'cent', '¥': 'yen', '元': 'yuan',
'円': 'yen', '﷼': 'rial', '₠': 'ecu', '¤': 'currency', '฿': 'baht',
"$": 'dollar', '₹': 'indian rupee',
// symbols
'©':'(c)', 'œ': 'oe', 'Œ': 'OE', '∑': 'sum', '®': '(r)', '†': '+',
'“': '"', '”': '"', '‘': "'", '’': "'", '∂': 'd', 'ƒ': 'f', '™': 'tm',
'℠': 'sm', '…': '...', '˚': 'o', 'º': 'o', 'ª': 'a', '•': '*',
'∆': 'delta', '∞': 'infinity', '♥': 'love', '|': 'or',
'<': 'less', '>': 'greater',
//emoji
};
const MULTI_CHAR_MAP = [
[ /<3/g, 'love'],
[ /&&/g, 'and'],
[ /\|\|/g, 'or'],
[ /w\//ig, 'with'],
[ /:\)/, 'smile' ]
];
const GREEK_CHAR_MAP = {
'α':'a', 'β':'b', 'γ':'g', 'δ':'d', 'ε':'e', 'ζ':'z', 'η':'h', 'θ':'8',
'ι':'i', 'κ':'k', 'λ':'l', 'μ':'m', 'ν':'n', 'ξ':'3', 'ο':'o', 'π':'p',
'ρ':'r', 'σ':'s', 'τ':'t', 'υ':'y', 'φ':'f', 'χ':'x', 'ψ':'ps', 'ω':'w',
'ά':'a', 'έ':'e', 'ί':'i', 'ό':'o', 'ύ':'y', 'ή':'h', 'ώ':'w', 'ς':'s',
'ϊ':'i', 'ΰ':'y', 'ϋ':'y', 'ΐ':'i',
'Α':'A', 'Β':'B', 'Γ':'G', 'Δ':'D', 'Ε':'E', 'Ζ':'Z', 'Η':'H', 'Θ':'8',
'Ι':'I', 'Κ':'K', 'Λ':'L', 'Μ':'M', 'Ν':'N', 'Ξ':'3', 'Ο':'O', 'Π':'P',
'Ρ':'R', 'Σ':'S', 'Τ':'T', 'Υ':'Y', 'Φ':'F', 'Χ':'X', 'Ψ':'PS', 'Ω':'W',
'Ά':'A', 'Έ':'E', 'Ί':'I', 'Ό':'O', 'Ύ':'Y', 'Ή':'H', 'Ώ':'W', 'Ϊ':'I',
'Ϋ':'Y'
};
const RUSSIAN_CHAR_MAP = {
'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'yo', 'ж':'zh',
'з':'z', 'и':'i', 'й':'j', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o',
'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'х':'h', 'ц':'c',
'ч':'ch', 'ш':'sh', 'щ':'sh', 'ъ':'u', 'ы':'y', 'э':'e', 'ю':'yu',
'я':'ya',
'А':'A', 'Б':'B', 'В':'V', 'Г':'G', 'Д':'D', 'Е':'E', 'Ё':'Yo', 'Ж':'Zh',
'З':'Z', 'И':'I', 'Й':'J', 'К':'K', 'Л':'L', 'М':'M', 'Н':'N', 'О':'O',
'П':'P', 'Р':'R', 'С':'S', 'Т':'T', 'У':'U', 'Ф':'F', 'Х':'H', 'Ц':'C',
'Ч':'Ch', 'Ш':'Sh', 'Щ':'Sh', 'Ъ':'U', 'Ы':'Y', 'Ь':'Ь', 'Э':'E', 'Ю':'Yu',
'Я':'Ya'
};
module.exports = class GladString {
constructor () {}
color (string, color) {
try {
return chalk[color](string);
} catch (err) {
return string;
}
}
camelize (str) {
return str.replace(CAMELIZE_REGEXP_1, function(match, separator, chr) {
return chr ? chr.toUpperCase() : '';
}).replace(CAMELIZE_REGEXP_2, function(match) {
return match.toLowerCase();
});
}
decamelize (str) {
return str.replace(DECAMELIZE_REGEXP, '$1_$2').toLowerCase();
}
decamelizeToArray (str) {
return str.replace(DECAMELIZE_REGEXP, '$1_$2').toLowerCase().split('_');
}
titelize (str) {
return str.split(' ').map(x => this.capitalize(x)).join(' ');
}
capitalize (str) {
return str.replace(CAPITALIZE, function(match) {
return match.toUpperCase();
});
}
dasherize (str) {
return this.decamelize(str).replace(DASHERIZE_REGEXP, '-');
}
slasherize (str) {
return this.decamelize(str).replace(DASHERIZE_REGEXP, '/');
}
reverseSlasherize (str) {
return this.decamelize(str).split(DASHERIZE_REGEXP).reverse().join('/');
}
underscore (str) {
return str.replace(UNDERSCORE_REGEXP_1, '$1_$2').
replace(UNDERSCORE_REGEXP_2, '_').toLowerCase();
}
cleanSpaces (str) {
return str.replace(WHITE_SPACES, ' ');
}
deburr (str = "", advanced = true) {
let deburred;
if (advanced) {
MULTI_CHAR_MAP.forEach(set => (str = str.replace(set[0], set[1])));
deburred = str.split('').map(char => {
return REPLACEMENTS[char] || GREEK_CHAR_MAP[char] || RUSSIAN_CHAR_MAP[char] || char;
}).join('');
} else {
deburred = str;
}
return lodash.deburr(deburred);
}
slugify (...args) {
let str = args.map(x => x.replace(/^,|,$/, '').trim()).join(' ');
return this.dasherize(this.deburr(str));
}
endsWith (str, val, pos) {
return lodash.endsWith(str, val, pos);
}
escape (str) {
return lodash.escape(str);
}
escapeRegExp (str) {
return lodash.escapeRegExp(str);
}
repeat (...args) {
return lodash.repeat.apply(lodash, args);
}
startsWith (...args) {
return lodash.startsWith.apply(lodash, args);
}
unescape (...args) {
return lodash.unescape.apply(lodash, args);
}
words (...args) {
return lodash.words.apply(lodash, args);
}
sentenceCase (string) {
var sentences = string.split("."),
out = "",
i = 0,
j;
for(i; i < sentences.length; i+= 1) {
var spaceput = "",
spaceCount=sentences[i].replace(/^(\s*).*$/,"$1").length;
sentences[i]=sentences[i].replace(/^\s+/,"");
var newstring=sentences[i].charAt(sentences[i]).toUpperCase() + sentences[i].slice(1);
for(j=0; j < spaceCount; j+= 1) {
spaceput = spaceput + " ";
}
out += spaceput + newstring + ".";
}
return out.substring(0, out.length - 1);
}
}