1
1
( function ( w ) {
2
2
'use strict' ;
3
3
4
+ var TABLE_NAME = 'hljs-ln' ,
5
+ LINE_NAME = 'hljs-ln-line' ,
6
+ CODE_BLOCK_NAME = 'hljs-ln-code' ,
7
+ NUMBERS_BLOCK_NAME = 'hljs-ln-numbers' ,
8
+ NUMBER_LINE_NAME = 'hljs-ln-n' ,
9
+ DATA_ATTR_NAME = 'data-line-number' ;
10
+
11
+ // https://wcoder.github.io/notes/string-format-for-string-formating-in-javascript
12
+ String . prototype . format = String . prototype . f = function ( ) {
13
+ var args = arguments ;
14
+ return this . replace ( / \{ ( \d + ) \} / g, function ( m , n ) {
15
+ return args [ n ] ? args [ n ] : m ;
16
+ } ) ;
17
+ } ;
18
+
4
19
if ( typeof w . hljs === 'undefined' ) {
5
20
console . error ( 'highlight.js not detected!' ) ;
6
21
} else {
7
22
w . hljs . initLineNumbersOnLoad = initLineNumbersOnLoad ;
8
23
w . hljs . lineNumbersBlock = lineNumbersBlock ;
24
+
25
+ addStyles ( ) ;
26
+ }
27
+
28
+ function addStyles ( ) {
29
+ var css = document . createElement ( 'style' ) ;
30
+ css . type = 'text/css' ;
31
+ css . innerHTML = ( '.{0}{border-collapse:collapse}' +
32
+ '.{0} td{padding:0}' +
33
+ '.{1}:before{content:attr({2})}' ) . format ( TABLE_NAME , NUMBER_LINE_NAME , DATA_ATTR_NAME ) ;
34
+ document . getElementsByTagName ( 'head' ) [ 0 ] . appendChild ( css ) ;
9
35
}
10
36
11
37
function initLineNumbersOnLoad ( ) {
33
59
function lineNumbersBlock ( element ) {
34
60
if ( typeof element !== 'object' ) return ;
35
61
36
- var parent = element . parentNode ;
37
- var lines = getCountLines ( parent . textContent ) ;
62
+ var lines = getLines ( element . innerHTML ) ;
38
63
39
- if ( lines > 1 ) {
40
- var l = '' ;
41
- for ( var i = 0 ; i < lines ; i ++ ) {
42
- l += ( i + 1 ) + '\n' ;
43
- }
64
+ if ( lines . length > 1 ) {
65
+ var html = '' ;
44
66
45
- var linesPanel = document . createElement ( 'code' ) ;
46
- linesPanel . className = 'hljs hljs-line-numbers' ;
47
- linesPanel . style . float = 'left' ;
48
- linesPanel . textContent = l ;
67
+ for ( var i = 0 ; i < lines . length ; i ++ ) {
68
+ html += ( '<tr><td class="{0}"><div class="{1} {2}" {3}="{5}"></div></td>' +
69
+ '<td class="{4}"><div class="{1}">{6}</div></td></tr>' ) . format (
70
+ NUMBERS_BLOCK_NAME ,
71
+ LINE_NAME ,
72
+ NUMBER_LINE_NAME ,
73
+ DATA_ATTR_NAME ,
74
+ CODE_BLOCK_NAME ,
75
+ i + 1 ,
76
+ lines [ i ] . length > 0 ? lines [ i ] : ' ' ) ;
77
+ }
49
78
50
- parent . insertBefore ( linesPanel , element ) ;
79
+ element . innerHTML = '<table class="{0}">{1}</table>' . format ( TABLE_NAME , html ) ;
51
80
}
52
81
}
53
82
54
- function getCountLines ( text ) {
55
- if ( text . length === 0 ) return 0 ;
56
-
57
- var regExp = / \r \n | \r | \n / g;
58
- var lines = text . match ( regExp ) ;
59
- lines = lines ? lines . length : 0 ;
60
-
61
- if ( ! text [ text . length - 1 ] . match ( regExp ) ) {
62
- lines += 1 ;
63
- }
64
-
65
- return lines ;
83
+ function getLines ( text ) {
84
+ if ( text . length === 0 ) return [ ] ;
85
+ return text . split ( / \r \n | \r | \n / g) ;
66
86
}
87
+
67
88
} ( window ) ) ;
0 commit comments