@json-to-office/core-docx 7.3.1 → 7.4.0
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.
- package/dist/index.js +368 -35
- package/dist/index.js.map +1 -1
- package/dist/ir/compiler.d.ts.map +1 -1
- package/dist/plugin/example/index.js +368 -35
- package/dist/plugin/example/index.js.map +1 -1
- package/dist/renderers/docxjs/docxSubpath.d.ts +4 -4
- package/dist/renderers/docxjs/docxSubpath.d.ts.map +1 -1
- package/dist/renderers/docxjs/emit.d.ts +5 -0
- package/dist/renderers/docxjs/emit.d.ts.map +1 -1
- package/dist/renderers/docxjs/index.d.ts +5 -3
- package/dist/renderers/docxjs/index.d.ts.map +1 -1
- package/dist/renderers/docxjs/pageNumbers.d.ts +113 -0
- package/dist/renderers/docxjs/pageNumbers.d.ts.map +1 -0
- package/dist/renderers/office-open/emit.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/ir/compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EACV,iBAAiB,EAGlB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAqD3D,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,wBAAwB,CAAC;AAuC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAEL,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/ir/compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EACV,iBAAiB,EAGlB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAqD3D,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,wBAAwB,CAAC;AAuC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAEL,KAAK,MAAM,EAwCZ,MAAM,SAAS,CAAC;AAyBjB,2DAA2D;AAC3D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,2EAA2E;IAC3E,QAAQ,EAAE,SAAS,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;IACrD,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B;;;;OAIG;IACH,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAoGD,wBAAgB,eAAe,CAC7B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,UAAU,EAClB,QAAQ,GAAE,iBAAiB,EAAO,EAClC,MAAM,GAAE,cAA0B,EAClC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,iBAAiB,CAkHnB"}
|
|
@@ -2902,7 +2902,7 @@ var init_chartText = __esm({
|
|
|
2902
2902
|
});
|
|
2903
2903
|
|
|
2904
2904
|
// src/renderers/docxjs/docxSubpath.ts
|
|
2905
|
-
function docxSubpath(specifier, component, importer) {
|
|
2905
|
+
function docxSubpath(specifier, component, importer, since = "9.8.0") {
|
|
2906
2906
|
let module;
|
|
2907
2907
|
let failure;
|
|
2908
2908
|
let loading;
|
|
@@ -2926,7 +2926,7 @@ function docxSubpath(specifier, component, importer) {
|
|
|
2926
2926
|
const { reason } = failure;
|
|
2927
2927
|
const detail = reason instanceof Error ? reason.message : String(reason);
|
|
2928
2928
|
throw new Error(
|
|
2929
|
-
`The docx \`${component}\` component needs docx
|
|
2929
|
+
`The docx \`${component}\` component needs docx ${since} or later: the \`${specifier}\` entry could not be loaded (${detail})`
|
|
2930
2930
|
);
|
|
2931
2931
|
}
|
|
2932
2932
|
throw new Error(
|
|
@@ -3523,8 +3523,19 @@ function emitBlock(block2, resources = /* @__PURE__ */ new Map()) {
|
|
|
3523
3523
|
return assertNever2(block2, "DocxIrBlock");
|
|
3524
3524
|
}
|
|
3525
3525
|
}
|
|
3526
|
+
function emitOutsideBody(emit) {
|
|
3527
|
+
const was = outsideBody;
|
|
3528
|
+
outsideBody = true;
|
|
3529
|
+
try {
|
|
3530
|
+
return emit();
|
|
3531
|
+
} finally {
|
|
3532
|
+
outsideBody = was;
|
|
3533
|
+
}
|
|
3534
|
+
}
|
|
3526
3535
|
function emitToc(block2) {
|
|
3527
|
-
|
|
3536
|
+
const cached = outsideBody && block2.cachedEntries?.length;
|
|
3537
|
+
const Field = cached ? ThemedTableOfContents : TableOfContents;
|
|
3538
|
+
return new Field(block2.alias ?? "Table of Contents", {
|
|
3528
3539
|
...block2.hyperlink !== void 0 ? { hyperlink: block2.hyperlink } : {},
|
|
3529
3540
|
...block2.headingRange ? {
|
|
3530
3541
|
headingStyleRange: `${block2.headingRange.from}-${block2.headingRange.to}`
|
|
@@ -3537,7 +3548,7 @@ function emitToc(block2) {
|
|
|
3537
3548
|
pageNumbersEntryLevelsRange: block2.omitPageNumbersForLevels.map((range) => `${range.from}-${range.to}`).join(",")
|
|
3538
3549
|
} : {},
|
|
3539
3550
|
...block2.entrySeparator !== void 0 ? { entryAndPageNumberSeparator: block2.entrySeparator } : {},
|
|
3540
|
-
...
|
|
3551
|
+
...cached ? {
|
|
3541
3552
|
cachedEntries: block2.cachedEntries.map((entry) => ({
|
|
3542
3553
|
title: entry.text,
|
|
3543
3554
|
level: entry.level
|
|
@@ -3660,7 +3671,7 @@ function emitBorder(border3) {
|
|
|
3660
3671
|
...border3.spacePoints !== void 0 ? { space: border3.spacePoints } : {}
|
|
3661
3672
|
};
|
|
3662
3673
|
}
|
|
3663
|
-
var ALIGNMENT2, PAGE_FIELDS, isSequenceField, WRAP_TYPE, ThemedTableOfContents, VERTICAL_ALIGN, TABLE_ANCHOR, HORIZONTAL_POSITION, VERTICAL_POSITION;
|
|
3674
|
+
var ALIGNMENT2, PAGE_FIELDS, isSequenceField, WRAP_TYPE, ThemedTableOfContents, outsideBody, VERTICAL_ALIGN, TABLE_ANCHOR, HORIZONTAL_POSITION, VERTICAL_POSITION;
|
|
3664
3675
|
var init_emit = __esm({
|
|
3665
3676
|
"src/renderers/docxjs/emit.ts"() {
|
|
3666
3677
|
"use strict";
|
|
@@ -3686,6 +3697,7 @@ var init_emit = __esm({
|
|
|
3686
3697
|
Object.defineProperty(ThemedTableOfContents.prototype, "getTabStopsForLevel", {
|
|
3687
3698
|
value: () => []
|
|
3688
3699
|
});
|
|
3700
|
+
outsideBody = false;
|
|
3689
3701
|
VERTICAL_ALIGN = {
|
|
3690
3702
|
top: VerticalAlign.TOP,
|
|
3691
3703
|
center: VerticalAlign.CENTER,
|
|
@@ -3873,6 +3885,318 @@ var init_styles2 = __esm({
|
|
|
3873
3885
|
}
|
|
3874
3886
|
});
|
|
3875
3887
|
|
|
3888
|
+
// src/renderers/docxjs/pageNumbers.ts
|
|
3889
|
+
import {
|
|
3890
|
+
Tab as Tab2
|
|
3891
|
+
} from "docx";
|
|
3892
|
+
function needsPageNumbers(ir) {
|
|
3893
|
+
const seen = /* @__PURE__ */ new Set();
|
|
3894
|
+
const visit = (value) => {
|
|
3895
|
+
if (typeof value !== "object" || value === null) return false;
|
|
3896
|
+
if (ArrayBuffer.isView(value) || seen.has(value)) return false;
|
|
3897
|
+
seen.add(value);
|
|
3898
|
+
if (Array.isArray(value)) return value.some(visit);
|
|
3899
|
+
if (value.kind === "toc") return true;
|
|
3900
|
+
return Object.values(value).some(visit);
|
|
3901
|
+
};
|
|
3902
|
+
return ir.sections.some((section2) => visit(section2.children));
|
|
3903
|
+
}
|
|
3904
|
+
async function createPageNumberEstimator(ir) {
|
|
3905
|
+
await layout.load();
|
|
3906
|
+
const cached = cachedContentsEntries(ir);
|
|
3907
|
+
const separators = contentsSeparators(ir);
|
|
3908
|
+
const estimate = layout.loaded() ? layout.get().estimatePageNumbersWith({ guess: true }) : void 0;
|
|
3909
|
+
return (body, context) => {
|
|
3910
|
+
renumberContentsBookmarks(body);
|
|
3911
|
+
restoreEntryNumbers(body, cached, separators);
|
|
3912
|
+
dropContentsEntryTabs(body);
|
|
3913
|
+
writeSeparatorTabs(body, context);
|
|
3914
|
+
endContentsInLastEntry(body);
|
|
3915
|
+
if (!estimate) {
|
|
3916
|
+
unavailable(
|
|
3917
|
+
`the \`docx/layout\` entry could not be loaded (${failureOf(() => layout.get())})`
|
|
3918
|
+
);
|
|
3919
|
+
return { bookmarks: /* @__PURE__ */ new Map() };
|
|
3920
|
+
}
|
|
3921
|
+
try {
|
|
3922
|
+
const estimated = estimate(body, context);
|
|
3923
|
+
if (complete(estimated)) clearUpdateFields(context.file);
|
|
3924
|
+
return estimated;
|
|
3925
|
+
} catch (error) {
|
|
3926
|
+
unavailable(error instanceof Error ? error.message : String(error));
|
|
3927
|
+
return { bookmarks: /* @__PURE__ */ new Map() };
|
|
3928
|
+
}
|
|
3929
|
+
};
|
|
3930
|
+
}
|
|
3931
|
+
function unavailable(reason) {
|
|
3932
|
+
reportWarning(
|
|
3933
|
+
"toc",
|
|
3934
|
+
PAGE_NUMBERS_UNAVAILABLE,
|
|
3935
|
+
`The table of contents is written without page numbers: laying the pages out failed (${reason}). Word fills them in when it updates the fields on open.`
|
|
3936
|
+
);
|
|
3937
|
+
}
|
|
3938
|
+
function failureOf(get) {
|
|
3939
|
+
try {
|
|
3940
|
+
get();
|
|
3941
|
+
return "unknown";
|
|
3942
|
+
} catch (error) {
|
|
3943
|
+
return error instanceof Error ? error.message : String(error);
|
|
3944
|
+
}
|
|
3945
|
+
}
|
|
3946
|
+
function complete(estimated) {
|
|
3947
|
+
return estimated.pageCount !== void 0 && (estimated.guesses ?? []).length === 0;
|
|
3948
|
+
}
|
|
3949
|
+
function clearUpdateFields(file) {
|
|
3950
|
+
const root = file?.Settings?.root;
|
|
3951
|
+
if (!root) return;
|
|
3952
|
+
const at = root.findIndex(
|
|
3953
|
+
(element) => element?.rootKey === "w:updateFields"
|
|
3954
|
+
);
|
|
3955
|
+
if (at >= 0) root.splice(at, 1);
|
|
3956
|
+
}
|
|
3957
|
+
function isContentsField(sdt) {
|
|
3958
|
+
let found = false;
|
|
3959
|
+
const visit = (element) => {
|
|
3960
|
+
if (found) return;
|
|
3961
|
+
if (nameOf(element) === "w:instrText") {
|
|
3962
|
+
found = childrenOf(element).some(
|
|
3963
|
+
(child) => typeof child === "string" && /^\s*TOC\b/.test(child)
|
|
3964
|
+
);
|
|
3965
|
+
return;
|
|
3966
|
+
}
|
|
3967
|
+
childrenOf(element).forEach(visit);
|
|
3968
|
+
};
|
|
3969
|
+
visit(sdt);
|
|
3970
|
+
return found;
|
|
3971
|
+
}
|
|
3972
|
+
function contentsFields(body) {
|
|
3973
|
+
const found = [];
|
|
3974
|
+
const visit = (element) => {
|
|
3975
|
+
const name = nameOf(element);
|
|
3976
|
+
if (name === void 0 || name === "_attr") return;
|
|
3977
|
+
if (name === "w:sdt" && isContentsField(element)) {
|
|
3978
|
+
found.push(element);
|
|
3979
|
+
return;
|
|
3980
|
+
}
|
|
3981
|
+
childrenOf(element).forEach(visit);
|
|
3982
|
+
};
|
|
3983
|
+
visit(body);
|
|
3984
|
+
return found;
|
|
3985
|
+
}
|
|
3986
|
+
function entryParagraphs(field) {
|
|
3987
|
+
return childrenOf(field).filter((content) => nameOf(content) === "w:sdtContent").flatMap(
|
|
3988
|
+
(content) => childrenOf(content).filter((paragraph2) => nameOf(paragraph2) === "w:p")
|
|
3989
|
+
);
|
|
3990
|
+
}
|
|
3991
|
+
function dropContentsEntryTabs(body) {
|
|
3992
|
+
for (const field of contentsFields(body)) {
|
|
3993
|
+
for (const paragraph2 of entryParagraphs(field)) {
|
|
3994
|
+
for (const properties of childrenOf(paragraph2)) {
|
|
3995
|
+
if (nameOf(properties) !== "w:pPr") continue;
|
|
3996
|
+
properties["w:pPr"] = childrenOf(properties).filter(
|
|
3997
|
+
(child) => nameOf(child) !== "w:tabs"
|
|
3998
|
+
);
|
|
3999
|
+
}
|
|
4000
|
+
}
|
|
4001
|
+
}
|
|
4002
|
+
}
|
|
4003
|
+
function endContentsInLastEntry(body) {
|
|
4004
|
+
for (const field of contentsFields(body)) {
|
|
4005
|
+
for (const content of childrenOf(field)) {
|
|
4006
|
+
if (nameOf(content) !== "w:sdtContent") continue;
|
|
4007
|
+
const paragraphs = childrenOf(content);
|
|
4008
|
+
const last = paragraphs[paragraphs.length - 1];
|
|
4009
|
+
const entry = paragraphs[paragraphs.length - 2];
|
|
4010
|
+
if (nameOf(last) !== "w:p" || nameOf(entry) !== "w:p") continue;
|
|
4011
|
+
const runs = childrenOf(last);
|
|
4012
|
+
const onlyTheEnd = runs.length === 1 && nameOf(runs[0]) === "w:r" && childrenOf(runs[0]).every(
|
|
4013
|
+
(child) => nameOf(child) === "w:fldChar" && attributesOf(child)?.["w:fldCharType"] === "end"
|
|
4014
|
+
);
|
|
4015
|
+
const entries = paragraphs.filter(
|
|
4016
|
+
(paragraph2) => textNodes(paragraph2).length > 0
|
|
4017
|
+
);
|
|
4018
|
+
if (!onlyTheEnd || entries.length < 2 || textNodes(entry).length === 0)
|
|
4019
|
+
continue;
|
|
4020
|
+
childrenOf(entry).push(runs[0]);
|
|
4021
|
+
paragraphs.pop();
|
|
4022
|
+
}
|
|
4023
|
+
}
|
|
4024
|
+
}
|
|
4025
|
+
function writeSeparatorTabs(body, context) {
|
|
4026
|
+
const tab = () => new Tab2().prepForXml(context);
|
|
4027
|
+
const visit = (element) => {
|
|
4028
|
+
const name = nameOf(element);
|
|
4029
|
+
if (name === void 0 || name === "_attr") return;
|
|
4030
|
+
if (name === "w:r") {
|
|
4031
|
+
const children = childrenOf(element);
|
|
4032
|
+
children.forEach((child, index) => {
|
|
4033
|
+
if (nameOf(child) !== "w:t") return;
|
|
4034
|
+
const text = childrenOf(child).filter(
|
|
4035
|
+
(part) => typeof part === "string"
|
|
4036
|
+
);
|
|
4037
|
+
if (text.length === 1 && text[0] === " ") children[index] = tab();
|
|
4038
|
+
});
|
|
4039
|
+
return;
|
|
4040
|
+
}
|
|
4041
|
+
childrenOf(element).forEach(visit);
|
|
4042
|
+
};
|
|
4043
|
+
for (const field of contentsFields(body))
|
|
4044
|
+
entryParagraphs(field).forEach(visit);
|
|
4045
|
+
}
|
|
4046
|
+
function textNodes(element) {
|
|
4047
|
+
const name = nameOf(element);
|
|
4048
|
+
if (name === void 0 || name === "_attr" || name === "w:instrText")
|
|
4049
|
+
return [];
|
|
4050
|
+
const children = childrenOf(element);
|
|
4051
|
+
if (name === "w:t")
|
|
4052
|
+
return children.flatMap(
|
|
4053
|
+
(child, index) => typeof child === "string" ? [{ parent: children, index }] : []
|
|
4054
|
+
);
|
|
4055
|
+
return children.flatMap(textNodes);
|
|
4056
|
+
}
|
|
4057
|
+
function contentsSeparators(ir) {
|
|
4058
|
+
const separators = [];
|
|
4059
|
+
const visit = (value) => {
|
|
4060
|
+
if (typeof value !== "object" || value === null) return;
|
|
4061
|
+
if (ArrayBuffer.isView(value)) return;
|
|
4062
|
+
if (Array.isArray(value)) {
|
|
4063
|
+
value.forEach(visit);
|
|
4064
|
+
return;
|
|
4065
|
+
}
|
|
4066
|
+
if (value.kind === "toc") {
|
|
4067
|
+
separators.push(value.entrySeparator);
|
|
4068
|
+
return;
|
|
4069
|
+
}
|
|
4070
|
+
Object.values(value).forEach(visit);
|
|
4071
|
+
};
|
|
4072
|
+
for (const section2 of ir.sections) visit(section2.children);
|
|
4073
|
+
return separators;
|
|
4074
|
+
}
|
|
4075
|
+
function cachedContentsEntries(ir) {
|
|
4076
|
+
const fields = [];
|
|
4077
|
+
const visit = (value) => {
|
|
4078
|
+
if (typeof value !== "object" || value === null) return;
|
|
4079
|
+
if (ArrayBuffer.isView(value)) return;
|
|
4080
|
+
if (Array.isArray(value)) {
|
|
4081
|
+
value.forEach(visit);
|
|
4082
|
+
return;
|
|
4083
|
+
}
|
|
4084
|
+
if (value.kind === "toc") {
|
|
4085
|
+
const toc = value;
|
|
4086
|
+
fields.push(toc.cachedEntries?.map((entry) => entry.text));
|
|
4087
|
+
return;
|
|
4088
|
+
}
|
|
4089
|
+
Object.values(value).forEach(visit);
|
|
4090
|
+
};
|
|
4091
|
+
for (const section2 of ir.sections) visit(section2.children);
|
|
4092
|
+
return fields;
|
|
4093
|
+
}
|
|
4094
|
+
function restoreEntryNumbers(body, cached, separators = []) {
|
|
4095
|
+
contentsFields(body).forEach((field, index) => {
|
|
4096
|
+
const texts = cached[index];
|
|
4097
|
+
const paragraphs = entryParagraphs(field).filter(
|
|
4098
|
+
(paragraph2) => textNodes(paragraph2).length > 0
|
|
4099
|
+
);
|
|
4100
|
+
if (!texts || texts.length !== paragraphs.length) return;
|
|
4101
|
+
paragraphs.forEach((paragraph2, entry) => {
|
|
4102
|
+
const nodes = textNodes(paragraph2);
|
|
4103
|
+
let title = nodes.map(({ parent, index: at }) => parent[at]).join("");
|
|
4104
|
+
const separator = separators[index];
|
|
4105
|
+
if (separator && title.endsWith(separator))
|
|
4106
|
+
title = title.slice(0, -separator.length);
|
|
4107
|
+
const text = texts[entry];
|
|
4108
|
+
if (title === "" || text === title || !text.endsWith(title)) return;
|
|
4109
|
+
const [first] = nodes;
|
|
4110
|
+
first.parent[first.index] = text.slice(0, text.length - title.length) + first.parent[first.index];
|
|
4111
|
+
});
|
|
4112
|
+
});
|
|
4113
|
+
}
|
|
4114
|
+
function renumberContentsBookmarks(body) {
|
|
4115
|
+
const names = /* @__PURE__ */ new Map();
|
|
4116
|
+
const paragraphs = (element) => {
|
|
4117
|
+
const name = nameOf(element);
|
|
4118
|
+
if (name === void 0 || name === "_attr") return;
|
|
4119
|
+
if (name !== "w:p") {
|
|
4120
|
+
childrenOf(element).forEach(paragraphs);
|
|
4121
|
+
return;
|
|
4122
|
+
}
|
|
4123
|
+
const children = childrenOf(element);
|
|
4124
|
+
for (const start of children) {
|
|
4125
|
+
if (nameOf(start) !== "w:bookmarkStart") continue;
|
|
4126
|
+
const attributes = attributesOf(start);
|
|
4127
|
+
const old = attributes?.["w:name"];
|
|
4128
|
+
if (typeof old !== "string" || !CONTENTS_BOOKMARK.test(old)) continue;
|
|
4129
|
+
const ordinal = names.size + 1;
|
|
4130
|
+
const renamed2 = `_Toc${ordinal}`;
|
|
4131
|
+
const id = CONTENTS_BOOKMARK_ID_BASE + ordinal;
|
|
4132
|
+
names.set(old, renamed2);
|
|
4133
|
+
const oldId = attributes["w:id"];
|
|
4134
|
+
attributes["w:name"] = renamed2;
|
|
4135
|
+
attributes["w:id"] = id;
|
|
4136
|
+
const end = [...children].reverse().find(
|
|
4137
|
+
(child) => nameOf(child) === "w:bookmarkEnd" && String(attributesOf(child)?.["w:id"]) === String(oldId)
|
|
4138
|
+
);
|
|
4139
|
+
if (end) attributesOf(end)["w:id"] = id;
|
|
4140
|
+
}
|
|
4141
|
+
};
|
|
4142
|
+
paragraphs(body);
|
|
4143
|
+
if (names.size === 0) return;
|
|
4144
|
+
const references = (element) => {
|
|
4145
|
+
const name = nameOf(element);
|
|
4146
|
+
if (name === void 0) return;
|
|
4147
|
+
if (name === "w:hyperlink") {
|
|
4148
|
+
const attributes = attributesOf(element);
|
|
4149
|
+
const anchor = attributes?.["w:anchor"];
|
|
4150
|
+
if (typeof anchor === "string" && names.has(anchor))
|
|
4151
|
+
attributes["w:anchor"] = names.get(anchor);
|
|
4152
|
+
}
|
|
4153
|
+
if (name === "w:instrText") {
|
|
4154
|
+
const children = childrenOf(element);
|
|
4155
|
+
children.forEach((child, index) => {
|
|
4156
|
+
if (typeof child !== "string") return;
|
|
4157
|
+
children[index] = child.replace(
|
|
4158
|
+
/\b(PAGEREF\s+)(_Toc\d+)\b/g,
|
|
4159
|
+
(match, field, bookmark) => names.has(bookmark) ? `${field}${names.get(bookmark)}` : match
|
|
4160
|
+
);
|
|
4161
|
+
});
|
|
4162
|
+
element[name] = children;
|
|
4163
|
+
return;
|
|
4164
|
+
}
|
|
4165
|
+
if (name === "_attr") return;
|
|
4166
|
+
childrenOf(element).forEach(references);
|
|
4167
|
+
};
|
|
4168
|
+
references(body);
|
|
4169
|
+
}
|
|
4170
|
+
function attributesOf(element) {
|
|
4171
|
+
const attributes = childrenOf(element).find(
|
|
4172
|
+
(child) => nameOf(child) === "_attr"
|
|
4173
|
+
);
|
|
4174
|
+
return attributes?._attr;
|
|
4175
|
+
}
|
|
4176
|
+
var PAGE_NUMBERS_UNAVAILABLE, layout, nameOf, childrenOf, CONTENTS_BOOKMARK_ID_BASE, CONTENTS_BOOKMARK;
|
|
4177
|
+
var init_pageNumbers = __esm({
|
|
4178
|
+
"src/renderers/docxjs/pageNumbers.ts"() {
|
|
4179
|
+
"use strict";
|
|
4180
|
+
init_generationContext();
|
|
4181
|
+
init_docxSubpath();
|
|
4182
|
+
PAGE_NUMBERS_UNAVAILABLE = "W_DOCX_PAGE_NUMBERS_UNAVAILABLE";
|
|
4183
|
+
layout = docxSubpath(
|
|
4184
|
+
"docx/layout",
|
|
4185
|
+
"toc",
|
|
4186
|
+
() => import("docx/layout"),
|
|
4187
|
+
"9.9.0"
|
|
4188
|
+
);
|
|
4189
|
+
nameOf = (element) => typeof element === "object" && element !== null && !Array.isArray(element) ? Object.keys(element)[0] : void 0;
|
|
4190
|
+
childrenOf = (element) => {
|
|
4191
|
+
const name = nameOf(element);
|
|
4192
|
+
const content = name === void 0 ? void 0 : element[name];
|
|
4193
|
+
return Array.isArray(content) ? content : content === void 0 ? [] : [content];
|
|
4194
|
+
};
|
|
4195
|
+
CONTENTS_BOOKMARK_ID_BASE = 3e6;
|
|
4196
|
+
CONTENTS_BOOKMARK = /^_Toc\d+$/;
|
|
4197
|
+
}
|
|
4198
|
+
});
|
|
4199
|
+
|
|
3876
4200
|
// src/utils/normalizeTextCase.ts
|
|
3877
4201
|
function normalizeTextCase(zip) {
|
|
3878
4202
|
let changed = false;
|
|
@@ -4654,7 +4978,8 @@ function createDocxJsRenderer() {
|
|
|
4654
4978
|
)
|
|
4655
4979
|
});
|
|
4656
4980
|
}
|
|
4657
|
-
const
|
|
4981
|
+
const pageNumbers = needsPageNumbers(ir) ? await createPageNumberEstimator(ir) : void 0;
|
|
4982
|
+
const document = buildDocument(ir, resources, pageNumbers);
|
|
4658
4983
|
const packed = await Packer.toBuffer(document);
|
|
4659
4984
|
const fixed = fixFloatingImageIdsInBuffer(packed);
|
|
4660
4985
|
const repaired = markers ? repairDrawingGroupsInBuffer(fixed, markers) : fixed;
|
|
@@ -4672,13 +4997,12 @@ function createDocxJsRenderer() {
|
|
|
4672
4997
|
}
|
|
4673
4998
|
};
|
|
4674
4999
|
}
|
|
4675
|
-
function buildDocument(ir, resources = /* @__PURE__ */ new Map()) {
|
|
5000
|
+
function buildDocument(ir, resources = /* @__PURE__ */ new Map(), pageNumbers) {
|
|
4676
5001
|
return new Document({
|
|
5002
|
+
...pageNumbers ? { pageNumbers } : {},
|
|
4677
5003
|
styles: emitStyles(ir.styles),
|
|
4678
5004
|
...ir.theme ? { theme: themeOptions(ir.theme) } : {},
|
|
4679
|
-
sections: ir.sections.map(
|
|
4680
|
-
(section2, index) => sectionOptions(section2, resources, index === ir.sections.length - 1)
|
|
4681
|
-
),
|
|
5005
|
+
sections: ir.sections.map((section2) => sectionOptions(section2, resources)),
|
|
4682
5006
|
...coreProperties(ir),
|
|
4683
5007
|
features: {
|
|
4684
5008
|
updateFields: ir.settings.updateFields,
|
|
@@ -4697,8 +5021,8 @@ function buildDocument(ir, resources = /* @__PURE__ */ new Map()) {
|
|
|
4697
5021
|
author: comment.author,
|
|
4698
5022
|
...comment.initials ? { initials: comment.initials } : {},
|
|
4699
5023
|
date: new Date(comment.date),
|
|
4700
|
-
children:
|
|
4701
|
-
(block2) => emitBlock(block2, resources)
|
|
5024
|
+
children: emitOutsideBody(
|
|
5025
|
+
() => comment.children.map((block2) => emitBlock(block2, resources))
|
|
4702
5026
|
),
|
|
4703
5027
|
...comment.parentId !== void 0 ? { parentId: comment.parentId } : {},
|
|
4704
5028
|
...comment.resolved !== void 0 ? { resolved: comment.resolved } : {}
|
|
@@ -4726,8 +5050,8 @@ function noteBodies(notes, resources) {
|
|
|
4726
5050
|
const bodies = {};
|
|
4727
5051
|
for (const note of notes) {
|
|
4728
5052
|
bodies[String(note.id)] = {
|
|
4729
|
-
children:
|
|
4730
|
-
(block2) => emitBlock(block2, resources)
|
|
5053
|
+
children: emitOutsideBody(
|
|
5054
|
+
() => note.children.map((block2) => emitBlock(block2, resources))
|
|
4731
5055
|
)
|
|
4732
5056
|
};
|
|
4733
5057
|
}
|
|
@@ -4888,7 +5212,7 @@ function collectImagePlacements(ir) {
|
|
|
4888
5212
|
}
|
|
4889
5213
|
return { placements, drawingGroups };
|
|
4890
5214
|
}
|
|
4891
|
-
function sectionOptions(section2, resources
|
|
5215
|
+
function sectionOptions(section2, resources) {
|
|
4892
5216
|
const { page, columns } = section2.properties;
|
|
4893
5217
|
const options = {
|
|
4894
5218
|
properties: {
|
|
@@ -4927,7 +5251,7 @@ function sectionOptions(section2, resources, closesDocument = false) {
|
|
|
4927
5251
|
}
|
|
4928
5252
|
} : {}
|
|
4929
5253
|
},
|
|
4930
|
-
children: sectionChildren(section2, resources
|
|
5254
|
+
children: sectionChildren(section2, resources)
|
|
4931
5255
|
};
|
|
4932
5256
|
const headers = chromeSlots(section2.headers, Header, resources);
|
|
4933
5257
|
if (headers) options.headers = headers;
|
|
@@ -4941,7 +5265,9 @@ function chromeSlots(set, Part, resources) {
|
|
|
4941
5265
|
for (const slot of ["default", "first", "even"]) {
|
|
4942
5266
|
const part = set[slot];
|
|
4943
5267
|
if (part) {
|
|
4944
|
-
out[slot] = new Part({
|
|
5268
|
+
out[slot] = new Part({
|
|
5269
|
+
children: emitOutsideBody(() => partChildren(part, resources))
|
|
5270
|
+
});
|
|
4945
5271
|
}
|
|
4946
5272
|
}
|
|
4947
5273
|
return Object.keys(out).length > 0 ? out : void 0;
|
|
@@ -4949,10 +5275,10 @@ function chromeSlots(set, Part, resources) {
|
|
|
4949
5275
|
function partChildren(part, resources) {
|
|
4950
5276
|
return part.children.map((block2) => emitBlock(block2, resources));
|
|
4951
5277
|
}
|
|
4952
|
-
function sectionChildren(section2, resources
|
|
5278
|
+
function sectionChildren(section2, resources) {
|
|
4953
5279
|
const blocks = section2.children.map((block2) => emitBlock(block2, resources));
|
|
4954
5280
|
const bookmark = section2.bookmark;
|
|
4955
|
-
const endsInFrame =
|
|
5281
|
+
const endsInFrame = lastBlockIsFrame(section2);
|
|
4956
5282
|
if (!bookmark && !endsInFrame) return blocks;
|
|
4957
5283
|
const out = [...blocks];
|
|
4958
5284
|
if (bookmark?.opens) {
|
|
@@ -5005,6 +5331,7 @@ var init_docxjs = __esm({
|
|
|
5005
5331
|
"use strict";
|
|
5006
5332
|
init_styles2();
|
|
5007
5333
|
init_charts();
|
|
5334
|
+
init_pageNumbers();
|
|
5008
5335
|
init_imageUtils();
|
|
5009
5336
|
init_packageDocument();
|
|
5010
5337
|
init_fixFloatingImageIds();
|
|
@@ -6191,7 +6518,7 @@ function sectionChildren2(value, ctx, closesDocument = false) {
|
|
|
6191
6518
|
const blocks = value.children.map((child) => block(child, ctx));
|
|
6192
6519
|
const last = value.children[value.children.length - 1];
|
|
6193
6520
|
const bookmark = value.bookmark;
|
|
6194
|
-
if (bookmark?.closes && last?.kind !== "paragraph" ||
|
|
6521
|
+
if (bookmark?.closes && last?.kind !== "paragraph" || last?.kind === "paragraph" && last.frame !== void 0 && (closesDocument || !bookmark?.closes))
|
|
6195
6522
|
blocks.push({
|
|
6196
6523
|
paragraph: {
|
|
6197
6524
|
children: [],
|
|
@@ -10557,9 +10884,9 @@ function schemeHex(token, theme) {
|
|
|
10557
10884
|
// src/ir/compiler.ts
|
|
10558
10885
|
var CONTENT_BOOKMARK_ID_BASE = 2e6;
|
|
10559
10886
|
var SINGLE_LINE_TWIPS = 240;
|
|
10560
|
-
function compileDocument(structure,
|
|
10887
|
+
function compileDocument(structure, layout2, warnings = [], images = /* @__PURE__ */ new Map(), options = {}) {
|
|
10561
10888
|
const styles = createDocumentStyles(structure.theme, structure.language);
|
|
10562
|
-
const outline = collectOutline(
|
|
10889
|
+
const outline = collectOutline(layout2, warnings);
|
|
10563
10890
|
const ctx = {
|
|
10564
10891
|
theme: structure.theme,
|
|
10565
10892
|
themeName: structure.themeName,
|
|
@@ -10594,10 +10921,10 @@ function compileDocument(structure, layout, warnings = [], images = /* @__PURE__
|
|
|
10594
10921
|
};
|
|
10595
10922
|
ctx.features.require("paragraphs", "sections");
|
|
10596
10923
|
ctx.features.require("styles", "styles");
|
|
10597
|
-
if (
|
|
10598
|
-
const ordinals = computeSectionOrdinals(
|
|
10599
|
-
const chrome = resolveSectionChrome(
|
|
10600
|
-
const sections =
|
|
10924
|
+
if (layout2.sections.length > 1) ctx.features.require("sections", "sections");
|
|
10925
|
+
const ordinals = computeSectionOrdinals(layout2.sections);
|
|
10926
|
+
const chrome = resolveSectionChrome(layout2.sections);
|
|
10927
|
+
const sections = layout2.sections.map(
|
|
10601
10928
|
(section2, index) => compileSection(section2, index, ordinals[index], chrome[index], ctx)
|
|
10602
10929
|
);
|
|
10603
10930
|
if (ctx.hasResolvedComment && !ctx.comments.some((comment) => comment.parentId !== void 0)) {
|
|
@@ -10675,9 +11002,9 @@ function separateFromTables(blocks, bodyAfterTwips) {
|
|
|
10675
11002
|
}
|
|
10676
11003
|
}
|
|
10677
11004
|
}
|
|
10678
|
-
function collectOutline(
|
|
11005
|
+
function collectOutline(layout2, warnings) {
|
|
10679
11006
|
try {
|
|
10680
|
-
return collectDocumentOutline(
|
|
11007
|
+
return collectDocumentOutline(layout2.sections);
|
|
10681
11008
|
} catch (error) {
|
|
10682
11009
|
warnings.push({
|
|
10683
11010
|
component: "document",
|
|
@@ -13223,13 +13550,19 @@ function compileTableRow(row, columnTwips, spacing, baseStyle, scope) {
|
|
|
13223
13550
|
...scope.cantSplit !== void 0 ? { cantSplit: scope.cantSplit } : {}
|
|
13224
13551
|
};
|
|
13225
13552
|
}
|
|
13553
|
+
var NORMAL_TABLE_CELL_MARGINS = {
|
|
13554
|
+
topTwips: 0,
|
|
13555
|
+
bottomTwips: 0,
|
|
13556
|
+
leftTwips: 108,
|
|
13557
|
+
rightTwips: 108
|
|
13558
|
+
};
|
|
13226
13559
|
function compileTableCell(cell, columnTwips, spacing, baseStyle, keepNext, partScope, rowRevision, markRevision) {
|
|
13227
|
-
const margins =
|
|
13560
|
+
const margins = cell.missing ? void 0 : cell.padding ? {
|
|
13228
13561
|
topTwips: pointsToTwips2(cell.padding.top),
|
|
13229
13562
|
bottomTwips: pointsToTwips2(cell.padding.bottom),
|
|
13230
13563
|
leftTwips: pointsToTwips2(cell.padding.left),
|
|
13231
13564
|
rightTwips: pointsToTwips2(cell.padding.right)
|
|
13232
|
-
} :
|
|
13565
|
+
} : NORMAL_TABLE_CELL_MARGINS;
|
|
13233
13566
|
const scope = {
|
|
13234
13567
|
...partScope,
|
|
13235
13568
|
measureTwips: cellMeasureTwips(columnTwips, margins)
|
|
@@ -13742,8 +14075,8 @@ function hasPageBreak(component) {
|
|
|
13742
14075
|
}
|
|
13743
14076
|
return false;
|
|
13744
14077
|
}
|
|
13745
|
-
function getColumnSettings(
|
|
13746
|
-
switch (
|
|
14078
|
+
function getColumnSettings(layout2) {
|
|
14079
|
+
switch (layout2) {
|
|
13747
14080
|
case "multi-column":
|
|
13748
14081
|
return {
|
|
13749
14082
|
count: 2,
|
|
@@ -15983,19 +16316,19 @@ async function compileDocumentScoped(document, options, warnings) {
|
|
|
15983
16316
|
context.themeName,
|
|
15984
16317
|
resolveGenerationDate(options)
|
|
15985
16318
|
);
|
|
15986
|
-
const
|
|
16319
|
+
const layout2 = applyLayout(
|
|
15987
16320
|
structure.sections,
|
|
15988
16321
|
context.theme,
|
|
15989
16322
|
context.themeName
|
|
15990
16323
|
);
|
|
15991
16324
|
const images = await loadImageResources(
|
|
15992
|
-
|
|
16325
|
+
layout2.sections.flatMap((section2) => [
|
|
15993
16326
|
...section2.components,
|
|
15994
16327
|
...Array.isArray(section2.header) ? section2.header : [],
|
|
15995
16328
|
...Array.isArray(section2.footer) ? section2.footer : []
|
|
15996
16329
|
])
|
|
15997
16330
|
);
|
|
15998
|
-
const compiled = compileDocument(structure,
|
|
16331
|
+
const compiled = compileDocument(structure, layout2, warnings, images, {
|
|
15999
16332
|
// A caller that collects nothing still needs to hear about a dropped
|
|
16000
16333
|
// value, so warnings go to the console when there is no collector.
|
|
16001
16334
|
echoWarnings: options.warnings === void 0
|