netstack.js 2.1.0 → 2.1.1

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.
Files changed (3) hide show
  1. package/README.md +2 -2
  2. package/netstack.js +85 -33
  3. 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 css
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.0
2
+ * netStack v2.1.1
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,6 +123,22 @@
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
144
  var stacktrace = this.element.textContent,
@@ -124,53 +147,82 @@
124
147
  lang = '',
125
148
  clone = '';
126
149
 
127
- // look for the language
128
- for (var i = 0; i < lines.length; ++i) {
129
- if (lang === '') {
130
- var regexes = {
131
- english: /\s+at .*\)/,
132
- danish: /\s+ved .*\)/,
133
- german: /\s+bei .*\)/,
134
- spanish: /\s+en .*\)/,
135
- russian: /\s+в .*\)/,
136
- chinese: /\s+在 .*\)/
137
- };
138
-
139
- for (var key in regexes) {
140
- if (regexes[key].test(lines[i])) {
141
- lang = key;
142
- break;
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 (lang === '') return;
149
-
150
- var selectedLanguage = this.search(lang, this.languages);
151
- this.language = selectedLanguage.name;
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
- sanitizedStack = this.formatException(sanitizedStack, selectedLanguage.at);
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*)' + selectedLanguage.at + ' .*?\\)'),
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(selectedLanguage.at + ' ', '');
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:' + selectedLanguage.line + ' \\d+'),
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(selectedLanguage.at + " " + partsFrame, '').trim();
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(selectedLanguage.in + '\\s.*$', 'm'),
269
+ var regFile = new RegExp(languageSet.in + '\\s.*$', 'm'),
218
270
  partsFile = String(regFile.exec(fileLi));
219
271
 
220
- partsFile = partsFile.replace(selectedLanguage.in + ' ', '').replace(':' + partsLine, '').replace('&lt;---', '');
272
+ partsFile = partsFile.replace(languageSet.in + ' ', '').replace(':' + partsLine, '').replace('&lt;---', '');
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>')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "netstack.js",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "A simple and easy JavaScript library for highlighting .NET stack traces",
5
5
  "main": "netstack.js",
6
6
  "scripts": {