Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
// ==UserScript==
// @name Firebug JSON formatting
// @namespace http://efcl.info/
// @include main
// ==/UserScript==
/*
参考
Firebug Chrome Authority
http://d.hatena.ne.jp/Griever/
*/
(function(){
/**
* @version 0.1.1
*/
var JSONDecoder = {};
/**
* typeofの拡張
* ArrayとかRegExpとかnullとかも判別する
*/
JSONDecoder.typeOf = function(value) {
var type = typeof value;
switch (type) {
case "object":
if (value instanceof Array) {
type = "array";
} else if (!(value instanceof Object)) {
type = "null";
}
//no break
case "function":
if (value instanceof RegExp) {
type = "regexp";
}
break;
}
return type;
}
/**
* JSONをFirebugのコンソールに書き出す
*/
JSONDecoder.toConsole = function(json) {
Application.console.log(json);
JSONDecoder.out = function(line) { Application.console.log(line); };
JSONDecoder.decode("", json, "");
}
JSONDecoder.toString = function(json) {
var decoded = "";
JSONDecoder.out = function(line) { decoded += (line + "\n"); };
JSONDecoder.decode("", json, "");
return decoded;
}
/**
* JSONを解析する
*/
JSONDecoder.decode = function(index, value, indent) {
var type = JSONDecoder.typeOf(value);
var pack = undefined;
switch (type) { //型別に見やすくする
case "object" :
pack = ["{", "}"];
break;
case "array" :
pack = ["[", "]"];
break;
case "function" :
type = "";
//no break
case "string" :
value = value.toString().replace(/\n/g, "\n" + indent); //全体をインデント
break;
case "undefined" :
type = "";
value = "undefined";
break;
case "null" :
type = "";
value = "null";
break;
}
if (type) {
type = " (" + type + ")"; //整形
}
if (pack) { //子要素がある場合は再帰処理
JSONDecoder.out(indent + index + type + pack[0]);
for (var i in value) {
JSONDecoder.decode(i, value[i], indent + "\t");
}
JSONDecoder.out(indent + pack[1]);
} else {
JSONDecoder.out(indent + index + type + ": " + value);
}
}
/**
* 文字列をObjectに変換する
*/
JSONDecoder.str2json = function(str) {
try {
eval("var json = " + str + ";");
return json;
} catch (e) {
return false;
}
}
var commandLine = document.getElementById('fbLargeCommandLine');
var toolbar = document.getElementById('fbCommandToolbar');
var Chrome = document.createElement('toolbarbutton');
Chrome.setAttribute('label', 'JSON');
toolbar.insertBefore(Chrome, toolbar.lastChild);
Chrome.addEventListener('command', function(){
JSONDecoder.toConsole(JSONDecoder.str2json(commandLine.value));
},false)
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.