UNPKG

1.29 kBJavaScriptView Raw
1const prism = require('prismjs')
2const loadLanguages = require('prismjs/components/index')
3const { logger, chalk, escapeHtml } = require('@vuepress/shared-utils')
4
5// required to make embedded highlighting work...
6loadLanguages(['markup', 'css', 'javascript'])
7
8function 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
15function 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
33module.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}