remark-docx
Version:
remark plugin to compile markdown to docx (Microsoft Word, Office Open XML).
89 lines (88 loc) • 2.35 kB
JavaScript
import { n as e, t } from "../../utils-BBifD5si.js";
import { visit as n } from "unist-util-visit";
import { imageSize as r } from "image-size";
//#region src/plugins/image/index.ts
var i = async (e) => (await fetch(e)).arrayBuffer(), a = async ({ buffer: e, width: t, height: n }) => {
let r = new Blob([e], { type: "image/svg+xml" }), i = URL.createObjectURL(r);
try {
let e = new Image();
e.src = i, await e.decode();
let r = window.devicePixelRatio, a = document.createElement("canvas"), o = t * r, s = n * r;
return a.width = o, a.height = s, a.getContext("2d").drawImage(e, 0, 0, o, s), new Promise((e) => {
a.toBlob((t) => {
t.arrayBuffer().then(e);
}, "image/png");
});
} finally {
URL.revokeObjectURL(i);
}
}, o = ({ load: o = i, fallbackSvg: s = a } = {}) => {
let c = /* @__PURE__ */ new Map();
return async ({ root: i, definition: a, images: l }) => {
let u = [];
if (n(i, "image", (e) => {
u.push(e);
}), n(i, "imageReference", (e) => {
let t = a(e.identifier);
t && u.push(t);
}), u.length !== 0) {
let n = /* @__PURE__ */ new Map();
u.forEach(({ url: i }) => {
if (!l.has(i)) {
if (c.has(i)) {
l.set(i, c.get(i));
return;
}
n.has(i) || n.set(i, (async () => {
let n;
try {
n = await o(i);
} catch (t) {
e(`Failed to load image: ${i} ${t}`);
return;
}
let { width: a, height: u, type: d } = r(new Uint8Array(n));
if (!t(d)) {
e(`Not supported image type: ${d}`);
return;
}
if (d === "svg") try {
let e = await s({
buffer: n,
width: a,
height: u
}), t = {
type: d,
width: a,
height: u,
data: n,
fallback: e
};
l.set(i, t), c.set(i, t);
} catch (t) {
e(`Failed to create fallback image: ${i} ${t}`);
return;
}
else {
let e = {
type: d,
width: a,
height: u,
data: n
};
l.set(i, e), c.set(i, e);
}
})());
}
}), await Promise.all(n.values());
}
if (c.size > 100) {
let e = c.size - 100;
for (let t of c.keys()) if (c.delete(t), e--, e <= 0) break;
}
return {};
};
};
//#endregion
export { a as browserSvgToPng, o as imagePlugin };
//# sourceMappingURL=index.js.map