{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/plugins/mermaid/index.ts"],"sourcesContent":["import type { RemarkDocxPlugin } from \"../../types\";\nimport { warnOnce } from \"../../utils\";\nimport mermaid from \"mermaid\";\nimport { visit } from \"unist-util-visit\";\nimport { imageSize } from \"image-size\";\nimport { browserSvgToPng } from \"../image\";\nimport { Paragraph } from \"docx\";\n\nconst browserRender = async (value: string): Promise<string> => {\n  const element = document.createElement(\"div\");\n  element.style.visibility = \"hidden\";\n  document.body.appendChild(element);\n  try {\n    const result = await mermaid.render(\"mermaid\", value, element);\n    return result.svg;\n  } finally {\n    document.body.removeChild(element);\n  }\n};\n\n/**\n * A plugin to render Mermaid inside \"code\" nodes with \"mermaid\" language.\n */\nexport const mermaidPlugin = (): RemarkDocxPlugin => {\n  const renderSvg = browserRender;\n\n  return async ({ root, images }) => {\n    const promises: Promise<void>[] = [];\n    visit(root, \"code\", ({ lang, value }) => {\n      if (lang === \"mermaid\") {\n        if (!images.has(value)) {\n          images.set(value, null);\n\n          promises.push(\n            (async () => {\n              try {\n                const svg = await renderSvg(value);\n                const data = new TextEncoder().encode(svg);\n                const { width, height } = imageSize(data);\n                const pngBuffer = await browserSvgToPng({\n                  buffer: data.buffer,\n                  width,\n                  height,\n                });\n\n                images.set(value, {\n                  type: \"svg\",\n                  width,\n                  height,\n                  data: data.buffer,\n                  fallback: pngBuffer,\n                });\n              } catch (e) {\n                warnOnce(String(e));\n              }\n            })(),\n          );\n        }\n      }\n    });\n\n    await Promise.all(promises);\n\n    return {\n      code: ({ lang, value }, ctx) => {\n        if (lang !== \"mermaid\") {\n          return null;\n        }\n        const image = ctx.images.get(value);\n        if (image == null) {\n          return null;\n        }\n\n        return new Paragraph({\n          children: ctx.render([{ type: \"image\", url: value }]),\n        });\n      },\n    };\n  };\n};\n"],"mappings":"qSAQA,IAAM,EAAgB,KAAO,IAAmC,CAC9D,IAAM,EAAU,SAAS,cAAc,KAAK,EAC5C,EAAQ,MAAM,WAAa,SAC3B,SAAS,KAAK,YAAY,CAAO,EACjC,GAAI,CAEF,OAAO,MADc,EAAA,QAAQ,OAAO,UAAW,EAAO,CAAO,GAC/C,GAChB,QAAU,CACR,SAAS,KAAK,YAAY,CAAO,CACnC,CACF,EAKa,MAAwC,CACnD,IAAM,EAAY,EAElB,OAAO,MAAO,CAAE,OAAM,YAAa,CACjC,IAAM,EAA4B,CAAC,EAoCnC,OAnCA,EAAA,EAAA,OAAM,EAAM,QAAS,CAAE,OAAM,WAAY,CACnC,IAAS,YACN,EAAO,IAAI,CAAK,IACnB,EAAO,IAAI,EAAO,IAAI,EAEtB,EAAS,MACN,SAAY,CACX,GAAI,CACF,IAAM,EAAM,MAAM,EAAU,CAAK,EAC3B,EAAO,IAAI,YAAY,EAAE,OAAO,CAAG,EACnC,CAAE,QAAO,WAAA,EAAA,EAAA,WAAqB,CAAI,EAClC,EAAY,MAAM,EAAA,gBAAgB,CACtC,OAAQ,EAAK,OACb,QACA,QACF,CAAC,EAED,EAAO,IAAI,EAAO,CAChB,KAAM,MACN,QACA,SACA,KAAM,EAAK,OACX,SAAU,CACZ,CAAC,CACH,OAAS,EAAG,CACV,EAAA,EAAS,OAAO,CAAC,CAAC,CACpB,CACF,GAAG,CACL,GAGN,CAAC,EAED,MAAM,QAAQ,IAAI,CAAQ,EAEnB,CACL,MAAO,CAAE,OAAM,SAAS,IAClB,IAAS,WAGC,EAAI,OAAO,IAAI,CACzB,GAAS,KACJ,KAGF,IAAI,EAAA,UAAU,CACnB,SAAU,EAAI,OAAO,CAAC,CAAE,KAAM,QAAS,IAAK,CAAM,CAAC,CAAC,CACtD,CAAC,CAEL,CACF,CACF"}