remark-shiki.ts 699 B

123456789101112131415161718192021
  1. import { visit } from 'unist-util-visit';
  2. import { createShikiHighlighter, type ShikiHighlighter } from './shiki.js';
  3. import type { RemarkPlugin, ShikiConfig } from './types.js';
  4. export function remarkShiki(config?: ShikiConfig): ReturnType<RemarkPlugin> {
  5. let highlighterAsync: Promise<ShikiHighlighter> | undefined;
  6. return async (tree: any) => {
  7. highlighterAsync ??= createShikiHighlighter(config);
  8. const highlighter = await highlighterAsync;
  9. visit(tree, 'code', (node) => {
  10. const lang = typeof node.lang === 'string' ? node.lang : 'plaintext';
  11. const html = highlighter.highlight(node.value, lang);
  12. node.type = 'html';
  13. node.value = html;
  14. node.children = [];
  15. });
  16. };
  17. }