92 lines
2.7 KiB
JavaScript
92 lines
2.7 KiB
JavaScript
|
#!/usr/bin/env node
|
||
|
|
||
|
/**
|
||
|
* Manual formatter taken straight from https://github.com/umbrae/jsonlintdotcom
|
||
|
**/
|
||
|
|
||
|
/*jslint white: true, devel: true, onevar: true, browser: true, undef: true, nomen: true, regexp: true, plusplus: false, bitwise: true, newcap: true, maxerr: 50, indent: 4 */
|
||
|
|
||
|
/**
|
||
|
* jsl.format - Provide json reformatting in a character-by-character approach, so that even invalid JSON may be reformatted (to the best of its ability).
|
||
|
*
|
||
|
**/
|
||
|
var formatter = (function () {
|
||
|
|
||
|
function repeat(s, count) {
|
||
|
return new Array(count + 1).join(s);
|
||
|
}
|
||
|
|
||
|
function formatJson(json, indentChars) {
|
||
|
var i = 0,
|
||
|
il = 0,
|
||
|
tab = (typeof indentChars !== "undefined") ? indentChars : " ",
|
||
|
newJson = "",
|
||
|
indentLevel = 0,
|
||
|
inString = false,
|
||
|
currentChar = null;
|
||
|
|
||
|
for (i = 0, il = json.length; i < il; i += 1) {
|
||
|
currentChar = json.charAt(i);
|
||
|
|
||
|
switch (currentChar) {
|
||
|
case '{':
|
||
|
case '[':
|
||
|
if (!inString) {
|
||
|
newJson += currentChar + "\n" + repeat(tab, indentLevel + 1);
|
||
|
indentLevel += 1;
|
||
|
} else {
|
||
|
newJson += currentChar;
|
||
|
}
|
||
|
break;
|
||
|
case '}':
|
||
|
case ']':
|
||
|
if (!inString) {
|
||
|
indentLevel -= 1;
|
||
|
newJson += "\n" + repeat(tab, indentLevel) + currentChar;
|
||
|
} else {
|
||
|
newJson += currentChar;
|
||
|
}
|
||
|
break;
|
||
|
case ',':
|
||
|
if (!inString) {
|
||
|
newJson += ",\n" + repeat(tab, indentLevel);
|
||
|
} else {
|
||
|
newJson += currentChar;
|
||
|
}
|
||
|
break;
|
||
|
case ':':
|
||
|
if (!inString) {
|
||
|
newJson += ": ";
|
||
|
} else {
|
||
|
newJson += currentChar;
|
||
|
}
|
||
|
break;
|
||
|
case ' ':
|
||
|
case "\n":
|
||
|
case "\t":
|
||
|
if (inString) {
|
||
|
newJson += currentChar;
|
||
|
}
|
||
|
break;
|
||
|
case '"':
|
||
|
if (i > 0 && json.charAt(i - 1) !== '\\') {
|
||
|
inString = !inString;
|
||
|
}
|
||
|
newJson += currentChar;
|
||
|
break;
|
||
|
default:
|
||
|
newJson += currentChar;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return newJson;
|
||
|
}
|
||
|
|
||
|
return { "formatJson": formatJson };
|
||
|
|
||
|
}());
|
||
|
|
||
|
if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
|
||
|
exports.formatter = formatter;
|
||
|
}
|