1 | /** global: UB */ |
||
2 | |||
3 | var stringFuncs = { |
||
4 | |||
5 | |||
6 | beginsWith: function(prefix, length = 0){ |
||
7 | return this.smartStartsWith(prefix, length, true); |
||
8 | }, |
||
9 | beginsWithCI: function(prefix, length = 0){ |
||
10 | return this.smartStartsWith(prefix, length, false); |
||
11 | }, |
||
12 | startsWith: function(prefix, length = 0){ |
||
13 | return this.smartStartsWith(prefix, length, true); |
||
14 | }, |
||
15 | startsWithCI: function(prefix, length = 0){ |
||
16 | return this.smartStartsWith(prefix, length, false); |
||
17 | }, |
||
18 | smartBeginsWith: function(prefix, length = 0, caseSensitive = true, trimAndCheck = false){ |
||
19 | return this.smartStartsWith(prefix, length, caseSensitive, trimAndCheck); |
||
20 | }, |
||
21 | smartStartsWith: function(prefix, length = 0, caseSensitive = true, trimAndCheck = false){ |
||
22 | var text = this; |
||
23 | |||
24 | // trim and check if needed |
||
25 | if (trimAndCheck) { |
||
26 | text = text.replace(UB.regex.Trim, ''); |
||
27 | } |
||
28 | |||
29 | // "starts with any" |
||
30 | if (prefix.constructor == Array){ |
||
31 | |||
32 | // per search term |
||
33 | for (var s = 0, sl = prefix.length;s<sl;s++){ |
||
34 | var pre = prefix[s]; |
||
35 | |||
36 | // ends with one |
||
37 | if (text.smartStartsWith(pre, length, caseSensitive)) { |
||
38 | return true; |
||
39 | } |
||
40 | } |
||
41 | |||
42 | // doesnt end with any given |
||
43 | return false; |
||
44 | } |
||
45 | |||
46 | |||
47 | // JS startsWith() API support |
||
48 | if (length > 0 && prefix.length > length){ |
||
49 | prefix = prefix.substr(0, length); |
||
50 | } |
||
51 | |||
52 | // "starts with" |
||
53 | var l1 = text.length; |
||
54 | var l2 = prefix.length; |
||
55 | |||
56 | // check quickly if same/less length |
||
57 | if (l1 < l2) { |
||
58 | return false; |
||
59 | } |
||
60 | if (l1 == l2) { |
||
61 | if (caseSensitive) { |
||
62 | return text == prefix; |
||
63 | } |
||
64 | return text.toLowerCase() == prefix.toLowerCase(); |
||
65 | } |
||
66 | |||
67 | // check using substring if main string longer |
||
68 | if (caseSensitive) { |
||
69 | //return text.substr(0, l2) == prefix; |
||
70 | return text.lastIndexOf(prefix, 0) === 0; |
||
71 | } |
||
72 | return text.substr(0, l2).toLowerCase() == prefix.toLowerCase(); |
||
73 | }, |
||
74 | endsWith: function(postfix, length = 0){ |
||
75 | return this.smartEndsWith(postfix, length, true); |
||
76 | }, |
||
77 | endsWithCI: function(postfix, length = 0){ |
||
78 | return this.smartEndsWith(postfix, length, false); |
||
79 | }, |
||
80 | smartEndsWith: function(postfix, length = 0, caseSensitive = true, trimAndCheck = false){ |
||
81 | var text = this; |
||
82 | |||
83 | |||
84 | // trim and check if needed |
||
85 | if (trimAndCheck) { |
||
86 | text = text.replace(UB.regex.Trim, ''); |
||
87 | } |
||
88 | |||
89 | // "ends with any" |
||
90 | if (postfix.constructor == Array){ |
||
91 | |||
92 | // per search term |
||
93 | for (var s = 0, sl = postfix.length;s<sl;s++){ |
||
94 | var post = postfix[s]; |
||
95 | |||
96 | // ends with one |
||
97 | if (text.smartEndsWith(post, length, caseSensitive)) { |
||
98 | return true; |
||
99 | } |
||
100 | } |
||
101 | |||
102 | // doesnt end with any given |
||
103 | return false; |
||
104 | } |
||
105 | |||
106 | // JS endsWith() API support |
||
107 | if (length > 0 && postfix.length > length){ |
||
108 | postfix = postfix.substr(0, length); |
||
109 | } |
||
110 | |||
111 | // "ends with" |
||
112 | var l1 = text.length; |
||
113 | var l2 = postfix.length; |
||
114 | |||
115 | // check quickly if same/less length |
||
116 | if (l1 < l2) { |
||
117 | return false; |
||
118 | } |
||
119 | if (l1 == l2) { |
||
120 | if (caseSensitive) { |
||
121 | return text == postfix; |
||
122 | } |
||
123 | return text.toLowerCase() == postfix.toLowerCase(); |
||
124 | } |
||
125 | |||
126 | // check using substring if main string longer |
||
127 | if (caseSensitive) { |
||
128 | //return text.substr(l1 - l2, l2) == postfix; |
||
129 | var index = l1 - l2; |
||
130 | return text.indexOf(postfix, index) == index; |
||
131 | } |
||
132 | return text.substr(l1 - l2, l2).toLowerCase() == postfix.toLowerCase(); |
||
133 | }, |
||
134 | contains: function(substring){ |
||
135 | return this.smartContains(substring, true); |
||
136 | }, |
||
137 | containsCI: function(substring){ |
||
138 | return this.smartContains(substring, false); |
||
139 | }, |
||
140 | smartContains: function(substring, caseSensitive = true, substringIsLower = false, wholeWords = false){ |
||
141 | var text = this; |
||
142 | |||
143 | // "contains any" |
||
144 | if (substring.constructor == Array){ |
||
145 | |||
146 | // per search term |
||
147 | for (var s = 0, sl = substring.length;s<sl;s++){ |
||
148 | var sub = substring[s]; |
||
149 | |||
150 | // ends with one |
||
151 | if (text.smartContains(sub, caseSensitive, substringIsLower, wholeWords)) { |
||
152 | return true; |
||
153 | } |
||
154 | } |
||
155 | |||
156 | // doesnt end with any given |
||
157 | return false; |
||
158 | } |
||
159 | |||
160 | // "contains" |
||
161 | if (wholeWords) { |
||
162 | return text.match(UB.regex.New(substring, wholeWords, caseSensitive, true)).length > 0; |
||
163 | } |
||
164 | if (caseSensitive) { |
||
165 | return text.indexOf(substring) != -1; |
||
166 | } |
||
167 | /* |
||
168 | text = text.toLowerCase(); |
||
169 | substring = substring.toLowerCase(); |
||
170 | |||
171 | return text.indexOf(substring) != -1;*/ |
||
172 | |||
173 | |||
174 | // quick checks |
||
175 | if (text.length < substring.length) { |
||
176 | return false; |
||
177 | } |
||
178 | |||
179 | //temps |
||
180 | var sl = substring.length; |
||
0 ignored issues
–
show
|
|||
181 | var ml = (text.length - sl); |
||
182 | |||
183 | // very fast CI comparison |
||
184 | return text._indexOfCI(substring, 0, substringIsLower, sl, ml) > -1; |
||
185 | |||
186 | // much faster than this: |
||
187 | /*return text.toLowerCase().indexOf(substring.toLowerCase()) != -1;*/ |
||
188 | }, |
||
189 | beginningOf: function(text, caseSensitive = true){ |
||
190 | var prefix = this; |
||
191 | return text.startsWith(prefix, caseSensitive); |
||
192 | }, |
||
193 | endingOf: function(text, caseSensitive = true){ |
||
194 | var postfix = this; |
||
195 | return text.endsWith(postfix, caseSensitive); |
||
196 | }, |
||
197 | containedIn: function(text, caseSensitive = true, substringIsLower = false){ |
||
198 | var substring = this; |
||
199 | return text.contains(substring, caseSensitive, substringIsLower); |
||
200 | }, |
||
201 | |||
202 | // contains |
||
203 | containsAll: function(checkPerWord, searchFor, caseSensitive = true){ |
||
204 | var str = this; |
||
205 | |||
206 | // split haystack into words |
||
207 | var words = checkPerWord?str.split(" "):[str]; |
||
208 | |||
209 | // compare each word of needle seperately |
||
210 | var matched = 0; |
||
211 | for (var w = 0, wl = words.length;w<wl;w++){ |
||
212 | |||
213 | var word = words[w]; |
||
214 | |||
215 | // return true if any haystack S.Contains the needle |
||
216 | for (var s = 0, sl = searchFor.length; s < sl; s++) { |
||
217 | var sWord = searchFor[s]; |
||
218 | if (word.smartContains(sWord, caseSensitive)) { |
||
219 | matched++; |
||
220 | } |
||
221 | } |
||
222 | } |
||
223 | |||
224 | return matched == searchFor.length; |
||
225 | }, |
||
226 | containsNumber: function(){ |
||
227 | var str = this; |
||
228 | for (var c = 0, cl = str.length;c<cl;c++){ |
||
229 | var char = str.charAt(c); |
||
230 | if (char.isNumber()) { |
||
231 | return true; |
||
232 | } |
||
233 | } |
||
234 | return false; |
||
235 | }, |
||
236 | containsAlphaNumeric: function(){ |
||
237 | var str = this; |
||
238 | for (var c = 0, cl = str.length;c<cl;c++){ |
||
239 | var char = str.charAt(c); |
||
240 | if (char.isAlphaNumeric()) { |
||
241 | return true; |
||
242 | } |
||
243 | } |
||
244 | return false; |
||
245 | }, |
||
246 | |||
247 | |||
248 | endsWithAny_Index: function(searchFor, caseSensitive = true, trimAndCheck = false){ |
||
249 | var str = this; |
||
250 | |||
251 | // trim and check if needed |
||
252 | if (trimAndCheck) { |
||
253 | str = str.replace(UB.regex.Trim, ''); |
||
254 | } |
||
255 | |||
256 | // per search term |
||
257 | var indices = []; |
||
0 ignored issues
–
show
|
|||
258 | for (var s = 0, sl = searchFor.length;s<sl;s++){ |
||
259 | var sWord = searchFor[s]; |
||
260 | |||
261 | // ends with one |
||
262 | if (str.endsWith(sWord, caseSensitive)) { |
||
263 | return s; |
||
264 | } |
||
265 | } |
||
266 | |||
267 | // doesnt end with any given |
||
268 | return -1; |
||
269 | }, |
||
270 | /** checks if the string begins with any of the given terms, and returns the char index of the first found term */ |
||
271 | beginsWithAny_Index: function(searchFor, caseSensitive = true, trimAndCheck = false){ |
||
272 | return this.startsWithAny_Index(searchFor, caseSensitive, trimAndCheck); |
||
273 | }, |
||
274 | /** checks if the string begins with any of the given terms, and returns the char index of the first found term */ |
||
275 | startsWithAny_Index: function(searchFor, caseSensitive = true, trimAndCheck = false){ |
||
276 | var str = this; |
||
277 | |||
278 | // trim and check if needed |
||
279 | if (trimAndCheck) { |
||
280 | str = str.replace(UB.regex.Trim, ''); |
||
281 | } |
||
282 | |||
283 | // per search term |
||
284 | var indices = []; |
||
0 ignored issues
–
show
|
|||
285 | for (var s = 0, sl = searchFor.length;s<sl;s++){ |
||
286 | var sWord = searchFor[s]; |
||
287 | |||
288 | // ends with one |
||
289 | if (str.startsWith(sWord, caseSensitive)) { |
||
290 | return s; |
||
291 | } |
||
292 | } |
||
293 | |||
294 | // doesnt end with any given |
||
295 | return -1; |
||
296 | }, |
||
297 | |||
298 | /** checks if the string contains any of the given terms |
||
299 | * @param searchFor an array of search terms |
||
300 | */ |
||
301 | containsAny_Index: function(searchFor, caseSensitive = true){ |
||
302 | var str = this; |
||
303 | |||
304 | // return index if found |
||
305 | for (var s = 0, sl = searchFor.length; s < sl; s++) { |
||
306 | var sWord = searchFor[s]; |
||
307 | var i = str.smartIndexOf(sWord, caseSensitive); |
||
308 | if (i > -1){ |
||
309 | return i; |
||
310 | } |
||
311 | } |
||
312 | |||
313 | return -1; |
||
314 | }, |
||
315 | |||
316 | none:null |
||
317 | }; |
||
318 | |||
319 | // register funcs |
||
320 | UB.registerFuncs(String.prototype, stringFuncs); |
This check looks for variables that are declared in multiple lines. There may be several reasons for this.
In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.
If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.