Issues (81)

src/ub.strings.find.asserts.js (3 issues)

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
Comprehensibility Naming Best Practice introduced by
The variable sl already seems to be declared on line 147. Consider using another variable name or omitting the var keyword.

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.

Loading history...
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
The variable indices seems to be never used. Consider removing it.
Loading history...
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
The variable indices seems to be never used. Consider removing it.
Loading history...
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);