remark-docx
Version:
remark plugin to compile markdown to docx (Microsoft Word, Office Open XML).
470 lines (469 loc) • 10.3 kB
JavaScript
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