-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
extension.js
90 lines (84 loc) · 2.31 KB
/
extension.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
const getAliases = () => {
const packageJson = require('./package.json');
const {
contributes: {
languages: [
{ id: languageId = 'textproto', aliases: languageAliases = [] },
],
},
} = packageJson;
const aliases = languageAliases
.map((x) => x.toLowerCase())
.filter((x) => x !== languageId);
return aliases;
};
/** @type LanguageFn */
const textproto = (hljs) => {
/** @type Mode */
const HERE_DOCS = {
begin: /<<\s*(?=[A-Z_a-z]+)/,
starts: {
contains: [
hljs.END_SAME_AS_BEGIN({
begin: /([A-Z_a-z]+)/,
end: /([A-Z_a-z]+)/,
className: 'string',
}),
],
},
};
return {
name: 'Protocol Buffer Text Format',
aliases: getAliases(),
contains: [
hljs.QUOTE_STRING_MODE,
hljs.NUMBER_MODE,
hljs.HASH_COMMENT_MODE,
{
className: 'object',
begin: /{/,
end: /}/,
contains: [
hljs.QUOTE_STRING_MODE,
hljs.NUMBER_MODE,
hljs.HASH_COMMENT_MODE,
HERE_DOCS,
],
},
HERE_DOCS,
],
};
};
module.exports.activate = () => ({
extendMarkdownIt(/** @type MarkdownIt */ md) {
const { highlight: defaultHighlight } = md.options;
md.use(require('markdown-it-highlightjs/core'), {
hljs: require('highlight.js/lib/core'),
register: {
textproto,
},
});
const { highlight: coreHighlight } = md.options;
md.options.highlight = (code, lang) =>
coreHighlight(code, lang) || defaultHighlight(code, lang);
return md;
},
});
/** @typedef {(hljs: HLJSApi) => Language} LanguageFn */
/**
* @callback Highlighter
* @param {string} code
* @param {string} languageName
* @returns {string}
*/
/**
* @callback MarkdownItPlugin
* @param {MarkdownIt} md
* @param {*} opts
*/
/**
* @typedef {object} MarkdownIt
* @property {object} options
* @property {Highlighter} options.highlight
* @property {(plugin: MarkdownItPlugin, ...args: any[]) => void} use
*/