/usr/share/javascript/yui3/json-stringify/json-stringify.js is in libjs-yui3-full 3.5.1-1ubuntu3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 | /*
YUI 3.5.1 (build 22)
Copyright 2012 Yahoo! Inc. All rights reserved.
Licensed under the BSD License.
http://yuilibrary.com/license/
*/
YUI.add('json-stringify', function(Y) {
/**
* Provides Y.JSON.stringify method for converting objects to JSON strings.
*
* @module json
* @submodule json-stringify
* @for JSON
* @static
*/
var _JSON = (Y.config.win || {}).JSON,
Lang = Y.Lang,
isFunction= Lang.isFunction,
isObject = Lang.isObject,
isArray = Lang.isArray,
_toStr = Object.prototype.toString,
Native = (_toStr.call(_JSON) === '[object JSON]' && _JSON),
useNative = !!Native,
UNDEFINED = 'undefined',
OBJECT = 'object',
NULL = 'null',
STRING = 'string',
NUMBER = 'number',
BOOLEAN = 'boolean',
DATE = 'date',
_allowable= {
'undefined' : UNDEFINED,
'string' : STRING,
'[object String]' : STRING,
'number' : NUMBER,
'[object Number]' : NUMBER,
'boolean' : BOOLEAN,
'[object Boolean]' : BOOLEAN,
'[object Date]' : DATE,
'[object RegExp]' : OBJECT
},
EMPTY = '',
OPEN_O = '{',
CLOSE_O = '}',
OPEN_A = '[',
CLOSE_A = ']',
COMMA = ',',
COMMA_CR = ",\n",
CR = "\n",
COLON = ':',
COLON_SP = ': ',
QUOTE = '"',
// Regex used to capture characters that need escaping before enclosing
// their containing string in quotes.
_SPECIAL = /[\x00-\x07\x0b\x0e-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
// Character substitution map for common escapes and special characters.
_COMMON = [
[/\\/g, '\\\\'],
[/\"/g, '\\"'],
[/\x08/g, '\\b'],
[/\x09/g, '\\t'],
[/\x0a/g, '\\n'],
[/\x0c/g, '\\f'],
[/\x0d/g, '\\r']
],
_COMMON_LENGTH = _COMMON.length,
// In-process optimization for special character escapes that haven't yet
// been promoted to _COMMON
_CHAR = {},
// Per-char counter to determine if it's worth fast tracking a special
// character escape sequence.
_CHAR_COUNT, _CACHE_THRESHOLD;
// Utility function used to determine how to serialize a variable.
function _type(o) {
var t = typeof o;
return _allowable[t] || // number, string, boolean, undefined
_allowable[_toStr.call(o)] || // Number, String, Boolean, Date
(t === OBJECT ?
(o ? OBJECT : NULL) : // object, array, null, misc natives
UNDEFINED); // function, unknown
}
// Escapes a special character to a safe Unicode representation
function _char(c) {
if (!_CHAR[c]) {
_CHAR[c] = '\\u'+('0000'+(+(c.charCodeAt(0))).toString(16)).slice(-4);
_CHAR_COUNT[c] = 0;
}
// === to avoid this conditional for the remainder of the current operation
if (++_CHAR_COUNT[c] === _CACHE_THRESHOLD) {
_COMMON.push([new RegExp(c, 'g'), _CHAR[c]]);
_COMMON_LENGTH = _COMMON.length;
}
return _CHAR[c];
}
// Enclose escaped strings in quotes
function _string(s) {
var i, chr;
// Preprocess the string against common characters to avoid function
// overhead associated with replacement via function.
for (i = 0; i < _COMMON_LENGTH; i++) {
chr = _COMMON[i];
s = s.replace(chr[0], chr[1]);
}
// original function replace for the not-as-common set of chars
return QUOTE + s.replace(_SPECIAL, _char) + QUOTE;
}
// Adds the provided space to the beginning of every line in the input string
function _indent(s,space) {
return s.replace(/^/gm, space);
}
// JavaScript implementation of stringify (see API declaration of stringify)
function _stringify(o,w,space) {
if (o === undefined) {
return undefined;
}
var replacer = isFunction(w) ? w : null,
format = _toStr.call(space).match(/String|Number/) || [],
_date = Y.JSON.dateToString,
stack = [],
tmp,i,len;
_CHAR_COUNT = {};
_CACHE_THRESHOLD = Y.JSON.charCacheThreshold;
if (replacer || !isArray(w)) {
w = undefined;
}
// Ensure whitelist keys are unique (bug 2110391)
if (w) {
tmp = {};
for (i = 0, len = w.length; i < len; ++i) {
tmp[w[i]] = true;
}
w = tmp;
}
// Per the spec, strings are truncated to 10 characters and numbers
// are converted to that number of spaces (max 10)
space = format[0] === 'Number' ?
new Array(Math.min(Math.max(0,space),10)+1).join(" ") :
(space || EMPTY).slice(0,10);
function _serialize(h,key) {
var value = h[key],
t = _type(value),
a = [],
colon = space ? COLON_SP : COLON,
arr, i, keys, k, v;
// Per the ECMA 5 spec, toJSON is applied before the replacer is
// called. Also per the spec, Date.prototype.toJSON has been added, so
// Date instances should be serialized prior to exposure to the
// replacer. I disagree with this decision, but the spec is the spec.
if (isObject(value) && isFunction(value.toJSON)) {
value = value.toJSON(key);
} else if (t === DATE) {
value = _date(value);
}
if (isFunction(replacer)) {
value = replacer.call(h,key,value);
}
if (value !== h[key]) {
t = _type(value);
}
switch (t) {
case DATE : // intentional fallthrough. Pre-replacer Dates are
// serialized in the toJSON stage. Dates here would
// have been produced by the replacer.
case OBJECT : break;
case STRING : return _string(value);
case NUMBER : return isFinite(value) ? value+EMPTY : NULL;
case BOOLEAN : return value+EMPTY;
case NULL : return NULL;
default : return undefined;
}
// Check for cyclical references in nested objects
for (i = stack.length - 1; i >= 0; --i) {
if (stack[i] === value) {
throw new Error("JSON.stringify. Cyclical reference");
}
}
arr = isArray(value);
// Add the object to the processing stack
stack.push(value);
if (arr) { // Array
for (i = value.length - 1; i >= 0; --i) {
a[i] = _serialize(value, i) || NULL;
}
} else { // Object
// If whitelist provided, take only those keys
keys = w || value;
i = 0;
for (k in keys) {
if (keys.hasOwnProperty(k)) {
v = _serialize(value, k);
if (v) {
a[i++] = _string(k) + colon + v;
}
}
}
}
// remove the array from the stack
stack.pop();
if (space && a.length) {
return arr ?
OPEN_A + CR + _indent(a.join(COMMA_CR), space) + CR + CLOSE_A :
OPEN_O + CR + _indent(a.join(COMMA_CR), space) + CR + CLOSE_O;
} else {
return arr ?
OPEN_A + a.join(COMMA) + CLOSE_A :
OPEN_O + a.join(COMMA) + CLOSE_O;
}
}
// process the input
return _serialize({'':o},'');
}
// Double check basic native functionality. This is primarily to catch broken
// early JSON API implementations in Firefox 3.1 beta1 and beta2.
if ( Native ) {
try {
useNative = ( '0' === Native.stringify(0) );
} catch ( e ) {
useNative = false;
}
}
Y.mix(Y.namespace('JSON'),{
/**
* Leverage native JSON stringify if the browser has a native
* implementation. In general, this is a good idea. See the Known Issues
* section in the JSON user guide for caveats. The default value is true
* for browsers with native JSON support.
*
* @property useNativeStringify
* @type Boolean
* @default true
* @static
*/
useNativeStringify : useNative,
/**
* Serializes a Date instance as a UTC date string. Used internally by
* stringify. Override this method if you need Dates serialized in a
* different format.
*
* @method dateToString
* @param d {Date} The Date to serialize
* @return {String} stringified Date in UTC format YYYY-MM-DDTHH:mm:SSZ
* @deprecated Use a replacer function
* @static
*/
dateToString : function (d) {
function _zeroPad(v) {
return v < 10 ? '0' + v : v;
}
return d.getUTCFullYear() + '-' +
_zeroPad(d.getUTCMonth() + 1) + '-' +
_zeroPad(d.getUTCDate()) + 'T' +
_zeroPad(d.getUTCHours()) + COLON +
_zeroPad(d.getUTCMinutes()) + COLON +
_zeroPad(d.getUTCSeconds()) + 'Z';
},
/**
* <p>Converts an arbitrary value to a JSON string representation.</p>
*
* <p>Objects with cyclical references will trigger an exception.</p>
*
* <p>If a whitelist is provided, only matching object keys will be
* included. Alternately, a replacer function may be passed as the
* second parameter. This function is executed on every value in the
* input, and its return value will be used in place of the original value.
* This is useful to serialize specialized objects or class instances.</p>
*
* <p>If a positive integer or non-empty string is passed as the third
* parameter, the output will be formatted with carriage returns and
* indentation for readability. If a String is passed (such as "\t") it
* will be used once for each indentation level. If a number is passed,
* that number of spaces will be used.</p>
*
* @method stringify
* @param o {MIXED} any arbitrary value to convert to JSON string
* @param w {Array|Function} (optional) whitelist of acceptable object
* keys to include, or a replacer function to modify the
* raw value before serialization
* @param ind {Number|String} (optional) indentation character or depth of
* spaces to format the output.
* @return {string} JSON string representation of the input
* @static
*/
stringify : function (o,w,ind) {
return Native && Y.JSON.useNativeStringify ?
Native.stringify(o,w,ind) : _stringify(o,w,ind);
},
/**
* <p>Number of occurrences of a special character within a single call to
* stringify that should trigger promotion of that character to a dedicated
* preprocess step for future calls. This is only used in environments
* that don't support native JSON, or when useNativeStringify is set to
* false.</p>
*
* <p>So, if set to 50 and an object is passed to stringify that includes
* strings containing the special character \x07 more than 50 times,
* subsequent calls to stringify will process object strings through a
* faster serialization path for \x07 before using the generic, slower,
* replacement process for all special characters.</p>
*
* <p>To prime the preprocessor cache, set this value to 1, then call
* <code>Y.JSON.stringify("<em>(all special characters to
* cache)</em>");</code>, then return this setting to a more conservative
* value.</p>
*
* <p>Special characters \ " \b \t \n \f \r are already cached.</p>
*
* @property charCacheThreshold
* @static
* @default 100
* @type {Number}
*/
charCacheThreshold: 100
});
}, '3.5.1' ,{requires:['yui-base']});
|