Last active
March 31, 2016 18:07
-
-
Save jordanbtucker/f740c2111cc5d8778d68 to your computer and use it in GitHub Desktop.
stringify functions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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