remark-docx 0.3.28 → 0.3.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/lib/chunk-CMqjfN_6.cjs +1 -0
  2. package/lib/index.cjs +2 -600
  3. package/lib/index.cjs.map +1 -1
  4. package/lib/index.d.ts +3 -3
  5. package/lib/index.js +468 -596
  6. package/lib/index.js.map +1 -1
  7. package/lib/mdast-util-to-docx.d.ts +2 -2
  8. package/lib/plugin.d.ts +3 -3
  9. package/lib/plugins/html/index.cjs +2 -28
  10. package/lib/plugins/html/index.cjs.map +1 -1
  11. package/lib/plugins/html/index.d.ts +1 -1
  12. package/lib/plugins/html/index.js +10 -25
  13. package/lib/plugins/html/index.js.map +1 -1
  14. package/lib/plugins/image/index.cjs +2 -129
  15. package/lib/plugins/image/index.cjs.map +1 -1
  16. package/lib/plugins/image/index.d.ts +1 -1
  17. package/lib/plugins/image/index.js +87 -124
  18. package/lib/plugins/image/index.js.map +1 -1
  19. package/lib/plugins/latex/index.cjs +2 -123
  20. package/lib/plugins/latex/index.cjs.map +1 -1
  21. package/lib/plugins/latex/index.d.ts +1 -7
  22. package/lib/plugins/latex/index.js +73 -119
  23. package/lib/plugins/latex/index.js.map +1 -1
  24. package/lib/plugins/mermaid/index.cjs +2 -77
  25. package/lib/plugins/mermaid/index.cjs.map +1 -1
  26. package/lib/plugins/mermaid/index.d.ts +1 -1
  27. package/lib/plugins/mermaid/index.js +46 -73
  28. package/lib/plugins/mermaid/index.js.map +1 -1
  29. package/lib/plugins/shiki/index.cjs +2 -113
  30. package/lib/plugins/shiki/index.cjs.map +1 -1
  31. package/lib/plugins/shiki/index.d.ts +2 -2
  32. package/lib/plugins/shiki/index.js +60 -109
  33. package/lib/plugins/shiki/index.js.map +1 -1
  34. package/lib/types.d.ts +3 -3
  35. package/lib/utils-BBifD5si.js +16 -0
  36. package/lib/utils-BBifD5si.js.map +1 -0
  37. package/lib/utils-D_YAYv4R.cjs +2 -0
  38. package/lib/utils-D_YAYv4R.cjs.map +1 -0
  39. package/package.json +5 -6
  40. package/lib/utils-BVB8aSvE.js +0 -25
  41. package/lib/utils-BVB8aSvE.js.map +0 -1
  42. package/lib/utils-KFMY7wxz.js +0 -22
  43. package/lib/utils-KFMY7wxz.js.map +0 -1
