PageSourceSearch

https://www.pcmatic.com/inc/json2.js

js pcmatic.com collected 2026-09-24 10:51:56 UTC 18,480 bytes, 497 lines download raw bytes

1/*
2    https://www.JSON.org/json2.js
3    2008-11-19
4
5    Public Domain.
6
7    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
8
9    See https://www.JSON.org/js.html
10
11    This file creates a global JSON object containing two methods: stringify
12    and parse.
13
14        JSON.stringify(value, replacer, space)
15            value       any JavaScript value, usually an object or array.
16
17            replacer    an optional parameter that determines how object
18                        values are stringified for objects. It can be a
19                        function or an array of strings.
20
21            space       an optional parameter that specifies the indentation
22                        of nested structures. If it is omitted, the text will
23                        be packed without extra whitespace. If it is a number,
24                        it will specify the number of spaces to indent at each
25                        level. If it is a string (such as '\t' or ' '),
26                        it contains the characters used to indent at each level.
27
28            This method produces a JSON text from a JavaScript value.
29
30            When an object value is found, if the object contains a toJSON
31            method, its toJSON method will be called and the result will be
32            stringified. A toJSON method does not serialize: it returns the
33            value represented by the name/value pair that should be serialized,
34            or undefined if nothing should be serialized. The toJSON method
35            will be passed the key associated with the value, and this will be
36            bound to the object holding the key.
37
38            For example, this would serialize Dates as ISO strings.
39
40                Date.prototype.toJSON = function (key) {
41                    function f(n) {
42                        // Format integers to have at least two digits.
43                        return n < 10 ? '0' + n : n;
44                    }
45
46                    return this.getUTCFullYear()   + '-' +
47                         f(this.getUTCMonth() + 1) + '-' +
48                         f(this.getUTCDate())      + 'T' +
49                         f(this.getUTCHours())     + ':' +
50                         f(this.getUTCMinutes())   + ':' +
51                         f(this.getUTCSeconds())   + 'Z';
52                };
53
54            You can provide an optional replacer method. It will be passed the
55            key and value of each member, with this bound to the containing
56            object. The value that is returned from your method will be
57            serialized. If your method returns undefined, then the member will
58            be excluded from the serialization.
59
60            If the replacer parameter is an array of strings, then it will be
61            used to select the members to be serialized. It filters the results
62            such that only members with keys listed in the replacer array are
63            stringified.
64
65            Values that do not have JSON representations, such as undefined or
66            functions, will not be serialized. Such values in objects will be
67            dropped; in arrays they will be replaced with null. You can use
68            a replacer function to replace those with JSON values.
69            JSON.stringify(undefined) returns undefined.
70
71            The optional space parameter produces a stringification of the
72            value that is filled with line breaks and indentation to make it
73            easier to read.
74
75            If the space parameter is a non-empty string, then that string will
76            be used for indentation. If the space parameter is a number, then
77            the indentation will be that many spaces.
78
79            Example:
80
81            text = JSON.stringify(['e', {pluribus: 'unum'}]);
82            // text is '["e",{"pluribus":"unum"}]'
83
84
85            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
86            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
87
88            text = JSON.stringify([new Date()], function (key, value) {
89                return this[key] instanceof Date ?
90                    'Date(' + this[key] + ')' : value;
91            });
92            // text is '["Date(---current time---)"]'
93
94
95        JSON.parse(text, reviver)
96            This method parses a JSON text to produce an object or array.
97            It can throw a SyntaxError exception.
98
99            The optional reviver parameter is a function that can filter and
100            transform the results. It receives each of the keys and values,
101            and its return value is used instead of the original value.
102            If it returns what it received, then the structure is not modified.
103            If it returns undefined then the member is deleted.
104
105            Example:
106
107            // Parse the text. Values that look like ISO date strings will
108            // be converted to Date objects.
109
110            myData = JSON.parse(text, function (key, value) {
111                var a;
112                if (typeof value === 'string') {
113                    a =
114/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
115                    if (a) {
116                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
117                            +a[5], +a[6]));
118                    }
119                }
120                return value;
121            });
122
123            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
124                var d;
125                if (typeof value === 'string' &&
126                        value.slice(0, 5) === 'Date(' &&
127                        value.slice(-1) === ')') {
128                    d = new Date(value.slice(5, -1));
129                    if (d) {
130                        return d;
131                    }
132                }
133                return value;
134            });
135
136
137    This is a reference implementation. You are free to copy, modify, or
138    redistribute.
139
140    This code should be minified before deployment.
141    See https://javascript.crockford.com/jsmin.html
142
143    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
144    NOT CONTROL.
145*/
146
147/*jslint evil: true */
148
149/*global JSON */
150
151/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
152    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
153    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
154    lastIndex, length, parse, prototype, push, replace, slice, stringify,
155    test, toJSON, toString, valueOf
156*/
157
158// Create a JSON object only if one does not already exist. We create the
159// methods in a closure to avoid creating global variables.
160
161if (!this.JSON) {
162    JSON = {};
163}
164(function () {
165
166    function f(n) {
167        // Format integers to have at least two digits.
168        return n < 10 ? '0' + n : n;
169    }
170
171    if (typeof Date.prototype.toJSON !== 'function') {
172
173        Date.prototype.toJSON = function (key) {
174
175            return this.getUTCFullYear()   + '-' +
176                 f(this.getUTCMonth() + 1) + '-' +
177                 f(this.getUTCDate())      + 'T' +
178                 f(this.getUTCHours())     + ':' +
179                 f(this.getUTCMinutes())   + ':' +
180                 f(this.getUTCSeconds())   + 'Z';
181        };
182
183        String.prototype.toJSON =
184        Number.prototype.toJSON =
185        Boolean.prototype.toJSON = function (key) {
186            return this.valueOf();
187        };
188    }
189
190    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
191        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ud800-\udfff\ufeff\ufff0-\uffff]/g,
192        gap,
193        indent,
194        meta = {    // table of character substitutions
195            '\b': '\\b',
196            '\t': '\\t',
197            '\n': '\\n',
198            '\f': '\\f',
199            '\r': '\\r',
200            '"' : '\\"',
201            '\\': '\\\\'
202        },
203        rep;
204
205
206    function quote(string) {
207
208// If the string contains no control characters, no quote characters, and no
209// backslash characters, then we can safely slap some quotes around it.
210// Otherwise we must also replace the offending characters with safe escape
211// sequences.
212
213// dwm 2010-04-20: replace invalid Unicode sequences with question marks.
214// "... (U+D800 through U+DFFF) ... are not legal Unicode values ..."
215// https://en.wikipedia.org/wiki/UTF-8#Invalid_code_points
216
217        escapable.lastIndex = 0;
218        return escapable.test(string) ?
219            '"' + string.replace(/[\ud800-\udfff]/g, "?").replace(escapable, function (a) {
220                var c = meta[a];
221                return typeof c === 'string' ? c :
222                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
223            }) + '"' :
224            '"' + string + '"';
225    }
226
227
228    function str(key, holder) {
229
230// Produce a string from holder[key].
231
232        var i,          // The loop counter.
233            k,          // The member key.
234            v,          // The member value.
235            length,
236            mind = gap,
237            partial,
238            value = holder[key];
239
240// If the value has a toJSON method, call it to obtain a replacement value.
241
242        if (value && typeof value === 'object' &&
243                typeof value.toJSON === 'function') {
244            value = value.toJSON(key);
245        }
246
247// If we were called with a replacer function, then call the replacer to
248// obtain a replacement value.
249
250        if (typeof rep === 'function') {
251            value = rep.call(holder, key, value);
252        }
253
254// What happens next depends on the value's type.
255
256        switch (typeof value) {
257        case 'string':
258            return quote(value);
259
260        case 'number':
261
262// JSON numbers must be finite. Encode non-finite numbers as null.
263
264            return isFinite(value) ? String(value) : 'null';
265
266        case 'boolean':
267        case 'null':
268
269// If the value is a boolean or null, convert it to a string. Note:
270// typeof null does not produce 'null'. The case is included here in
271// the remote chance that this gets fixed someday.
272
273            return String(value);
274
275// If the type is 'object', we might be dealing with an object or an array or
276// null.
277
278        case 'object':
279
280// Due to a specification blunder in ECMAScript, typeof null is 'object',
281// so watch out for that case.
282
283            if (!value) {
284                return 'null';
285            }
286
287// Make an array to hold the partial results of stringifying this object value.
288
289            gap += indent;
290            partial = [];
291
292// Is the value an array?
293
294            if (Object.prototype.toString.apply(value) === '[object Array]') {
295
296// The value is an array. Stringify every element. Use null as a placeholder
297// for non-JSON values.
298
299                length = value.length;
300                for (i = 0; i < length; i += 1) {
301                    partial[i] = str(i, value) || 'null';
302                }
303
304// Join all of the elements together, separated with commas, and wrap them in
305// brackets.
306
307                v = partial.length === 0 ? '[]' :
308                    gap ? '[\n' + gap +
309                            partial.join(',\n' + gap) + '\n' +
310                                mind + ']' :
311                          '[' + partial.join(',') + ']';
312                gap = mind;
313                return v;
314            }
315
316// If the replacer is an array, use it to select the members to be stringified.
317
318            if (rep && typeof rep === 'object') {
319                length = rep.length;
320                for (i = 0; i < length; i += 1) {
321                    k = rep[i];
322                    if (typeof k === 'string') {
323                        v = str(k, value);
324                        if (v) {
325                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
326                        }
327                    }
328                }
329            } else {
330
331// Otherwise, iterate through all of the keys in the object.
332
333                for (k in value) {
334                    if (Object.hasOwnProperty.call(value, k)) {
335                        v = str(k, value);
336                        if (v) {
337                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
338                        }
339                    }
340                }
341            }
342
343// Join all of the member texts together, separated with commas,
344// and wrap them in braces.
345
346            v = partial.length === 0 ? '{}' :
347                gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
348                        mind + '}' : '{' + partial.join(',') + '}';
349            gap = mind;
350            return v;
351        }
352    }
353
354// If the JSON object does not yet have a stringify method, give it one.
355
356    if (typeof JSON.stringify !== 'function') {
357        JSON.stringify = function (value, replacer, space) {
358
359// The stringify method takes a value and an optional replacer, and an optional
360// space parameter, and returns a JSON text. The replacer can be a function
vendor: 4,246 bytes, lines 361-467
361// that can replace values, or an array of strings that will select the keys.
362// A default replacer method can be provided. Use of the space parameter can
363// produce text that is more easily readable.
364
365            var i;
366            gap = '';
367            indent = '';
368
369// If the space parameter is a number, make an indent string containing that
370// many spaces.
371
372            if (typeof space === 'number') {
373                for (i = 0; i < space; i += 1) {
374                    indent += ' ';
375                }
376
377// If the space parameter is a string, it will be used as the indent string.
378
379            } else if (typeof space === 'string') {
380                indent = space;
381            }
382
383// If there is a replacer, it must be a function or an array.
384// Otherwise, throw an error.
385
386            rep = replacer;
387            if (replacer && typeof replacer !== 'function' &&
388                    (typeof replacer !== 'object' ||
389                     typeof replacer.length !== 'number')) {
390                throw new Error('JSON.stringify');
391            }
392
393// Make a fake root object containing our value under the key of ''.
394// Return the result of stringifying the value.
395
396            return str('', {'': value});
397        };
398    }
399
400
401// If the JSON object does not yet have a parse method, give it one.
402
403    if (typeof JSON.parse !== 'function') {
404        JSON.parse = function (text, reviver) {
405
406// The parse method takes a text and an optional reviver function, and returns
407// a JavaScript value if the text is a valid JSON text.
408
409            var j;
410
411            function walk(holder, key) {
412
413// The walk method is used to recursively walk the resulting structure so
414// that modifications can be made.
415
416                var k, v, value = holder[key];
417                if (value && typeof value === 'object') {
418                    for (k in value) {
419                        if (Object.hasOwnProperty.call(value, k)) {
420                            v = walk(value, k);
421                            if (v !== undefined) {
422                                value[k] = v;
423                            } else {
424                                delete value[k];
425                            }
426                        }
427                    }
428                }
429                return reviver.call(holder, key, value);
430            }
431
432
433// Parsing happens in four stages. In the first stage, we replace certain
434// Unicode characters with escape sequences. JavaScript handles many characters
435// incorrectly, either silently deleting them, or treating them as line endings.
436
437            cx.lastIndex = 0;
438            if (cx.test(text)) {
439                text = text.replace(cx, function (a) {
440                    return '\\u' +
441                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
442                });
443            }
444
445// In the second stage, we run the text against regular expressions that look
446// for non-JSON patterns. We are especially concerned with '()' and 'new'
447// because they can cause invocation, and '=' because it can cause mutation.
448// But just to be safe, we want to reject all unexpected forms.
449
450// We split the second stage into 4 regexp operations in order to work around
451// crippling inefficiencies in IE's and Safari's regexp engines. First we
452// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
453// replace all simple value tokens with ']' characters. Third, we delete all
454// open brackets that follow a colon or comma or that begin the text. Finally,
455// we look to see that the remaining characters are only whitespace or ']' or
456// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
457
458            if (/^[\],:{}\s]*$/.
459test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
460replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
461replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
462
463// In the third stage we use the eval function to compile the text into a
464// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
465// in JavaScript: it can begin a block or an object literal. We wrap the text
466// in parens to eliminate the ambiguity.
467
468                j = eval('(' + text + ')');
469
470// In the optional fourth stage, we recursively walk the new structure, passing
471// each name/value pair to a reviver function for possible transformation.
472
473                return typeof reviver === 'function' ?
474                    walk({'': j}, '') : j;
475            }
476
477// If the text is not JSON parseable, then a SyntaxError is thrown.
478
479            throw new SyntaxError('JSON.parse');
480        };
481    }
482})();
483
484Date.prototype.toJSON = function(key){ return "123convDate123:" + (new Date(this)).getTime(); };
485
486function customStringifyDate(key, value)
487{
488	if(typeof(value) == "date") 
489		return "123convDate123:" + (new Date(value)).getTime(); 
490	return value;
491}
492function customParseDate(key, value)
493{
494	if(typeof(value) == "string" && value.indexOf("123convDate123:") == 0) 
495		return new Date(parseInt(value.substr(15)));
496	return value;
497}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.