@@ -7,167 +7,219 @@ import * as S from 'string';
7
7
8
8
import * as Prism from 'prismjs' ;
9
9
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' ) ;
33
33
34
34
import * as hljs from 'highlight.js/lib/highlight' ;
35
35
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 {
63
93
tokens [ idx ] . attrJoin ( 'role' , 'alert' ) ;
64
94
tokens [ idx ] . attrJoin ( 'class' , 'alert' ) ;
65
95
tokens [ idx ] . attrJoin ( 'class' , `alert-${ tokens [ idx ] . info . trim ( ) } ` ) ;
66
96
return self . renderToken ( ...arguments ) ;
67
97
}
68
98
69
- function parseFenceCodeParams ( lang ) {
70
- const attrMatch = lang . match ( / { ( .* ) } / )
71
- const params = { }
99
+ function parseFenceCodeParams ( lang ) {
100
+ const attrMatch = lang . match ( / { ( .* ) } / ) ;
101
+ const params = { } ;
72
102
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 ) ) ;
94
118
} 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
+ }
96
142
}
97
- }
98
- } )
143
+ } ) ;
144
+ }
99
145
}
100
- return params
146
+ return params ;
101
147
}
102
148
103
- function highlightRender ( code , lang ) {
149
+ function highlightRender ( code , lang ) {
104
150
if ( ! lang || / n o ( - ? ) h i g h l i g h t | p l a i n | t e x t / . test ( lang ) ) {
105
151
// fallback
106
152
return highlight ( code , lang ) ;
107
153
}
108
154
// support adding extra attributes for fence code block
109
155
// ex: ```graphviz {engine="neato"}
110
156
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 ;
113
159
if ( lang === 'sequence' ) {
114
- return `<span class="sequence-diagram raw">${ code } </span>`
160
+ return `<span class="sequence-diagram raw">${ code } </span>` ;
115
161
} else if ( lang === 'flow' ) {
116
- return `<span class="flow-chart raw">${ code } </span>`
162
+ return `<span class="flow-chart raw">${ code } </span>` ;
117
163
} else if ( lang === 'graphviz' ) {
118
164
// support to specify layout engine of graphviz
119
- let dataAttrs = ''
165
+ let dataAttrs = '' ;
120
166
if ( params . hasOwnProperty ( 'engine' ) ) {
121
- dataAttrs = ' data-engine="' + params . engine + '"'
167
+ dataAttrs = ' data-engine="' + params . engine + '"' ;
122
168
}
123
- return `<span class="graphviz raw"${ dataAttrs } >${ code } </span>`
169
+ return `<span class="graphviz raw"${ dataAttrs } >${ code } </span>` ;
124
170
} else if ( lang === 'mermaid' ) {
125
- return `<span class="mermaid raw">${ code } </span>`
171
+ return `<span class="mermaid raw">${ code } </span>` ;
126
172
} else if ( lang === 'abc' ) {
127
- return `<span class="abc raw">${ code } </span>`
173
+ return `<span class="abc raw">${ code } </span>` ;
128
174
}
129
175
130
176
const result = {
131
- value : code
132
- }
177
+ value : code ,
178
+ } ;
133
179
134
180
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 ] ) ;
137
183
} 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 ) ;
140
186
} 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 ) ;
143
189
} else {
144
- code = S ( code ) . unescapeHTML ( ) . s
145
- const languages = hljs . listLanguages ( )
190
+ code = S ( code ) . unescapeHTML ( ) . s ;
191
+ const languages = hljs . listLanguages ( ) ;
146
192
if ( ! languages . includes ( lang ) ) {
147
- result . value = hljs . highlightAuto ( code ) . value
193
+ result . value = hljs . highlightAuto ( code ) . value ;
148
194
} else {
149
- result . value = hljs . highlight ( lang , code ) . value
195
+ result . value = hljs . highlight ( lang , code ) . value ;
150
196
}
151
197
}
152
198
153
- const showlinenumbers = / = $ | = \d + $ | = \+ $ / . test ( lang )
199
+ const showlinenumbers = / = $ | = \d + $ | = \+ $ / . test ( lang ) ;
154
200
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 = [ ] ;
160
208
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>` ;
162
210
}
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>`;
166
218
}
167
219
return result . value ;
168
220
}
169
221
170
- let highlight
222
+ let highlight ;
171
223
172
224
// this method is called when your extension is activated
173
225
// your extension is activated the very first time the command is executed
@@ -185,43 +237,47 @@ export function activate(context: vscode.ExtensionContext) {
185
237
markerPattern : / ^ \[ t o c \] / im,
186
238
} ) ;
187
239
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
+ ) ;
196
250
197
251
md . use ( markdownitContainer , 'success' , { render } ) ;
198
252
md . use ( markdownitContainer , 'info' , { render } ) ;
199
253
md . use ( markdownitContainer , 'warning' , { render } ) ;
200
254
md . use ( markdownitContainer , 'danger' , { render } ) ;
201
255
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 + ( .* ) $ / ) ;
204
258
} ,
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 + ( .* ) $ / ) ;
207
261
208
262
if ( tokens [ idx ] . nesting === 1 ) {
209
263
// 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
+ ) ;
211
267
} else {
212
268
// closing tag
213
- return '</details>\n'
269
+ return '</details>\n' ;
214
270
}
215
- }
216
- } )
271
+ } ,
272
+ } ) ;
217
273
218
274
md . options . linkify = true ;
219
275
md . options . typographer = true ;
220
276
highlight = md . options . highlight ;
221
277
md . options . highlight = highlightRender ;
222
278
223
279
return md ;
224
- }
280
+ } ,
225
281
} ;
226
282
}
227
283
0 commit comments