1
- ( function ( w ) {
1
+ ( function ( w , d ) {
2
2
'use strict' ;
3
3
4
+ // TODO: add more langs
5
+ var defaultLangNamesMap = {
6
+ cs : 'C#' ,
7
+ csharp : 'C#' ,
8
+ fsharp : 'F#' ,
9
+ objectivec : 'Objective-C' ,
10
+ } ;
11
+
4
12
if ( typeof w . hljs === 'undefined' ) {
5
13
console . error ( 'highlight.js not detected!' ) ;
6
14
} else {
7
15
w . hljs . initLangOnLoad = initLangOnLoad ;
8
16
w . hljs . initLangBlock = initLangBlock ;
9
17
}
10
18
11
- function initLangOnLoad ( ) {
12
- w . addEventListener ( 'load' , function ( ) {
13
- try {
14
- var blocks = document . querySelectorAll ( 'code.hljs' ) ;
19
+ function initLangOnLoad ( options ) {
20
+ if ( d . readyState === 'interactive' || d . readyState === 'complete' ) {
21
+ documentReady ( options ) ;
22
+ } else {
23
+ w . addEventListener ( 'DOMContentLoaded' , function ( ) {
24
+ documentReady ( options ) ;
25
+ } ) ;
26
+ }
27
+ }
28
+
29
+ function documentReady ( options ) {
30
+ try {
31
+ var blocks = d . querySelectorAll ( 'code.hljs,code.nohighlight' ) ;
15
32
16
- for ( var i in blocks ) {
17
- if ( blocks . hasOwnProperty ( i ) ) {
18
- initLangBlock ( blocks [ i ] ) ;
33
+ for ( var i in blocks ) {
34
+ if ( blocks . hasOwnProperty ( i ) ) {
35
+ if ( ! isPluginDisabledForBlock ( blocks [ i ] ) ) {
36
+ initLangBlock ( blocks [ i ] , options ) ;
19
37
}
20
38
}
21
- } catch ( e ) {
22
- console . error ( 'highlight-lang error: ' , e ) ;
23
39
}
24
- } ) ;
40
+ } catch ( e ) {
41
+ w . console . error ( 'hljs-lang error: ' , e ) ;
42
+ }
43
+ }
44
+
45
+ function isPluginDisabledForBlock ( element ) {
46
+ return element . classList . contains ( 'nohljslang' ) ;
25
47
}
26
48
27
- function initLangBlock ( element ) {
49
+ function initLangBlock ( element , options ) {
28
50
if ( typeof element !== 'object' ) return ;
29
51
30
- var classes = element . className . split ( ' ' ) ;
31
- var lang = getLangNameFromClasses ( classes ) ;
52
+ var lang = getLangNameFromElement ( element ) ;
53
+ var internalOptions = mapOptions ( element , lang , options ) ;
32
54
33
55
if ( lang !== '' ) {
34
56
var langPanel = document . createElement ( 'div' ) ;
35
57
langPanel . className = 'hljs-lang' ;
36
- langPanel . textContent = convertLangName ( lang ) ;
58
+ langPanel . textContent = convertLangName ( lang , internalOptions . overrideNames ) ;
37
59
element . parentNode . insertBefore ( langPanel , element ) ;
38
60
}
39
61
}
40
62
63
+ /**
64
+ * @param {HTMLElement } element Code block.
65
+ * @param {Object } options External API options.
66
+ * @returns {Object } Internal API options.
67
+ */
68
+ function mapOptions ( element , langKey , options ) {
69
+ options = options || { } ;
70
+ return {
71
+ overrideNames : getOverrideNamesOption ( element , langKey , options ) ,
72
+ } ;
73
+ }
74
+
75
+ function getOverrideNamesOption ( element , langKey , options ) {
76
+ var overrideNames = { } ;
77
+
78
+ if ( ! ! options . overrideNames ) {
79
+ overrideNames = options . overrideNames ;
80
+ }
81
+
82
+ // can be overridden because local option is priority
83
+ var value = getAttribute ( element , 'data-lang-name' ) ;
84
+ if ( ! ! value ) {
85
+ var opts = { } ;
86
+ opts [ langKey ] = value ;
87
+ overrideNames = opts ;
88
+ }
89
+
90
+ return overrideNames ;
91
+ }
92
+
93
+ function getLangNameFromElement ( element ) {
94
+ var classes = element . className . split ( ' ' ) ;
95
+ var lang = getLangNameFromClasses ( classes ) ;
96
+ return lang ;
97
+ }
98
+
41
99
function getLangNameFromClasses ( classes ) {
42
100
// TODO: define lang for auto-syntax
43
101
if ( ! ! classes && classes . length > 1 && classes [ 1 ] === 'hljs' ) {
46
104
return '' ;
47
105
}
48
106
49
- // TODO: rework this crap
50
- function convertLangName ( lang )
107
+ function convertLangName ( langKey , overrideNamesMap )
51
108
{
52
- // TODO: add more langs
53
- var map = [
54
- [ 'C#' , [ 'cs' , 'csharp' ] ] ,
55
- [ 'F#' , [ 'fsharp' ] ] ,
56
- [ 'Objective-C' , [ 'objectivec' ] ]
57
- ] ;
58
-
59
- map . forEach ( function ( e ) {
60
- if ( e [ 1 ] . indexOf ( lang ) !== - 1 ) {
61
- lang = e [ 0 ] ;
62
- return ;
63
- }
64
- } ) ;
65
- return lang ;
109
+ var overriddenLangName = overrideNamesMap [ langKey ] ;
110
+ if ( ! ! overriddenLangName ) {
111
+ return overriddenLangName ;
112
+ }
113
+
114
+ var langName = defaultLangNamesMap [ langKey ] ;
115
+ if ( ! ! langName ) {
116
+ return langName ;
117
+ }
118
+
119
+ return langKey ;
120
+ }
121
+
122
+ /**
123
+ * @param {HTMLElement } element Code block.
124
+ * @param {String } attrName Attribute name.
125
+ * @returns {String } Attribute value or empty.
126
+ */
127
+ function getAttribute ( element , attrName ) {
128
+ return element . hasAttribute ( attrName ) ? element . getAttribute ( attrName ) : null ;
66
129
}
67
130
68
- } ( window ) ) ;
131
+ } ( window , document ) ) ;
0 commit comments