{"version":3,"file":"index.cjs","sources":["../../../src/plugins/shiki/index.ts"],"sourcesContent":["import { Paragraph, TextRun } from \"docx\";\nimport type { RemarkDocxPlugin } from \"../../types\";\nimport {\n  createHighlighter,\n  type BundledLanguage,\n  type BundledTheme,\n} from \"shiki\";\nimport { visit } from \"unist-util-visit\";\nimport type { FontStyle } from \"shiki/textmate\";\nimport { warnOnce } from \"../../utils\";\n\n/**\n * Format to 6 disit hex\n */\nconst formatHex = (str: string): string => {\n  // #RGB\n  if (str.length === 4) {\n    const r = str[1]!;\n    const g = str[2]!;\n    const b = str[3]!;\n    return str[0]! + r + r + g + g + b + b;\n  }\n  // #RRGGBBAA\n  if (str.length === 9) {\n    return str.slice(0, 7);\n  }\n  return str;\n};\n\nexport interface ShikiPluginOptions {\n  /**\n   * https://shiki.style/themes\n   */\n  theme: BundledTheme;\n}\n\n/**\n * A plugin to render \"code\" nodes, with syntax highlighting powered by shiki.\n */\nexport const shikiPlugin = ({\n  theme,\n}: ShikiPluginOptions): RemarkDocxPlugin => {\n  let highlighter: Awaited<ReturnType<typeof createHighlighter>> | undefined;\n  const langs = new Set<string>();\n  const failedLangs = new Set<string>();\n\n  return async ({ root }) => {\n    const newLangs: string[] = [];\n\n    visit(root, \"code\", ({ lang }) => {\n      if (lang) {\n        if (!langs.has(lang)) {\n          langs.add(lang);\n          newLangs.push(lang);\n        }\n      }\n    });\n\n    if (!highlighter) {\n      highlighter = await createHighlighter({\n        themes: [theme],\n        langs: [],\n      });\n    }\n    await Promise.all(\n      newLangs.map(async (l) => {\n        try {\n          await highlighter!.loadLanguage(l as BundledLanguage);\n        } catch (e) {\n          failedLangs.add(l);\n          warnOnce(String(e));\n        }\n      }),\n    );\n\n    return {\n      code: ({ value, lang }) => {\n        if (!lang || failedLangs.has(lang)) {\n          return null;\n        }\n        const res = highlighter!.codeToTokens(value, {\n          lang: lang as BundledLanguage,\n          theme,\n        });\n        let { bg, fg } = res;\n        if (fg) {\n          fg = formatHex(fg);\n        }\n        if (bg) {\n          bg = formatHex(bg);\n        }\n\n        return res.tokens.map((r) => {\n          return new Paragraph({\n            shading: {\n              type: \"clear\",\n              color: \"auto\",\n              fill: bg,\n            },\n            children: r.map(({ content, bgColor, color, fontStyle }) => {\n              if (color) {\n                color = formatHex(color);\n              }\n              if (bgColor) {\n                bgColor = formatHex(bgColor);\n              }\n              return new TextRun({\n                text: content,\n                color: color ?? fg,\n                shading: bgColor\n                  ? {\n                      type: \"clear\",\n                      color: \"auto\",\n                      fill: bgColor,\n                    }\n                  : undefined,\n                bold: fontStyle === (2 satisfies FontStyle.Bold),\n                italics: fontStyle === (1 satisfies FontStyle.Italic),\n                underline:\n                  fontStyle === (4 satisfies FontStyle.Underline)\n                    ? { type: \"single\", color: fg }\n                    : undefined,\n                strike: fontStyle === (8 satisfies FontStyle.Strikethrough),\n              });\n            }),\n          });\n        });\n      },\n    };\n  };\n};\n"],"names":["visit","createHighlighter","warnOnce","Paragraph","TextRun"],"mappings":"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"}