11/*!
22 * 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)
3+ * A simple and easy library for highlighting JavaScript stack traces
4+ * License: Apache 2
5+ * Author: https://elmah.io
66 */
7- ( function ( $ ) {
7+ ( function ( ) {
88 'use strict' ;
99
10- $ . fn . jsStack = function ( options ) {
11-
12- var settings = $ . extend ( {
13-
14- // Default values for classes
10+ function jsStack ( element , options ) {
11+ // Default settings
12+ var settings = Object . assign ( {
1513 method : 'st-methodName' ,
1614 file : 'st-fileName' ,
1715 line : 'st-lineNumber' ,
1816 column : 'st-column'
19-
2017 } , options ) ;
2118
22- return this . each ( function ( ) {
19+ var UNKNOWN_FUNCTION = '<unknown>' ;
20+ var chrome = / ^ \s * a t (?: (?: (?: A n o n y m o u s f u n c t i o n ) ? | ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ) ? \( ? ( (?: f i l e | h t t p | h t t p s ) : .* ?) : ( \d + ) (?: : ( \d + ) ) ? \) ? \s * $ / i,
21+ gecko = / ^ (?: \s * ( [ ^ @ ] * ) (?: \( ( .* ?) \) ) ? @ ) ? ( \S .* ?) : ( \d + ) (?: : ( \d + ) ) ? \s * $ / i,
22+ node = / ^ \s * a t (?: ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ? \( ? ( .* ?) : ( \d + ) (?: : ( \d + ) ) ? \) ? \s * $ / i,
23+ other = / ^ \s * a t (?: (?: (?: A n o n y m o u s f u n c t i o n ) ? | ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ) \( ? ( (?: ) .* ?) ? \) ? \s * $ / i;
2324
24- var UNKNOWN_FUNCTION = '<unknown>' ;
25- var chrome = / ^ \s * a t (?: (?: (?: A n o n y m o u s f u n c t i o n ) ? | ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ) ? \( ? ( (?: f i l e | h t t p | h t t p s ) : .* ?) : ( \d + ) (?: : ( \d + ) ) ? \) ? \s * $ / i,
26- gecko = / ^ (?: \s * ( [ ^ @ ] * ) (?: \( ( .* ?) \) ) ? @ ) ? ( \S .* ?) : ( \d + ) (?: : ( \d + ) ) ? \s * $ / i,
27- node = / ^ \s * a t (?: ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ? \( ? ( .* ?) : ( \d + ) (?: : ( \d + ) ) ? \) ? \s * $ / i,
28- other = / ^ \s * a t (?: (?: (?: A n o n y m o u s f u n c t i o n ) ? | ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ) \( ? ( (?: ) .* ?) ? \) ? \s * $ / i;
29- var stacktrace = escapeHtml ( $ ( this ) . text ( ) ) ,
30- lines = stacktrace . split ( '\n' ) ,
31- stack = '' ,
32- parts ,
33- element ;
25+ var stacktrace = escapeHtml ( element . textContent ) ,
26+ lines = stacktrace . split ( '\n' ) ,
27+ stack = '' ,
28+ parts ,
29+ elementObj ;
3430
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 ( / & l t ; / g, '<span><</span>' ) . replace ( / & g t ; / g, '<span>></span>' ) ;
31+ function template_line ( line , element ) {
32+ line = line . replace ( element . file , '<span class="' + settings . file + '">' + element . file + '</span>' )
33+ . replace ( element . methodName + ' (' , '<span class="' + settings . method + '">' + element . methodName + '</span> (' )
34+ . replace ( ':' + element . lineNumber + ':' + element . column , ':<span class="' + settings . line + '">' + element . lineNumber + '</span>:<span class="' + settings . column + '">' + element . column + '</span>' ) ;
35+ line = line . replace ( / & l t ; / g, '<span><</span>' ) . replace ( / & g t ; / g, '<span>></span>' ) ;
4036
41- return line ;
42- }
37+ return line ;
38+ }
4339
44- function escapeHtml ( unsafe ) {
45- return unsafe
46- . replace ( / & / g, "&" )
47- . replace ( / < / g, "<" )
48- . replace ( / > / g, ">" )
49- . replace ( / " / g, """ )
50- . replace ( / ' / g, "'" ) ;
51- }
40+ function escapeHtml ( unsafe ) {
41+ return unsafe
42+ . replace ( / & / g, "&" )
43+ . replace ( / < / g, "<" )
44+ . replace ( / > / g, ">" )
45+ . replace ( / " / g, """ )
46+ . replace ( / ' / g, "'" ) ;
47+ }
5248
53- for ( var i = 0 , j = lines . length ; i < j ; ++ i ) {
54- var line = '' ;
49+ for ( var i = 0 , j = lines . length ; i < j ; ++ i ) {
50+ var line = '' ;
5551
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 ( / & l t ; / g, '<span><</span>' ) . replace ( / & g t ; / g, '<span>></span>' ) ;
88- }
52+ if ( ( parts = gecko . exec ( lines [ i ] ) ) ) {
53+ elementObj = {
54+ 'file' : parts [ 3 ] ,
55+ 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION ,
56+ 'lineNumber' : + parts [ 4 ] ,
57+ 'column' : parts [ 5 ] ? + parts [ 5 ] : null
58+ } ;
59+ line = template_line ( lines [ i ] , elementObj ) ;
60+ } else if ( ( parts = chrome . exec ( lines [ i ] ) ) ) {
61+ elementObj = {
62+ 'file' : parts [ 2 ] ,
63+ 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION ,
64+ 'lineNumber' : + parts [ 3 ] ,
65+ 'column' : parts [ 4 ] ? + parts [ 4 ] : null
66+ } ;
67+ line = template_line ( lines [ i ] , elementObj ) ;
68+ } else if ( ( parts = node . exec ( lines [ i ] ) ) ) {
69+ elementObj = {
70+ 'file' : parts [ 2 ] ,
71+ 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION ,
72+ 'lineNumber' : + parts [ 3 ] ,
73+ 'column' : parts [ 4 ] ? + parts [ 4 ] : null
74+ } ;
75+ line = template_line ( lines [ i ] , elementObj ) ;
76+ } else if ( ( parts = other . exec ( lines [ i ] ) ) ) {
77+ elementObj = {
78+ 'file' : parts [ 2 ] ,
79+ 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION
80+ } ;
81+ line = template_line ( lines [ i ] , elementObj ) ;
82+ } else {
83+ line = lines [ i ] . replace ( / & l t ; / g, '<span><</span>' ) . replace ( / & g t ; / g, '<span>></span>' ) ;
84+ }
8985
90- if ( lines . length - 1 == i ) {
91- stack += line ;
92- } else {
93- stack += line + '\n' ;
94- }
86+ if ( lines . length - 1 == i ) {
87+ stack += line ;
88+ } else {
89+ stack += line + '\n' ;
9590 }
91+ }
92+
93+ element . innerHTML = stack ;
94+ }
9695
97- return $ ( this ) . html ( stack ) ;
96+ // Function to initialize the plugin on elements
97+ function initJsStack ( elements , options ) {
98+ elements . forEach ( function ( element ) {
99+ jsStack ( element , options ) ;
98100 } ) ;
99- } ;
101+ }
100102
101- } ( jQuery ) ) ;
103+ // Expose the plugin globally
104+ window . jsStack = function ( selector , options ) {
105+ var elements = document . querySelectorAll ( selector ) ;
106+ initJsStack ( Array . from ( elements ) , options ) ;
107+ } ;
108+ } ) ( ) ;
0 commit comments