@qooxdoo/framework
Version:
The JS Framework for Coders
233 lines (195 loc) • 6.11 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2008 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Sebastian Werner (wpbasti)
************************************************************************ */
/**
* Contains some common methods available to all log appenders.
*/
qx.Bootstrap.define("qx.log.appender.Util",
{
statics :
{
/**
* Converts a single log entry to HTML
*
* @signature function(entry)
* @param entry {Map} The entry to process
*/
toHtml : function(entry)
{
var output = [];
var item, msg, sub, list;
output.push("<span class='offset'>", this.formatOffset(entry.offset, 6), "</span> ");
if (entry.object)
{
if (entry.clazz) {
output.push("<span class='object' title='Object instance with hash code: " + entry.object + "'>", entry.clazz.classname, "[", entry.object, "]</span>: ");
} else {
var obj = entry.win.qx.core.ObjectRegistry.fromHashCode(entry.object, true);
if (obj) {
output.push("<span class='object' title='Object instance with hash code: " + obj.$$hash + "'>", obj.classname, "[", obj.$$hash, "]</span>: ");
}
}
}
else if (entry.clazz)
{
output.push("<span class='object'>" + entry.clazz.classname, "</span>: ");
}
var items = entry.items;
for (var i=0, il=items.length; i<il; i++)
{
item = items[i];
msg = item.text;
if (msg instanceof Array)
{
var list = [];
for (var j=0, jl=msg.length; j<jl; j++)
{
sub = msg[j];
if (typeof sub === "string") {
list.push("<span>" + this.escapeHTML(sub) + "</span>");
} else if (sub.key) {
list.push("<span class='type-key'>" + sub.key + "</span>:<span class='type-" + sub.type + "'>" + this.escapeHTML(sub.text) + "</span>");
} else {
list.push("<span class='type-" + sub.type + "'>" + this.escapeHTML(sub.text) + "</span>");
}
}
output.push("<span class='type-" + item.type + "'>");
if (item.type === "map") {
output.push("{", list.join(", "), "}");
} else {
output.push("[", list.join(", "), "]");
}
output.push("</span>");
}
else
{
output.push("<span class='type-" + item.type + "'>" + this.escapeHTML(msg) + "</span> ");
}
}
var wrapper = document.createElement("DIV");
wrapper.innerHTML = output.join("");
wrapper.className = "level-" + entry.level;
return wrapper;
},
/**
* Formats a numeric time offset to 6 characters.
*
* @param offset {Integer} Current offset value
* @param length {Integer?6} Refine the length
* @return {String} Padded string
*/
formatOffset : function(offset, length)
{
var str = offset.toString();
var diff = (length||6) - str.length;
var pad = "";
for (var i=0; i<diff; i++) {
pad += "0";
}
return pad+str;
},
/**
* Escapes the HTML in the given value
*
* @param value {String} value to escape
* @return {String} escaped value
*/
escapeHTML : function(value) {
return String(value).replace(/[<>&"']/g, this.__escapeHTMLReplace);
},
/**
* Internal replacement helper for HTML escape.
*
* @param ch {String} Single item to replace.
* @return {String} Replaced item
*/
__escapeHTMLReplace : function(ch)
{
var map =
{
"<" : "<",
">" : ">",
"&" : "&",
"'" : "'",
'"' : """
};
return map[ch] || "?";
},
/**
* Converts a single log entry to plain text
*
* @param entry {Map} The entry to process
* @return {String} the formatted log entry
*/
toText : function(entry) {
return this.toTextArray(entry).join(" ");
},
/**
* Converts a single log entry to an array of plain text
*
* @param entry {Map} The entry to process
* @return {Array} Argument list ready message array.
*/
toTextArray : function(entry)
{
var output = [];
output.push(this.formatOffset(entry.offset, 6));
if (entry.object)
{
if (entry.clazz) {
output.push(entry.clazz.classname + "[" + entry.object + "]:");
} else {
var obj = entry.win.qx.core.ObjectRegistry.fromHashCode(entry.object, true);
if (obj) {
output.push(obj.classname + "[" + obj.$$hash + "]:");
}
}
}
else if (entry.clazz) {
output.push(entry.clazz.classname + ":");
}
var items = entry.items;
var item, msg;
for (var i=0, il=items.length; i<il; i++)
{
item = items[i];
msg = item.text;
if (item.trace && item.trace.length > 0) {
if (typeof(this.FORMAT_STACK) == "function") {
qx.log.Logger.deprecatedConstantWarning(qx.log.appender.Util,
"FORMAT_STACK",
"Use qx.dev.StackTrace.FORMAT_STACKTRACE instead");
msg += "\n" + this.FORMAT_STACK(item.trace);
} else {
msg += "\n" + item.trace;
}
}
if (msg instanceof Array)
{
var list = [];
for (var j=0, jl=msg.length; j<jl; j++) {
list.push(msg[j].text);
}
if (item.type === "map") {
output.push("{", list.join(", "), "}");
} else {
output.push("[", list.join(", "), "]");
}
}
else
{
output.push(msg);
}
}
return output;
}
}
});