@@ -7,167 +7,219 @@ import * as S from 'string';
77
88import * as Prism from 'prismjs' ;
99
10- require ( 'prismjs/components/prism-wiki' )
11- require ( 'prismjs/components/prism-haskell' )
12- require ( 'prismjs/components/prism-go' )
13- require ( 'prismjs/components/prism-typescript' )
14- require ( 'prismjs/components/prism-jsx' )
15- require ( 'prismjs/components/prism-makefile' )
16- require ( 'prismjs/components/prism-gherkin' )
17- require ( 'prismjs/components/prism-sas' )
18- require ( 'prismjs/components/prism-javascript' )
19- require ( 'prismjs/components/prism-json' )
20- require ( 'prismjs/components/prism-c' )
21- require ( 'prismjs/components/prism-cpp' )
22- require ( 'prismjs/components/prism-java' )
23- require ( 'prismjs/components/prism-csharp' )
24- require ( 'prismjs/components/prism-objectivec' )
25- require ( 'prismjs/components/prism-scala' )
26- require ( 'prismjs/components/prism-kotlin' )
27- require ( 'prismjs/components/prism-groovy' )
28- require ( 'prismjs/components/prism-r' )
29- require ( 'prismjs/components/prism-rust' )
30- require ( 'prismjs/components/prism-yaml' )
31- require ( 'prismjs/components/prism-pug' )
32- require ( 'prismjs/components/prism-sass' )
10+ require ( 'prismjs/components/prism-wiki' ) ;
11+ require ( 'prismjs/components/prism-haskell' ) ;
12+ require ( 'prismjs/components/prism-go' ) ;
13+ require ( 'prismjs/components/prism-typescript' ) ;
14+ require ( 'prismjs/components/prism-jsx' ) ;
15+ require ( 'prismjs/components/prism-makefile' ) ;
16+ require ( 'prismjs/components/prism-gherkin' ) ;
17+ require ( 'prismjs/components/prism-sas' ) ;
18+ require ( 'prismjs/components/prism-javascript' ) ;
19+ require ( 'prismjs/components/prism-json' ) ;
20+ require ( 'prismjs/components/prism-c' ) ;
21+ require ( 'prismjs/components/prism-cpp' ) ;
22+ require ( 'prismjs/components/prism-java' ) ;
23+ require ( 'prismjs/components/prism-csharp' ) ;
24+ require ( 'prismjs/components/prism-objectivec' ) ;
25+ require ( 'prismjs/components/prism-scala' ) ;
26+ require ( 'prismjs/components/prism-kotlin' ) ;
27+ require ( 'prismjs/components/prism-groovy' ) ;
28+ require ( 'prismjs/components/prism-r' ) ;
29+ require ( 'prismjs/components/prism-rust' ) ;
30+ require ( 'prismjs/components/prism-yaml' ) ;
31+ require ( 'prismjs/components/prism-pug' ) ;
32+ require ( 'prismjs/components/prism-sass' ) ;
3333
3434import * as hljs from 'highlight.js/lib/highlight' ;
3535
36- hljs . registerLanguage ( 'bash' , require ( 'highlight.js/lib/languages/bash' ) )
37- hljs . registerLanguage ( 'clojure' , require ( 'highlight.js/lib/languages/clojure' ) )
38- hljs . registerLanguage ( 'coffeescript' , require ( 'highlight.js/lib/languages/coffeescript' ) )
39- hljs . registerLanguage ( 'cs' , require ( 'highlight.js/lib/languages/cs' ) )
40- hljs . registerLanguage ( 'css' , require ( 'highlight.js/lib/languages/css' ) )
41- hljs . registerLanguage ( 'elm' , require ( 'highlight.js/lib/languages/elm' ) )
42- hljs . registerLanguage ( 'xml' , require ( 'highlight.js/lib/languages/xml' ) )
43- hljs . registerLanguage ( 'handlebars' , require ( 'highlight.js/lib/languages/handlebars' ) )
44- hljs . registerLanguage ( 'http' , require ( 'highlight.js/lib/languages/http' ) )
45- hljs . registerLanguage ( 'ini' , require ( 'highlight.js/lib/languages/ini' ) )
46- hljs . registerLanguage ( 'prolog' , require ( 'highlight.js/lib/languages/prolog' ) )
47- hljs . registerLanguage ( 'python' , require ( 'highlight.js/lib/languages/python' ) )
48- hljs . registerLanguage ( 'ruby' , require ( 'highlight.js/lib/languages/ruby' ) )
49- hljs . registerLanguage ( 'sql' , require ( 'highlight.js/lib/languages/sql' ) )
50- hljs . registerLanguage ( 'swift' , require ( 'highlight.js/lib/languages/swift' ) )
51- hljs . registerLanguage ( 'diff' , require ( 'highlight.js/lib/languages/diff' ) )
52- hljs . registerLanguage ( 'shell' , require ( 'highlight.js/lib/languages/shell' ) )
53- hljs . registerLanguage ( 'php' , require ( 'highlight.js/lib/languages/php' ) )
54- hljs . registerLanguage ( 'lua' , require ( 'highlight.js/lib/languages/lua' ) )
55- hljs . registerLanguage ( 'nginx' , require ( 'highlight.js/lib/languages/nginx' ) )
56- hljs . registerLanguage ( 'perl' , require ( 'highlight.js/lib/languages/perl' ) )
57- hljs . registerLanguage ( 'dockerfile' , require ( 'highlight.js/lib/languages/dockerfile' ) )
58-
59- let prismLangs = [ 'haskell' , 'go' , 'groovy' , 'typescript' , 'json' , 'jsx' , 'gherkin' , 'sas' , 'javascript' , 'c' , 'cpp' , 'java' , 'csharp' , 'objectivec' , 'scala' , 'kotlin' , 'r' , 'rust' , 'yaml' , 'pug' , 'sass' ]
60-
61-
62- function render ( tokens , idx , options , env , self ) : string {
36+ hljs . registerLanguage ( 'bash' , require ( 'highlight.js/lib/languages/bash' ) ) ;
37+ hljs . registerLanguage ( 'clojure' , require ( 'highlight.js/lib/languages/clojure' ) ) ;
38+ hljs . registerLanguage (
39+ 'coffeescript' ,
40+ require ( 'highlight.js/lib/languages/coffeescript' ) ,
41+ ) ;
42+ hljs . registerLanguage ( 'cs' , require ( 'highlight.js/lib/languages/cs' ) ) ;
43+ hljs . registerLanguage ( 'css' , require ( 'highlight.js/lib/languages/css' ) ) ;
44+ hljs . registerLanguage ( 'elm' , require ( 'highlight.js/lib/languages/elm' ) ) ;
45+ hljs . registerLanguage ( 'xml' , require ( 'highlight.js/lib/languages/xml' ) ) ;
46+ hljs . registerLanguage (
47+ 'handlebars' ,
48+ require ( 'highlight.js/lib/languages/handlebars' ) ,
49+ ) ;
50+ hljs . registerLanguage ( 'http' , require ( 'highlight.js/lib/languages/http' ) ) ;
51+ hljs . registerLanguage ( 'ini' , require ( 'highlight.js/lib/languages/ini' ) ) ;
52+ hljs . registerLanguage ( 'prolog' , require ( 'highlight.js/lib/languages/prolog' ) ) ;
53+ hljs . registerLanguage ( 'python' , require ( 'highlight.js/lib/languages/python' ) ) ;
54+ hljs . registerLanguage ( 'ruby' , require ( 'highlight.js/lib/languages/ruby' ) ) ;
55+ hljs . registerLanguage ( 'sql' , require ( 'highlight.js/lib/languages/sql' ) ) ;
56+ hljs . registerLanguage ( 'swift' , require ( 'highlight.js/lib/languages/swift' ) ) ;
57+ hljs . registerLanguage ( 'diff' , require ( 'highlight.js/lib/languages/diff' ) ) ;
58+ hljs . registerLanguage ( 'shell' , require ( 'highlight.js/lib/languages/shell' ) ) ;
59+ hljs . registerLanguage ( 'php' , require ( 'highlight.js/lib/languages/php' ) ) ;
60+ hljs . registerLanguage ( 'lua' , require ( 'highlight.js/lib/languages/lua' ) ) ;
61+ hljs . registerLanguage ( 'nginx' , require ( 'highlight.js/lib/languages/nginx' ) ) ;
62+ hljs . registerLanguage ( 'perl' , require ( 'highlight.js/lib/languages/perl' ) ) ;
63+ hljs . registerLanguage (
64+ 'dockerfile' ,
65+ require ( 'highlight.js/lib/languages/dockerfile' ) ,
66+ ) ;
67+
68+ let prismLangs = [
69+ 'haskell' ,
70+ 'go' ,
71+ 'groovy' ,
72+ 'typescript' ,
73+ 'json' ,
74+ 'jsx' ,
75+ 'gherkin' ,
76+ 'sas' ,
77+ 'javascript' ,
78+ 'c' ,
79+ 'cpp' ,
80+ 'java' ,
81+ 'csharp' ,
82+ 'objectivec' ,
83+ 'scala' ,
84+ 'kotlin' ,
85+ 'r' ,
86+ 'rust' ,
87+ 'yaml' ,
88+ 'pug' ,
89+ 'sass' ,
90+ ] ;
91+
92+ function render ( tokens , idx , options , env , self ) : string {
6393 tokens [ idx ] . attrJoin ( 'role' , 'alert' ) ;
6494 tokens [ idx ] . attrJoin ( 'class' , 'alert' ) ;
6595 tokens [ idx ] . attrJoin ( 'class' , `alert-${ tokens [ idx ] . info . trim ( ) } ` ) ;
6696 return self . renderToken ( ...arguments ) ;
6797}
6898
69- function parseFenceCodeParams ( lang ) {
70- const attrMatch = lang . match ( / { ( .* ) } / )
71- const params = { }
99+ function parseFenceCodeParams ( lang ) {
100+ const attrMatch = lang . match ( / { ( .* ) } / ) ;
101+ const params = { } ;
72102 if ( attrMatch && attrMatch . length >= 2 ) {
73- const attrs = attrMatch [ 1 ]
74- const paraMatch = attrs . match ( / ( [ # . ] ( \S + ?) \s ) | ( ( \S + ?) \s * = \s * ( " ( .+ ?) " | ' ( .+ ?) ' | \[ [ ^ \] ] * \] | \{ [ } ] * \} | ( \S + ) ) ) / g)
75- paraMatch && paraMatch . forEach ( param => {
76- param = param . trim ( )
77- if ( param [ 0 ] === '#' ) {
78- params [ 'id' ] = param . slice ( 1 )
79- } else if ( param [ 0 ] === '.' ) {
80- if ( params [ 'class' ] ) params [ 'class' ] = [ ]
81- params [ 'class' ] = params [ 'class' ] . concat ( param . slice ( 1 ) )
82- } else {
83- const offset = param . indexOf ( '=' )
84- const id = param . substring ( 0 , offset ) . trim ( ) . toLowerCase ( )
85- let val = param . substring ( offset + 1 ) . trim ( )
86- const valStart = val [ 0 ]
87- const valEnd = val [ val . length - 1 ]
88- if ( [ '"' , "'" ] . indexOf ( valStart ) !== - 1 && [ '"' , "'" ] . indexOf ( valEnd ) !== - 1 && valStart === valEnd ) {
89- val = val . substring ( 1 , val . length - 1 )
90- }
91- if ( id === 'class' ) {
92- if ( params [ 'class' ] ) params [ 'class' ] = [ ]
93- params [ 'class' ] = params [ 'class' ] . concat ( val )
103+ const attrs = attrMatch [ 1 ] ;
104+ const paraMatch = attrs . match (
105+ / ( [ # . ] ( \S + ?) \s ) | ( ( \S + ?) \s * = \s * ( " ( .+ ?) " | ' ( .+ ?) ' | \[ [ ^ \] ] * \] | \{ [ } ] * \} | ( \S + ) ) ) / g,
106+ ) ;
107+
108+ if ( paraMatch ) {
109+ paraMatch . forEach ( param => {
110+ param = param . trim ( ) ;
111+ if ( param [ 0 ] === '#' ) {
112+ params [ 'id' ] = param . slice ( 1 ) ;
113+ } else if ( param [ 0 ] === '.' ) {
114+ if ( params [ 'class' ] ) {
115+ params [ 'class' ] = [ ] ;
116+ }
117+ params [ 'class' ] = params [ 'class' ] . concat ( param . slice ( 1 ) ) ;
94118 } else {
95- params [ id ] = val
119+ const offset = param . indexOf ( '=' ) ;
120+ const id = param
121+ . substring ( 0 , offset )
122+ . trim ( )
123+ . toLowerCase ( ) ;
124+ let val = param . substring ( offset + 1 ) . trim ( ) ;
125+ const valStart = val [ 0 ] ;
126+ const valEnd = val [ val . length - 1 ] ;
127+ if (
128+ [ '"' , "'" ] . indexOf ( valStart ) !== - 1 &&
129+ [ '"' , "'" ] . indexOf ( valEnd ) !== - 1 &&
130+ valStart === valEnd
131+ ) {
132+ val = val . substring ( 1 , val . length - 1 ) ;
133+ }
134+ if ( id === 'class' ) {
135+ if ( params [ 'class' ] ) {
136+ params [ 'class' ] = [ ] ;
137+ }
138+ params [ 'class' ] = params [ 'class' ] . concat ( val ) ;
139+ } else {
140+ params [ id ] = val ;
141+ }
96142 }
97- }
98- } )
143+ } ) ;
144+ }
99145 }
100- return params
146+ return params ;
101147}
102148
103- function highlightRender ( code , lang ) {
149+ function highlightRender ( code , lang ) {
104150 if ( ! lang || / n o ( - ? ) h i g h l i g h t | p l a i n | t e x t / . test ( lang ) ) {
105151 // fallback
106152 return highlight ( code , lang ) ;
107153 }
108154 // support adding extra attributes for fence code block
109155 // ex: ```graphviz {engine="neato"}
110156 const params = parseFenceCodeParams ( lang ) as any ;
111- lang = lang . split ( / \s + / g) [ 0 ]
112- code = S ( code ) . escapeHTML ( ) . s
157+ lang = lang . split ( / \s + / g) [ 0 ] ;
158+ code = S ( code ) . escapeHTML ( ) . s ;
113159 if ( lang === 'sequence' ) {
114- return `<span class="sequence-diagram raw">${ code } </span>`
160+ return `<span class="sequence-diagram raw">${ code } </span>` ;
115161 } else if ( lang === 'flow' ) {
116- return `<span class="flow-chart raw">${ code } </span>`
162+ return `<span class="flow-chart raw">${ code } </span>` ;
117163 } else if ( lang === 'graphviz' ) {
118164 // support to specify layout engine of graphviz
119- let dataAttrs = ''
165+ let dataAttrs = '' ;
120166 if ( params . hasOwnProperty ( 'engine' ) ) {
121- dataAttrs = ' data-engine="' + params . engine + '"'
167+ dataAttrs = ' data-engine="' + params . engine + '"' ;
122168 }
123- return `<span class="graphviz raw"${ dataAttrs } >${ code } </span>`
169+ return `<span class="graphviz raw"${ dataAttrs } >${ code } </span>` ;
124170 } else if ( lang === 'mermaid' ) {
125- return `<span class="mermaid raw">${ code } </span>`
171+ return `<span class="mermaid raw">${ code } </span>` ;
126172 } else if ( lang === 'abc' ) {
127- return `<span class="abc raw">${ code } </span>`
173+ return `<span class="abc raw">${ code } </span>` ;
128174 }
129175
130176 const result = {
131- value : code
132- }
177+ value : code ,
178+ } ;
133179
134180 if ( prismLangs . indexOf ( lang ) !== - 1 ) {
135- code = S ( code ) . unescapeHTML ( ) . s
136- result . value = Prism . highlight ( code , Prism . languages [ lang ] )
181+ code = S ( code ) . unescapeHTML ( ) . s ;
182+ result . value = Prism . highlight ( code , Prism . languages [ lang ] ) ;
137183 } else if ( lang === 'tiddlywiki' || lang === 'mediawiki' ) {
138- code = S ( code ) . unescapeHTML ( ) . s
139- result . value = Prism . highlight ( code , Prism . languages . wiki )
184+ code = S ( code ) . unescapeHTML ( ) . s ;
185+ result . value = Prism . highlight ( code , Prism . languages . wiki ) ;
140186 } else if ( lang === 'cmake' ) {
141- code = S ( code ) . unescapeHTML ( ) . s
142- result . value = Prism . highlight ( code , Prism . languages . makefile )
187+ code = S ( code ) . unescapeHTML ( ) . s ;
188+ result . value = Prism . highlight ( code , Prism . languages . makefile ) ;
143189 } else {
144- code = S ( code ) . unescapeHTML ( ) . s
145- const languages = hljs . listLanguages ( )
190+ code = S ( code ) . unescapeHTML ( ) . s ;
191+ const languages = hljs . listLanguages ( ) ;
146192 if ( ! languages . includes ( lang ) ) {
147- result . value = hljs . highlightAuto ( code ) . value
193+ result . value = hljs . highlightAuto ( code ) . value ;
148194 } else {
149- result . value = hljs . highlight ( lang , code ) . value
195+ result . value = hljs . highlight ( lang , code ) . value ;
150196 }
151197 }
152198
153- const showlinenumbers = / = $ | = \d + $ | = \+ $ / . test ( lang )
199+ const showlinenumbers = / = $ | = \d + $ | = \+ $ / . test ( lang ) ;
154200 if ( showlinenumbers ) {
155- let startnumber = 1
156- const matches = lang . match ( / = ( \d + ) $ / )
157- if ( matches ) { startnumber = parseInt ( matches [ 1 ] ) }
158- const lines = result . value . split ( '\n' )
159- const linenumbers = [ ]
201+ let startnumber = 1 ;
202+ const matches = lang . match ( / = ( \d + ) $ / ) ;
203+ if ( matches ) {
204+ startnumber = parseInt ( matches [ 1 ] ) ;
205+ }
206+ const lines = result . value . split ( '\n' ) ;
207+ const linenumbers = [ ] ;
160208 for ( let i = 0 ; i < lines . length - 1 ; i ++ ) {
161- linenumbers [ i ] = `<span data-linenumber='${ startnumber + i } '></span>`
209+ linenumbers [ i ] = `<span data-linenumber='${ startnumber + i } '></span>` ;
162210 }
163- const continuelinenumber = / = \+ $ / . test ( lang )
164- const linegutter = `<div class='gutter linenumber${ continuelinenumber ? ' continue' : '' } '>${ linenumbers . join ( '\n' ) } </div>`
165- result . value = `<div class='wrapper'>${ linegutter } <div class='code'>${ result . value } </div></div>`
211+ const continuelinenumber = / = \+ $ / . test ( lang ) ;
212+ const linegutter = `<div class='gutter linenumber${
213+ continuelinenumber ? ' continue' : ''
214+ } '>${ linenumbers . join ( '\n' ) } </div>`;
215+ result . value = `<div class='wrapper'>${ linegutter } <div class='code'>${
216+ result . value
217+ } </div></div>`;
166218 }
167219 return result . value ;
168220}
169221
170- let highlight
222+ let highlight ;
171223
172224// this method is called when your extension is activated
173225// your extension is activated the very first time the command is executed
@@ -185,43 +237,47 @@ export function activate(context: vscode.ExtensionContext) {
185237 markerPattern : / ^ \[ t o c \] / im,
186238 } ) ;
187239
188- md . use ( require ( 'markdown-it-mathjax' ) ( {
189- beforeMath : '<span class="mathjax raw">' ,
190- afterMath : '</span>' ,
191- beforeInlineMath : '<span class="mathjax raw">' ,
192- afterInlineMath : '</span>' ,
193- beforeDisplayMath : '<span class="mathjax raw display">' ,
194- afterDisplayMath : '</span>'
195- } ) ) ;
240+ md . use (
241+ require ( 'markdown-it-mathjax' ) ( {
242+ beforeMath : '<span class="mathjax raw">' ,
243+ afterMath : '</span>' ,
244+ beforeInlineMath : '<span class="mathjax raw">' ,
245+ afterInlineMath : '</span>' ,
246+ beforeDisplayMath : '<span class="mathjax raw display">' ,
247+ afterDisplayMath : '</span>' ,
248+ } ) ,
249+ ) ;
196250
197251 md . use ( markdownitContainer , 'success' , { render } ) ;
198252 md . use ( markdownitContainer , 'info' , { render } ) ;
199253 md . use ( markdownitContainer , 'warning' , { render } ) ;
200254 md . use ( markdownitContainer , 'danger' , { render } ) ;
201255 md . use ( markdownitContainer , 'spoiler' , {
202- validate : function ( params ) {
203- return params . trim ( ) . match ( / ^ s p o i l e r \s + ( .* ) $ / )
256+ validate : function ( params ) {
257+ return params . trim ( ) . match ( / ^ s p o i l e r \s + ( .* ) $ / ) ;
204258 } ,
205- render : function ( tokens , idx ) {
206- var m = tokens [ idx ] . info . trim ( ) . match ( / ^ s p o i l e r \s + ( .* ) $ / )
259+ render : function ( tokens , idx ) {
260+ var m = tokens [ idx ] . info . trim ( ) . match ( / ^ s p o i l e r \s + ( .* ) $ / ) ;
207261
208262 if ( tokens [ idx ] . nesting === 1 ) {
209263 // opening tag
210- return '<details><summary>' + md . utils . escapeHtml ( m [ 1 ] ) + '</summary>\n'
264+ return (
265+ '<details><summary>' + md . utils . escapeHtml ( m [ 1 ] ) + '</summary>\n'
266+ ) ;
211267 } else {
212268 // closing tag
213- return '</details>\n'
269+ return '</details>\n' ;
214270 }
215- }
216- } )
271+ } ,
272+ } ) ;
217273
218274 md . options . linkify = true ;
219275 md . options . typographer = true ;
220276 highlight = md . options . highlight ;
221277 md . options . highlight = highlightRender ;
222278
223279 return md ;
224- }
280+ } ,
225281 } ;
226282}
227283
0 commit comments