Total Complexity | 52 |
Complexity/F | 2.6 |
Lines of Code | 307 |
Function Count | 20 |
Duplicated Lines | 0 |
Ratio | 0 % |
Changes | 1 | ||
Bugs | 0 | Features | 0 |
Complex classes like src/ub.strings.case.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
1 | |||
9 | UB.UTF_casingRangedLowerS = [97, 224, 1072, 1121, 1169, 1377, 4304, 7681, 7841, 9424]; |
||
|
|||
10 | UB.UTF_casingRangedLowerE = [122, 246, 1103, 1153, 1215, 1414, 4341, 7829, 7929, 9449]; |
||
11 | UB.UTF_casingRangedIncrement = [1, 1, 1, 2, 2, 1, 1, 2, 2, 1]; |
||
12 | UB.UTF_casingRangedUpper = [65, 192, 1040, 1120, 1168, 1329, 4256, 7680, 7840, 9398]; |
||
13 | |||
14 | // raw tables |
||
15 | UB.UTF_casingRawLower = [248, 249, 250, 251, 252, 253, 254, 255, 257, 259, 261, 263, 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293, 295, 297, 299, 301, 303, 305, 307, 309, 311, 314, 316, 318, 320, 322, 324, 326, 328, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351, 353, 355, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 378, 380, 382, 387, 389, 392, 396, 402, 409, 417, 419, 421, 424, 429, 432, 436, 438, 441, 445, 454, 457, 460, 462, 464, 466, 468, 470, 472, 474, 476, 479, 481, 483, 485, 487, 489, 491, 493, 495, 499, 501, 507, 509, 511, 513, 515, 517, 519, 521, 523, 525, 527, 529, 531, 533, 535, 595, 596, 599, 600, 601, 603, 608, 611, 616, 617, 623, 626, 629, 643, 648, 650, 651, 658, 940, 941, 942, 943, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 995, 997, 999, 1001, 1003, 1005, 1007, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1118, 1119, 1218, 1220, 1224, 1228, 1233, 1235, 1237, 1239, 1241, 1243, 1245, 1247, 1249, 1251, 1253, 1255, 1257, 1259, 1263, 1265, 1267, 1269, 1273, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7952, 7953, 7954, 7955, 7956, 7957, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 8000, 8001, 8002, 8003, 8004, 8005, 8017, 8019, 8021, 8023, 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039, 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8112, 8113, 8144, 8145, 8160, 8161]; |
||
16 | UB.UTF_casingRawUpper = [216, 217, 218, 219, 220, 221, 222, 376, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 73, 306, 308, 310, 313, 315, 317, 319, 321, 323, 325, 327, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 370, 372, 374, 377, 379, 381, 386, 388, 391, 395, 401, 408, 416, 418, 420, 423, 428, 431, 435, 437, 440, 444, 452, 455, 458, 461, 463, 465, 467, 469, 471, 473, 475, 478, 480, 482, 484, 486, 488, 490, 492, 494, 497, 500, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, 532, 534, 385, 390, 394, 398, 399, 400, 403, 404, 407, 406, 412, 413, 415, 425, 430, 433, 434, 439, 902, 904, 905, 906, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 908, 910, 911, 994, 996, 998, 1000, 1002, 1004, 1006, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1038, 1039, 1217, 1219, 1223, 1227, 1232, 1234, 1236, 1238, 1240, 1242, 1244, 1246, 1248, 1250, 1252, 1254, 1256, 1258, 1262, 1264, 1266, 1268, 1272, 7944, 7945, 7946, 7947, 7948, 7949, 7950, 7951, 7960, 7961, 7962, 7963, 7964, 7965, 7976, 7977, 7978, 7979, 7980, 7981, 7982, 7983, 7992, 7993, 7994, 7995, 7996, 7997, 7998, 7999, 8008, 8009, 8010, 8011, 8012, 8013, 8025, 8027, 8029, 8031, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8047, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8088, 8089, 8090, 8091, 8092, 8093, 8094, 8095, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8120, 8121, 8152, 8153, 8168, 8169]; |
||
17 | |||
18 | |||
19 | // final tables (= ranged + raw) |
||
20 | UB.UTF_casingTablesMax = 9450; |
||
21 | |||
22 | UB.initCasing = function(){ |
||
23 | |||
24 | // exit if already initialized |
||
25 | if (UB.UTF_lowerToUpper != null){ |
||
1 ignored issue
–
show
|
|||
26 | return; |
||
27 | } |
||
28 | |||
29 | // CALC CASING CONVERSION TABLES |
||
30 | UB.UTF_lowerToUpper = []; |
||
31 | UB.UTF_upperToLower = []; |
||
32 | |||
33 | // init by mapping to self (most chars dont have an uppercase/lowercase version) |
||
34 | for (var n = 0, nlast = UB.UTF_casingTablesMax;n <= nlast;n++){ |
||
35 | UB.UTF_lowerToUpper[n] = n; |
||
36 | UB.UTF_upperToLower[n] = n; |
||
37 | } |
||
38 | |||
39 | // per range |
||
40 | for (var r = 0, rl = UB.UTF_casingRangedLowerS.length;r<rl;r++){ |
||
41 | |||
42 | // per value in range |
||
43 | var inc = UB.UTF_casingRangedIncrement[r]; |
||
44 | var offset = UB.UTF_casingRangedUpper[r] - UB.UTF_casingRangedLowerS[r]; |
||
45 | for (var lower = UB.UTF_casingRangedLowerS[r], lowerlast = UB.UTF_casingRangedLowerE[r];lower <= lowerlast;lower += inc){ |
||
46 | |||
47 | // calc uppercase |
||
48 | var upper = lower + offset; |
||
49 | |||
50 | // store in table |
||
51 | UB.UTF_lowerToUpper[lower] = upper; |
||
52 | UB.UTF_upperToLower[upper] = lower; |
||
53 | |||
54 | } |
||
55 | |||
56 | } |
||
57 | |||
58 | // per raw value |
||
59 | for (var n = 0, nl = UB.UTF_casingRawLower.length;n<nl;n++){ |
||
60 | |||
61 | var lower = UB.UTF_casingRawLower[n]; |
||
62 | var upper = UB.UTF_casingRawUpper[n]; |
||
63 | |||
64 | // store in table |
||
65 | UB.UTF_lowerToUpper[lower] = upper; |
||
66 | UB.UTF_upperToLower[upper] = lower; |
||
67 | |||
68 | } |
||
69 | |||
70 | // fix bug in unicode table .. "I" >> "i" |
||
71 | UB.UTF_upperToLower[73] = 105; |
||
72 | |||
73 | |||
74 | } |
||
75 | |||
76 | |||
77 | var arrayFuncs = { |
||
78 | |||
79 | camelCaseMergeWords: function(firstCharCaps = false){ |
||
80 | var words = this; |
||
81 | |||
82 | // lowercase first letter |
||
83 | words[0] = firstCharCaps ? S.FirstLetterUpper(words[0]) : S.FirstLetterLower(words[0]); |
||
84 | |||
85 | // loop thru all words |
||
86 | var newWords = ""; |
||
87 | for (var w = 0, wl = words.length;w<wl;w++){ |
||
88 | var word = words[w].replace(Regex.Trim, ''); |
||
89 | |||
90 | // cap first letter if not 1st word |
||
91 | newWords += w == 0 ? word : S.FirstLetterUpper(word); |
||
1 ignored issue
–
show
|
|||
92 | } |
||
93 | return newWords; |
||
94 | }, |
||
95 | |||
96 | none:null |
||
97 | }; |
||
98 | |||
99 | // register funcs |
||
100 | UB.registerFuncs(Array.prototype, arrayFuncs); |
||
101 | |||
102 | |||
103 | var stringFuncs = { |
||
104 | |||
105 | // casing |
||
106 | camelCaseSeperate: function(){ |
||
107 | var camelCase = this; |
||
108 | |||
109 | // loop thru all chars |
||
110 | var lastUp = false; |
||
111 | var lastSpace = false; |
||
112 | var newName = []; |
||
113 | var len = 0; |
||
114 | for (var c = 0, cl = camelCase.length - 1;c <= cl;c++){ |
||
115 | var char = camelCase.charAt(c); |
||
116 | var charNext = c < cl ? camelCase.charAt(c + 1) : "_"; |
||
117 | |||
118 | // if its a Capital ... and if prev is not also a capital ... or if the next is small |
||
119 | var up = (char.toUpperCase() == char); |
||
120 | var nextUp = (charNext.toUpperCase() == charNext); |
||
121 | if ((up && (!lastUp || !nextUp) && !lastSpace) || char == "_") { |
||
122 | |||
123 | // add a space |
||
124 | if (len > 0 && newName[len - 1] != " "){ |
||
125 | newName.push(" "); |
||
126 | len++; |
||
127 | } |
||
128 | } |
||
129 | lastUp = up; |
||
130 | |||
131 | // add the char |
||
132 | if (char != "_"){ |
||
133 | newName.push(char); |
||
134 | len++; |
||
135 | } |
||
136 | lastSpace = char == " "; |
||
137 | } |
||
138 | |||
139 | // caps first letter |
||
140 | return S.FirstLetterUpper(newName.join("")); |
||
141 | }, |
||
142 | camelCaseSeperateWords: function(){ |
||
143 | var camelCase = this; |
||
144 | return S.CamelCaseSeperate(camelCase).split(" "); |
||
145 | }, |
||
146 | camelCaseMerge: function(firstCharCaps = false){ |
||
147 | var sentence = this; |
||
148 | |||
149 | // exit quickly if no spaces .. no words to merge |
||
150 | if (sentence.indexOf(" ") == -1) { |
||
151 | if (firstCharCaps) { |
||
152 | return S.FirstLetterUpper(sentence); |
||
153 | }else{ |
||
154 | return sentence; |
||
155 | } |
||
156 | } |
||
157 | |||
158 | // merge words using camel case |
||
159 | return S.CamelCaseMergeWords(sentence.split(" "), firstCharCaps); |
||
160 | }, |
||
161 | firstLetterUpper: function(){ |
||
162 | var str = this; |
||
163 | str = str.trim(); |
||
164 | return str.charAt(0).toUpperCase() + str.substr(1); |
||
165 | }, |
||
166 | firstLetterLower: function(){ |
||
167 | var str = this; |
||
168 | str = str.trim(); |
||
169 | return str.charAt(0).toLowerCase() + str.substr(1); |
||
170 | }, |
||
171 | toSmartCase: function(){ |
||
172 | var word = this; |
||
173 | // home loan > Home Loan |
||
174 | // PRNQ loan > PRNQ Loan |
||
175 | return S.ToCustomCase(word, ";,. -_" + "\t" + "\n", true); |
||
176 | }, |
||
177 | toSentenceCase: function(){ |
||
178 | var word = this; |
||
179 | return S.ToCustomCase(word, ".", false); |
||
180 | }, |
||
181 | toCustomCase: function(capsAfterChars, preserveCaps = false){ |
||
182 | var word = this; |
||
183 | var nextCaps = true;// first char caps |
||
184 | |||
185 | // per char |
||
186 | var chars = S.SplitChars(word); |
||
187 | var chars2 = []; |
||
188 | for (var c = 0, cl = chars.length;c<cl;c++){ |
||
189 | var ch = chars[c]; |
||
190 | var added = false; |
||
191 | |||
192 | // add as CAPS if wanted |
||
193 | if (nextCaps) { |
||
194 | nextCaps = false; |
||
195 | chars2.push(ch.toUpperCase()); |
||
196 | added = true; |
||
197 | } |
||
198 | |||
199 | // next char should have caps |
||
200 | if (capsAfterChars.indexOf(ch) > -1) { |
||
201 | nextCaps = true; |
||
202 | } |
||
203 | |||
204 | // add normally |
||
205 | if (!added) { |
||
206 | |||
207 | // preserve caps if wanted |
||
208 | if (preserveCaps && ch.toUpperCase() == ch) { |
||
209 | chars2.push(ch); |
||
210 | }else { |
||
211 | |||
212 | // add as lower case |
||
213 | chars2.push(ch.toLowerCase()); |
||
214 | } |
||
215 | } |
||
216 | } |
||
217 | return chars2.join(""); |
||
218 | }, |
||
219 | toTitleCase: function(){ |
||
220 | var word = this; |
||
221 | // home loan > Home Loan |
||
222 | // PRNQ loan > Prnq Loan |
||
223 | return S.ToCustomCase(word, ";,. -_" + "\t" + "\n", false); |
||
224 | }, |
||
225 | toSentenceTitleCase: function(){ |
||
226 | var title = this; |
||
227 | var parts = []; |
||
228 | var index = 0; |
||
229 | |||
230 | // create regexps |
||
231 | var small = "(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|v[.]?|via|vs[.]?)"; |
||
232 | var punct = "([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]*)"; |
||
233 | var r1 = new RegExp("\\b([A-Za-z][a-z.'Õ]*)\\b", "g"); |
||
234 | var r2 = new RegExp("[A-Za-z]\\.[A-Za-z]", ""); |
||
235 | var r3 = new RegExp("\\b" + small + "\\b", "ig"); |
||
236 | var r4 = new RegExp("^" + punct + small + "\\b", "ig"); |
||
237 | var r5 = new RegExp("\\b" + small + punct + "$", "ig"); |
||
238 | var r6 = new RegExp(" V(s?)\\. ", "ig"); |
||
239 | var r7 = new RegExp("(['Õ])S\\b", "ig"); |
||
240 | var split = new RegExp("[:.;?!] |(?: |^)[\"Ò]", "g"); |
||
241 | |||
242 | // per word in string |
||
243 | while (true) { |
||
244 | var m = split.exec(title); |
||
245 | |||
246 | // smart capatalize |
||
247 | parts.push( title.substring(index, m ? m.index : title.length).replace(r1, function(all) { |
||
248 | return r2.test(all) ? all : ToUpperCaseFirst(all); |
||
249 | }).replace(r3, S.ToLowerCase).replace(r4, function (all, punct, word){ |
||
250 | return punct + S.ToUpperCaseFirst(word); |
||
251 | }).replace(r5, S.ToUpperCaseFirst)); |
||
252 | |||
253 | index = split.lastIndex; |
||
254 | |||
255 | if ( m ) parts.push( m[0] ); |
||
256 | else break; |
||
257 | } |
||
258 | |||
259 | return parts.join("").replace(r6, " v$1. ").replace(r7, "$1s"); |
||
260 | }, |
||
261 | toCamelCase: function(){ |
||
262 | var word = this; |
||
263 | return S.CamelCaseMerge(word, false); |
||
264 | }, |
||
265 | toPascalCase: function(){ |
||
266 | var word = this; |
||
267 | return S.CamelCaseMerge(word, true); |
||
268 | }, |
||
269 | toURLCase: function(){ |
||
270 | var path = this; |
||
271 | path = S.Remove(path, "&"); |
||
272 | path = S.Remove(path, "\""); |
||
273 | path = S.Remove(path, "'"); |
||
274 | path = S.Remove(path, ","); |
||
275 | path = S.Remove(path, "?"); |
||
276 | path = S.Replace(P.SetSlash(path, "/"), " ", "-"); |
||
277 | path = S.Replace(path, "----", "-"); |
||
278 | path = S.Replace(path, "---", "-"); |
||
279 | path = S.Replace(path, "--", "-"); |
||
280 | return path.toLowerCase(); |
||
281 | }, |
||
282 | pascalToCamelCase: function(){ |
||
283 | var word = this; |
||
284 | |||
285 | // no change if already begins with lowercase letter |
||
286 | if (S.IsLowercase(word.substr(0, 1))) { |
||
287 | return word; |
||
288 | } |
||
289 | |||
290 | // make the first word lowercase |
||
291 | |||
292 | // if >2 chars are uppercase |
||
293 | var num = S.CountStartingUppercase(word); |
||
294 | if (num > 2) { |
||
295 | |||
296 | // lowercase all uppercase chars (except the last) |
||
297 | return S.FirstXCharsLower(word, num - 1); |
||
298 | } |
||
299 | |||
300 | // lowercase first char only |
||
301 | return S.FirstLetterLower(word); |
||
302 | }, |
||
303 | firstXCharsUpper: function(numOfChars){ |
||
304 | var text = this; |
||
305 | return S.SetRange(text, 0, numOfChars - 1, S.GetRange(text, 0, numOfChars - 1).toUpperCase()); |
||
306 | }, |
||
307 | firstXCharsLower: function(numOfChars){ |
||
308 | var text = this; |
||
309 | return S.SetRange(text, 0, numOfChars - 1, S.GetRange(text, 0, numOfChars - 1).toLowerCase()); |
||
310 | }, |
||
311 | none:null |
||
312 | }; |
||
313 | |||
314 | // register funcs |
||
315 | UB.registerFuncs(String.prototype, stringFuncs); |
This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.
To learn more about declaring variables in Javascript, see the MDN.