mubot-server
Version:
A server for mubot
129 lines (123 loc) • 5.71 kB
JavaScript
"use strict";
angular.module("jsonFormatter", ["RecursionHelper"]).provider("JSONFormatterConfig", function() {
var n = !1,
e = 100,
t = 5;
return {
get hoverPreviewEnabled() {
return n
},
set hoverPreviewEnabled(e) {
n = !!e
},
get hoverPreviewArrayCount() {
return e
},
set hoverPreviewArrayCount(n) {
e = parseInt(n, 10)
},
get hoverPreviewFieldCount() {
return t
},
set hoverPreviewFieldCount(n) {
t = parseInt(n, 10)
},
$get: function() {
return {
hoverPreviewEnabled: n,
hoverPreviewArrayCount: e,
hoverPreviewFieldCount: t
}
}
}
}).directive("jsonFormatter", ["RecursionHelper", "JSONFormatterConfig", function(n, e) {
function t(n) {
return n.replace('"', '"')
}
function r(n) {
if (void 0 === n) return "";
if (null === n) return "Object";
if ("object" == typeof n && !n.constructor) return "Object";
var e = /function (.{1,})\(/,
t = e.exec(n.constructor.toString());
return t && t.length > 1 ? t[1] : ""
}
function o(n) {
return null === n ? "null" : typeof n
}
function s(n, e) {
var r = o(n);
// Hacked out 'r' and replaced it with '"Loading..."'.
return "null" === r || "undefined" === r ? "Loading..." : ("string" === r && (e = '"' + t(e) + '"'), "function" === r ? n.toString().replace(/[\r\n]/g, "").replace(/\{.*\}/, "") + "{…}" : e)
}
function i(n) {
var e = "";
return angular.isObject(n) ? (e = r(n), angular.isArray(n) && (e += "[" + n.length + "]")) : e = s(n, n), e
}
function a(n) {
n.isArray = function() {
return angular.isArray(n.json)
}, n.isObject = function() {
return angular.isObject(n.json)
}, n.getKeys = function() {
return n.isObject() ? Object.keys(n.json).map(function(n) {
return "" === n ? '""' : n
}) : void 0
}, n.type = o(n.json), n.hasKey = "undefined" != typeof n.key, n.getConstructorName = function() {
return r(n.json)
}, "string" === n.type && ("Invalid Date" !== new Date(n.json).toString() && (n.isDate = !0), 0 === n.json.indexOf("http") && (n.isUrl = !0)), n.isEmptyObject = function() {
return n.getKeys() && !n.getKeys().length && n.isOpen && !n.isArray()
}, n.isOpen = !!n.open, n.toggleOpen = function() {
n.isOpen = !n.isOpen
}, n.childrenOpen = function() {
return n.open > 1 ? n.open - 1 : 0
}, n.openLink = function(e) {
e && (window.location.href = n.json)
}, n.parseValue = function(e) {
return s(n.json, e)
}, n.showThumbnail = function() {
return !!e.hoverPreviewEnabled && n.isObject() && !n.isOpen
}, n.getThumbnail = function() {
if (n.isArray()) return n.json.length > e.hoverPreviewArrayCount ? "Array[" + n.json.length + "]" : "[" + n.json.map(i).join(", ") + "]";
var t = n.getKeys(),
r = t.slice(0, e.hoverPreviewFieldCount),
o = r.map(function(e) {
return e + ":" + i(n.json[e])
}),
s = t.length >= 5 ? "…" : "";
return "{" + o.join(", ") + s + "}"
}
}
return {
templateUrl: "json-formatter.html",
restrict: "E",
replace: !0,
scope: {
json: "=",
key: "=",
open: "="
},
compile: function(e) {
return n.compile(e, a)
}
}
}]), "object" == typeof module && (module.exports = "jsonFormatter"), angular.module("RecursionHelper", []).factory("RecursionHelper", ["$compile", function(n) {
return {
compile: function(e, t) {
angular.isFunction(t) && (t = {
post: t
});
var r, o = e.contents().remove();
return {
pre: t && t.pre ? t.pre : null,
post: function(e, s) {
r || (r = n(o)), r(e, function(n) {
s.append(n)
}), t && t.post && t.post.apply(null, arguments)
}
}
}
}
}]), angular.module("jsonFormatter").run(["$templateCache", function(n) {
n.put("json-formatter.html", '<div ng-init="isOpen = open && open > 0" class="json-formatter-row"><a ng-click="toggleOpen()"><span class="toggler {{isOpen ? \'open\' : \'\'}}" ng-if="isObject()"></span> <span class="key" ng-if="hasKey"><span class="key-text">{{key}}</span><span class="colon">:</span></span> <span class="value"><span ng-if="isObject()"><span class="constructor-name">{{getConstructorName(json)}}</span> <span ng-if="isArray()"><span class="bracket">[</span><span class="number">{{json.length}}</span><span class="bracket">]</span></span></span> <span ng-if="!isObject()" ng-click="openLink(isUrl)" class="{{type}}" ng-class="{date: isDate, url: isUrl}">{{parseValue(json)}}</span></span> <span ng-if="showThumbnail()" class="thumbnail-text">{{getThumbnail()}}</span></a><div class="children" ng-if="getKeys().length && isOpen"><json-formatter ng-repeat="key in getKeys() track by $index" json="json[key]" key="key" open="childrenOpen()"></json-formatter></div><div class="children empty object" ng-if="isEmptyObject()"></div><div class="children empty array" ng-if="getKeys() && !getKeys().length && isOpen && isArray()"></div></div>')
}]);