remark-docx
Version:
remark plugin to compile markdown to docx (Microsoft Word, Office Open XML).
1 lines • 3.42 kB
Source Map (JSON)
{"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"}