{"version":3,"file":"index.cjs","sources":["../../../src/plugins/latex/index.ts"],"sourcesContent":["import type { RemarkDocxPlugin } from \"../../types\";\nimport { Paragraph, XmlAttributeComponent, XmlComponent } from \"docx\";\nimport { mml2omml } from \"mathml2omml\";\nimport { XMLParser } from \"fast-xml-parser\";\nimport { mathjax } from \"@mathjax/src/js/mathjax.js\";\nimport { TeX } from \"@mathjax/src/js/input/tex.js\";\nimport { SerializedMmlVisitor } from \"@mathjax/src/js/core/MmlTree/SerializedMmlVisitor.js\";\nimport { STATE } from \"@mathjax/src/js/core/MathItem.js\";\nimport { liteAdaptor } from \"@mathjax/src/js/adaptors/liteAdaptor.js\";\nimport { RegisterHTMLHandler } from \"@mathjax/src/js/handlers/html.js\";\n// import { source } from \"@mathjax/src/components/js/source.js\";\nimport { Loader } from \"@mathjax/src/js/components/loader.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/noerrors/noerrors.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/ams/ams.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/boldsymbol/boldsymbol.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/newcommand/newcommand.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/textmacros/textmacros.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/unicode/unicode.js\";\n\n// https://devblogs.microsoft.com/math-in-office/officemath/\n\nclass MathAttributeComponent extends XmlAttributeComponent<\n  Record<string, any>\n> {}\n\nclass MathXmlComponent extends XmlComponent {\n  constructor(\n    rootKey: string,\n    children: (MathXmlComponent | string)[],\n    attrs?: Record<string, any>,\n  ) {\n    super(rootKey);\n    if (attrs) {\n      const mathAttrs: Record<string, any> = {};\n      for (const [k, v] of Object.entries(attrs)) {\n        if (k.startsWith(\"m:\")) {\n          mathAttrs[k] = v;\n        }\n      }\n      this.root.push(new MathAttributeComponent(mathAttrs));\n    }\n    if (children.length) {\n      this.root.push(...children);\n    }\n  }\n}\n\ninterface XmlText {\n  \"#text\": string | number | boolean;\n}\ninterface XmlAttr {\n  [key: string]: string | number | boolean;\n}\ninterface XmlElement {\n  [key: string]: typeof key extends \":@\" ? XmlAttr : XmlNode[];\n}\ntype XmlNode = XmlElement | XmlText;\n\nconst isXmlText = (o: XmlNode): o is XmlText => \"#text\" in o;\n\nconst buildElement = (o: XmlElement): XmlComponent | null => {\n  const attrs = o[\":@\"];\n  let tagName = \"\";\n  let children: XmlNode[] | undefined;\n  for (const k of Object.keys(o)) {\n    if (k !== \":@\") {\n      tagName = k;\n      children = o[k];\n      break;\n    }\n  }\n\n  if (tagName.startsWith(\"m:\")) {\n    const mathChildren: (MathXmlComponent | string)[] = [];\n    for (const n of children ?? []) {\n      if (isXmlText(n)) {\n        const text = n[\"#text\"];\n        mathChildren.push(String(text));\n      } else {\n        const c = buildElement(n);\n        if (c) {\n          mathChildren.push(c);\n        }\n      }\n    }\n    return new MathXmlComponent(tagName, mathChildren, attrs);\n  }\n\n  return null;\n};\n\n/**\n * A plugin to render LaTeX inside \"math\" and \"inlineMath\" nodes\n */\nexport const latexPlugin = (): RemarkDocxPlugin => {\n  // https://github.com/mathjax/MathJax-demos-node/blob/master/mjs/mixed/tex2mml\n  // https://github.com/mathjax/MathJax-src/blob/master/components/mjs/input/tex/tex.js\n  // https://github.com/mathjax/MathJax-src/blob/master/ts/components/startup.ts#L490\n  // https://github.com/mathjax/MathJax-src/blob/master/testsuite/src/setupTex.ts#L162\n  RegisterHTMLHandler(liteAdaptor() as any);\n\n  const load = [\n    \"[tex]/noerrors\",\n    \"[tex]/ams\",\n    \"[tex]/newcommand\",\n    \"[tex]/boldsymbol\",\n    \"[tex]/textmacros\",\n    \"[tex]/unicode\",\n  ];\n  const packages = [\"base\"].concat(load.map((name) => name.slice(6)));\n  Loader.preLoaded(...load);\n\n  const tex = new TeX({ packages });\n  const doc = mathjax.document(\"\", { InputJax: tex });\n  const visitor = new SerializedMmlVisitor();\n\n  const parser = new XMLParser({\n    ignoreAttributes: false,\n    preserveOrder: true,\n    attributeNamePrefix: \"\",\n  });\n\n  const parseLatex = (value: string): XmlComponent | null => {\n    const node = doc.convert(value, { end: STATE[\"CONVERT\"] });\n    const mathml = visitor.visitTree(node);\n    const omml = mml2omml(mathml);\n    const obj = parser.parse(omml);\n    return buildElement(obj[0]);\n  };\n\n  return async () => {\n    return {\n      math: ({ value }) => {\n        const math = parseLatex(value);\n        if (!math) {\n          return null;\n        }\n        return new Paragraph({\n          children: [math],\n        });\n      },\n      inlineMath: ({ value }) => {\n        return parseLatex(value);\n      },\n    };\n  };\n};\n"],"names":["XmlAttributeComponent","XmlComponent","RegisterHTMLHandler","liteAdaptor","Loader","TeX","mathjax","SerializedMmlVisitor","XMLParser","STATE","mml2omml","Paragraph"],"mappings":"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"}