// Human Readable JSON Greasemonkey Script v0.1.1
// Copyright 2007 Gerald Kaszuba
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
// --------------------------------------------------------------------
//
// ==UserScript==
// @name Human Readable JSON
// @namespace http://misc.slowchop.com/misc/wiki/HumanReadableJSONGreasemonkey
// @description Adds line breaks and indentation to a JSON response, making it easier to read.
// @include http://misc.slowchop.com/misc/wiki/HumanReadableJSONGreasemonkey/JsonExample?format=txt
// ==/UserScript==
/*
JSON pretty print borrowed and slightly modified from http://www.matsblog.com/stories/2075888/
*/
(function () {
var INTEND = " ";
var NEWLINE = "\n";
var pPr = false;
var intendLevel = 0;
var intend = function(a) {
if (!pPr) return a;
for (var l=0; l<intendLevel; l++) {
a[a.length] = INTEND;
}
return a;
};
var newline = function(a) {
if (pPr) a[a.length] = NEWLINE;
return a;
};
var m = {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"' : '\\"',
'\\': '\\\\'
},
s = {
array: function (x) {
var a = ['['], b, f, i, l = x.length, v;
a = newline(a);
intendLevel++;
for (i = 0; i < l; i += 1) {
v = x[i];
f = s[typeof v];
if (f) {
v = f(v);
if (typeof v == 'string') {
if (b) {
a[a.length] = ',';
a = newline(a);
}
a = intend(a);
a[a.length] = v;
b = true;
}
}
}
intendLevel--;
a = newline(a);
a = intend(a);
a[a.length] = ']';
return a.join('');
},
'boolean': function (x) {
return String(x);
},
'null': function (x) {
return "null";
},
number: function (x) {
return isFinite(x) ? String(x) : 'null';
},
object: function (x, formatedOutput) {
if (x) {
if (x instanceof Array) {
return s.array(x);
}
var a = ['{'], b, f, i, v;
a = newline(a);
intendLevel++;
for (i in x) {
v = x[i];
f = s[typeof v];
if (f) {
v = f(v);
if (typeof v == 'string') {
if (b) {
a[a.length] = ',';
a = newline(a);
}
a = intend(a);
a.push(s.string(i), ((pPr) ? ': ' : ':'), v);
b = true;
}
}
}
intendLevel--;
a = newline(a);
a = intend(a);
a[a.length] = '}';
return a.join('');
}
return 'null';
},
string: function (x) {
if (/["\\\x00-\x1f]/.test(x)) {
x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
var c = m[b];
if (c) {
return c;
}
c = b.charCodeAt();
return '\\u00' +
Math.floor(c / 16).toString(16) +
(c % 16).toString(16);
});
}
return '"' + x + '"';
}
};
Object.prototype.toJSONString = function (prettyPrint) {
pPr = prettyPrint;
return s.object(this);
};
Array.prototype.toJSONString = function (prettyPrint) {
pPr = prettyPrint;
return s.array(this);
};
})();
String.prototype.parseJSON = function () {
try {
return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
this.replace(/"(\\.|[^"\\])*"/g, ''))) &&
eval('(' + this + ')');
} catch (e) {
return false;
}
};
window.addEventListener(
'load',
function() {
jsonTag = document.getElementsByTagName('pre')[0];
if (!jsonTag)
return;
jsonText = jsonTag.textContent;
jsonObj = jsonText.parseJSON();
prettyJson = jsonObj.toJSONString(true);
jsonTag.textContent = prettyJson;
},
true);
// vim: ts=4 sw=4 expandtab