import { toHtml } from 'hast-util-to-html'
import rangeParser from 'parse-numeric-range'
import { refractor } from 'refractor'
import css from 'refractor/lang/css.js'
import tsx from 'refractor/lang/tsx.js'
import { rehypeHighlightLine } from './rehypeLine'
import { rehypeHighlightWord } from './rehypeWord'
let highlighter: (
source: string,
language: 'tsx' | 'css' | string,
line?: string
) => string
export function createCodeHighlighter() {
if (highlighter) return highlighter
refractor.register(tsx)
refractor.register(css)
highlighter = function codeToHtml(source, language, line = '0') {
let result: any = refractor.highlight(source, language)
result = rehypeHighlightLine(result, rangeParser(line))
result = rehypeHighlightWord(result)
result = toHtml(result)
return result as string
}
return highlighter
}