1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | const chalk = require('chalk');
|
7 | const CAPITALIZE = (/(^|\/)([a-z])/g);
|
8 | const CAMELIZE_REGEXP_1 = (/(\-|\_|\.|\s)+(.)?/g);
|
9 | const CAMELIZE_REGEXP_2 = (/(^|\/)([A-Z])/g);
|
10 | const DECAMELIZE_REGEXP = (/([a-z\d])([A-Z])/g);
|
11 | const DASHERIZE_REGEXP = (/[ _]/g);
|
12 | const UNDERSCORE_REGEXP_1 = (/([a-z\d])([A-Z]+)/g);
|
13 | const UNDERSCORE_REGEXP_2 = (/\-|\s+/g);
|
14 | const WHITE_SPACES = /\s+/g;
|
15 | const lodash = require('lodash');
|
16 | const REPLACEMENTS = {
|
17 |
|
18 | '&' : 'and',
|
19 | '?' : 'q',
|
20 |
|
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 |
|
30 | '©':'(c)', 'œ': 'oe', 'Œ': 'OE', '∑': 'sum', '®': '(r)', '†': '+',
|
31 | '“': '"', '”': '"', '‘': "'", '’': "'", '∂': 'd', 'ƒ': 'f', '™': 'tm',
|
32 | '℠': 'sm', '…': '...', '˚': 'o', 'º': 'o', 'ª': 'a', '•': '*',
|
33 | '∆': 'delta', '∞': 'infinity', '♥': 'love', '|': 'or',
|
34 | '<': 'less', '>': 'greater',
|
35 |
|
36 | };
|
37 |
|
38 | const MULTI_CHAR_MAP = [
|
39 | [ /<3/g, 'love'],
|
40 | [ /&&/g, 'and'],
|
41 | [ /\|\|/g, 'or'],
|
42 | [ /w\//ig, 'with'],
|
43 | [ /:\)/, 'smile' ]
|
44 | ];
|
45 |
|
46 | const 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 |
|
59 | const 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 |
|
72 | module.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 | }
|