Skip to content

Commit 93c9a90

Browse files
authored
Merge pull request #2 from ZsharE/master
Converted library to vanilla javascript
2 parents a803478 + 9fac2e4 commit 93c9a90

File tree

3 files changed

+110
-88
lines changed

3 files changed

+110
-88
lines changed

README.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
[![npm](https://img.shields.io/npm/v/jsstack.js.svg)](https://www.npmjs.com/package/jsstack.js)
33
![license](https://img.shields.io/hexpm/l/plug.svg?style=flat-square)
44

5-
A simple and easy jQuery plugin for highlighting JavaScript stack traces
5+
A simple and easy library for highlighting JavaScript stack traces
66

77
#### Demo
88
<img src="example.png" alt="jsStack.js - demo" width="700" />
99

1010
#### Initialization
11-
```
12-
$('.stacktrace').jsStack();
11+
```javascript
12+
jsStack('.stacktrace');
1313
```
1414

1515
#### Default values for classes
16-
```
17-
$('.stacktrace').jsStack({
16+
```javascript
17+
jsStack('.stacktrace', {
1818
method: 'st-methodName',
1919
file: 'st-fileName',
2020
line: 'st-lineNumber',
@@ -23,7 +23,7 @@ $('.stacktrace').jsStack({
2323
```
2424

2525
#### Ready to go css
26-
```
26+
```css
2727
pre {padding: 20px 10px;}
2828
pre, code {background-color: #333;color: #ffffff;}
2929
.st-methodName {color: #70c9ba;font-weight: bolder;}

jsStack.js

+102-80
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,123 @@
11
/*!
2-
* jsStack v1.0.1
3-
* A simple and easy jQuery plugin for highlighting JavaScript stack traces
4-
* License : Apache 2
5-
* Author : Stanescu Eduard-Dan (https://elmah.io)
2+
* jsStack v2.0.0
3+
* A simple and easy library for highlighting JavaScript stack traces
4+
* License: Apache 2
5+
* Author: https://elmah.io
66
*/
7-
(function($) {
8-
'use strict';
9-
10-
$.fn.jsStack = function(options) {
117

12-
var settings = $.extend({
8+
(function (root, factory) {
9+
if (typeof define === 'function' && define.amd) {
10+
// AMD
11+
define([], factory);
12+
} else if (typeof module === 'object' && module.exports) {
13+
// Node, CommonJS-like
14+
module.exports = factory();
15+
} else {
16+
// Browser globals (root is window)
17+
root.jsStack = factory();
18+
}
19+
}(typeof self !== 'undefined' ? self : this, function () {
20+
'use strict';
1321

14-
// Default values for classes
22+
function jsStack(element, options) {
23+
// Default settings
24+
var settings = Object.assign({
1525
method: 'st-methodName',
1626
file: 'st-fileName',
1727
line: 'st-lineNumber',
1828
column: 'st-column'
19-
2029
}, options);
2130

22-
return this.each(function() {
31+
var UNKNOWN_FUNCTION = '<unknown>';
32+
var chrome = /^\s*at (?:(?:(?:Anonymous function)?|((?:\[object object\])?\S+(?: \[as \S+\])?)) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i,
33+
gecko = /^(?:\s*([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i,
34+
node = /^\s*at (?:((?:\[object object\])?\S+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i,
35+
other = /^\s*at (?:(?:(?:Anonymous function)?|((?:\[object object\])?\S+(?: \[as \S+\])?)) )\(?((?:).*?)?\)?\s*$/i;
2336

24-
var UNKNOWN_FUNCTION = '<unknown>';
25-
var chrome = /^\s*at (?:(?:(?:Anonymous function)?|((?:\[object object\])?\S+(?: \[as \S+\])?)) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i,
26-
gecko = /^(?:\s*([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i,
27-
node = /^\s*at (?:((?:\[object object\])?\S+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i,
28-
other = /^\s*at (?:(?:(?:Anonymous function)?|((?:\[object object\])?\S+(?: \[as \S+\])?)) )\(?((?:).*?)?\)?\s*$/i;
29-
var stacktrace = escapeHtml($(this).text()),
30-
lines = stacktrace.split('\n'),
31-
stack = '',
32-
parts,
33-
element;
37+
var stacktrace = escapeHtml(element.textContent),
38+
lines = stacktrace.split('\n'),
39+
stack = '',
40+
parts,
41+
elementObj;
3442

35-
function template_line(line, element) {
36-
line = line.replace(element.file, '<span class="'+ settings.file +'">' + element.file + '</span>')
37-
.replace(element.methodName + ' (', '<span class="'+ settings.method +'">' + element.methodName + '</span> (')
38-
.replace(':' + element.lineNumber + ':' + element.column, ':<span class="'+ settings.line +'">' + element.lineNumber + '</span>:<span class="'+ settings.column +'">' + element.column + '</span>');
39-
line = line.replace(/&lt;/g, '<span>&lt;</span>').replace(/&gt;/g, '<span>&gt;</span>');
43+
function template_line(line, element) {
44+
line = line.replace(element.file, '<span class="'+ settings.file +'">' + element.file + '</span>')
45+
.replace(element.methodName + ' (', '<span class="'+ settings.method +'">' + element.methodName + '</span> (')
46+
.replace(':' + element.lineNumber + ':' + element.column, ':<span class="'+ settings.line +'">' + element.lineNumber + '</span>:<span class="'+ settings.column +'">' + element.column + '</span>');
47+
line = line.replace(/&lt;/g, '<span>&lt;</span>').replace(/&gt;/g, '<span>&gt;</span>');
4048

41-
return line;
42-
}
49+
return line;
50+
}
4351

44-
function escapeHtml(unsafe) {
45-
return unsafe
46-
.replace(/&/g, "&amp;")
47-
.replace(/</g, "&lt;")
48-
.replace(/>/g, "&gt;")
49-
.replace(/"/g, "&quot;")
50-
.replace(/'/g, "&#039;");
51-
}
52+
function escapeHtml(unsafe) {
53+
return unsafe
54+
.replace(/&/g, "&amp;")
55+
.replace(/</g, "&lt;")
56+
.replace(/>/g, "&gt;")
57+
.replace(/"/g, "&quot;")
58+
.replace(/'/g, "&#039;");
59+
}
5260

53-
for (var i = 0, j = lines.length; i < j; ++i) {
54-
var line = '';
61+
for (var i = 0, j = lines.length; i < j; ++i) {
62+
var line = '';
5563

56-
if ((parts = gecko.exec(lines[i]))) {
57-
element = {
58-
'file': parts[3],
59-
'methodName': parts[1] || UNKNOWN_FUNCTION,
60-
'lineNumber': +parts[4],
61-
'column': parts[5] ? +parts[5] : null
62-
};
63-
line = template_line(lines[i], element);
64-
} else if ((parts = chrome.exec(lines[i]))) {
65-
element = {
66-
'file': parts[2],
67-
'methodName': parts[1] || UNKNOWN_FUNCTION,
68-
'lineNumber': +parts[3],
69-
'column': parts[4] ? +parts[4] : null
70-
};
71-
line = template_line(lines[i], element);
72-
} else if ((parts = node.exec(lines[i]))) {
73-
element = {
74-
'file': parts[2],
75-
'methodName': parts[1] || UNKNOWN_FUNCTION,
76-
'lineNumber': +parts[3],
77-
'column': parts[4] ? +parts[4] : null
78-
};
79-
line = template_line(lines[i], element);
80-
} else if ((parts = other.exec(lines[i]))) {
81-
element = {
82-
'file': parts[2],
83-
'methodName': parts[1] || UNKNOWN_FUNCTION
84-
};
85-
line = template_line(lines[i], element);
86-
} else {
87-
line = lines[i].replace(/&lt;/g, '<span>&lt;</span>').replace(/&gt;/g, '<span>&gt;</span>');
88-
}
64+
if ((parts = gecko.exec(lines[i]))) {
65+
elementObj = {
66+
'file': parts[3],
67+
'methodName': parts[1] || UNKNOWN_FUNCTION,
68+
'lineNumber': +parts[4],
69+
'column': parts[5] ? +parts[5] : null
70+
};
71+
line = template_line(lines[i], elementObj);
72+
} else if ((parts = chrome.exec(lines[i]))) {
73+
elementObj = {
74+
'file': parts[2],
75+
'methodName': parts[1] || UNKNOWN_FUNCTION,
76+
'lineNumber': +parts[3],
77+
'column': parts[4] ? +parts[4] : null
78+
};
79+
line = template_line(lines[i], elementObj);
80+
} else if ((parts = node.exec(lines[i]))) {
81+
elementObj = {
82+
'file': parts[2],
83+
'methodName': parts[1] || UNKNOWN_FUNCTION,
84+
'lineNumber': +parts[3],
85+
'column': parts[4] ? +parts[4] : null
86+
};
87+
line = template_line(lines[i], elementObj);
88+
} else if ((parts = other.exec(lines[i]))) {
89+
elementObj = {
90+
'file': parts[2],
91+
'methodName': parts[1] || UNKNOWN_FUNCTION
92+
};
93+
line = template_line(lines[i], elementObj);
94+
} else {
95+
line = lines[i].replace(/&lt;/g, '<span>&lt;</span>').replace(/&gt;/g, '<span>&gt;</span>');
96+
}
8997

90-
if (lines.length - 1 == i) {
91-
stack += line;
92-
} else {
93-
stack += line + '\n';
94-
}
98+
if (lines.length - 1 == i) {
99+
stack += line;
100+
} else {
101+
stack += line + '\n';
95102
}
103+
}
104+
105+
element.innerHTML = stack;
106+
}
96107

97-
return $(this).html(stack);
108+
// Function to initialize the plugin on elements
109+
function initJsStack(elements, options) {
110+
elements.forEach(function(element) {
111+
jsStack(element, options);
98112
});
99-
};
113+
}
114+
115+
// Expose the plugin globally
116+
function jsStackLibrary(selector, options) {
117+
var elements = document.querySelectorAll(selector);
118+
initJsStack(Array.from(elements), options);
119+
}
120+
121+
return jsStackLibrary;
100122

101-
}(jQuery));
123+
}));

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "jsstack.js",
3-
"version": "1.0.1",
4-
"description": "A simple and easy jQuery plugin for highlighting JavaScript stack traces",
3+
"version": "2.0.0",
4+
"description": "A simple and easy library for highlighting JavaScript stack traces",
55
"main": "jsStack.js",
66
"scripts": {
77
"test": "echo \"Error: no test specified\" && exit 1"

0 commit comments

Comments
 (0)