/** * 将对象处理成json格式化和着色的html * @author 暮光:城中城 * @since 2017年5月7日 */ var Formatjson = { // 需要在对象或列表后面添加注释的对象,例:{userList: "用户列表"} // 那么在名字为userList的对象或列表后面都会加上:“用户列表” 这个注释 annotationObject: {}, tabStr: " ", isArray: function(obj) { return obj && typeof obj === 'object' && typeof obj.length === 'number' && !(obj.propertyIsEnumerable('length')); }, processObjectToHtmlPre: function(obj, indent, addComma, isArray, isPropertyContent, showAnnotation) { var htmlStr = this.processObject(obj, "", indent, addComma, isArray, isPropertyContent, showAnnotation); htmlStr = '
' + htmlStr + '
'; return htmlStr; }, processObject: function(obj, keyName, indent, addComma, isArray, isPropertyContent, showAnnotation) { var html = ""; var comma = (addComma) ? ", " : ""; var type = typeof obj; if (this.isArray(obj)) { if (obj.length == 0) { html += this.getRow(indent, "[ ]" + comma, isPropertyContent); } else { var clpsHtml = ''; var annotation = ''; if(showAnnotation && isNotEmpty(keyName) && isNotEmpty(this.annotationObject[keyName])) { annotation = '// '+this.annotationObject[keyName]+''; } html += this.getRow(indent, "["+clpsHtml+annotation, isPropertyContent); for (var i = 0; i < obj.length; i++) { html += this.processObject(obj[i], "", indent + 1, i < (obj.length - 1), true, false, showAnnotation); } clpsHtml = ""; html += this.getRow(indent, clpsHtml + "]" + comma); } } else if (type == 'object' && obj == null) { html += this.formatLiteral("null", "", comma, indent, isArray, "null"); } else if (type == 'object') { var numProps = 0; for ( var prop in obj) { numProps++; } if (numProps == 0) { html += this.getRow(indent, "{ }" + comma, isPropertyContent); } else { var clpsHtml = ''; var annotation = ''; if(showAnnotation && isNotEmpty(keyName) && isNotEmpty(this.annotationObject[keyName])) { annotation = '// '+this.annotationObject[keyName]+''; } html += this.getRow(indent, "{"+clpsHtml+annotation, isPropertyContent); var j = 0; for ( var prop in obj) { var processStr = '"' + prop + '": ' + this.processObject(obj[prop], prop, indent + 1, ++j < numProps, false, true, showAnnotation); html += this.getRow(indent + 1, processStr); } clpsHtml = ""; html += this.getRow(indent, clpsHtml + "}" + comma); } } else if (type == 'number') { html += this.formatLiteral(obj, "", comma, indent, isArray, "number"); } else if (type == 'boolean') { html += this.formatLiteral(obj, "", comma, indent, isArray, "boolean"); } else if (type == 'function') { obj = this.formatFunction(indent, obj); html += this.formatLiteral(obj, "", comma, indent, isArray, "function"); } else if (type == 'undefined') { html += this.formatLiteral("undefined", "", comma, indent, isArray, "null"); } else { html += this.formatLiteral(obj, "\"", comma, indent, isArray, "string"); } return html; }, expImgClicked: function(img){ var container = img.parentNode.nextSibling; if(!container) return; var disp = "none"; var src = "webjars/doc-wiki/img/collapsed.png"; if(container.style.display == "none"){ disp = "inline"; src = "webjars/doc-wiki/img/expanded.png"; } container.style.display = disp; img.src = src; }, formatLiteral: function(literal, quote, comma, indent, isArray, style) { if (typeof literal == 'string') { literal = literal.split("<").join("<").split(">").join(">"); } var str = "" + quote + literal + quote + comma + ""; if (isArray) { str = this.getRow(indent, str); } return str; }, formatFunction: function(indent, obj) { var tabs = ""; for (var i = 0; i < indent; i++) { tabs += this.tabStr; } var funcStrArray = obj.toString().split("\n"); var str = ""; for (var i = 0; i < funcStrArray.length; i++) { str += ((i == 0) ? "" : tabs) + funcStrArray[i] + "\n"; } return str; }, getRow: function(indent, data, isPropertyContent) { var tabs = ""; for (var i = 0; i < indent && !isPropertyContent; i++) { tabs += this.tabStr; } if (data != null && data.length > 0 && data.charAt(data.length - 1) != "\n") { data = data + "\n"; } return tabs + data; } }