UNPKG

6.02 kBJavaScriptView Raw
1/*
2 Attributions:
3 Portions of this are from Ember.JS. License MIT.
4*/
5
6const chalk = require('chalk');
7const CAPITALIZE = (/(^|\/)([a-z])/g);
8const CAMELIZE_REGEXP_1 = (/(\-|\_|\.|\s)+(.)?/g);
9const CAMELIZE_REGEXP_2 = (/(^|\/)([A-Z])/g);
10const DECAMELIZE_REGEXP = (/([a-z\d])([A-Z])/g);
11const DASHERIZE_REGEXP = (/[ _]/g);
12const UNDERSCORE_REGEXP_1 = (/([a-z\d])([A-Z]+)/g);
13const UNDERSCORE_REGEXP_2 = (/\-|\s+/g);
14const WHITE_SPACES = /\s+/g;
15const lodash = require('lodash');
16const REPLACEMENTS = {
17 //url-unsafe
18 '&' : 'and',
19 '?' : 'q',
20 // currency
21 '€': 'euro', '₢': 'cruzeiro', '₣': 'french franc', '£': 'pound',
22 '₤': 'lira', '₥': 'mill', '₦': 'naira', '₧': 'peseta', '₨': 'rupee',
23 '₩': 'won', '₪': 'new shequel', '₫': 'dong', '₭': 'kip', '₮': 'tugrik',
24 '₯': 'drachma', '₰': 'penny', '₱': 'peso', '₲': 'guarani', '₳': 'austral',
25 '₴': 'hryvnia', '₵': 'cedi', '¢': 'cent', '¥': 'yen', '元': 'yuan',
26 '円': 'yen', '﷼': 'rial', '₠': 'ecu', '¤': 'currency', '฿': 'baht',
27 "$": 'dollar', '₹': 'indian rupee',
28
29 // symbols
30 '©':'(c)', 'œ': 'oe', 'Œ': 'OE', '∑': 'sum', '®': '(r)', '†': '+',
31 '“': '"', '”': '"', '‘': "'", '’': "'", '∂': 'd', 'ƒ': 'f', '™': 'tm',
32 '℠': 'sm', '…': '...', '˚': 'o', 'º': 'o', 'ª': 'a', '•': '*',
33 '∆': 'delta', '∞': 'infinity', '♥': 'love', '|': 'or',
34 '<': 'less', '>': 'greater',
35 //emoji
36};
37
38const MULTI_CHAR_MAP = [
39 [ /<3/g, 'love'],
40 [ /&&/g, 'and'],
41 [ /\|\|/g, 'or'],
42 [ /w\//ig, 'with'],
43 [ /:\)/, 'smile' ]
44];
45
46const GREEK_CHAR_MAP = {
47 'α':'a', 'β':'b', 'γ':'g', 'δ':'d', 'ε':'e', 'ζ':'z', 'η':'h', 'θ':'8',
48 'ι':'i', 'κ':'k', 'λ':'l', 'μ':'m', 'ν':'n', 'ξ':'3', 'ο':'o', 'π':'p',
49 'ρ':'r', 'σ':'s', 'τ':'t', 'υ':'y', 'φ':'f', 'χ':'x', 'ψ':'ps', 'ω':'w',
50 'ά':'a', 'έ':'e', 'ί':'i', 'ό':'o', 'ύ':'y', 'ή':'h', 'ώ':'w', 'ς':'s',
51 'ϊ':'i', 'ΰ':'y', 'ϋ':'y', 'ΐ':'i',
52 'Α':'A', 'Β':'B', 'Γ':'G', 'Δ':'D', 'Ε':'E', 'Ζ':'Z', 'Η':'H', 'Θ':'8',
53 'Ι':'I', 'Κ':'K', 'Λ':'L', 'Μ':'M', 'Ν':'N', 'Ξ':'3', 'Ο':'O', 'Π':'P',
54 'Ρ':'R', 'Σ':'S', 'Τ':'T', 'Υ':'Y', 'Φ':'F', 'Χ':'X', 'Ψ':'PS', 'Ω':'W',
55 'Ά':'A', 'Έ':'E', 'Ί':'I', 'Ό':'O', 'Ύ':'Y', 'Ή':'H', 'Ώ':'W', 'Ϊ':'I',
56 'Ϋ':'Y'
57};
58
59const RUSSIAN_CHAR_MAP = {
60 'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'yo', 'ж':'zh',
61 'з':'z', 'и':'i', 'й':'j', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o',
62 'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'х':'h', 'ц':'c',
63 'ч':'ch', 'ш':'sh', 'щ':'sh', 'ъ':'u', 'ы':'y', 'э':'e', 'ю':'yu',
64 'я':'ya',
65 'А':'A', 'Б':'B', 'В':'V', 'Г':'G', 'Д':'D', 'Е':'E', 'Ё':'Yo', 'Ж':'Zh',
66 'З':'Z', 'И':'I', 'Й':'J', 'К':'K', 'Л':'L', 'М':'M', 'Н':'N', 'О':'O',
67 'П':'P', 'Р':'R', 'С':'S', 'Т':'T', 'У':'U', 'Ф':'F', 'Х':'H', 'Ц':'C',
68 'Ч':'Ch', 'Ш':'Sh', 'Щ':'Sh', 'Ъ':'U', 'Ы':'Y', 'Ь':'Ь', 'Э':'E', 'Ю':'Yu',
69 'Я':'Ya'
70};
71
72module.exports = class GladString {
73
74 constructor () {}
75
76 color (string, color) {
77 try {
78 return chalk[color](string);
79 } catch (err) {
80 return string;
81 }
82 }
83
84 camelize (str) {
85 return str.replace(CAMELIZE_REGEXP_1, function(match, separator, chr) {
86 return chr ? chr.toUpperCase() : '';
87 }).replace(CAMELIZE_REGEXP_2, function(match) {
88 return match.toLowerCase();
89 });
90 }
91
92 decamelize (str) {
93 return str.replace(DECAMELIZE_REGEXP, '$1_$2').toLowerCase();
94 }
95
96 decamelizeToArray (str) {
97 return str.replace(DECAMELIZE_REGEXP, '$1_$2').toLowerCase().split('_');
98 }
99
100 titelize (str) {
101 return str.split(' ').map(x => this.capitalize(x)).join(' ');
102 }
103
104 capitalize (str) {
105 return str.replace(CAPITALIZE, function(match) {
106 return match.toUpperCase();
107 });
108 }
109
110 dasherize (str) {
111 return this.decamelize(str).replace(DASHERIZE_REGEXP, '-');
112 }
113
114 slasherize (str) {
115 return this.decamelize(str).replace(DASHERIZE_REGEXP, '/');
116 }
117
118 reverseSlasherize (str) {
119 return this.decamelize(str).split(DASHERIZE_REGEXP).reverse().join('/');
120 }
121
122 underscore (str) {
123 return str.replace(UNDERSCORE_REGEXP_1, '$1_$2').
124 replace(UNDERSCORE_REGEXP_2, '_').toLowerCase();
125 }
126
127 cleanSpaces (str) {
128 return str.replace(WHITE_SPACES, ' ');
129 }
130
131 deburr (str = "", advanced = true) {
132 let deburred;
133 if (advanced) {
134 MULTI_CHAR_MAP.forEach(set => (str = str.replace(set[0], set[1])));
135 deburred = str.split('').map(char => {
136 return REPLACEMENTS[char] || GREEK_CHAR_MAP[char] || RUSSIAN_CHAR_MAP[char] || char;
137 }).join('');
138 } else {
139 deburred = str;
140 }
141 return lodash.deburr(deburred);
142 }
143
144 slugify (...args) {
145 let str = args.map(x => x.replace(/^,|,$/, '').trim()).join(' ');
146 return this.dasherize(this.deburr(str));
147 }
148
149 endsWith (str, val, pos) {
150 return lodash.endsWith(str, val, pos);
151 }
152
153 escape (str) {
154 return lodash.escape(str);
155 }
156
157 escapeRegExp (str) {
158 return lodash.escapeRegExp(str);
159 }
160
161 repeat (...args) {
162 return lodash.repeat.apply(lodash, args);
163 }
164
165 startsWith (...args) {
166 return lodash.startsWith.apply(lodash, args);
167 }
168
169 unescape (...args) {
170 return lodash.unescape.apply(lodash, args);
171 }
172
173 words (...args) {
174 return lodash.words.apply(lodash, args);
175 }
176
177 sentenceCase (string) {
178 var sentences = string.split("."),
179 out = "",
180 i = 0,
181 j;
182
183 for(i; i < sentences.length; i+= 1) {
184 var spaceput = "",
185 spaceCount=sentences[i].replace(/^(\s*).*$/,"$1").length;
186
187 sentences[i]=sentences[i].replace(/^\s+/,"");
188 var newstring=sentences[i].charAt(sentences[i]).toUpperCase() + sentences[i].slice(1);
189
190 for(j=0; j < spaceCount; j+= 1) {
191 spaceput = spaceput + " ";
192 }
193
194 out += spaceput + newstring + ".";
195 }
196
197 return out.substring(0, out.length - 1);
198 }
199
200}