1
1
mirror of https://github.com/theoludwig/theoludwig.git synced 2024-12-08 00:44:30 +01:00
.profile/utils/remarkSyntaxHighlightingPlugin.ts
2022-10-20 22:43:25 +02:00

31 lines
878 B
TypeScript

import type { Plugin, Transformer } from 'unified'
import type { Literal } from 'unist'
import { visit } from 'unist-util-visit'
import type { Highlighter } from 'shiki'
export interface RemarkSyntaxHighlightingPluginOptions {
highlighter: Highlighter
}
export type RemarkSyntaxHighlightingNode = Literal<string> & {
lang: string
meta: string
children: undefined
}
export const remarkSyntaxHighlightingPlugin: Plugin<
[RemarkSyntaxHighlightingPluginOptions],
Literal<string, RemarkSyntaxHighlightingNode>
> = (options) => {
const transformer: Transformer<RemarkSyntaxHighlightingNode> = (tree) => {
visit<RemarkSyntaxHighlightingNode, string>(tree, 'code', (node) => {
node.type = 'html'
node.children = undefined
node.value = options.highlighter.codeToHtml(node.value, {
lang: node.lang
})
})
}
return transformer
}