import { createIncremarkParser, type IncremarkParserOptions } from '@incremark/core'; import { highlightCodeSnippetHtml, type IncremarkCodeTheme } from './incremarkCodeHighlight'; import { renderIncremarkAst, renderKatexIncremarkHtml } from './incremarkRenderer'; const INCREMARK_PARSER_OPTIONS = { gfm: true, math: { tex: true }, containers: true, htmlTree: true } satisfies IncremarkParserOptions; const INCREMARK_CODE_BLOCK_PATTERN = /(
', ``);
}
function decodeHtmlEntities(value: string): string {
return value.replace(HTML_ENTITY_RE, (match, entity) => {
if (entity.startsWith('#x') || entity.startsWith('#X')) {
const codePoint = Number.parseInt(entity.slice(2), 16);
return Number.isNaN(codePoint) ? match : String.fromCodePoint(codePoint);
}
if (entity.startsWith('#')) {
const codePoint = Number.parseInt(entity.slice(1), 10);
return Number.isNaN(codePoint) ? match : String.fromCodePoint(codePoint);
}
return NAMED_HTML_ENTITIES[entity] ?? match;
});
}