netstack.js 2.1.0 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/netstack.js +86 -34
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -49,7 +49,7 @@ const stack = new netStack('.stacktrace', {
|
|
|
49
49
|
});
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
#### Ready to go
|
|
52
|
+
#### Ready to go CSS
|
|
53
53
|
```css
|
|
54
54
|
pre, code {background-color:#333; color: #ffffff;}
|
|
55
55
|
.st-type {color: #0a8472; font-weight: bolder;}
|
|
@@ -64,4 +64,4 @@ pre, code {background-color:#333; color: #ffffff;}
|
|
|
64
64
|
---
|
|
65
65
|
### Acknowledgments
|
|
66
66
|
|
|
67
|
-
* [IgoR-NiK](https://github.com/IgoR-NiK)
|
|
67
|
+
* [IgoR-NiK](https://github.com/IgoR-NiK)
|
package/netstack.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* netStack v2.1.
|
|
2
|
+
* netStack v2.1.2
|
|
3
3
|
* A simple and easy JavaScript library for highlighting .NET stack traces
|
|
4
4
|
* License: Apache 2
|
|
5
5
|
* Author: https://elmah.io
|
|
@@ -76,6 +76,8 @@
|
|
|
76
76
|
return null;
|
|
77
77
|
};
|
|
78
78
|
|
|
79
|
+
netStack.prototype.allEqual = arr => arr.every(val => val === arr[0]);
|
|
80
|
+
|
|
79
81
|
netStack.prototype.replacer = function(args, at_language) {
|
|
80
82
|
if (args[0].substring(0).match(/(-{3}>)/)) {
|
|
81
83
|
return '\r\n ' + args[0];
|
|
@@ -86,7 +88,7 @@
|
|
|
86
88
|
}
|
|
87
89
|
};
|
|
88
90
|
|
|
89
|
-
netStack.prototype.formatException = function(exceptionMessage, at_language) {
|
|
91
|
+
netStack.prototype.formatException = function(exceptionMessage, at_language, loop, position) {
|
|
90
92
|
var result = exceptionMessage || '';
|
|
91
93
|
var searchReplaces = [
|
|
92
94
|
{
|
|
@@ -104,7 +106,12 @@
|
|
|
104
106
|
];
|
|
105
107
|
|
|
106
108
|
var self = this;
|
|
107
|
-
searchReplaces.forEach(function(item) {
|
|
109
|
+
searchReplaces.forEach(function(item, index) {
|
|
110
|
+
// multilanguage, skip --- lines
|
|
111
|
+
if (loop === true && position > 0 && index === 1) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
108
115
|
if (item.repl == null) {
|
|
109
116
|
result = result.replace(item.find, function() {
|
|
110
117
|
return self.replacer(arguments, at_language);
|
|
@@ -116,61 +123,106 @@
|
|
|
116
123
|
return result;
|
|
117
124
|
};
|
|
118
125
|
|
|
126
|
+
netStack.prototype.detectLanguagesInOrder = function(input, regexes) {
|
|
127
|
+
let matches = [];
|
|
128
|
+
|
|
129
|
+
for (let [language, regex] of Object.entries(regexes)) {
|
|
130
|
+
let match;
|
|
131
|
+
while ((match = regex.exec(input)) !== null) {
|
|
132
|
+
matches.push({ language, index: match.index });
|
|
133
|
+
}
|
|
134
|
+
regex.lastIndex = 0;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
matches.sort((a, b) => a.index - b.index);
|
|
138
|
+
|
|
139
|
+
return matches.map((match) => match.language);
|
|
140
|
+
};
|
|
141
|
+
|
|
119
142
|
netStack.prototype.init = function() {
|
|
120
143
|
// Get the stacktrace, sanitize it, and split it into lines
|
|
121
|
-
var stacktrace = this.element.textContent,
|
|
144
|
+
var stacktrace = this.element.textContent.trim(), // trim empty spaces and lines before and after stacktrace
|
|
122
145
|
sanitizedStack = stacktrace.replace(/</g, '<').replace(/>/g, '>'),
|
|
123
146
|
lines = sanitizedStack.split('\n'),
|
|
124
147
|
lang = '',
|
|
125
148
|
clone = '';
|
|
126
149
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
150
|
+
var languagesRegex = {
|
|
151
|
+
english: /\s+at .*?\)/g,
|
|
152
|
+
danish: /\s+ved .*?\)/g,
|
|
153
|
+
german: /\s+bei .*?\)/g,
|
|
154
|
+
spanish: /\s+en .*?\)/g,
|
|
155
|
+
russian: /\s+в .*?\)/g,
|
|
156
|
+
chinese: /\s+在 .*?\)/g
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// look for the language(s) in the stack trace
|
|
160
|
+
lang = this.detectLanguagesInOrder(lines, languagesRegex);
|
|
161
|
+
|
|
162
|
+
// if no language is found, return
|
|
163
|
+
if (lang.length === 0) return;
|
|
164
|
+
|
|
165
|
+
// if multiline option is true, check if the language is the same for all lines
|
|
166
|
+
if (typeof lang === 'object') {
|
|
167
|
+
if (this.allEqual(lang)) {
|
|
168
|
+
lang = lang[0];
|
|
145
169
|
}
|
|
146
170
|
}
|
|
147
171
|
|
|
148
|
-
if
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
172
|
+
// if lang is an array, we have multiple languages
|
|
173
|
+
if (Array.isArray(lang)) {
|
|
174
|
+
var selectedLanguage = [];
|
|
175
|
+
for (var i = 0; i < lang.length; ++i) {
|
|
176
|
+
selectedLanguage.push(this.search(lang[i], this.languages));
|
|
177
|
+
}
|
|
178
|
+
this.language = 'multilanguage';
|
|
179
|
+
} else if (typeof lang === 'string') {
|
|
180
|
+
var selectedLanguage = this.search(lang, this.languages);
|
|
181
|
+
this.language = selectedLanguage.name;
|
|
182
|
+
}
|
|
152
183
|
|
|
153
184
|
// Pritty print result if is set to true
|
|
154
185
|
if (this.settings.prettyprint) {
|
|
155
|
-
|
|
186
|
+
if (Array.isArray(selectedLanguage)) {
|
|
187
|
+
var sanitizedStacks = sanitizedStack;
|
|
188
|
+
const selectedLanguages = [...new Set(selectedLanguage)];
|
|
189
|
+
selectedLanguages.forEach((language, index) => {
|
|
190
|
+
sanitizedStacks = this.formatException(sanitizedStacks, language.at, true, index);
|
|
191
|
+
});
|
|
192
|
+
sanitizedStack = sanitizedStacks;
|
|
193
|
+
} else {
|
|
194
|
+
sanitizedStack = this.formatException(sanitizedStack, selectedLanguage.at);
|
|
195
|
+
}
|
|
196
|
+
|
|
156
197
|
lines = sanitizedStack.split('\n');
|
|
157
198
|
}
|
|
158
199
|
|
|
200
|
+
if (Array.isArray(selectedLanguage)) {
|
|
201
|
+
var langContor = 0;
|
|
202
|
+
}
|
|
203
|
+
|
|
159
204
|
for (var i = 0; i < lines.length; ++i) {
|
|
160
205
|
var li = lines[i],
|
|
161
|
-
hli = new RegExp('(\\S*)' + selectedLanguage.at + ' .*\\)')
|
|
206
|
+
hli = new RegExp('(\\S*)' + selectedLanguage.at + ' .*\\)'),
|
|
207
|
+
languageSet = selectedLanguage;
|
|
208
|
+
|
|
209
|
+
if (Array.isArray(selectedLanguage)) {
|
|
210
|
+
hli = new RegExp('(\\S*)' + selectedLanguage[langContor].at + ' .*\\)');
|
|
211
|
+
languageSet = selectedLanguage[langContor];
|
|
212
|
+
hli.test(lines[i]) ? langContor++ : langContor;
|
|
213
|
+
}
|
|
162
214
|
|
|
163
215
|
if (hli.test(lines[i])) {
|
|
164
216
|
|
|
165
217
|
// Frame
|
|
166
|
-
var regFrame = new RegExp('(\\S*)' +
|
|
218
|
+
var regFrame = new RegExp('(\\S*)' + languageSet.at + ' .*?\\)'),
|
|
167
219
|
partsFrame = String(regFrame.exec(lines[i]));
|
|
168
220
|
|
|
169
221
|
if (partsFrame.substring(partsFrame.length - 1) == ',') {
|
|
170
222
|
partsFrame = partsFrame.slice(0, -1);
|
|
171
223
|
}
|
|
172
224
|
|
|
173
|
-
partsFrame = partsFrame.replace(
|
|
225
|
+
partsFrame = partsFrame.replace(languageSet.at + ' ', '');
|
|
174
226
|
|
|
175
227
|
// Frame -> ParameterList
|
|
176
228
|
var regParamList = /\(.*\)/,
|
|
@@ -206,18 +258,18 @@
|
|
|
206
258
|
var newPartsFrame = partsFrame.replace(partsParamList, stringParam).replace(partsTypeMethod, stringTypeMethod);
|
|
207
259
|
|
|
208
260
|
// Line
|
|
209
|
-
var regLine = new RegExp('\\b:' +
|
|
261
|
+
var regLine = new RegExp('\\b:' + languageSet.line + ' \\d+'),
|
|
210
262
|
partsLine = String(regLine.exec(lines[i]));
|
|
211
263
|
|
|
212
264
|
partsLine = partsLine.replace(':', '').trim();
|
|
213
265
|
|
|
214
|
-
var fileLi = li.replace(
|
|
266
|
+
var fileLi = li.replace(languageSet.at + " " + partsFrame, '').trim();
|
|
215
267
|
|
|
216
268
|
// File => (!) text requires multiline to exec regex, otherwise it will return null.
|
|
217
|
-
var regFile = new RegExp(
|
|
269
|
+
var regFile = new RegExp(languageSet.in + '\\s.*$', 'm'),
|
|
218
270
|
partsFile = String(regFile.exec(fileLi));
|
|
219
271
|
|
|
220
|
-
partsFile = partsFile.replace(
|
|
272
|
+
partsFile = partsFile.replace(languageSet.in + ' ', '').replace(':' + partsLine, '').replace('<---', '');
|
|
221
273
|
|
|
222
274
|
li = li.replace(partsFrame, '<span class="' + this.settings.frame + '">' + newPartsFrame + '</span>')
|
|
223
275
|
.replace(partsFile, '<span class="' + this.settings.file + '">' + partsFile + '</span>')
|