@@ -33,16 +33,25 @@ const rWrap = /\s*wrap:(\w+)/i;
3333 * @returns {String } Code snippet with code highlighting
3434 */
3535
36- function getHighlightOptions ( config , arg ) {
37- let lang = '' ;
36+ function parseArgs ( arg ) {
37+ let _highlightEnable = true ;
38+ if ( rHighlight . test ( arg ) ) {
39+ arg = arg . replace ( rHighlight , ( match , _enable ) => {
40+ _highlightEnable = _enable === 'true' ;
41+ return '' ;
42+ } ) ;
43+ }
44+
45+ // Here we parse the args
46+ let lang , line_number , wrap ;
47+
3848 if ( rLang . test ( arg ) ) {
3949 arg = arg . replace ( rLang , ( match , _lang ) => {
4050 lang = _lang ;
4151 return '' ;
4252 } ) ;
4353 }
4454
45- let line_number = config . line_number ;
4655 if ( rLineNumber . test ( arg ) ) {
4756 arg = arg . replace ( rLineNumber , ( match , _line_number ) => {
4857 line_number = _line_number === 'true' ;
@@ -58,7 +67,6 @@ function getHighlightOptions(config, arg) {
5867 } ) ;
5968 }
6069
61- let wrap = config . wrap ;
6270 if ( rWrap . test ( arg ) ) {
6371 arg = arg . replace ( rWrap , ( match , _wrap ) => {
6472 wrap = _wrap === 'true' ;
@@ -107,109 +115,58 @@ function getHighlightOptions(config, arg) {
107115 }
108116
109117 return {
118+ _highlightEnable,
110119 lang,
111- firstLine : first_line ,
120+ first_line,
112121 caption,
113- gutter : line_number ,
114- hljs : config . hljs ,
122+ line_number,
115123 mark,
116- tab : config . tab_replace ,
117- autoDetect : config . auto_detect ,
118124 wrap
119125 } ;
120126}
121127
122- function getPrismjsOptions ( config , arg ) {
123- let lang ;
124- if ( rLang . test ( arg ) ) {
125- arg = arg . replace ( rLang , ( match , _lang ) => {
126- lang = _lang ;
127- return '' ;
128- } ) ;
129- }
128+ module . exports = ctx => function codeTag ( args , content ) {
129+ const arg = args . join ( ' ' ) ;
130+ const hljsCfg = ctx . config . highlight || { } ;
131+ const prismjsCfg = ctx . config . prismjs || { } ;
130132
131- let line_number = config . line_number ;
132- if ( rLineNumber . test ( arg ) ) {
133- arg = arg . replace ( rLineNumber , ( match , _line_number ) => {
134- line_number = _line_number === 'true' ;
135- return '' ;
136- } ) ;
137- }
133+ const { _highlightEnable, lang, first_line, caption, line_number, mark, wrap } = parseArgs ( arg ) ;
138134
139- let first_line = 1 ;
140- if ( rFirstLine . test ( arg ) ) {
141- arg = arg . replace ( rFirstLine , ( match , _first_line ) => {
142- first_line = _first_line ;
143- return '' ;
144- } ) ;
135+ /*
136+ * If highlight is not enabled inside code tag,
137+ * or neither hljs nor prism is enabled,
138+ * then return un-highlighted code directly.
139+ */
140+ if ( ! _highlightEnable || ( ! hljsCfg . enable && ! prismjsCfg . enable ) ) {
141+ return `<pre><code>${ escapeHTML ( content ) } </code></pre>` ;
145142 }
146143
147- if ( rWrap . test ( arg ) ) arg = arg . replace ( rWrap , '' ) ;
148-
149- let mark = [ ] ;
150- if ( rMark . test ( arg ) ) {
151- arg = arg . replace ( rMark , ( match , _mark ) => {
152- mark = _mark . split ( ',' ) . reduce ( ( prev , cur ) => {
153- if ( / - / . test ( cur ) ) {
154- let a = Number ( cur . substr ( 0 , cur . indexOf ( '-' ) ) ) ;
155- let b = Number ( cur . substr ( cur . indexOf ( '-' ) + 1 ) ) ;
156- if ( b < a ) { // switch a & b
157- const temp = a ;
158- a = b ;
159- b = temp ;
160- }
161-
162- for ( ; a <= b ; a ++ ) {
163- prev . push ( a ) ;
164- }
165-
166- return prev ;
167- }
168-
169- prev . push ( Number ( cur ) ) ;
170- return prev ;
171- } , [ ] ) ;
172-
173- return '' ;
174- } ) ;
175- }
144+ const hljsOption = {
145+ lang : typeof lang !== 'undefined' ? lang : '' ,
146+ firstLine : first_line ,
147+ caption,
148+ gutter : typeof line_number !== 'undefined' ? line_number : hljsCfg . line_number ,
149+ hljs : hljsCfg . hljs ,
150+ mark,
151+ tab : hljsCfg . tab_replace ,
152+ autoDetect : hljsCfg . auto_detect ,
153+ wrap : typeof wrap === 'undefined' ? wrap : hljsCfg . wrap
154+ } ;
176155
177- return {
156+ const prismjsOption = {
178157 lang,
179158 firstLine : first_line ,
180- lineNumber : line_number ,
159+ lineNumber : typeof line_number !== 'undefined' ? line_number : prismjsCfg . line_number ,
181160 mark,
182- tab : config . tab_replace ,
183- isPreprocess : config . preprocess
161+ tab : prismjsCfg . tab_replace ,
162+ isPreprocess : prismjsCfg . preprocess
184163 } ;
185- }
186-
187- module . exports = ctx => function codeTag ( args , content ) {
188- let arg = args . join ( ' ' ) ;
189- const hljsCfg = ctx . config . highlight || { } ;
190- const prismjsCfg = ctx . config . prismjs || { } ;
191-
192- let _hljsEnable = hljsCfg . enable ;
193-
194- if ( rHighlight . test ( arg ) ) {
195- arg = arg . replace ( rHighlight , ( match , _enable ) => {
196- _hljsEnable = _enable === 'true' ;
197- return '' ;
198- } ) ;
199- }
200-
201- if ( ! _hljsEnable && ! prismjsCfg . enable ) {
202- content = escapeHTML ( content ) ;
203- return `<pre><code>${ content } </code></pre>` ;
204- }
205164
206165 if ( prismjsCfg . enable ) {
207- content = prismHighlight ( content , getPrismjsOptions ( prismjsCfg , arg ) ) ;
166+ content = prismHighlight ( content , prismjsOption ) ;
208167 } else {
209- content = highlight ( content , getHighlightOptions ( hljsCfg , arg ) ) ;
168+ content = highlight ( content , hljsOption ) ;
210169 }
211170
212- content = content . replace ( / { / g, '{' ) . replace ( / } / g, '}' ) ;
213-
214- return content ;
171+ return content . replace ( / { / g, '{' ) . replace ( / } / g, '}' ) ;
215172} ;
0 commit comments