summaryrefslogtreecommitdiff
path: root/share/www/script/futon.format.js
diff options
context:
space:
mode:
authorChristopher Lenz <cmlenz@apache.org>2009-01-12 21:06:35 +0000
committerChristopher Lenz <cmlenz@apache.org>2009-01-12 21:06:35 +0000
commita58246859370c52b5209fe94a043bdcc7f8b7001 (patch)
tree9cdc1bb00a2b007a2b1bd057a35777532b4b995d /share/www/script/futon.format.js
parentd51618067f7d2fcb8fa751ddb89e4c9693d0b52c (diff)
Add syntax highlighting of JSON code in Futon.
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@733897 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'share/www/script/futon.format.js')
-rw-r--r--share/www/script/futon.format.js118
1 files changed, 118 insertions, 0 deletions
diff --git a/share/www/script/futon.format.js b/share/www/script/futon.format.js
new file mode 100644
index 00000000..b8870a94
--- /dev/null
+++ b/share/www/script/futon.format.js
@@ -0,0 +1,118 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+(function($) {
+ $.futon = $.futon || {};
+ $.extend($.futon, {
+
+ // JSON pretty printing
+ formatJSON: function(val, options) {
+ options = options || {};
+ if (options.indent === undefined) {
+ options.indent = 4;
+ }
+ options.indent = options.indent !== undefined ? options.indent : 4;
+ options.linesep = options.linesep !== undefined ? options.linesep : "\n";
+ options.quoteKeys = options.quoteKeys !== undefined ? options.quoteKeys : true;
+ var itemsep = options.linesep.length ? "," + options.linesep : ", ";
+
+ function escape(string) {
+ return string.replace(/&/g, "&amp;")
+ .replace(/</g, "&lt;")
+ .replace(/>/g, "&gt;");
+ }
+
+ function format(val, depth) {
+ var tab = [];
+ for (var i = 0; i < options.indent * depth; i++) tab.push("");
+ tab = tab.join(" ");
+
+ var type = typeof val;
+ switch (type) {
+ case "boolean":
+ case "number":
+ case "string":
+ var retval = JSON.stringify(val);
+ if (options.html) {
+ retval = "<code class='" + type + "'>" + escape(retval) + "</code>";
+ }
+ return retval;
+
+ case "object": {
+ if (val === null) {
+ if (options.html) {
+ return "<code class='null'>null</code>";
+ }
+ return "null";
+ }
+ if (val.constructor == Date) {
+ return JSON.stringify(val);
+ }
+
+ var buf = [];
+
+ if (val.constructor == Array) {
+ buf.push("[");
+ for (var index = 0; index < val.length; index++) {
+ buf.push(index > 0 ? itemsep : options.linesep);
+ buf.push(tab, format(val[index], depth + 1));
+ }
+ if (index >= 0) buf.push(options.linesep, tab.substr(options.indent));
+ buf.push("]");
+
+ } else {
+ buf.push("{");
+ var index = 0;
+ for (var key in val) {
+ if (!val.hasOwnProperty(key)) continue;
+ buf.push(index > 0 ? itemsep : options.linesep);
+ var keyDisplay = options.quoteKeys ? JSON.stringify(key) : key;
+ if (options.html) {
+ if (options.quoteKeys) {
+ keyDisplay = keyDisplay.substr(1, keyDisplay.length - 2);
+ }
+ keyDisplay = "<code class='key'>" + escape(keyDisplay) + "</code>";
+ if (options.quoteKeys) {
+ keyDisplay = '"' + keyDisplay + '"';
+ }
+ }
+ buf.push(tab, keyDisplay,
+ ": ", format(val[key], depth + 1));
+ index++;
+ }
+ if (index >= 0) buf.push(options.linesep, tab.substr(options.indent));
+ buf.push("}");
+ }
+
+ return buf.join("");
+ }
+ }
+ }
+
+ return format(val, 1);
+ },
+
+ // File size pretty printing
+ formatSize: function(size) {
+ var jump = 512;
+ if (size < jump) return size + " bytes";
+ var units = ["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
+ var i = 0;
+ while (size >= jump && i < units.length) {
+ i += 1;
+ size /= 1024
+ }
+ return size.toFixed(1) + ' ' + units[i - 1];
+ }
+
+ });
+})(jQuery);