Skip to content

Commit 886ad13

Browse files
committed
Format codes
1 parent a4b1c57 commit 886ad13

File tree

2 files changed

+355
-239
lines changed

2 files changed

+355
-239
lines changed

src/extension.ts

Lines changed: 184 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -7,167 +7,219 @@ import * as S from 'string';
77

88
import * 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

3434
import * 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 || /no(-?)highlight|plain|text/.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: /^\[toc\]/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(/^spoiler\s+(.*)$/)
256+
validate: function(params) {
257+
return params.trim().match(/^spoiler\s+(.*)$/);
204258
},
205-
render: function (tokens, idx) {
206-
var m = tokens[idx].info.trim().match(/^spoiler\s+(.*)$/)
259+
render: function(tokens, idx) {
260+
var m = tokens[idx].info.trim().match(/^spoiler\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

Comments
 (0)