48 lines
1.2 KiB
TypeScript
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
|
|
}
|