@@ -1,126 +1,89 @@
1
- import { w as warnOnce, i as isSupportedType } from '../../utils-KFMY7wxz.js';
2
- import { visit } from 'unist-util-visit';
3
- import { imageSize } from 'image-size';
4
-
5
- const loadWithFetch = async (url) => {
6
- const res = await fetch(url);
7
- return res.arrayBuffer();
8
- };
9
- /**
10
- * @internal
11
- */
12
- const browserSvgToPng = async ({ buffer, width, height, }) => {
13
- const svgBlob = new Blob([buffer], { type: "image/svg+xml" });
14
- const url = URL.createObjectURL(svgBlob);
15
- try {
16
- const img = new Image();
17
- img.src = url;
18
- await img.decode();
19
- const dpr = window.devicePixelRatio;
20
- const canvas = document.createElement("canvas");
21
- const scaledWidth = width * dpr;
22
- const scaledHeight = height * dpr;
23
- canvas.width = scaledWidth;
24
- canvas.height = scaledHeight;
25
- const ctx = canvas.getContext("2d");
26
- ctx.drawImage(img, 0, 0, scaledWidth, scaledHeight);
27
- return new Promise((resolve) => {
28
- canvas.toBlob((blob) => {
29
- blob.arrayBuffer().then(resolve);
30
- }, "image/png");
31
- });
32
- }
33
- finally {
34
- URL.revokeObjectURL(url);
35
- }
36
- };
37
- /**
38
- * A plugin to render "image" nodes
39
- */
40
- const imagePlugin = ({ load = loadWithFetch, fallbackSvg = browserSvgToPng, } = {}) => {
41
- const cache = new Map();
42
- const maxCacheLength = 100;
43
- return async ({ root, definition, images }) => {
44
- const imageList = [];
45
- visit(root, "image", (node) => {
46
- imageList.push(node);
47
- });
48
- visit(root, "imageReference", (node) => {
49
- const maybeImage = definition(node.identifier);
50
- if (maybeImage) {
51
- imageList.push(maybeImage);
52
- }
53
- });
54
- if (imageList.length !== 0) {
55
- const promises = new Map();
56
- imageList.forEach(({ url }) => {
57
- if (images.has(url)) {
58
- return;
59
- }
60
- if (cache.has(url)) {
61
- images.set(url, cache.get(url));
62
- return;
63
- }
64
- if (!promises.has(url)) {
65
- promises.set(url, (async () => {
66
- let data;
67
- try {
68
- data = await load(url);
69
- }
70
- catch (e) {
71
- warnOnce(`Failed to load image: ${url} ${e}`);
72
- return;
73
- }
74
- const { width, height, type } = imageSize(new Uint8Array(data));
75
- if (!isSupportedType(type)) {
76
- warnOnce(`Not supported image type: ${type}`);
77
- return;
78
- }
79
- if (type === "svg") {
80
- try {
81
- const fallback = await fallbackSvg({
82
- buffer: data,
83
- width,
84
- height,
85
- });
86
- const docxImage = {
87
- type,
88
- width,
89
- height,
90
- data,
91
- fallback,
92
- };
93
- images.set(url, docxImage);
94
- cache.set(url, docxImage);
95
- }
96
- catch (e) {
97
- warnOnce(`Failed to create fallback image: ${url} ${e}`);
98
- return;
99
- }
100
- }
101
- else {
102
- const docxImage = { type, width, height, data };
103
- images.set(url, docxImage);
104
- cache.set(url, docxImage);
105
- }
106
- })());
107
- }
108
- });
109
- await Promise.all(promises.values());
110
- }
111
- if (cache.size > maxCacheLength) {
112
- let deleteCount = cache.size - maxCacheLength;
113
- for (const key of cache.keys()) {
114
- cache.delete(key);
115
- deleteCount--;
116
- if (deleteCount <= 0) {
117
- break;
118
- }
119
- }
120
- }
121
- return {};
122
- };
1
+ import { n as e, t } from "../../utils-BBifD5si.js";
2
+ import { visit as n } from "unist-util-visit";
3
+ import { imageSize as r } from "image-size";
4
+ //#region src/plugins/image/index.ts
5
+ var i = async (e) => (await fetch(e)).arrayBuffer(), a = async ({ buffer: e, width: t, height: n }) => {
6
+ let r = new Blob([e], { type: "image/svg+xml" }), i = URL.createObjectURL(r);
7
+ try {
8
+ let e = new Image();
9
+ e.src = i, await e.decode();
10
+ let r = window.devicePixelRatio, a = document.createElement("canvas"), o = t * r, s = n * r;
11
+ return a.width = o, a.height = s, a.getContext("2d").drawImage(e, 0, 0, o, s), new Promise((e) => {
12
+ a.toBlob((t) => {
13
+ t.arrayBuffer().then(e);
14
+ }, "image/png");
15
+ });
16
+ } finally {
17
+ URL.revokeObjectURL(i);
18
+ }
19
+ }, o = ({ load: o = i, fallbackSvg: s = a } = {}) => {
20
+ let c = /* @__PURE__ */ new Map();
21
+ return async ({ root: i, definition: a, images: l }) => {
22
+ let u = [];
23
+ if (n(i, "image", (e) => {
24
+ u.push(e);
25
+ }), n(i, "imageReference", (e) => {
26
+ let t = a(e.identifier);
27
+ t && u.push(t);
28
+ }), u.length !== 0) {
29
+ let n = /* @__PURE__ */ new Map();
30
+ u.forEach(({ url: i }) => {
31
+ if (!l.has(i)) {
32
+ if (c.has(i)) {
33
+ l.set(i, c.get(i));
34
+ return;
35
+ }
36
+ n.has(i) || n.set(i, (async () => {
37
+ let n;
38
+ try {
39
+ n = await o(i);
40
+ } catch (t) {
41
+ e(`Failed to load image: ${i} ${t}`);
42
+ return;
43
+ }
44
+ let { width: a, height: u, type: d } = r(new Uint8Array(n));
45
+ if (!t(d)) {
46
+ e(`Not supported image type: ${d}`);
47
+ return;
48
+ }
49
+ if (d === "svg") try {
50
+ let e = await s({
51
+ buffer: n,
52
+ width: a,
53
+ height: u
54
+ }), t = {
55
+ type: d,
56
+ width: a,
57
+ height: u,
58
+ data: n,
59
+ fallback: e
60
+ };
61
+ l.set(i, t), c.set(i, t);
62
+ } catch (t) {
63
+ e(`Failed to create fallback image: ${i} ${t}`);
64
+ return;
65
+ }
66
+ else {
67
+ let e = {
68
+ type: d,
69
+ width: a,
70
+ height: u,
71
+ data: n
72
+ };
73
+ l.set(i, e), c.set(i, e);
74
+ }
75
+ })());
76
+ }
77
+ }), await Promise.all(n.values());
78
+ }
79
+ if (c.size > 100) {
80
+ let e = c.size - 100;
81
+ for (let t of c.keys()) if (c.delete(t), e--, e <= 0) break;
82
+ }
83
+ return {};
84
+ };
123
85
  };
86
+ //#endregion
87
+ export { a as browserSvgToPng, o as imagePlugin };
124
88
 
125
- export { browserSvgToPng, imagePlugin };
126
- //# sourceMappingURL=index.js.map
89
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/plugins/image/index.ts"],"sourcesContent":["import { isSupportedType, warnOnce } from \"../../utils\";\nimport { type DocxImageData, type RemarkDocxPlugin } from \"../../types\";\nimport type * as mdast from \"mdast\";\nimport { visit } from \"unist-util-visit\";\nimport { imageSize } from \"image-size\";\n\ntype LoadFn = (url: string) => Promise<ArrayBuffer>;\n\ntype SvgToPngFn = (options: {\n buffer: ArrayBuffer;\n width: number;\n height: number;\n}) => Promise<ArrayBuffer>;\n\nconst loadWithFetch: LoadFn = async (url) => {\n const res = await fetch(url);\n return res.arrayBuffer();\n};\n\n/**\n * @internal\n */\nexport const browserSvgToPng: SvgToPngFn = async ({\n buffer,\n width,\n height,\n}) => {\n const svgBlob = new Blob([buffer], { type: \"image/svg+xml\" });\n const url = URL.createObjectURL(svgBlob);\n\n try {\n const img = new Image();\n img.src = url;\n await img.decode();\n\n const dpr = window.devicePixelRatio;\n\n const canvas = document.createElement(\"canvas\");\n const scaledWidth = width * dpr;\n const scaledHeight = height * dpr;\n canvas.width = scaledWidth;\n canvas.height = scaledHeight;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(img, 0, 0, scaledWidth, scaledHeight);\n\n return new Promise<ArrayBuffer>((resolve) => {\n canvas.toBlob((blob) => {\n blob!.arrayBuffer().then(resolve);\n }, \"image/png\");\n });\n } finally {\n URL.revokeObjectURL(url);\n }\n};\n\nexport interface ImagePluginOptions {\n /**\n * A function to resolve image data from url.\n * @default {@link loadWithFetch}\n */\n load?: LoadFn;\n /**\n * A function to convert SVG to PNG. According to the docx specifications, embedding SVG images also requires including PNG.\n * @default {@link browserSvgToPng}, which handles conversion only on browser\n */\n fallbackSvg?: SvgToPngFn;\n}\n\n/**\n * A plugin to render \"image\" nodes\n */\nexport const imagePlugin = ({\n load = loadWithFetch,\n fallbackSvg = browserSvgToPng,\n}: ImagePluginOptions = {}): RemarkDocxPlugin => {\n const cache = new Map<string, DocxImageData>();\n\n const maxCacheLength = 100;\n\n return async ({ root, definition, images }) => {\n const imageList: (mdast.Image | mdast.Definition)[] = [];\n visit(root, \"image\", (node) => {\n imageList.push(node);\n });\n visit(root, \"imageReference\", (node) => {\n const maybeImage = definition(node.identifier)!;\n if (maybeImage) {\n imageList.push(maybeImage);\n }\n });\n\n if (imageList.length !== 0) {\n const promises = new Map<string, Promise<void>>();\n imageList.forEach(({ url }) => {\n if (images.has(url)) {\n return;\n }\n if (cache.has(url)) {\n images.set(url, cache.get(url)!);\n return;\n }\n if (!promises.has(url)) {\n promises.set(\n url,\n (async () => {\n let data: ArrayBuffer;\n try {\n data = await load(url);\n } catch (e) {\n warnOnce(`Failed to load image: ${url} ${e}`);\n return;\n }\n\n const { width, height, type } = imageSize(new Uint8Array(data));\n if (!isSupportedType(type)) {\n warnOnce(`Not supported image type: ${type}`);\n return;\n }\n\n if (type === \"svg\") {\n try {\n const fallback = await fallbackSvg({\n buffer: data,\n width,\n height,\n });\n const docxImage: DocxImageData = {\n type,\n width,\n height,\n data,\n fallback,\n };\n images.set(url, docxImage);\n cache.set(url, docxImage);\n } catch (e) {\n warnOnce(`Failed to create fallback image: ${url} ${e}`);\n return;\n }\n } else {\n const docxImage: DocxImageData = { type, width, height, data };\n images.set(url, docxImage);\n cache.set(url, docxImage);\n }\n })(),\n );\n }\n });\n\n await Promise.all(promises.values());\n }\n\n if (cache.size > maxCacheLength) {\n let deleteCount = cache.size - maxCacheLength;\n for (const key of cache.keys()) {\n cache.delete(key);\n deleteCount--;\n if (deleteCount <= 0) {\n break;\n }\n }\n }\n\n return {};\n };\n};\n"],"names":[],"mappings":";;;;AAcA,MAAM,aAAa,GAAW,OAAO,GAAG,KAAI;AAC1C,IAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC;AAC5B,IAAA,OAAO,GAAG,CAAC,WAAW,EAAE;AAC1B,CAAC;AAED;;AAEG;AACI,MAAM,eAAe,GAAe,OAAO,EAChD,MAAM,EACN,KAAK,EACL,MAAM,GACP,KAAI;AACH,IAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;AAExC,IAAA,IAAI;AACF,QAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,QAAA,GAAG,CAAC,GAAG,GAAG,GAAG;AACb,QAAA,MAAM,GAAG,CAAC,MAAM,EAAE;AAElB,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB;QAEnC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,QAAA,MAAM,WAAW,GAAG,KAAK,GAAG,GAAG;AAC/B,QAAA,MAAM,YAAY,GAAG,MAAM,GAAG,GAAG;AACjC,QAAA,MAAM,CAAC,KAAK,GAAG,WAAW;AAC1B,QAAA,MAAM,CAAC,MAAM,GAAG,YAAY;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE;AACpC,QAAA,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC;AAEnD,QAAA,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,KAAI;AAC1C,YAAA,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;gBACrB,IAAK,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;YACnC,CAAC,EAAE,WAAW,CAAC;AACjB,QAAA,CAAC,CAAC;IACJ;YAAU;AACR,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;IAC1B;AACF;AAeA;;AAEG;AACI,MAAM,WAAW,GAAG,CAAC,EAC1B,IAAI,GAAG,aAAa,EACpB,WAAW,GAAG,eAAe,GAAA,GACP,EAAE,KAAsB;AAC9C,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB;IAE9C,MAAM,cAAc,GAAG,GAAG;IAE1B,OAAO,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAI;QAC5C,MAAM,SAAS,GAAuC,EAAE;QACxD,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,KAAI;AAC5B,YAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACtB,QAAA,CAAC,CAAC;QACF,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC,IAAI,KAAI;YACrC,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAE;YAC/C,IAAI,UAAU,EAAE;AACd,gBAAA,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB;YACjD,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,KAAI;AAC5B,gBAAA,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACnB;gBACF;AACA,gBAAA,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAClB,oBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;oBAChC;gBACF;gBACA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACtB,QAAQ,CAAC,GAAG,CACV,GAAG,EACH,CAAC,YAAW;AACV,wBAAA,IAAI,IAAiB;AACrB,wBAAA,IAAI;AACF,4BAAA,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;wBACxB;wBAAE,OAAO,CAAC,EAAE;AACV,4BAAA,QAAQ,CAAC,CAAA,sBAAA,EAAyB,GAAG,IAAI,CAAC,CAAA,CAAE,CAAC;4BAC7C;wBACF;AAEA,wBAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AAC/D,wBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AAC1B,4BAAA,QAAQ,CAAC,CAAA,0BAAA,EAA6B,IAAI,CAAA,CAAE,CAAC;4BAC7C;wBACF;AAEA,wBAAA,IAAI,IAAI,KAAK,KAAK,EAAE;AAClB,4BAAA,IAAI;AACF,gCAAA,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC;AACjC,oCAAA,MAAM,EAAE,IAAI;oCACZ,KAAK;oCACL,MAAM;AACP,iCAAA,CAAC;AACF,gCAAA,MAAM,SAAS,GAAkB;oCAC/B,IAAI;oCACJ,KAAK;oCACL,MAAM;oCACN,IAAI;oCACJ,QAAQ;iCACT;AACD,gCAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;AAC1B,gCAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;4BAC3B;4BAAE,OAAO,CAAC,EAAE;AACV,gCAAA,QAAQ,CAAC,CAAA,iCAAA,EAAoC,GAAG,IAAI,CAAC,CAAA,CAAE,CAAC;gCACxD;4BACF;wBACF;6BAAO;4BACL,MAAM,SAAS,GAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;AAC9D,4BAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;AAC1B,4BAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;wBAC3B;oBACF,CAAC,GAAG,CACL;gBACH;AACF,YAAA,CAAC,CAAC;YAEF,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACtC;AAEA,QAAA,IAAI,KAAK,CAAC,IAAI,GAAG,cAAc,EAAE;AAC/B,YAAA,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,GAAG,cAAc;YAC7C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;AAC9B,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;AACjB,gBAAA,WAAW,EAAE;AACb,gBAAA,IAAI,WAAW,IAAI,CAAC,EAAE;oBACpB;gBACF;YACF;QACF;AAEA,QAAA,OAAO,EAAE;AACX,IAAA,CAAC;AACH;;;;"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/plugins/image/index.ts"],"sourcesContent":["import { isSupportedType, warnOnce } from \"../../utils\";\nimport { type DocxImageData, type RemarkDocxPlugin } from \"../../types\";\nimport type * as mdast from \"mdast\";\nimport { visit } from \"unist-util-visit\";\nimport { imageSize } from \"image-size\";\n\ntype LoadFn = (url: string) => Promise<ArrayBuffer>;\n\ntype SvgToPngFn = (options: {\n buffer: ArrayBuffer;\n width: number;\n height: number;\n}) => Promise<ArrayBuffer>;\n\nconst loadWithFetch: LoadFn = async (url) => {\n const res = await fetch(url);\n return res.arrayBuffer();\n};\n\n/**\n * @internal\n */\nexport const browserSvgToPng: SvgToPngFn = async ({\n buffer,\n width,\n height,\n}) => {\n const svgBlob = new Blob([buffer], { type: \"image/svg+xml\" });\n const url = URL.createObjectURL(svgBlob);\n\n try {\n const img = new Image();\n img.src = url;\n await img.decode();\n\n const dpr = window.devicePixelRatio;\n\n const canvas = document.createElement(\"canvas\");\n const scaledWidth = width * dpr;\n const scaledHeight = height * dpr;\n canvas.width = scaledWidth;\n canvas.height = scaledHeight;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(img, 0, 0, scaledWidth, scaledHeight);\n\n return new Promise<ArrayBuffer>((resolve) => {\n canvas.toBlob((blob) => {\n blob!.arrayBuffer().then(resolve);\n }, \"image/png\");\n });\n } finally {\n URL.revokeObjectURL(url);\n }\n};\n\nexport interface ImagePluginOptions {\n /**\n * A function to resolve image data from url.\n * @default {@link loadWithFetch}\n */\n load?: LoadFn;\n /**\n * A function to convert SVG to PNG. According to the docx specifications, embedding SVG images also requires including PNG.\n * @default {@link browserSvgToPng}, which handles conversion only on browser\n */\n fallbackSvg?: SvgToPngFn;\n}\n\n/**\n * A plugin to render \"image\" nodes\n */\nexport const imagePlugin = ({\n load = loadWithFetch,\n fallbackSvg = browserSvgToPng,\n}: ImagePluginOptions = {}): RemarkDocxPlugin => {\n const cache = new Map<string, DocxImageData>();\n\n const maxCacheLength = 100;\n\n return async ({ root, definition, images }) => {\n const imageList: (mdast.Image | mdast.Definition)[] = [];\n visit(root, \"image\", (node) => {\n imageList.push(node);\n });\n visit(root, \"imageReference\", (node) => {\n const maybeImage = definition(node.identifier)!;\n if (maybeImage) {\n imageList.push(maybeImage);\n }\n });\n\n if (imageList.length !== 0) {\n const promises = new Map<string, Promise<void>>();\n imageList.forEach(({ url }) => {\n if (images.has(url)) {\n return;\n }\n if (cache.has(url)) {\n images.set(url, cache.get(url)!);\n return;\n }\n if (!promises.has(url)) {\n promises.set(\n url,\n (async () => {\n let data: ArrayBuffer;\n try {\n data = await load(url);\n } catch (e) {\n warnOnce(`Failed to load image: ${url} ${e}`);\n return;\n }\n\n const { width, height, type } = imageSize(new Uint8Array(data));\n if (!isSupportedType(type)) {\n warnOnce(`Not supported image type: ${type}`);\n return;\n }\n\n if (type === \"svg\") {\n try {\n const fallback = await fallbackSvg({\n buffer: data,\n width,\n height,\n });\n const docxImage: DocxImageData = {\n type,\n width,\n height,\n data,\n fallback,\n };\n images.set(url, docxImage);\n cache.set(url, docxImage);\n } catch (e) {\n warnOnce(`Failed to create fallback image: ${url} ${e}`);\n return;\n }\n } else {\n const docxImage: DocxImageData = { type, width, height, data };\n images.set(url, docxImage);\n cache.set(url, docxImage);\n }\n })(),\n );\n }\n });\n\n await Promise.all(promises.values());\n }\n\n if (cache.size > maxCacheLength) {\n let deleteCount = cache.size - maxCacheLength;\n for (const key of cache.keys()) {\n cache.delete(key);\n deleteCount--;\n if (deleteCount <= 0) {\n break;\n }\n }\n }\n\n return {};\n };\n};\n"],"mappings":";;;;AAcA,IAAM,IAAwB,OAAO,OAE5B,MADW,MAAM,CAAG,GAChB,YAAY,GAMZ,IAA8B,OAAO,EAChD,WACA,UACA,gBACI;CACJ,IAAM,IAAU,IAAI,KAAK,CAAC,CAAM,GAAG,EAAE,MAAM,gBAAgB,CAAC,GACtD,IAAM,IAAI,gBAAgB,CAAO;CAEvC,IAAI;EACF,IAAM,IAAM,IAAI,MAAM;EAEtB,AADA,EAAI,MAAM,GACV,MAAM,EAAI,OAAO;EAEjB,IAAM,IAAM,OAAO,kBAEb,IAAS,SAAS,cAAc,QAAQ,GACxC,IAAc,IAAQ,GACtB,IAAe,IAAS;EAM9B,OALA,EAAO,QAAQ,GACf,EAAO,SAAS,GAEhB,EADmB,WAAW,IAC9B,EAAI,UAAU,GAAK,GAAG,GAAG,GAAa,CAAY,GAE3C,IAAI,SAAsB,MAAY;GAC3C,EAAO,QAAQ,MAAS;IACtB,EAAM,YAAY,EAAE,KAAK,CAAO;GAClC,GAAG,WAAW;EAChB,CAAC;CACH,UAAU;EACR,IAAI,gBAAgB,CAAG;CACzB;AACF,GAkBa,KAAe,EAC1B,UAAO,GACP,iBAAc,MACQ,CAAC,MAAwB;CAC/C,IAAM,oBAAQ,IAAI,IAA2B;CAI7C,OAAO,OAAO,EAAE,SAAM,eAAY,gBAAa;EAC7C,IAAM,IAAgD,CAAC;EAWvD,IAVA,EAAM,GAAM,UAAU,MAAS;GAC7B,EAAU,KAAK,CAAI;EACrB,CAAC,GACD,EAAM,GAAM,mBAAmB,MAAS;GACtC,IAAM,IAAa,EAAW,EAAK,UAAU;GAC7C,AAAI,KACF,EAAU,KAAK,CAAU;EAE7B,CAAC,GAEG,EAAU,WAAW,GAAG;GAC1B,IAAM,oBAAW,IAAI,IAA2B;GAyDhD,AAxDA,EAAU,SAAS,EAAE,aAAU;IACzB,OAAO,IAAI,CAAG,GAGlB;SAAI,EAAM,IAAI,CAAG,GAAG;MAClB,EAAO,IAAI,GAAK,EAAM,IAAI,CAAG,CAAE;MAC/B;KACF;KACA,AAAK,EAAS,IAAI,CAAG,KACnB,EAAS,IACP,IACC,YAAY;MACX,IAAI;MACJ,IAAI;OACF,IAAO,MAAM,EAAK,CAAG;MACvB,SAAS,GAAG;OACV,EAAS,yBAAyB,EAAI,GAAG,GAAG;OAC5C;MACF;MAEA,IAAM,EAAE,UAAO,WAAQ,YAAS,EAAU,IAAI,WAAW,CAAI,CAAC;MAC9D,IAAI,CAAC,EAAgB,CAAI,GAAG;OAC1B,EAAS,6BAA6B,GAAM;OAC5C;MACF;MAEA,IAAI,MAAS,OACX,IAAI;OACF,IAAM,IAAW,MAAM,EAAY;QACjC,QAAQ;QACR;QACA;OACF,CAAC,GACK,IAA2B;QAC/B;QACA;QACA;QACA;QACA;OACF;OAEA,AADA,EAAO,IAAI,GAAK,CAAS,GACzB,EAAM,IAAI,GAAK,CAAS;MAC1B,SAAS,GAAG;OACV,EAAS,oCAAoC,EAAI,GAAG,GAAG;OACvD;MACF;WACK;OACL,IAAM,IAA2B;QAAE;QAAM;QAAO;QAAQ;OAAK;OAE7D,AADA,EAAO,IAAI,GAAK,CAAS,GACzB,EAAM,IAAI,GAAK,CAAS;MAC1B;KACF,GAAG,CACL;IA7CF;GA+CF,CAAC,GAED,MAAM,QAAQ,IAAI,EAAS,OAAO,CAAC;EACrC;EAEA,IAAI,EAAM,OAAO,KAAgB;GAC/B,IAAI,IAAc,EAAM,OAAO;GAC/B,KAAK,IAAM,KAAO,EAAM,KAAK,GAG3B,IAFA,EAAM,OAAO,CAAG,GAChB,KACI,KAAe,GACjB;EAGN;EAEA,OAAO,CAAC;CACV;AACF"}
@@ -1,123 +1,2 @@
1
- 'use strict';
2
-
3
- var docx = require('docx');
4
- var mathml2omml = require('mathml2omml');
5
- var fastXmlParser = require('fast-xml-parser');
6
- var mathjax_js = require('@mathjax/src/js/mathjax.js');
7
- var tex_js = require('@mathjax/src/js/input/tex.js');
8
- var SerializedMmlVisitor_js = require('@mathjax/src/js/core/MmlTree/SerializedMmlVisitor.js');
9
- var MathItem_js = require('@mathjax/src/js/core/MathItem.js');
10
- var liteAdaptor_js = require('@mathjax/src/js/adaptors/liteAdaptor.js');
11
- var html_js = require('@mathjax/src/js/handlers/html.js');
12
- var loader_js = require('@mathjax/src/js/components/loader.js');
13
- require('@mathjax/src/components/js/input/tex/extensions/noerrors/noerrors.js');
14
- require('@mathjax/src/components/js/input/tex/extensions/ams/ams.js');
15
- require('@mathjax/src/components/js/input/tex/extensions/boldsymbol/boldsymbol.js');
16
- require('@mathjax/src/components/js/input/tex/extensions/newcommand/newcommand.js');
17
- require('@mathjax/src/components/js/input/tex/extensions/textmacros/textmacros.js');
18
- require('@mathjax/src/components/js/input/tex/extensions/unicode/unicode.js');
19
-
20
- // https://devblogs.microsoft.com/math-in-office/officemath/
21
- class MathAttributeComponent extends docx.XmlAttributeComponent {
22
- }
23
- class MathXmlComponent extends docx.XmlComponent {
24
- constructor(rootKey, children, attrs) {
25
- super(rootKey);
26
- if (attrs) {
27
- const mathAttrs = {};
28
- for (const [k, v] of Object.entries(attrs)) {
29
- if (k.startsWith("m:")) {
30
- mathAttrs[k] = v;
31
- }
32
- }
33
- this.root.push(new MathAttributeComponent(mathAttrs));
34
- }
35
- if (children.length) {
36
- this.root.push(...children);
37
- }
38
- }
39
- }
40
- const isXmlText = (o) => "#text" in o;
41
- const buildElement = (o) => {
42
- const attrs = o[":@"];
43
- let tagName = "";
44
- let children;
45
- for (const k of Object.keys(o)) {
46
- if (k !== ":@") {
47
- tagName = k;
48
- children = o[k];
49
- break;
50
- }
51
- }
52
- if (tagName.startsWith("m:")) {
53
- const mathChildren = [];
54
- for (const n of children !== null && children !== void 0 ? children : []) {
55
- if (isXmlText(n)) {
56
- const text = n["#text"];
57
- mathChildren.push(String(text));
58
- }
59
- else {
60
- const c = buildElement(n);
61
- if (c) {
62
- mathChildren.push(c);
63
- }
64
- }
65
- }
66
- return new MathXmlComponent(tagName, mathChildren, attrs);
67
- }
68
- return null;
69
- };
70
- /**
71
- * A plugin to render LaTeX inside "math" and "inlineMath" nodes
72
- */
73
- const latexPlugin = () => {
74
- // https://github.com/mathjax/MathJax-demos-node/blob/master/mjs/mixed/tex2mml
75
- // https://github.com/mathjax/MathJax-src/blob/master/components/mjs/input/tex/tex.js
76
- // https://github.com/mathjax/MathJax-src/blob/master/ts/components/startup.ts#L490
77
- // https://github.com/mathjax/MathJax-src/blob/master/testsuite/src/setupTex.ts#L162
78
- html_js.RegisterHTMLHandler(liteAdaptor_js.liteAdaptor());
79
- const load = [
80
- "[tex]/noerrors",
81
- "[tex]/ams",
82
- "[tex]/newcommand",
83
- "[tex]/boldsymbol",
84
- "[tex]/textmacros",
85
- "[tex]/unicode",
86
- ];
87
- const packages = ["base"].concat(load.map((name) => name.slice(6)));
88
- loader_js.Loader.preLoaded(...load);
89
- const tex = new tex_js.TeX({ packages });
90
- const doc = mathjax_js.mathjax.document("", { InputJax: tex });
91
- const visitor = new SerializedMmlVisitor_js.SerializedMmlVisitor();
92
- const parser = new fastXmlParser.XMLParser({
93
- ignoreAttributes: false,
94
- preserveOrder: true,
95
- attributeNamePrefix: "",
96
- });
97
- const parseLatex = (value) => {
98
- const node = doc.convert(value, { end: MathItem_js.STATE["CONVERT"] });
99
- const mathml = visitor.visitTree(node);
100
- const omml = mathml2omml.mml2omml(mathml);
101
- const obj = parser.parse(omml);
102
- return buildElement(obj[0]);
103
- };
104
- return async () => {
105
- return {
106
- math: ({ value }) => {
107
- const math = parseLatex(value);
108
- if (!math) {
109
- return null;
110
- }
111
- return new docx.Paragraph({
112
- children: [math],
113
- });
114
- },
115
- inlineMath: ({ value }) => {
116
- return parseLatex(value);
117
- },
118
- };
119
- };
120
- };
121
-
122
- exports.latexPlugin = latexPlugin;
123
- //# sourceMappingURL=index.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("docx"),t=require("mathml2omml"),n=require("fast-xml-parser"),r=require("@mathjax/src/js/mathjax.js"),i=require("@mathjax/src/js/input/tex.js"),a=require("@mathjax/src/js/core/MmlTree/SerializedMmlVisitor.js"),o=require("@mathjax/src/js/core/MathItem.js"),s=require("@mathjax/src/js/adaptors/liteAdaptor.js"),c=require("@mathjax/src/js/handlers/html.js"),l=require("@mathjax/src/js/components/loader.js");require("@mathjax/src/components/js/input/tex/extensions/noerrors/noerrors.js"),require("@mathjax/src/components/js/input/tex/extensions/ams/ams.js"),require("@mathjax/src/components/js/input/tex/extensions/boldsymbol/boldsymbol.js"),require("@mathjax/src/components/js/input/tex/extensions/newcommand/newcommand.js"),require("@mathjax/src/components/js/input/tex/extensions/textmacros/textmacros.js"),require("@mathjax/src/components/js/input/tex/extensions/unicode/unicode.js");var u=class extends e.XmlAttributeComponent{},d=class extends e.XmlComponent{constructor(e,t,n){if(super(e),n){let e={};for(let[t,r]of Object.entries(n))t.startsWith(`m:`)&&(e[t]=r);this.root.push(new u(e))}t.length&&this.root.push(...t)}},f=e=>`#text`in e,p=e=>{let t=e[`:@`],n=``,r;for(let t of Object.keys(e))if(t!==`:@`){n=t,r=e[t];break}if(n.startsWith(`m:`)){let e=[];for(let t of r??[])if(f(t)){let n=t[`#text`];e.push(String(n))}else{let n=p(t);n&&e.push(n)}return new d(n,e,t)}return null},m=()=>{(0,c.RegisterHTMLHandler)((0,s.liteAdaptor)());let u=[`[tex]/noerrors`,`[tex]/ams`,`[tex]/newcommand`,`[tex]/boldsymbol`,`[tex]/textmacros`,`[tex]/unicode`],d=[`base`].concat(u.map(e=>e.slice(6)));l.Loader.preLoaded(...u);let f=new i.TeX({packages:d}),m=r.mathjax.document(``,{InputJax:f}),h=new a.SerializedMmlVisitor,g=new n.XMLParser({ignoreAttributes:!1,preserveOrder:!0,attributeNamePrefix:``}),_=e=>{let n=m.convert(e,{end:o.STATE.CONVERT}),r=(0,t.mml2omml)(h.visitTree(n));return p(g.parse(r)[0])};return async()=>({math:({value:t})=>{let n=_(t);return n?new e.Paragraph({children:[n]}):null},inlineMath:({value:e})=>_(e)})};exports.latexPlugin=m;
2
+ //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"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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"}
1
+ {"version":3,"file":"index.cjs","names":[],"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"],"mappings":"s8BAqBA,IAAM,EAAN,cAAqC,EAAA,qBAEnC,CAAC,EAEG,EAAN,cAA+B,EAAA,YAAa,CAC1C,YACE,EACA,EACA,EACA,CAEA,GADA,MAAM,CAAO,EACT,EAAO,CACT,IAAM,EAAiC,CAAC,EACxC,IAAK,GAAM,CAAC,EAAG,KAAM,OAAO,QAAQ,CAAK,EACnC,EAAE,WAAW,IAAI,IACnB,EAAU,GAAK,GAGnB,KAAK,KAAK,KAAK,IAAI,EAAuB,CAAS,CAAC,CACtD,CACI,EAAS,QACX,KAAK,KAAK,KAAK,GAAG,CAAQ,CAE9B,CACF,EAaM,EAAa,GAA6B,UAAW,EAErD,EAAgB,GAAuC,CAC3D,IAAM,EAAQ,EAAE,MACZ,EAAU,GACV,EACJ,IAAK,IAAM,KAAK,OAAO,KAAK,CAAC,EAC3B,GAAI,IAAM,KAAM,CACd,EAAU,EACV,EAAW,EAAE,GACb,KACF,CAGF,GAAI,EAAQ,WAAW,IAAI,EAAG,CAC5B,IAAM,EAA8C,CAAC,EACrD,IAAK,IAAM,KAAK,GAAY,CAAC,EAC3B,GAAI,EAAU,CAAC,EAAG,CAChB,IAAM,EAAO,EAAE,SACf,EAAa,KAAK,OAAO,CAAI,CAAC,CAChC,KAAO,CACL,IAAM,EAAI,EAAa,CAAC,EACpB,GACF,EAAa,KAAK,CAAC,CAEvB,CAEF,OAAO,IAAI,EAAiB,EAAS,EAAc,CAAK,CAC1D,CAEA,OAAO,IACT,EAKa,MAAsC,EAKjD,EAAA,EAAA,sBAAA,EAAA,EAAA,aAAgC,CAAQ,EAExC,IAAM,EAAO,CACX,iBACA,YACA,mBACA,mBACA,mBACA,eACF,EACM,EAAW,CAAC,MAAM,EAAE,OAAO,EAAK,IAAK,GAAS,EAAK,MAAM,CAAC,CAAC,CAAC,EAClE,EAAA,OAAO,UAAU,GAAG,CAAI,EAExB,IAAM,EAAM,IAAI,EAAA,IAAI,CAAE,UAAS,CAAC,EAC1B,EAAM,EAAA,QAAQ,SAAS,GAAI,CAAE,SAAU,CAAI,CAAC,EAC5C,EAAU,IAAI,EAAA,qBAEd,EAAS,IAAI,EAAA,UAAU,CAC3B,iBAAkB,GAClB,cAAe,GACf,oBAAqB,EACvB,CAAC,EAEK,EAAc,GAAuC,CACzD,IAAM,EAAO,EAAI,QAAQ,EAAO,CAAE,IAAK,EAAA,MAAM,OAAW,CAAC,EAEnD,GAAA,EAAA,EAAA,UADS,EAAQ,UAAU,CACX,CAAM,EAE5B,OAAO,EADK,EAAO,MAAM,CACL,EAAI,EAAE,CAC5B,EAEA,OAAO,UACE,CACL,MAAO,CAAE,WAAY,CACnB,IAAM,EAAO,EAAW,CAAK,EAI7B,OAHK,EAGE,IAAI,EAAA,UAAU,CACnB,SAAU,CAAC,CAAI,CACjB,CAAC,EAJQ,IAKX,EACA,YAAa,CAAE,WACN,EAAW,CAAK,CAE3B,EAEJ"}
@@ -1,10 +1,4 @@
1
- import type { RemarkDocxPlugin } from "../../types";
2
- import "@mathjax/src/components/js/input/tex/extensions/noerrors/noerrors.js";
3
- import "@mathjax/src/components/js/input/tex/extensions/ams/ams.js";
4
- import "@mathjax/src/components/js/input/tex/extensions/boldsymbol/boldsymbol.js";
5
- import "@mathjax/src/components/js/input/tex/extensions/newcommand/newcommand.js";
6
- import "@mathjax/src/components/js/input/tex/extensions/textmacros/textmacros.js";
7
- import "@mathjax/src/components/js/input/tex/extensions/unicode/unicode.js";
1
+ import { RemarkDocxPlugin } from '../../types';
8
2
  /**
9
3
  * A plugin to render LaTeX inside "math" and "inlineMath" nodes
10
4
  */