UNPKG

remark-docx

Version:

remark plugin to compile markdown to docx (Microsoft Word, Office Open XML).

470 lines (469 loc) 10.3 kB
import { n as e } from "./utils-BBifD5si.js"; import { AlignmentType as t, Document as n, ExternalHyperlink as r, FootnoteReferenceRun as i, HeadingLevel as a, ImageRun as o, LevelFormat as s, Packer as c, PageBreak as l, Paragraph as u, Table as d, TableCell as f, TableRow as p, TextRun as m, sectionMarginDefaults as ee, sectionPageSizeDefaults as te } from "docx"; import { definitions as h } from "mdast-util-definitions"; import g from "deepmerge"; //#region src/mdast-util-to-docx.ts var _ = "bullet", v = "ordered", y = "task-complete", b = "task-incomplete", x = "Hyperlink", S = (e) => ({ hanging: 400, left: 400 * (e + 1) }), ne = () => { let e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map(); return { id: (t) => { let n = e.get(t); return n ?? e.set(t, n = e.size + 1), n; }, set: (e, n) => { t.set(e, n); }, toConfig: () => t.entries().reduce((e, [t, n]) => (e[t] = { children: n }, e), {}) }; }, re = () => { let e = 1, t = []; return { createId: () => { let n = `${v}-${e++}`; return t.push(n), n; }, getIds: () => t }; }, ie = (e, t) => e.reduceRight((e, t) => { for (let [n, r] of Object.entries(t)) { let t = e[n]; e[n] = t ? (e, n) => r(e, n) || t(e, n) : r; } return e; }, t), C = (e) => e.map(({ format: e, text: n }, r) => ({ level: r, format: s[e], text: n, alignment: t.LEFT, style: { paragraph: { indent: S(r) } } })), w = (e, t) => { if (t.quote != null && (e.indent = S(t.quote + 1)), t.list) { let { level: n, meta: r } = t.list; r.type === "task" ? e.numbering = { reference: r.checked ? y : b, level: n } : r.type === "ordered" ? e.numbering = { reference: r.reference, level: n } : e.numbering = { reference: _, level: n }; } return t.rtl && (e.bidirectional = !0), new u(e); }, T = async (t, { plugins: r = [], title: i, subject: a, creator: o, keywords: s, description: l, styles: u, size: d, margin: f, orientation: p, columns: m, spacing: v, direction: x, background: S, thematicBreak: w = "page", orderedListFormat: T } = {}) => { let z = h(t), B = re(), V = ne(), H = /* @__PURE__ */ new Map(), me = { root: t, images: H, definition: z }, he = ie(await Promise.all(r.map((e) => e(me))), { paragraph: ae, heading: E, thematicBreak: D, blockquote: O, list: oe, listItem: se, table: ce, tableRow: I, tableCell: I, html: L, code: R, definition: I, footnoteDefinition: P, text: k, emphasis: le, strong: ue, delete: de, inlineCode: fe, break: pe, link: A, linkReference: j, image: M, imageReference: N, footnoteReference: F, math: L, inlineMath: L }), U = (t, n) => { let r = he[t.type]; if (!r) return e(`${t.type} node is not supported without plugins.`), null; let i = r(t, n); return i ? Array.isArray(i) ? i : [i] : null; }, { WIDTH: W, HEIGHT: G } = te; d && (d.width != null && (W = d.width), d.height != null && (G = d.height)); let { TOP: K, LEFT: q, BOTTOM: J, RIGHT: Y } = ee; f && (f.top != null && (K = f.top), f.left != null && (q = f.left), f.bottom != null && (J = f.bottom), f.right != null && (Y = f.right)); let ge = { render(e, t) { let n = []; for (let r of e) { let e = U(r, t ?? this); e && n.push(...e); } return n; }, width: W - q - Y, style: {}, thematicBreak: w, rtl: x === "rtl", definition: z, images: H, footnote: V, orderedId: B.createId }, X = [[]]; for (let e of t.children) { let t = U(e, ge); t && (t.length ? X[X.length - 1].push(...t) : X.push([])); } let _e = C(T ?? [ { text: "%1.", format: "DECIMAL" }, { text: "%2.", format: "DECIMAL" }, { text: "%3.", format: "DECIMAL" }, { text: "%4.", format: "DECIMAL" }, { text: "%5.", format: "DECIMAL" }, { text: "%6.", format: "DECIMAL" } ]), ve = { column: m ? { count: m } : void 0, page: { textDirection: x === "vertical" ? "tbRl" : void 0, size: { width: W, height: G, orientation: p }, margin: { top: K, left: q, bottom: J, right: Y } } }, Z = new n({ title: i, subject: a, creator: o, keywords: s, description: l, styles: g({ default: { document: { paragraph: { spacing: v ? { after: v } : void 0 } } } }, u || {}), background: S, sections: X.filter((e) => e.length).map((e) => ({ properties: ve, children: e })), footnotes: V.toConfig(), numbering: { config: [ { reference: _, levels: C([ { text: "●", format: "BULLET" }, { text: "○", format: "BULLET" }, { text: "■", format: "BULLET" }, { text: "●", format: "BULLET" }, { text: "○", format: "BULLET" }, { text: "■", format: "BULLET" } ]) }, ...B.getIds().map((e) => ({ reference: e, levels: _e })), { reference: y, levels: C([ { text: "☑", format: "BULLET" }, { text: "☑", format: "BULLET" }, { text: "☑", format: "BULLET" }, { text: "☑", format: "BULLET" }, { text: "☑", format: "BULLET" }, { text: "☑", format: "BULLET" } ]) }, { reference: b, levels: C([ { text: "☐", format: "BULLET" }, { text: "☐", format: "BULLET" }, { text: "☐", format: "BULLET" }, { text: "☐", format: "BULLET" }, { text: "☐", format: "BULLET" }, { text: "☐", format: "BULLET" } ]) } ] } }), Q = "default-bullet-numbering", $ = Z.numbering; return $.abstractNumberingMap.delete(Q), $.concreteNumberingMap.delete(Q), c.toArrayBuffer(Z); }, ae = ({ children: e }, t) => w({ children: t.render(e) }, t), E = ({ children: e, depth: t }, n) => { let r; switch (t) { case 1: r = "TITLE"; break; case 2: r = "HEADING_1"; break; case 3: r = "HEADING_2"; break; case 4: r = "HEADING_3"; break; case 5: r = "HEADING_4"; break; case 6: r = "HEADING_5"; break; } return w({ heading: a[r], outlineLevel: t - 1, children: n.render(e) }, n); }, D = (e, t) => { switch (t.thematicBreak) { case "page": return new u({ children: [new l()] }); case "section": return []; case "line": return new u({ thematicBreak: !0 }); } }, O = ({ children: e }, t) => t.render(e, { ...t, quote: t.quote == null ? 0 : t.quote + 1 }), oe = ({ children: e, ordered: t }, n) => { let r = n.list, i; return i = t ? { type: "ordered", reference: r && r.meta.type === "ordered" ? r.meta.reference : n.orderedId() } : { type: "bullet" }, n.render(e, { ...n, list: { level: r ? r.level + 1 : 0, meta: i } }); }, se = ({ children: e, checked: t }, n) => { let r = n.list; return r && t != null && (r = { level: r.level, meta: { type: "task", checked: t } }), n.render(e, { ...n, list: r }); }, ce = ({ children: e, align: n }, r) => { let i = n?.map((e) => { switch (e) { case "left": return "LEFT"; case "right": return "RIGHT"; case "center": return "CENTER"; default: return "LEFT"; } }), a = e[0].children.length, o = r.width / a, s = { columnWidths: Array.from({ length: a }).map(() => o), rows: e.map((e) => new p({ children: e.children.map((e, n) => new f({ width: { size: o, type: "dxa" }, children: [new u({ alignment: t[i?.[n] ?? "LEFT"], children: r.render(e.children, { ...r, rtl: void 0 }) })] })) })) }; return r.rtl && (s.visuallyRightToLeft = !0), new d(s); }, k = ({ value: e }, { style: t, rtl: n }) => { let r = { text: e, bold: t.bold, italics: t.italic, strike: t.strike }; return t.inlineCode && (r.highlight = "lightGray"), t.link && (r.style = x), n && (r.rightToLeft = !0), new m(r); }, le = ({ children: e }, t) => t.render(e, { ...t, style: { ...t.style, italic: !0 } }), ue = ({ children: e }, t) => t.render(e, { ...t, style: { ...t.style, bold: !0 } }), de = ({ children: e }, t) => t.render(e, { ...t, style: { ...t.style, strike: !0 } }), fe = ({ value: e }, t) => k({ type: "text", value: e }, { ...t, style: { ...t.style, inlineCode: !0 } }), pe = () => new m({ text: "", break: 1 }), A = ({ children: e, url: t }, n) => t.startsWith("#") ? n.render(e) : new r({ link: t, children: n.render(e, { ...n, style: { ...n.style, link: !0 } }) }), j = ({ children: e, identifier: t }, n) => { let r = n.definition(t); return r == null ? n.render(e) : A({ type: "link", children: e, url: r.url }, n); }, M = (e, t) => { let n = t.images.get(e.url); if (!n) return null; let { width: r, height: i } = n, a = t.width / 1440 * 96; if (r > a) { let e = a / r; r *= e, i *= e; } let s = e.alt || e.title ? { name: "", description: e.alt ?? void 0, title: e.title ?? void 0 } : void 0; if (n.type === "svg") { let { type: e, data: t, fallback: a } = n; return new o({ type: e, data: t, transformation: { width: r, height: i }, fallback: { type: "png", data: a }, altText: s }); } let { type: c, data: l } = n; return new o({ type: c, data: l, transformation: { width: r, height: i }, altText: s }); }, N = (e, t) => { let n = t.definition(e.identifier); return n == null ? null : M({ type: "image", url: n.url, alt: e.alt, title: n.title }, t); }, P = ({ children: e, identifier: t }, n) => { let r = n.render(e).filter((e) => e instanceof u); return n.footnote.set(n.footnote.id(t), r), null; }, F = ({ identifier: e }, t) => new i(t.footnote.id(e)), I = () => null, L = (t, n) => (e(`${t.type} node is not supported without plugins, falling back to text.`), k({ type: "text", value: t.value }, n)), R = (t, n) => (e(`${t.type} node is not supported without plugins, falling back to text.`), w({ children: t.value.split(/\r?\n/).map((e, t) => new m({ text: e, break: t === 0 ? void 0 : 1 })) }, n)), z = function(e) { this.compiler = (t) => T(t, e); }; //#endregion export { z as default }; //# sourceMappingURL=index.js.map