2024-02-15 07:43:09 +00:00
|
|
|
import { type Parser, createParser } from 'prosemirror-highlight/shiki'
|
|
|
|
import type { BuiltinLanguage } from 'shiki'
|
2023-12-20 18:54:40 +00:00
|
|
|
|
|
|
|
let parser: Parser | undefined
|
|
|
|
|
2024-02-15 07:43:09 +00:00
|
|
|
export const shikiParser: Parser = (options) => {
|
2023-12-20 18:54:40 +00:00
|
|
|
const lang = options.language ?? 'text'
|
|
|
|
|
|
|
|
// Register the language if it's not yet registered
|
2024-01-01 16:46:37 +00:00
|
|
|
const { highlighter, promise } = useHighlighter(lang as BuiltinLanguage)
|
2023-12-20 18:54:40 +00:00
|
|
|
|
2024-01-01 16:46:37 +00:00
|
|
|
// If the highlighter or the language is not available, return a promise that
|
|
|
|
// will resolve when it's ready. When the promise resolves, the editor will
|
|
|
|
// re-parse the code block.
|
2023-12-20 18:54:40 +00:00
|
|
|
if (!highlighter)
|
2024-01-01 16:46:37 +00:00
|
|
|
return promise ?? []
|
2023-12-20 18:54:40 +00:00
|
|
|
|
|
|
|
if (!parser)
|
|
|
|
parser = createParser(highlighter)
|
|
|
|
|
|
|
|
return parser(options)
|
|
|
|
}
|