// ref https://github.com/vuejs/vitepress/blob/main/src/node/markdown/plugins/highlight.ts import chalk from 'chalk'; import escapeHtml from 'escape-html'; import prism from 'prismjs'; import consola from 'consola'; // prism is listed as actual dep so it's ok to require import loadLanguages from 'prismjs/components/index.js'; // required to make embedded highlighting work... loadLanguages(['markup', 'css', 'javascript']); function wrap(code: string, lang: string): string { if (lang === 'text') { code = escapeHtml(code); } return `
${code}
`; } export const highlight = (str: string, lang: string) => { if (!lang) { return wrap(str, 'text'); } lang = lang.toLowerCase(); const rawLang = lang; if (lang === 'vue' || lang === 'html') { lang = 'markup'; } if (lang === 'md') { lang = 'markdown'; } if (lang === 'ts') { lang = 'typescript'; } if (lang === 'py') { lang = 'python'; } if (!prism.languages[lang]) { try { loadLanguages([lang]); } catch { consola.warn( chalk.yellow(`[vitepress] Syntax highlight for language "${lang}" is not supported.`), ); } } if (prism.languages[lang]) { const code = prism.highlight(str, prism.languages[lang], lang); return wrap(code, rawLang); } return wrap(str, 'text'); };