1 | const prism = require('prismjs')
|
2 | const loadLanguages = require('prismjs/components/index')
|
3 | const { logger, chalk, escapeHtml } = require('@vuepress/shared-utils')
|
4 |
|
5 |
|
6 | loadLanguages(['markup', 'css', 'javascript'])
|
7 |
|
8 | function wrap (code, lang) {
|
9 | if (lang === 'text') {
|
10 | code = escapeHtml(code)
|
11 | }
|
12 | return `<pre v-pre class="language-${lang}"><code>${code}</code></pre>`
|
13 | }
|
14 |
|
15 | function getLangCodeFromExtension (extension) {
|
16 | const extensionMap = {
|
17 | vue: 'markup',
|
18 | html: 'markup',
|
19 | md: 'markdown',
|
20 | rb: 'ruby',
|
21 | ts: 'typescript',
|
22 | py: 'python',
|
23 | sh: 'bash',
|
24 | yml: 'yaml',
|
25 | styl: 'stylus',
|
26 | kt: 'kotlin',
|
27 | rs: 'rust'
|
28 | }
|
29 |
|
30 | return extensionMap[extension] || extension
|
31 | }
|
32 |
|
33 | module.exports = (str, lang) => {
|
34 | if (!lang) {
|
35 | return wrap(str, 'text')
|
36 | }
|
37 | lang = lang.toLowerCase()
|
38 | const rawLang = lang
|
39 |
|
40 | lang = getLangCodeFromExtension(lang)
|
41 |
|
42 | if (!prism.languages[lang]) {
|
43 | try {
|
44 | loadLanguages([lang])
|
45 | } catch (e) {
|
46 | logger.warn(chalk.yellow(`[vuepress] Syntax highlight for language "${lang}" is not supported.`))
|
47 | }
|
48 | }
|
49 | if (prism.languages[lang]) {
|
50 | const code = prism.highlight(str, prism.languages[lang], lang)
|
51 | return wrap(code, rawLang)
|
52 | }
|
53 | return wrap(str, 'text')
|
54 | }
|