Files
blog-frontend-v2/src/lib/markdoc.ts

48 lines
1.2 KiB
TypeScript

import Markdoc, { type Config } from '@markdoc/markdoc'
import { ensureShikiEngine, shikiRender } from './markdown'
const { nodes, Tag } = Markdoc
export const markdocConfig: Config = {
nodes: {
fence: {
render: 'CodeBlock',
attributes: {
...nodes.fence.attributes,
highlightedHtml: { type: String },
},
transform(node, config) {
/*
* 注意力!!!!!!!!!!!!!!
* 注意!!!!!!!!!!!!
*
* 如果改了这里的逻辑,记得更改 `markdoc-cache.ts` 里的版本号
* 以让对应的缓存能够被更新
*
**/
const attributes = node.transformAttributes(config)
const highlightedHtml = shikiRender(
node.attributes.content,
node.attributes.language,
)
return new Tag(
'CodeBlock',
{ ...attributes, highlightedHtml },
node.transformChildren(config),
)
},
},
},
}
export const renderMarkdocTree = async (content: string) => {
const ast = Markdoc.parse(content)
await ensureShikiEngine()
const tree = Markdoc.transform(ast, markdocConfig)
return tree
}