hlp 2.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,704 @@
1
+ ## motivation
2
+ tired of writing
3
+
4
+ ```js
5
+ if( Object.keys(obj).length === 0 && obj.constructor === Object )
6
+ {
7
+
8
+ }
9
+ ```
10
+
11
+ or
12
+
13
+ ```js
14
+ if (typeof arr !== 'undefined' && arr.length > 0)
15
+ {
16
+
17
+ }
18
+ ```
19
+
20
+ or
21
+
22
+ ```js
23
+ for(const [obj__key, obj__value] of Object.entries(obj))
24
+ {
25
+
26
+ }
27
+ ```
28
+
29
+ ?
30
+
31
+
32
+ ## installation
33
+
34
+ ```
35
+ npm init -y
36
+ npm install hlp
37
+ ```
38
+
39
+ now embed it directly:
40
+ ```html
41
+ <script src="hlp.js"></script>
42
+ ```
43
+
44
+ or use it as a module:
45
+ ```js
46
+ import hlp from 'hlp';
47
+ ```
48
+
49
+
50
+ ## usage
51
+
52
+ ### existence
53
+ ```js
54
+ // check existence
55
+ if( hlp.x(vrbl) )
56
+ {
57
+
58
+ }
59
+
60
+ // check non-existence
61
+ if( hlp.nx(vrbl) )
62
+ {
63
+
64
+ }
65
+ ```
66
+
67
+ ### equality
68
+ ```js
69
+ // js has a lot of pitfalls, when comparing loosely
70
+ if( '' == [] ) // true
71
+ if( '' == [''] ) // true
72
+ if( '' == 0 ) // true
73
+ if( ' ' == false ) // true
74
+ if( [0] == false ) // true
75
+ if( [0] == '0' ) // true
76
+ if( [] == false ) // true
77
+ if( [''] == false ) // true
78
+ if( 0 == false ) // true
79
+ if( 0 == [] ) // true
80
+ if( 0 == [''] ) // true
81
+ if( [0] == false ) // true
82
+ if( [0] == 0 ) // true
83
+
84
+ // also don't forget those delicacies
85
+ 0 === -0 // true
86
+ NaN === NaN // false
87
+ (![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]] === 'fail' // true
88
+
89
+ // this non-strict equality is symmetric, but not transitive
90
+ a = ''; b = 0; c = [0];
91
+ a == b; // true
92
+ b == c; // true
93
+ c == a; // false
94
+
95
+ // to overcome this issue, we...
96
+
97
+ // ...use strict comparison when possible
98
+ if( vrbl === 'foo' )
99
+ {
100
+
101
+ }
102
+
103
+ // ...use loose comparison when appropriate
104
+ if( hlp.getParam('number') == 1337 )
105
+ {
106
+
107
+ }
108
+
109
+ // ...check for truthness / falsiness with these helper methods
110
+ if( hlp.true(vrbl) )
111
+ {
112
+
113
+ }
114
+
115
+ if( hlp.false(vrbl) )
116
+ {
117
+
118
+ }
119
+
120
+ // be aware, that hlp.true is not always the logic negation of hlp.false
121
+ hlp.true(null) // false
122
+ hlp.false(null) // false
123
+ ```
124
+
125
+ ### value
126
+ ```js
127
+ // get variable if exists, otherwise ''
128
+ hlp.v( vrbl )
129
+
130
+ // get variable if exists, otherwise 'default'
131
+ hlp.v( vrbl, 'default' )
132
+
133
+ // get first variable that exists, otherwise ''
134
+ hlp.v( vrbl1, vrbl2, vrbl3 )
135
+ ```
136
+
137
+ ### loop
138
+ ```js
139
+ // loop over arrays/objects only if possible
140
+ hlp.loop(['foo','bar','baz'], (vrbl__value) =>
141
+ {
142
+
143
+ });
144
+ hlp.loop(['foo','bar','baz'], (vrbl__value, vrbl__key) =>
145
+ {
146
+
147
+ });
148
+ hlp.loop({bar: 'foo', baz: 'bar', foo: 'baz'}, (vrbl__value, vrbl__key) =>
149
+ {
150
+
151
+ });
152
+ hlp.loop([], (vrbl__value, vrbl__key) => { }) // does nothing
153
+ hlp.loop({}, (vrbl__value, vrbl__key) => { }) // does nothing
154
+ hlp.loop(null, (vrbl__value, vrbl__key) => { }) // does nothing
155
+ ```
156
+
157
+
158
+ ### try
159
+
160
+ ```js
161
+ // if you are unsure, if a variable is even set before checking its existence,
162
+ // simply put it inside this helper function
163
+ if( hlp.x(() => vrbl) )
164
+ if( hlp.nx(() => vrbl) )
165
+ if( hlp.true(() => vrbl) )
166
+ if( hlp.false(() => vrbl) )
167
+ if( hlp.v(() => vrbl) === 'foo' )
168
+ if( hlp.v(() => vrbl) == 1337 )
169
+ echo hlp.v(() => vrbl)
170
+ hlp.loop((() => vrbl), (vrbl__value, vrbl__key) => { })
171
+
172
+ ```
173
+ that works because javascript only evaluates the content of the inner callback (or closure) when it is actually executed.
174
+
175
+
176
+
177
+ ### helpers
178
+
179
+ there are also some other neat little helpers available:
180
+
181
+ ```js
182
+ // capitalize
183
+ hlp.capitalize('foo') // Foo
184
+
185
+ // check if object
186
+ hlp.isObject({}) // true
187
+ hlp.isObject({foo: 'bar'}) // true
188
+ hlp.isObject(null) // false
189
+ hlp.isObject([]) // false (be aware: an array in js is scrictly an object, but this function returns false)
190
+
191
+ // check if array
192
+ hlp.isArray([]) // true
193
+ hlp.isArray(['foo','bar']) // true
194
+ hlp.isArray(null) // false
195
+
196
+ // check if string
197
+ hlp.isString('foo'); // true
198
+ hlp.isString(42); // false
199
+ hlp.isString(null); // false
200
+
201
+ // check if date
202
+ hlp.isDate('2018-01-01') // true
203
+ hlp.isDate('2018-02-29') // false
204
+ hlp.isDate('1700-01-01') // true
205
+ hlp.isDate(42) // false
206
+
207
+ // format date
208
+ hlp.formatDate('d.m.Y', '2018-01-01') // 01.01.2018
209
+ hlp.formatDate('Y-m-d H:i:s', new Date()) // 01.01.2018
210
+
211
+ // get week number from date
212
+ hlp.dateToWeek(new Date('2021-02-22')) // 8
213
+ hlp.dateToWeek() // hlp.dateToWeek(new Date())
214
+
215
+ // get date (of monday) from week number
216
+ hlp.weekToDate(42, 2018) // new Date('2018-10-14')
217
+ hlp.weekToDate(17, 2023) // new Date('2023-04-23')
218
+
219
+ // add days to date
220
+ hlp.addDays(new Date('2018-01-01'), 7) // new Date('2018-01-08')
221
+ hlp.addDays(new Date('2018-02-22'), 658) // new Date('2019-12-12')
222
+ hlp.addDays(new Date('2018-02-22'), 1) // new Date('2018-02-21')
223
+
224
+ // compare dates
225
+ let d1 = new Date();
226
+ let d2 = new Date();
227
+ hlp.compareDates(d1, d2) // 0
228
+ hlp.addDays(d1, -1);
229
+ hlp.compareDates(d1, d2) // -1
230
+ hlp.addDays(d1, 2);
231
+ hlp.compareDates(d1, d2) // 1
232
+ hlp.compareDates('2020-01-01', '2020-01-17 17:42:19') // -1
233
+
234
+ // spaceship operator
235
+ hlp.spaceship(5,7) // -1
236
+ hlp.spaceship(9,7) // 1
237
+ hlp.spaceship(7,7) // 0
238
+ hlp.spaceship('foo','bar') // 1
239
+ hlp.spaceship('bar','foo') // -1
240
+
241
+ // check if objects are equal
242
+ hlp.objectsAreEqual({}, {}) // true
243
+ hlp.objectsAreEqual({ foo: 'bar' }, { foo: 'bar'}) // true
244
+ hlp.objectsAreEqual({ foo: 'bar' }, { bar: 'baz'}) // false
245
+
246
+ // check if object is inside an array/object
247
+ hlp.containsObject({ foo: 'bar' }, []) // false
248
+ hlp.containsObject({ foo: 'bar' }, [{ foo: 'bar' }, { bar: 'baz' }]) // true
249
+ hlp.containsObject({ foo: 'bar' }, { foo: { foo: 'bar' } }) // true
250
+
251
+ // recursively search key/value in nested object and return dotprop array
252
+ hlp.findRecursiveInObject({ foo: { id: 42 }, bar: { foo: { id: 7 } }, baz: { id1: 42, id2: 7 } }, 'id'); // ['foo', 'bar.foo']
253
+ hlp.findRecursiveInObject({ foo: { id: 42 }, bar: { foo: { id: 7 } }, baz: { id1: 42, id2: 7 } }, 'id', 42); // ['foo']
254
+ hlp.findRecursiveInObject({ foo: { id: 42 }, bar: { foo: { id: 7 } }, baz: { id1: 42, id2: 7 } }, null, 7); // ['bar.foo', 'baz']
255
+
256
+ // deep clone reference types (object/array/date/regex)
257
+ hlp.deepCopy({ foo: 'bar' })
258
+ hlp.deepCopy(['foo','bar'])
259
+ hlp.deepCopy(new Date())
260
+ hlp.deepCopy(new Date('2018-01-01'))
261
+ hlp.deepCopy(new RegExp('ab+c', 'i'))
262
+
263
+ // generate uuid/guid v4
264
+ hlp.uuid() // e86e393c-9788-857b-27c2-f80c8ca1a302
265
+ hlp.uuid() // 8b25a8f8-9525-bd73-4679-3539321db93b
266
+
267
+ // replace all occurences
268
+ hlp.replaceAll('foo bar baz', 'a', 'b') // 'foo bbr bbz'
269
+
270
+ // replace last occurence
271
+ hlp.replaceLast('foo bar baz', 'a', 'b') // 'foo bar bbz'
272
+
273
+ // replace last occurence
274
+ hlp.replaceFirst('foo bar baz', 'a', 'b') // 'foo bbr baz'
275
+
276
+ // case insensitive search
277
+ hlp.indexOfCaseInsensitive('foo', 'this is a FOO') // 10
278
+ hlp.indexOfCaseInsensitive('foo', 'this is a FOO and a foobar', 15) // 20
279
+
280
+ // count occurences in string
281
+ hlp.countAllOccurences('foo', 'this is a foo and a foobar') // 2
282
+ hlp.countAllOccurencesCaseInsensitive('FoO', 'this is a FOO and a foobar') // 2
283
+
284
+ // find all positions in string
285
+ hlp.findAllPositions('foo', 'this is a foo and a foobar') // [10,20]
286
+ hlp.findAllPositionsCaseInsensitive('FoO', 'this is a FOO and a foobar') // [10,20]
287
+
288
+ // highlight strings
289
+ hlp.highlight('that is a search string', 'is') // that <strong class="highlight">is</strong> a search string
290
+ hlp.highlight('abc def geh ijk lmn opq rst abc def geh ijk lmn opq rst', 'ijk', true, 5) // '... geh <strong class="highlight">ijk</strong> lmn ... geh <strong class="highlight">ijk</strong> lmn ...'
291
+
292
+ // return unique array (remove duplicate values, order-safe)
293
+ hlp.uniqueArray(['foo','bar','foo','baz']) // ['foo','bar','baz']
294
+
295
+ // shuffle array
296
+ hlp.shuffle(['foo','bar']) // ['foo','bar']
297
+ hlp.shuffle(['foo','bar']) // ['foo','bar']
298
+ hlp.shuffle(['foo','bar']) // ['foo','bar'] (yikes)
299
+ hlp.shuffle(['foo','bar']) // ['bar','foo']
300
+
301
+ // char helpers
302
+ hlp.charToInt('D') // 4
303
+ hlp.intToChar(4) // 'D'
304
+ hlp.incChar('D') // 'E'
305
+ hlp.incChar('Z') // 'AA'
306
+ hlp.incChar('A',2) // 'C'
307
+ hlp.decChar('U') // 'T'
308
+
309
+ // slugify / sanitize string
310
+ hlp.slugify('That röcks!') // that-roecks
311
+
312
+ // range
313
+ hlp.range('A','Z') // ['A','B',...,'Z']
314
+ hlp.range(1,42) // [1,2,...,42]
315
+ hlp.range('C','A') // ['C','B','A']
316
+
317
+ // get last item of object/array
318
+ hlp.last(['foo', 'bar', 'baz']) // 'baz'
319
+ hlp.last({ foo: 'bar', bar: 'baz'}) // 'baz'
320
+
321
+ // get first item of object/array
322
+ hlp.first(['foo', 'bar', 'baz']) // 'foo'
323
+ hlp.first({ foo: 'bar', bar: 'baz'}) // 'bar'
324
+
325
+ // get random element from object/array
326
+ hlp.rand(['foo', 'bar', 'baz']) // 'bar'
327
+
328
+ // generate a random string
329
+ hlp.random_string() // edPhi34d
330
+ hlp.random_string(10) // abCa321aC6
331
+ hlp.random_string(16, 'idkfa') // idifafafifaifafk
332
+
333
+ // generate a random integer
334
+ hlp.random_int() // 42
335
+ hlp.random_int(7,42) // 17
336
+
337
+ // check if variable is integer
338
+ hlp.isInteger('foo') // false
339
+ hlp.isInteger(42) // true
340
+ hlp.isInteger('42') // true
341
+ hlp.isInteger(4e2) // true
342
+ hlp.isInteger('4e2') // true
343
+ hlp.isInteger(' 1 ') // true
344
+ hlp.isInteger('') // false
345
+ hlp.isInteger(' ') // false
346
+ hlp.isInteger(42.1) // false
347
+ hlp.isInteger('1a') // false
348
+ hlp.isInteger('4e2a') // false
349
+ hlp.isInteger(null) // false
350
+ hlp.isInteger(undefined) // false
351
+ hlp.isInteger(NaN) // false
352
+
353
+ // check if variable is numeric
354
+ hlp.isNumeric(1337) // true
355
+ hlp.isNumeric('42') // true
356
+ hlp.isNumeric('42.7') // true
357
+ hlp.isNumeric('a') // false
358
+
359
+ // json parsing
360
+ hlp.jsonStringToObject('["foo","bar","baz"]') // ['foo','bar','baz']
361
+ hlp.jsonStringToObject('["foo","bar","baz",]') // null
362
+ hlp.jsonObjectToString(['foo','bar','baz']) // '["foo","bar","baz"]'
363
+ hlp.isJsonString('["foo","bar","baz",]') // false
364
+ hlp.isJsonString('["foo","bar","baz"]') // true
365
+
366
+ // map for objects
367
+ hlp.map({ foo: 'bar', bar: 'baz' }, (obj__key, obj__value) => obj__value += '!'); // { foo: 'bar!', bar: 'baz!' }
368
+
369
+ // fun with blobs
370
+ hlp.stringtoblob(string)
371
+ hlp.stringtoblob(string, 'image/png')
372
+ hlp.blobtostring(blob).then((string) => { })
373
+ hlp.blobtobase64(blob).then((base64) => { })
374
+ hlp.base64toblob(base64)
375
+ hlp.base64toblob(base64, 'image/png')
376
+ hlp.filetobase64(file).then((base64) => { })
377
+ hlp.blobtofile(blob)
378
+ hlp.blobtofile(blob, 'filename.png')
379
+ hlp.filetoblob(file)
380
+ hlp.base64tofile(base64)
381
+ hlp.base64tofile(base64, 'image/png')
382
+ hlp.base64tofile(base64, 'image/png', 'filename.png')
383
+ hlp.base64tostring(base64)
384
+ hlp.stringtobase64(string)
385
+ hlp.blobtourl(blob)
386
+ hlp.stringtourl(string)
387
+ hlp.base64tourl(base64)
388
+ hlp.filetourl(file)
389
+
390
+ // fix exif image orientation
391
+ hlp.fixImageOrientation(base64).then((base64) => { });
392
+ hlp.getImageOrientation(base64).then((orientation) => { });
393
+
394
+ // html entity encode/decode
395
+ hlp.htmlEncode('&<>"`\'') // &amp;&lt;&gt;&quot;&#96;&#x27;
396
+ hlp.htmlDecode('&amp;&lt;&gt;&quot;&#96;&#x27;') // &<>"`'
397
+
398
+ // line break conversion
399
+ hlp.nl2br('foo\nbar') // foo<br/>bar
400
+ hlp.br2nl('foo<br/>bar') // foo\nbar
401
+
402
+ // floating point math made easy
403
+ hlp.fmath('*', 0.1, 0.2) // 0.02
404
+ hlp.fmath('+', 0.1, 0.2) // 0.3
405
+ hlp.fmath('-', 0.1, 0.2) // -0.1
406
+ hlp.fmath('/', 0.2, 0.1) // 2
407
+ hlp.fmath('/', 0.39, 100, 12) // 0.0039 (precision of 12)
408
+
409
+ // trim helpers
410
+ hlp.trim(' foo ') // 'foo'
411
+ hlp.trim('xxfoox', 'x') // 'foo'
412
+ hlp.ltrim(' foo ') // 'foo '
413
+ hlp.ltrim('xxfoox', 'x') // 'foox'
414
+ hlp.rtrim(' foo ') // ' foo'
415
+ hlp.rtrim('xxfoox', 'x') // 'xxfoo'
416
+
417
+ // create lexicographically ordered string ids like in firebase
418
+ hlp.pushId() // -LDiDooGs9PyGHmghk5i
419
+ hlp.pushId() // -LDiDooGs9PyGHmghk5j
420
+
421
+ // access object properties with dotprop notation
422
+ // today it is better to use optional chaining in combination with nullish coalescing ({}?.c?.a?.a??'default')
423
+ hlp.getProp({
424
+ a: 1,
425
+ b: { a: 3, b: 3 },
426
+ c: { a: { a: 7 } }
427
+ }, 'c.a.a') // 7
428
+ ```
429
+
430
+ check out also the following helpers for the frontend:
431
+
432
+ ```js
433
+ // cookies
434
+ hlp.cookieSet('foo', 'bar', 7);
435
+ hlp.cookieGet('foo') // bar
436
+ hlp.cookieDelete('foo')
437
+ hlp.cookieExists('foo') // false
438
+
439
+ // get parameter (example url: https://tld.com/?foo=bar&bar=baz)
440
+ hlp.getParam('foo') // foo
441
+ hlp.getParam('bar') // baz
442
+ hlp.getParam('baz') // null
443
+
444
+ // device detection helpers
445
+ hlp.getDevice() // ['phone','tablet','desktop']
446
+ hlp.isPhone()
447
+ hlp.isTablet()
448
+ hlp.isDesktop()
449
+ hlp.isMobile()
450
+ hlp.isTouch()
451
+
452
+ // os detection helpers
453
+ hlp.getOs() // ['windows','mac','linux','unknown']
454
+ hlp.isWindows()
455
+ hlp.isMac()
456
+ hlp.isLinux()
457
+
458
+ // browser detection helpers
459
+ hlp.getBrowser() // ['ie','edge','firefox','chrome','safari','opera','unknown']
460
+
461
+ // smooth scroll to position / element
462
+ hlp.scrollTo( 0, 1000 ).then(() => { console.log('done'); });
463
+ hlp.scrollTo( document.querySelector('.foo'), 1000 ).then(() => { console.log('done'); });
464
+
465
+ // get top/left scroll position
466
+ hlp.scrollTop()
467
+ hlp.scrollLeft()
468
+
469
+ // get offset of element (excluding margin)
470
+ hlp.offsetTop( document.querySelector('.foo') )
471
+ hlp.offsetLeft( document.querySelector('.foo') )
472
+ hlp.offsetRight( document.querySelector('.foo') )
473
+ hlp.offsetBottom( document.querySelector('.foo') )
474
+
475
+ // get document size
476
+ hlp.documentWidth()
477
+ hlp.documentHeight()
478
+
479
+ // get window size
480
+ hlp.windowWidth()
481
+ hlp.windowHeight()
482
+ hlp.windowWidthWithoutScrollbar()
483
+ hlp.windowHeightWithoutScrollbar()
484
+
485
+ // get width with margin
486
+ hlp.outerWidthWithMargin( document.querySelector('.foo') )
487
+ hlp.outerHeightWithMargin( document.querySelector('.foo') )
488
+
489
+ // polyfills for ie11
490
+ hlp.closest( document.querySelector('.children'), '.parent' )
491
+ hlp.matches( document.querySelector('.parent'), '.parent' ) // true
492
+ hlp.remove( document.querySelector('.foo') ) // also works if .foo does not exist
493
+
494
+ // dom traversal
495
+ hlp.prevAll( document.querySelector('.foo') )
496
+ hlp.prevAll( document.querySelector('.foo'), '.bar' )
497
+ hlp.nextAll( document.querySelector('.foo') )
498
+ hlp.nextAll( document.querySelector('.foo'), '.bar' )
499
+ hlp.siblings( document.querySelector('.foo') )
500
+ hlp.siblings( document.querySelector('.foo'), '.bar' )
501
+ hlp.parents( document.querySelector('.foo') )
502
+ hlp.parents( document.querySelector('.foo'), '.bar' )
503
+
504
+ // wrap all text nodes with new node
505
+ hlp.wrapTextNodes( document.querySelector('.foo'), 'p' )
506
+
507
+ // html string to dom (also supports ie11 and td nodes that cannot be root nodes)
508
+ hlp.html2dom('<p>foo</p>')
509
+ hlp.html2dom('<td>bar</td>')
510
+
511
+ // get all styles of a dom element (extracted from both inline styling and external styling through stylesheets)
512
+ hlp.css( document.querySelector('.foo') )
513
+
514
+ // visually focus element on page
515
+ hlp.focus('.foo')
516
+ hlp.unfocus()
517
+
518
+ // on delegate
519
+ hlp.on('click', '.selector', (e, el) => { });
520
+ hlp.on('click', '.selector', '.scope', (e, el) => { });
521
+
522
+ // classic debounce
523
+ window.addEventListener('resize', hlp.debounce(() => { console.log('debounce at resize') }, 1000));
524
+ document.querySelector('.container').addEventListener('input', hlp.debounce((e) => { console.log('debounce at '+e.target.value); }, 1000));
525
+
526
+ // classic throttle
527
+ window.addEventListener('resize', hlp.throttle(() => { console.log('throttle at resize') }, 1000));
528
+ document.querySelector('.container').addEventListener('input', hlp.throttle((e) => { console.log('throttle at '+e.target.value); }, 1000));
529
+
530
+ // get current url
531
+ hlp.url() // https://github.com/vielhuber/hlp
532
+ hlp.urlWithHash() // https://github.com/vielhuber/hlp#foo
533
+ hlp.fullUrl() // https://github.com/vielhuber/hlp?foo=bar#foo
534
+ hlp.urlWithArgs() // https://github.com/vielhuber/hlp?foo=bar
535
+ hlp.baseUrl() // https://github.com
536
+ hlp.urlHost(); // github.com
537
+ hlp.urlHostTopLevel(); // github.com
538
+ hlp.urlPath(); // /vielhuber/hlp
539
+ hlp.urlHash(); // #foo
540
+ hlp.urlArgs(); // ?foo=bar
541
+
542
+ // get url of current running script
543
+ hlp.urlOfScript(); // https://tld.com/wp-content/themes/dummy/script.js
544
+ hlp.pathOfScript(); // https://tld.com/wp-content/themes/dummy
545
+
546
+ // set 100vh for dom element (even for ios devices, see https://nicolas-hoizey.com/2015/02/viewport-height-is-taller-than-the-visible-part-of-the-document-in-some-mobile-browsers.html)
547
+ hlp.real100vh('.foo')
548
+
549
+ // remove hover states on ios to prevent double clicks (see https://stackoverflow.com/questions/47802530/a-click-in-ios-safari-triggers-a-hover-state-on-element-underneath-where-you-t);
550
+ hlp.iOsRemoveHover();
551
+
552
+ // fade in/out dom element
553
+ hlp.fadeIn( document.querySelector('.foo'), 1000 ).then(() => { console.log('done'); });
554
+ hlp.fadeOut( document.querySelector('.foo'), 1000 ).then(() => { console.log('done'); });
555
+
556
+ // check if dom element is generally visible
557
+ hlp.isVisible( document.querySelector('.foo') )
558
+ // check if dom element is visible inside viewport
559
+ hlp.isVisibleInViewport( document.querySelector('.foo') )
560
+
561
+ // wait until a dom element has a certain css property
562
+ // this is quite useful when working with async loaded stylesheets like loadCSS
563
+ // .beacon is an element below the fold populated by the stylesheet
564
+ hlp.waitUntil('.beacon').then(() => { });
565
+ hlp.waitUntil('.beacon','position').then(() => { });
566
+ hlp.waitUntil('.beacon','position','relative').then(() => { });
567
+
568
+ // run a function for every dom element, even it is added dynamically later on
569
+ hlp.runForEl('.beacon', el => { el.style.backgroundColor = 'red'; });
570
+
571
+ // automatically change height of all textareas based on content
572
+ hlp.textareaAutoHeight()
573
+ hlp.textareaAutoHeight('.special')
574
+ hlp.textareaSetHeight( document.querySelector('.special') )
575
+
576
+ // load external js file in dom with promise
577
+ hlp.loadJs('https://apis.google.com/js/api.js').then(() => { console.log('done'); });
578
+ hlp.loadJs([
579
+ 'https://www.tld.com/1.js',
580
+ 'https://www.tld.com/2.js',
581
+ 'https://www.tld.com/3.js'
582
+ ]).then(() => { console.log('done'); });
583
+ hlp.loadJsSequentially([
584
+ 'https://www.tld.com/1.js',
585
+ 'https://www.tld.com/2.js',
586
+ 'https://www.tld.com/3.js'
587
+ ]).then(() => { console.log('done'); });
588
+
589
+ // run event after all images are loaded inside container
590
+ // works even after dynamic changes
591
+ // runs more than once (after each change)
592
+ // run this outside of window load / document ready events
593
+ hlp.triggerAfterAllImagesLoaded('.container', '.container__image', () => {});
594
+
595
+ // proper document read/load events, that are guaranteed to be run (also if the script is embedded via async)
596
+ hlp.ready().then(() => {});
597
+ hlp.load().then(() => {});
598
+
599
+ // easy ajax requests (without the fetch api; also works in ie11)
600
+ hlp.get('https://httpbin.org/anything').then((response) => { }).catch((error) => { }) // { "method": "GET", ... }
601
+ hlp.get('/relpath').then((response) => { }).catch((error) => { }) // if a full url is omitted, the call is done on the baseurl
602
+ hlp.get('https://httpbin.org/anything', { throttle: 1000 }).then((response) => { }).catch((error) => { }) // same but with a throttle of 1 second
603
+ hlp.get('https://httpbin.org/status/404', { allow_errors: false }).then((response) => { }) // deny 404 and other status codes as a response (inside catch())
604
+ hlp.post('https://httpbin.org/anything', { data: { foo: 'bar' } }).then((response) => { }).catch((error) => { }) // { "method": "POST", "data": {"foo": "bar"}, ... }
605
+ hlp.post('https://httpbin.org/anything', { data: { foo: 'bar' }, headers: { Bar: 'baz' } }).then((response) => { }).catch((error) => { }) // { "method": "POST", "headers" = { "Bar": "baz", ... }, ... }
606
+ let formData = new FormData(); formData.append('foo', 'bar'); hlp.post('https://httpbin.org/anything', { data: formData }) // this also works with FormData
607
+
608
+ // on resize vertically/horizontally
609
+ window.addEventListener('resize', () => {}) // inaccurate, triggers too often (especially when scrolling on android/iphone)
610
+ hlp.onResizeHorizontal(() => {}) // only triggers when viewport width changes; also triggers on first run
611
+ hlp.onResizeVertical(() => {}) // only triggers when viewport height changes; also triggers on first run
612
+
613
+ // add event listener once
614
+ hlp.addEventListenerOnce(
615
+ document.getElementById('foo'),
616
+ 'click',
617
+ (event) => { alert('this gets called only once'); }
618
+ );
619
+ hlp.addEventListenerOnce(
620
+ document.getElementById('foo'),
621
+ 'click',
622
+ (event) => { if(1==1) { return false; } } // if you return false, the event listener is not removed
623
+ );
624
+
625
+ // simple animations (via css transitions)
626
+ hlp.animate(
627
+ document.getElementById('.single'),
628
+ 'transform: translateX(0)',
629
+ 'transform: translateX(-100%)',
630
+ 'ease-in-out',
631
+ 1000
632
+ ).then(() => { console.log('done'); });
633
+ hlp.animate(
634
+ document.querySelectorAll('.multiple'),
635
+ 'opacity: 1; pointer-events:auto',
636
+ 'opacity: 0; pointer-events:none',
637
+ 'linear',
638
+ 5000
639
+ ).then(() => { console.log('done'); });
640
+ ```
641
+
642
+
643
+ ## php implementation
644
+
645
+ there is also a php implemenation [stringhelper](https://github.com/vielhuber/stringhelper) with similiar functions available.
646
+
647
+
648
+ ## appendix
649
+
650
+ ### existence matrix
651
+
652
+ | | <sub>hlp.x()</sub> | <sub>hlp.true()</sub> | <sub>hlp.false()</sub> | <sub>!== null</sub> | <sub>!= null</sub> | <sub>!== false</sub> | <sub>!= false</sub> | <sub>=== true</sub> | <sub>== true</sub> | <sub>typeof !== 'undefined'</sub> | <sub>!= undefined</sub> | <sub>!== undefined</sub> | <sub>if/else</sub> | <sub>ternary</sub> | <sub>length > 0</sub> | <sub>!= ''</sub> | <sub>!== ''</sub> |
653
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
654
+ | <sub>undefined</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>true</sub> | <sub>true</sub> |
655
+ | <sub>null</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>true</sub> | <sub>true</sub> |
656
+ | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> |
657
+ | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> |
658
+ | <sub>[]</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> |
659
+ | <sub>['']</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> |
660
+ | <sub>0</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> |
661
+ | <sub>1</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> |
662
+ | <sub>-1</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> |
663
+ | <sub>'0'</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
664
+ | <sub>'1'</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
665
+ | <sub>'-1'</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
666
+ | <sub>''</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> |
667
+ | <sub>' '</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
668
+ | <sub>'null'</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
669
+ | <sub>'false'</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
670
+ | <sub>'true'</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
671
+ | <sub>'str'</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
672
+ | <sub>[0,1]</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
673
+ | <sub>[0]</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
674
+ | <sub>{}</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> |
675
+ | <sub>un.known.property</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> |
676
+ | <sub>(()=>un.known.property)</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
677
+
678
+ ### loose comparison matrix
679
+
680
+ | <sub>==</sub> | <sub>undefined</sub> | <sub>null</sub> | <sub>false</sub> | <sub>true</sub> | <sub>[]</sub> | <sub>['']</sub> | <sub>0</sub> | <sub>1</sub> | <sub>-1</sub> | <sub>'0'</sub> | <sub>'1'</sub> | <sub>'-1'</sub> | <sub>''</sub> | <sub>' '</sub> | <sub>'null'</sub> | <sub>'false'</sub> | <sub>'true'</sub> | <sub>'str'</sub> | <sub>[0,1]</sub> | <sub>[0]</sub> | <sub>{}</sub> | <sub>un.known.property</sub> | <sub>(()=>un.known.property)</sub> |
681
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
682
+ | <sub>undefined</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
683
+ | <sub>null</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
684
+ | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
685
+ | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
686
+ | <sub>[]</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
687
+ | <sub>['']</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
688
+ | <sub>0</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
689
+ | <sub>1</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
690
+ | <sub>-1</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
691
+ | <sub>'0'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
692
+ | <sub>'1'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
693
+ | <sub>'-1'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
694
+ | <sub>''</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
695
+ | <sub>' '</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
696
+ | <sub>'null'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
697
+ | <sub>'false'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
698
+ | <sub>'true'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
699
+ | <sub>'str'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
700
+ | <sub>[0,1]</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
701
+ | <sub>[0]</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
702
+ | <sub>{}</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>error</sub> | <sub>false</sub> |
703
+ | <sub>un.known.property</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> |
704
+ | <sub>(()=>un.known.property)</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>true</sub> |