1- ( function ( w ) {
1+ ( function ( w , d ) {
22 'use strict' ;
33
4+ // TODO: add more langs
5+ var defaultLangNamesMap = {
6+ cs : 'C#' ,
7+ csharp : 'C#' ,
8+ fsharp : 'F#' ,
9+ objectivec : 'Objective-C' ,
10+ } ;
11+
412 if ( typeof w . hljs === 'undefined' ) {
513 console . error ( 'highlight.js not detected!' ) ;
614 } else {
715 w . hljs . initLangOnLoad = initLangOnLoad ;
816 w . hljs . initLangBlock = initLangBlock ;
917 }
1018
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' ) ;
1532
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 ) ;
1937 }
2038 }
21- } catch ( e ) {
22- console . error ( 'highlight-lang error: ' , e ) ;
2339 }
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' ) ;
2547 }
2648
27- function initLangBlock ( element ) {
49+ function initLangBlock ( element , options ) {
2850 if ( typeof element !== 'object' ) return ;
2951
30- var classes = element . className . split ( ' ' ) ;
31- var lang = getLangNameFromClasses ( classes ) ;
52+ var lang = getLangNameFromElement ( element ) ;
53+ var internalOptions = mapOptions ( element , lang , options ) ;
3254
3355 if ( lang !== '' ) {
3456 var langPanel = document . createElement ( 'div' ) ;
3557 langPanel . className = 'hljs-lang' ;
36- langPanel . textContent = convertLangName ( lang ) ;
58+ langPanel . textContent = convertLangName ( lang , internalOptions . overrideNames ) ;
3759 element . parentNode . insertBefore ( langPanel , element ) ;
3860 }
3961 }
4062
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+
4199 function getLangNameFromClasses ( classes ) {
42100 // TODO: define lang for auto-syntax
43101 if ( ! ! classes && classes . length > 1 && classes [ 1 ] === 'hljs' ) {
46104 return '' ;
47105 }
48106
49- // TODO: rework this crap
50- function convertLangName ( lang )
107+ function convertLangName ( langKey , overrideNamesMap )
51108 {
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 ;
66129 }
67130
68- } ( window ) ) ;
131+ } ( window , document ) ) ;
0 commit comments