Issues (81)

src/ub.strings.find.asserts.js (2 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;
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);