Skip to content

Instantly share code, notes, and snippets.

@jordanbtucker
Last active March 31, 2016 18:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jordanbtucker/f740c2111cc5d8778d68 to your computer and use it in GitHub Desktop.
Save jordanbtucker/f740c2111cc5d8778d68 to your computer and use it in GitHub Desktop.
stringify functions
var stringify = function(value, replacer, space) {
var stack = [];
var indent = '';
var propertyList;
var replacerFunction;
if(typeof replacer === 'function') {
replacerFunction = replacer;
} else if(replacer instanceof Array) {
propertyList = [];
for(var i = 0; i < replacer.length; i++) {
var v = replacer[i];
var item;
if(typeof v === 'string') {
item = v;
} else if(typeof v === 'number') {
item = String(v);
} else if(v instanceof String || v instanceof Number) {
item = String(v);
}
if(item && propertyList.indexOf(item) < 0) {
propertyList.push(item);
}
}
}
if(space instanceof Number) {
space = Number(space);
} else if(space instanceof String) {
space = String(space);
}
var gap = ''
if(typeof space === 'number') {
space = Math.min(10, Math.floor(space));
for(var i = 0; i < space; i++) {
gap += ' ';
}
} else if(typeof space === 'string') {
if(space.length <= 10) {
gap = space;
} else {
gap = space.substr(0, 10);
}
}
var wrapper = { '': value };
var str = function(key, holder) {
var value = holder[key];
if(value instanceof Object) {
if(value && typeof value.toJSON === 'function') {
value = value.toJSON(key);
}
}
if(replacerFunction) {
value = replacerFunction.call(holder, key, value);
}
if(value instanceof Number) {
value = Number(value);
} else if(value instanceof String) {
value = String(value);
} else if(value instanceof Boolean) {
value = Boolean(value);
}
if(value === null) {
return 'null';
}
if(value === true) {
return 'true';
}
if(value === false) {
return 'false';
}
if(typeof value === 'string') {
return quote(value);
}
if(typeof value === 'number') {
if(isFinite(value)) {
return String(value);
} else {
return 'null';
}
}
if(typeof value === 'object') {
if(value instanceof Array) {
return ja(value);
} else {
return jo(value);
}
}
};
var quote = function(value) {
var product = '"';
for(var i = 0; i < value.length; i++) {
var c = value[i];
switch(c) {
case '"':
case '\\':
product += '\\' + c;
break;
case '\b':
product += '\\b';
break;
case '\f':
product += '\\f';
break;
case '\n':
product += '\\n';
break;
case '\r':
product += '\\r';
break;
case '\t':
product += '\\t';
break;
default:
var code = c.charCodeAt(0);
if(code < 0x20) {
product += '\\u' + ('000' + code.toString(16)).slice(-4);
} else {
product += c;
}
}
}
product += '"';
return product;
};
var jo = function(value) {
if(stack.indexOf(value) >= 0) {
throw new TypeError('Converting circular structure to JSON');
}
stack.push(value);
var stepback = indent;
indent += gap;
var k;
if(propertyList) {
k = propertyList;
} else {
k = Object.keys(value);
}
var partial = [];
for(var i = 0; i < k.length; i++) {
var p = k[i];
var strP = str(p, value);
if(strP) {
var member = quote(p);
member += ':';
if(gap) {
member += ' ';
}
member += strP;
partial.push(member);
}
}
var final;
if(partial.length === 0) {
final = '{}';
} else {
if(!gap) {
final = '{' + partial.join(',') + '}';
} else {
var separator = ',\n' + indent;
var properties = partial.join(separator);
final = '{\n' + indent + properties + '\n' + stepback + '}';
}
}
stack.pop();
indent = stepback;
return final;
};
var ja = function(value) {
if(stack.indexOf(value) >= 0) {
throw new TypeError('Converting circular structure to JSON');
}
stack.push(value);
var stepback = indent;
indent += gap;
var partial = [];
for(var i = 0; i < value.length; i++) {
var strP = str(String(i), value);
if(!strP) {
partial.push('null');
} else {
partial.push(strP);
}
}
var final;
if(partial.length === 0) {
final = '[]';
} else {
if(!gap) {
final = '[' + partial.join(',') + ']';
} else {
var separator = ',\n' + indent;
var properties = partial.join(separator);
final = '[\n' + indent + properties + '\n' + stepback + ']';
}
}
stack.pop();
indent = stepback;
return final;
};
return str('', wrapper);
};
module.exports = stringify;
var stringify5 = function(value, replacer, space) {
var stack = [];
var indent = '';
var propertyList;
var replacerFunction;
if(typeof replacer === 'function') {
replacerFunction = replacer;
} else if(replacer instanceof Array) {
propertyList = [];
for(var i = 0; i < replacer.length; i++) {
var v = replacer[i];
var item;
if(typeof v === 'string') {
item = v;
} else if(typeof v === 'number') {
item = String(v);
} else if(v instanceof String || v instanceof Number) {
item = String(v);
}
if(item && propertyList.indexOf(item) < 0) {
propertyList.push(item);
}
}
}
if(space instanceof Number) {
space = Number(space);
} else if(space instanceof String) {
space = String(space);
}
var gap = ''
if(typeof space === 'number') {
space = Math.min(10, Math.floor(space));
for(var i = 0; i < space; i++) {
gap += ' ';
}
} else if(typeof space === 'string') {
if(space.length <= 10) {
gap = space;
} else {
gap = space.substr(0, 10);
}
}
var wrapper = { '': value };
var str = function(key, holder) {
var value = holder[key];
if(value instanceof Object) {
if(value && typeof value.toJSON === 'function') {
value = value.toJSON(key);
}
}
if(replacerFunction) {
value = replacerFunction.call(holder, key, value);
}
if(value instanceof Number) {
value = Number(value);
} else if(value instanceof String) {
value = String(value);
} else if(value instanceof Boolean) {
value = Boolean(value);
}
if(value === null) {
return 'null';
}
if(value === true) {
return 'true';
}
if(value === false) {
return 'false';
}
if(typeof value === 'string') {
return quote(value);
}
if(typeof value === 'number') {
return String(value);
}
if(typeof value === 'object') {
if(value instanceof Array) {
return ja(value);
} else {
return jo(value);
}
}
};
var quote = function(value) {
var product = '"';
for(var i = 0; i < value.length; i++) {
var c = value[i];
switch(c) {
case '"':
case '\\':
product += '\\' + c;
break;
case '\b':
product += '\\b';
break;
case '\f':
product += '\\f';
break;
case '\n':
product += '\\n';
break;
case '\r':
product += '\\r';
break;
case '\t':
product += '\\t';
break;
default:
var code = c.charCodeAt(0);
if(code < 0x20) {
product += '\\u' + ('000' + code.toString(16)).slice(-4);
} else {
product += c;
}
}
}
product += '"';
return product;
};
var jo = function(value) {
if(stack.indexOf(value) >= 0) {
throw new TypeError('Converting circular structure to JSON');
}
stack.push(value);
var stepback = indent;
indent += gap;
var k;
if(propertyList) {
k = propertyList;
} else {
k = Object.keys(value);
}
var partial = [];
for(var i = 0; i < k.length; i++) {
var p = k[i];
var strP = str(p, value);
if(strP) {
var member;
if(/[_$A-Za-z][_$0-9A-Za-z]*/.test(p)) {
member = p;
} else {
member = quote(p);
}
member += ':';
if(gap) {
member += ' ';
}
member += strP;
partial.push(member);
}
}
var final;
if(partial.length === 0) {
final = '{}';
} else {
if(!gap) {
final = '{' + partial.join(',') + '}';
} else {
var separator = ',\n' + indent;
var properties = partial.join(separator) + ',';
final = '{\n' + indent + properties + '\n' + stepback + '}';
}
}
stack.pop();
indent = stepback;
return final;
};
var ja = function(value) {
if(stack.indexOf(value) >= 0) {
throw new TypeError('Converting circular structure to JSON');
}
stack.push(value);
var stepback = indent;
indent += gap;
var partial = [];
for(var i = 0; i < value.length; i++) {
var strP = str(String(i), value);
if(!strP) {
partial.push('null');
} else {
partial.push(strP);
}
}
var final;
if(partial.length === 0) {
final = '[]';
} else {
if(!gap) {
final = '[' + partial.join(',') + ']';
} else {
var separator = ',\n' + indent;
var properties = partial.join(separator) + ',';
final = '[\n' + indent + properties + '\n' + stepback + ']';
}
}
stack.pop();
indent = stepback;
return final;
};
return str('', wrapper);
};
module.exports = stringify5;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment