forked from anseki/leader-line
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtraceLog.js
81 lines (71 loc) · 2.42 KB
/
traceLog.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* exported traceLog */
var traceLog = (function() {
'use strict';
function getMessage() {
var args = Array.prototype.slice.call(arguments),
message = args.shift() + '';
if (!args.length) { return message; }
message = message.replace(/%([odifs_])/g, function(s, param) {
var arg;
if (!args.length) { return ''; }
arg = args.shift();
if (param === 'o') {
return arg + '';
} else if (param === 'd' || param === 'i') {
arg = typeof arg === 'boolean' ? (arg ? 1 : 0) : parseInt(arg, 10);
return isNaN(arg) ? '0' : arg + '';
} else if (param === 'f') {
arg = typeof arg === 'boolean' ? (arg ? 1 : 0) : parseFloat(arg);
return isNaN(arg) ? '0.000000' : arg.toFixed(6) + '';
} else if (param === '_') { // drop arg
return '';
}
return arg + '';
});
if (message) { args.unshift(message); }
return args.join(' ');
}
var
tags = {}, tagStack = [], reTag = /^<(\/)?(.+?)>$/,
traceLog = {
log: [],
enabled: false,
getOpenCloseTags: false, // Contain tags for TaggedLog
add: function() {
var message, i, matches, tagName, iStack;
if (traceLog.enabled) {
traceLog.log.push((message = getMessage.apply(null, arguments)));
i = traceLog.log.length - 1;
if ((matches = reTag.exec(message))) {
tagName = matches[2];
if (matches[1]) { // end tag
if (tagStack.length && tagStack[tagStack.length - 1] === tagName) {
tagStack.pop();
} else if ((iStack = tagStack.lastIndexOf(tagName)) > -1) {
console.warn('Droped from stack: ' + tagStack.splice(iStack));
} else {
throw new Error('Not found tag: ' + tagName);
}
} else { // start tag
tagStack.push(tagName);
tags[tagName] = tags[tagName] || [];
}
if (traceLog.getOpenCloseTags) { tags[tagName].push(i); }
} else if (tagStack.length) {
tags[tagStack[tagStack.length - 1]].push(i);
}
}
},
getTaggedLog: function(tagName) {
return tags[tagName] ?
tags[tagName].map(function(i) { return traceLog.log[i]; }) :
null;
},
clear: function() {
traceLog.log = [];
tags = {};
tagStack = [];
}
};
return traceLog;
})();