refactor(docs): use default vitepress highlighter

Use the default vitepress highlighter instead of making our own
highlighter using shiki.

The benefits are:
  - We don't need to directly depend on shiki
  - `mermaid-example` code-blocks will use the same highlighting
    as other languages (e.g. `html`/`js`).
  - We can control the theme from the global `vitepress` config.
  - Darkmode/lightmode themes are supported
  - Escaping is already handled by the default highlight function
This commit is contained in:
Alois Klink
2022-11-17 18:18:34 +00:00
parent 461236030c
commit 6da6edfc01
3 changed files with 16 additions and 20 deletions

View File

@@ -91,7 +91,6 @@
"prettier": "^2.7.1",
"remark": "^14.0.2",
"rimraf": "^3.0.2",
"shiki": "^0.11.1",
"start-server-and-test": "^1.14.0",
"typedoc": "^0.23.18",
"typedoc-plugin-markdown": "^3.13.6",

View File

@@ -1,8 +1,5 @@
import type { MarkdownRenderer } from 'vitepress';
// Note: using "import shiki from 'shiki' and then "const highlighter = await shiki.getHighlighter(...) does not work 2022-11-15
import { getHighlighter } from 'shiki';
const MermaidExample = async (md: MarkdownRenderer) => {
const defaultRenderer = md.renderer.rules.fence;
@@ -10,26 +7,29 @@ const MermaidExample = async (md: MarkdownRenderer) => {
throw new Error('defaultRenderer is undefined');
}
const highlighter = await getHighlighter({
theme: 'material-palenight',
langs: ['mermaid'],
});
md.renderer.rules.fence = (tokens, index, options, env, slf) => {
const token = tokens[index];
if (token.info.trim() === 'mermaid-example') {
const highlight = highlighter
.codeToHtml(token.content, { lang: 'mermaid' })
.replace(/<span/g, '<span v-pre')
.replace('#2e3440ff', 'transparent')
.replace('#292D3E', 'transparent');
if (!md.options.highlight) {
// this function is always created by vitepress, but we need to check it
// anyway to make TypeScript happy
throw new Error(
'Missing MarkdownIt highlight function (should be automatically created by vitepress'
);
}
// doing ```mermaid-example {line-numbers=5 highlight=14-17} is not supported
const langAttrs = '';
return `<h5>Code:</h5>
<div class="language-mermaid">
<button class="copy"></button>
<span class="lang">mermaid</span>
${highlight}
<button class="copy"></button>
<span class="lang">mermaid</span>
${
// html is pre-escaped by the highlight function
// (it also adds `v-pre` to ignore Vue template syntax)
md.options.highlight(token.content, 'mermaid', langAttrs)
}
</div>
<h5>Diagram:</h5>`;
}

3
pnpm-lock.yaml generated
View File

@@ -275,9 +275,6 @@ importers:
rimraf:
specifier: ^3.0.2
version: 3.0.2
shiki:
specifier: ^0.11.1
version: 0.11.1
start-server-and-test:
specifier: ^1.14.0
version: 1.14.0