@usejunior/docx-core 0.18.0 → 0.20.1
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/.tsbuildinfo +1 -1
- package/dist/core-types.d.ts +1 -139
- package/dist/core-types.d.ts.map +1 -1
- package/dist/core-types.js +1 -3
- package/dist/core-types.js.map +1 -1
- package/dist/generation/emit/borders.d.ts +14 -0
- package/dist/generation/emit/borders.d.ts.map +1 -0
- package/dist/generation/emit/borders.js +45 -0
- package/dist/generation/emit/borders.js.map +1 -0
- package/dist/generation/emit/properties.d.ts +1 -1
- package/dist/generation/emit/properties.d.ts.map +1 -1
- package/dist/generation/emit/properties.js +4 -0
- package/dist/generation/emit/properties.js.map +1 -1
- package/dist/generation/emit/table.d.ts.map +1 -1
- package/dist/generation/emit/table.js +3 -31
- package/dist/generation/emit/table.js.map +1 -1
- package/dist/generation/index.d.ts +1 -1
- package/dist/generation/index.d.ts.map +1 -1
- package/dist/generation/types.d.ts +9 -0
- package/dist/generation/types.d.ts.map +1 -1
- package/dist/generation/types.js.map +1 -1
- package/dist/generation/validate-spec.d.ts.map +1 -1
- package/dist/generation/validate-spec.js +2 -0
- package/dist/generation/validate-spec.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/generation-probes.d.ts +36 -2
- package/dist/integration/generation-probes.d.ts.map +1 -1
- package/dist/integration/generation-probes.js +137 -15
- package/dist/integration/generation-probes.js.map +1 -1
- package/dist/integration/libreoffice-oracle.js +1 -1
- package/dist/integration/synthetic-docx-fixture.d.ts.map +1 -1
- package/dist/integration/synthetic-docx-fixture.js +37 -20
- package/dist/integration/synthetic-docx-fixture.js.map +1 -1
- package/dist/primitives/accept_ai_edits.js +14 -2
- package/dist/primitives/accept_ai_edits.js.map +1 -1
- package/dist/primitives/accept_changes.d.ts +7 -0
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +92 -4
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/bookmarks.d.ts +1 -0
- package/dist/primitives/bookmarks.d.ts.map +1 -1
- package/dist/primitives/bookmarks.js +1 -1
- package/dist/primitives/bookmarks.js.map +1 -1
- package/dist/primitives/comments.d.ts +31 -4
- package/dist/primitives/comments.d.ts.map +1 -1
- package/dist/primitives/comments.js +111 -12
- package/dist/primitives/comments.js.map +1 -1
- package/dist/primitives/document.d.ts +47 -1
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +198 -13
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/document_view-headings.d.ts +3 -1
- package/dist/primitives/document_view-headings.d.ts.map +1 -1
- package/dist/primitives/document_view-headings.js +5 -5
- package/dist/primitives/document_view-headings.js.map +1 -1
- package/dist/primitives/document_view.d.ts +2 -0
- package/dist/primitives/document_view.d.ts.map +1 -1
- package/dist/primitives/document_view.js +18 -4
- package/dist/primitives/document_view.js.map +1 -1
- package/dist/primitives/field_evaluation.d.ts +70 -0
- package/dist/primitives/field_evaluation.d.ts.map +1 -0
- package/dist/primitives/field_evaluation.js +462 -0
- package/dist/primitives/field_evaluation.js.map +1 -0
- package/dist/primitives/footnotes.d.ts +17 -3
- package/dist/primitives/footnotes.d.ts.map +1 -1
- package/dist/primitives/footnotes.js +64 -17
- package/dist/primitives/footnotes.js.map +1 -1
- package/dist/primitives/formatting_tags.js +2 -2
- package/dist/primitives/formatting_tags.js.map +1 -1
- package/dist/primitives/index.d.ts +8 -1
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +8 -1
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/merge_runs.d.ts +3 -1
- package/dist/primitives/merge_runs.d.ts.map +1 -1
- package/dist/primitives/merge_runs.js +12 -2
- package/dist/primitives/merge_runs.js.map +1 -1
- package/dist/primitives/namespaces.d.ts +12 -2
- package/dist/primitives/namespaces.d.ts.map +1 -1
- package/dist/primitives/namespaces.js +13 -2
- package/dist/primitives/namespaces.js.map +1 -1
- package/dist/primitives/note_conversion.d.ts +11 -0
- package/dist/primitives/note_conversion.d.ts.map +1 -0
- package/dist/primitives/note_conversion.js +12 -0
- package/dist/primitives/note_conversion.js.map +1 -0
- package/dist/primitives/opc-target.d.ts +24 -0
- package/dist/primitives/opc-target.d.ts.map +1 -0
- package/dist/primitives/opc-target.js +99 -0
- package/dist/primitives/opc-target.js.map +1 -0
- package/dist/primitives/paragraph_numbering.d.ts +40 -0
- package/dist/primitives/paragraph_numbering.d.ts.map +1 -0
- package/dist/primitives/paragraph_numbering.js +198 -0
- package/dist/primitives/paragraph_numbering.js.map +1 -0
- package/dist/primitives/reject_changes.d.ts +7 -0
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +133 -10
- package/dist/primitives/reject_changes.js.map +1 -1
- package/dist/primitives/sectPrAudit.d.ts +18 -1
- package/dist/primitives/sectPrAudit.d.ts.map +1 -1
- package/dist/primitives/sectPrAudit.js +120 -34
- package/dist/primitives/sectPrAudit.js.map +1 -1
- package/dist/primitives/sections.d.ts +134 -0
- package/dist/primitives/sections.d.ts.map +1 -0
- package/dist/primitives/sections.js +644 -0
- package/dist/primitives/sections.js.map +1 -0
- package/dist/primitives/serialize_html.d.ts.map +1 -1
- package/dist/primitives/serialize_html.js +18 -7
- package/dist/primitives/serialize_html.js.map +1 -1
- package/dist/primitives/styles.d.ts +60 -0
- package/dist/primitives/styles.d.ts.map +1 -1
- package/dist/primitives/styles.js +206 -25
- package/dist/primitives/styles.js.map +1 -1
- package/dist/primitives/symbol_run_content.d.ts +42 -0
- package/dist/primitives/symbol_run_content.d.ts.map +1 -0
- package/dist/primitives/symbol_run_content.js +79 -0
- package/dist/primitives/symbol_run_content.js.map +1 -0
- package/dist/primitives/text.d.ts +29 -0
- package/dist/primitives/text.d.ts.map +1 -1
- package/dist/primitives/text.js +354 -44
- package/dist/primitives/text.js.map +1 -1
- package/dist/primitives/track-changes-emitter.d.ts +9 -0
- package/dist/primitives/track-changes-emitter.d.ts.map +1 -1
- package/dist/primitives/track-changes-emitter.js +40 -2
- package/dist/primitives/track-changes-emitter.js.map +1 -1
- package/dist/primitives/validate_document.d.ts.map +1 -1
- package/dist/primitives/validate_document.js +22 -1
- package/dist/primitives/validate_document.js.map +1 -1
- package/dist/shared/docx/DocxArchive.d.ts.map +1 -1
- package/dist/shared/docx/DocxArchive.js +7 -0
- package/dist/shared/docx/DocxArchive.js.map +1 -1
- package/dist/shared/field-semantics.d.ts +26 -0
- package/dist/shared/field-semantics.d.ts.map +1 -0
- package/dist/shared/field-semantics.js +232 -0
- package/dist/shared/field-semantics.js.map +1 -0
- package/dist/shared/field-structure.d.ts +14 -0
- package/dist/shared/field-structure.d.ts.map +1 -1
- package/dist/shared/field-structure.js +98 -7
- package/dist/shared/field-structure.js.map +1 -1
- package/package.json +3 -5
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type WordFieldKind } from '../shared/field-semantics.js';
|
|
2
|
+
export type FieldRefreshStatus = 'evaluated' | 'dirtied' | 'unchanged' | 'preserved' | 'unsupported';
|
|
3
|
+
/**
|
|
4
|
+
* Where a field sits in the story it was read from.
|
|
5
|
+
*
|
|
6
|
+
* Both ordinals are document-order positions within a single refresh result.
|
|
7
|
+
* They are not durable identities: inserting an earlier paragraph shifts every
|
|
8
|
+
* later `paragraphOrdinal`. Use them to correlate an outcome with the XML that
|
|
9
|
+
* produced it, not to remember a field across edits. `paragraphOrdinal` is
|
|
10
|
+
* absent for a field that has no `w:p` ancestor.
|
|
11
|
+
*/
|
|
12
|
+
export interface FieldLocator {
|
|
13
|
+
paragraphOrdinal?: number;
|
|
14
|
+
fieldOrdinal: number;
|
|
15
|
+
}
|
|
16
|
+
export interface FieldRefreshOutcome {
|
|
17
|
+
index: number;
|
|
18
|
+
locator: FieldLocator;
|
|
19
|
+
kind: WordFieldKind;
|
|
20
|
+
instruction: string;
|
|
21
|
+
status: FieldRefreshStatus;
|
|
22
|
+
target?: string;
|
|
23
|
+
reason?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface FieldRefreshOptions {
|
|
26
|
+
markLayoutDependentDirty?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface FieldRefreshReport {
|
|
29
|
+
changed: boolean;
|
|
30
|
+
outcomes: FieldRefreshOutcome[];
|
|
31
|
+
}
|
|
32
|
+
export interface FieldXmlRefreshResult extends FieldRefreshReport {
|
|
33
|
+
documentXml: string;
|
|
34
|
+
}
|
|
35
|
+
export interface FieldDocxRefreshResult extends FieldRefreshReport {
|
|
36
|
+
document: Buffer;
|
|
37
|
+
/**
|
|
38
|
+
* Field-bearing parts present in the package that this operation did not
|
|
39
|
+
* read, such as `word/header1.xml` or `word/footnotes.xml`.
|
|
40
|
+
*/
|
|
41
|
+
skippedStories: string[];
|
|
42
|
+
}
|
|
43
|
+
export type FieldRefreshErrorCode = 'MALFORMED_FIELD_TOPOLOGY';
|
|
44
|
+
export declare class FieldRefreshError extends Error {
|
|
45
|
+
readonly code: FieldRefreshErrorCode;
|
|
46
|
+
constructor(code: FieldRefreshErrorCode, message: string);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Refresh the deterministic subset of complex fields in a main document story.
|
|
50
|
+
*
|
|
51
|
+
* Layout-dependent results are never synthesized. Callers may instead request
|
|
52
|
+
* `w:dirty="true"` on their begin markers so a layout-capable host recalculates
|
|
53
|
+
* them when the document is opened.
|
|
54
|
+
*
|
|
55
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.18
|
|
56
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.5.51
|
|
57
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.5.45
|
|
58
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.5.44
|
|
59
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.5.42
|
|
60
|
+
* @see https://github.com/UseJunior/safe-docx/issues/762
|
|
61
|
+
*/
|
|
62
|
+
export declare function refreshDocumentFieldsXml(documentXml: string, options?: FieldRefreshOptions): FieldXmlRefreshResult;
|
|
63
|
+
/**
|
|
64
|
+
* Refresh supported fields in `word/document.xml` of a DOCX package.
|
|
65
|
+
*
|
|
66
|
+
* Only the main story is read. Any other field-bearing part present in the
|
|
67
|
+
* package is named in `skippedStories`.
|
|
68
|
+
*/
|
|
69
|
+
export declare function refreshDocxFields(document: Buffer, options?: FieldRefreshOptions): Promise<FieldDocxRefreshResult>;
|
|
70
|
+
//# sourceMappingURL=field_evaluation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field_evaluation.d.ts","sourceRoot":"","sources":["../../src/primitives/field_evaluation.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AAItC,MAAM,MAAM,kBAAkB,GAC1B,WAAW,GACX,SAAS,GACT,WAAW,GACX,WAAW,GACX,aAAa,CAAC;AAElB;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAE/D,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;gBAEzB,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM;CAKzD;AAyYD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,mBAAwB,GAChC,qBAAqB,CA2FvB;AAkBD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,sBAAsB,CAAC,CAcjC"}
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import { DocxArchive } from '../shared/docx/DocxArchive.js';
|
|
2
|
+
import { classifyFieldInstruction, } from '../shared/field-semantics.js';
|
|
3
|
+
import { W_NS } from '../shared/ooxml/namespaces.js';
|
|
4
|
+
import { parseXml, serializeXml } from './xml.js';
|
|
5
|
+
export class FieldRefreshError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
constructor(code, message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'FieldRefreshError';
|
|
10
|
+
this.code = code;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The instruction a reader would act on: the surviving text, or the deleted
|
|
15
|
+
* text when the whole instruction was struck. Concatenating both views yields a
|
|
16
|
+
* chimera like `REF Old REF New`, which describes neither revision state.
|
|
17
|
+
*/
|
|
18
|
+
function fieldInstructionView(field) {
|
|
19
|
+
const current = field.currentInstruction.join('');
|
|
20
|
+
return current.trim().length > 0 ? current : field.deletedInstruction.join('');
|
|
21
|
+
}
|
|
22
|
+
const REVISION_CONTAINERS = new Set(['ins', 'del', 'moveFrom', 'moveTo']);
|
|
23
|
+
const DELETION_CONTAINERS = new Set(['del', 'moveFrom']);
|
|
24
|
+
function wAttribute(element, localName) {
|
|
25
|
+
return (element.getAttributeNS(W_NS, localName) ??
|
|
26
|
+
element.getAttribute(`w:${localName}`));
|
|
27
|
+
}
|
|
28
|
+
function isWordElement(element, localName) {
|
|
29
|
+
return element.namespaceURI === W_NS && element.localName === localName;
|
|
30
|
+
}
|
|
31
|
+
function elementChildren(node) {
|
|
32
|
+
const children = [];
|
|
33
|
+
for (let child = node.firstChild; child; child = child.nextSibling) {
|
|
34
|
+
if (child.nodeType === 1)
|
|
35
|
+
children.push(child);
|
|
36
|
+
}
|
|
37
|
+
return children;
|
|
38
|
+
}
|
|
39
|
+
function nearestWordAncestor(node, localName) {
|
|
40
|
+
for (let current = node.parentNode; current; current = current.parentNode) {
|
|
41
|
+
if (current.nodeType === 1 &&
|
|
42
|
+
isWordElement(current, localName)) {
|
|
43
|
+
return current;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
function hasRevisionAncestor(node) {
|
|
49
|
+
for (let current = node; current; current = current.parentNode) {
|
|
50
|
+
if (current.nodeType === 1 &&
|
|
51
|
+
current.namespaceURI === W_NS &&
|
|
52
|
+
REVISION_CONTAINERS.has(current.localName)) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Flatten the story in document order, treating `w:fldSimple` as opaque.
|
|
60
|
+
*
|
|
61
|
+
* The simple-field element itself is emitted so callers can recognize and
|
|
62
|
+
* refuse it, but its subtree is not: a simple field owns its own instruction
|
|
63
|
+
* and cached result, and letting those descendants surface in the flat
|
|
64
|
+
* sequence lets an enclosing complex field adopt — and overwrite — them.
|
|
65
|
+
*/
|
|
66
|
+
function enumerateElements(root) {
|
|
67
|
+
const elements = [];
|
|
68
|
+
const visit = (node) => {
|
|
69
|
+
for (const child of elementChildren(node)) {
|
|
70
|
+
elements.push(child);
|
|
71
|
+
if (isWordElement(child, 'fldSimple'))
|
|
72
|
+
continue;
|
|
73
|
+
visit(child);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
visit(root);
|
|
77
|
+
return elements;
|
|
78
|
+
}
|
|
79
|
+
function hasDeletionAncestor(node) {
|
|
80
|
+
for (let current = node; current; current = current.parentNode) {
|
|
81
|
+
if (current.nodeType === 1 &&
|
|
82
|
+
current.namespaceURI === W_NS &&
|
|
83
|
+
DELETION_CONTAINERS.has(current.localName)) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Validate and enumerate complex fields before any mutation occurs.
|
|
91
|
+
*
|
|
92
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.18
|
|
93
|
+
* @see https://github.com/UseJunior/safe-docx/issues/762
|
|
94
|
+
*/
|
|
95
|
+
function collectComplexFields(document) {
|
|
96
|
+
const roots = [];
|
|
97
|
+
const stack = [];
|
|
98
|
+
for (const element of enumerateElements(document)) {
|
|
99
|
+
if (isWordElement(element, 'fldSimple')) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (isWordElement(element, 'fldChar')) {
|
|
103
|
+
const type = wAttribute(element, 'fldCharType');
|
|
104
|
+
if (type === 'begin') {
|
|
105
|
+
const parent = stack[stack.length - 1];
|
|
106
|
+
const field = {
|
|
107
|
+
begin: element,
|
|
108
|
+
currentInstruction: [],
|
|
109
|
+
deletedInstruction: [],
|
|
110
|
+
resultTexts: [],
|
|
111
|
+
nested: parent !== undefined,
|
|
112
|
+
hasNested: false,
|
|
113
|
+
parent,
|
|
114
|
+
};
|
|
115
|
+
if (parent)
|
|
116
|
+
parent.hasNested = true;
|
|
117
|
+
if (!parent)
|
|
118
|
+
roots.push(field);
|
|
119
|
+
stack.push(field);
|
|
120
|
+
}
|
|
121
|
+
else if (type === 'separate') {
|
|
122
|
+
const field = stack[stack.length - 1];
|
|
123
|
+
if (!field || field.separate) {
|
|
124
|
+
throw new FieldRefreshError('MALFORMED_FIELD_TOPOLOGY', field ? 'Complex field contains more than one separator' : 'Stray field separator');
|
|
125
|
+
}
|
|
126
|
+
field.separate = element;
|
|
127
|
+
}
|
|
128
|
+
else if (type === 'end') {
|
|
129
|
+
const field = stack.pop();
|
|
130
|
+
if (!field) {
|
|
131
|
+
throw new FieldRefreshError('MALFORMED_FIELD_TOPOLOGY', 'Stray field end');
|
|
132
|
+
}
|
|
133
|
+
field.end = element;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
throw new FieldRefreshError('MALFORMED_FIELD_TOPOLOGY', `Unknown field character type: ${type ?? '(missing)'}`);
|
|
137
|
+
}
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const field = stack[stack.length - 1];
|
|
141
|
+
if (!field)
|
|
142
|
+
continue;
|
|
143
|
+
if (!field.separate &&
|
|
144
|
+
(isWordElement(element, 'instrText') || isWordElement(element, 'delInstrText'))) {
|
|
145
|
+
// `w:delInstrText` is the canonical deleted-instruction element, but Word
|
|
146
|
+
// and our own atomizer both also emit plain `w:instrText` inside a
|
|
147
|
+
// `w:del`. Ancestry is the only reliable signal.
|
|
148
|
+
const target = isWordElement(element, 'delInstrText') || hasDeletionAncestor(element)
|
|
149
|
+
? field.deletedInstruction
|
|
150
|
+
: field.currentInstruction;
|
|
151
|
+
target.push(element.textContent ?? '');
|
|
152
|
+
}
|
|
153
|
+
else if (field.separate && isWordElement(element, 't')) {
|
|
154
|
+
field.resultTexts.push(element);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (stack.length > 0) {
|
|
158
|
+
throw new FieldRefreshError('MALFORMED_FIELD_TOPOLOGY', 'Unclosed complex field');
|
|
159
|
+
}
|
|
160
|
+
return roots;
|
|
161
|
+
}
|
|
162
|
+
function resolveBookmarkRanges(elements) {
|
|
163
|
+
const startsByName = new Map();
|
|
164
|
+
const startsById = new Map();
|
|
165
|
+
const endsById = new Map();
|
|
166
|
+
const indexes = new Map();
|
|
167
|
+
elements.forEach((element, index) => indexes.set(element, index));
|
|
168
|
+
for (const element of elements) {
|
|
169
|
+
if (isWordElement(element, 'bookmarkStart')) {
|
|
170
|
+
const name = wAttribute(element, 'name');
|
|
171
|
+
const id = wAttribute(element, 'id');
|
|
172
|
+
if (name)
|
|
173
|
+
startsByName.set(name, [...(startsByName.get(name) ?? []), element]);
|
|
174
|
+
if (id)
|
|
175
|
+
startsById.set(id, [...(startsById.get(id) ?? []), element]);
|
|
176
|
+
}
|
|
177
|
+
else if (isWordElement(element, 'bookmarkEnd')) {
|
|
178
|
+
const id = wAttribute(element, 'id');
|
|
179
|
+
if (id)
|
|
180
|
+
endsById.set(id, [...(endsById.get(id) ?? []), element]);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const ranges = new Map();
|
|
184
|
+
for (const [name, starts] of startsByName) {
|
|
185
|
+
if (starts.length !== 1) {
|
|
186
|
+
ranges.set(name, 'duplicate-bookmark-name');
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const start = starts[0];
|
|
190
|
+
const id = wAttribute(start, 'id');
|
|
191
|
+
if (!id || (startsById.get(id)?.length ?? 0) !== 1) {
|
|
192
|
+
ranges.set(name, 'duplicate-or-missing-bookmark-id');
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const ends = endsById.get(id) ?? [];
|
|
196
|
+
if (ends.length !== 1) {
|
|
197
|
+
ranges.set(name, 'missing-or-duplicate-bookmark-end');
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const startIndex = indexes.get(start);
|
|
201
|
+
const endIndex = indexes.get(ends[0]);
|
|
202
|
+
if (endIndex <= startIndex) {
|
|
203
|
+
ranges.set(name, 'reversed-bookmark-range');
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
ranges.set(name, { start, end: ends[0], startIndex, endIndex });
|
|
207
|
+
}
|
|
208
|
+
return ranges;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Project a bookmark range to the plain text a REF result should cache.
|
|
212
|
+
*
|
|
213
|
+
* Word writes a REF result structurally: a tab becomes `w:tab`, a break or a
|
|
214
|
+
* paragraph transition becomes new run and paragraph content. This primitive
|
|
215
|
+
* replaces a single `w:t` payload, so it can only faithfully represent a
|
|
216
|
+
* projection that is itself a single run of characters. A range carrying tabs,
|
|
217
|
+
* breaks, or a paragraph transition is therefore refused rather than flattened
|
|
218
|
+
* into literal U+0009/U+000A, which Word collapses on display.
|
|
219
|
+
*
|
|
220
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.5.51
|
|
221
|
+
* @see https://github.com/UseJunior/safe-docx/issues/762
|
|
222
|
+
*/
|
|
223
|
+
function bookmarkText(indexes, elements, range, field) {
|
|
224
|
+
const fieldStart = indexes.get(field.begin) ?? -1;
|
|
225
|
+
const fieldEnd = indexes.get(field.end) ?? -1;
|
|
226
|
+
if (range.startIndex <= fieldStart &&
|
|
227
|
+
range.endIndex >= fieldEnd) {
|
|
228
|
+
return { reason: 'self-referential-bookmark' };
|
|
229
|
+
}
|
|
230
|
+
let value = '';
|
|
231
|
+
let renderedParagraph;
|
|
232
|
+
for (let index = range.startIndex + 1; index < range.endIndex; index += 1) {
|
|
233
|
+
const element = elements[index];
|
|
234
|
+
if (hasRevisionAncestor(element))
|
|
235
|
+
return { reason: 'bookmark-contains-revisions' };
|
|
236
|
+
if (isWordElement(element, 'fldChar') ||
|
|
237
|
+
isWordElement(element, 'fldSimple') ||
|
|
238
|
+
isWordElement(element, 'drawing') ||
|
|
239
|
+
isWordElement(element, 'object')) {
|
|
240
|
+
return { reason: 'unsupported-bookmark-content' };
|
|
241
|
+
}
|
|
242
|
+
if (isWordElement(element, 'tab') ||
|
|
243
|
+
isWordElement(element, 'br') ||
|
|
244
|
+
isWordElement(element, 'cr')) {
|
|
245
|
+
return { reason: 'unsupported-bookmark-layout' };
|
|
246
|
+
}
|
|
247
|
+
if (!isWordElement(element, 't'))
|
|
248
|
+
continue;
|
|
249
|
+
const paragraph = nearestWordAncestor(element, 'p');
|
|
250
|
+
if (renderedParagraph && paragraph && paragraph !== renderedParagraph) {
|
|
251
|
+
return { reason: 'unsupported-bookmark-layout' };
|
|
252
|
+
}
|
|
253
|
+
if (paragraph)
|
|
254
|
+
renderedParagraph = paragraph;
|
|
255
|
+
value += element.textContent ?? '';
|
|
256
|
+
}
|
|
257
|
+
return { value };
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Structural reasons a field cannot be refreshed, independent of its
|
|
261
|
+
* instruction semantics.
|
|
262
|
+
*
|
|
263
|
+
* Revision detection is part of this pass and runs *before* the caller trusts
|
|
264
|
+
* anything the classifier derived: a field whose instruction was edited under
|
|
265
|
+
* tracked changes has two instruction states, and neither its kind nor its
|
|
266
|
+
* bookmark target may be asserted from the mixture.
|
|
267
|
+
*/
|
|
268
|
+
function structuralRefreshBlocker(field, indexes, elements) {
|
|
269
|
+
if (field.nested || field.hasNested)
|
|
270
|
+
return 'nested-field';
|
|
271
|
+
if (!field.separate || !field.end)
|
|
272
|
+
return 'incomplete-field';
|
|
273
|
+
if (hasRevisionAncestor(field.begin) || hasRevisionAncestor(field.end)) {
|
|
274
|
+
return 'field-contains-revisions';
|
|
275
|
+
}
|
|
276
|
+
const startIndex = indexes.get(field.begin) ?? 0;
|
|
277
|
+
const endIndex = indexes.get(field.end) ?? elements.length - 1;
|
|
278
|
+
for (let index = startIndex; index <= endIndex; index += 1) {
|
|
279
|
+
if (hasRevisionAncestor(elements[index]))
|
|
280
|
+
return 'field-contains-revisions';
|
|
281
|
+
}
|
|
282
|
+
const locked = wAttribute(field.begin, 'fldLock');
|
|
283
|
+
if (locked === 'true' || locked === '1')
|
|
284
|
+
return 'locked-field';
|
|
285
|
+
if (!nearestWordAncestor(field.begin, 'p'))
|
|
286
|
+
return 'field-outside-paragraph';
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
function semanticRefreshBlocker(field, classification) {
|
|
290
|
+
if (classification.evaluationClass === 'deterministic-ref' &&
|
|
291
|
+
nearestWordAncestor(field.begin, 'p') !== nearestWordAncestor(field.end, 'p')) {
|
|
292
|
+
return 'cross-paragraph-field';
|
|
293
|
+
}
|
|
294
|
+
return classification.reason;
|
|
295
|
+
}
|
|
296
|
+
function replaceCachedResult(field, value) {
|
|
297
|
+
const first = field.resultTexts[0];
|
|
298
|
+
if (!first)
|
|
299
|
+
return 'missing';
|
|
300
|
+
if (field.resultTexts.map((text) => text.textContent ?? '').join('') === value) {
|
|
301
|
+
return 'unchanged';
|
|
302
|
+
}
|
|
303
|
+
first.textContent = value;
|
|
304
|
+
if (/^\s|\s$/u.test(value)) {
|
|
305
|
+
first.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
first.removeAttributeNS('http://www.w3.org/XML/1998/namespace', 'space');
|
|
309
|
+
}
|
|
310
|
+
for (const text of field.resultTexts.slice(1))
|
|
311
|
+
text.textContent = '';
|
|
312
|
+
return 'changed';
|
|
313
|
+
}
|
|
314
|
+
function fieldLocators(document, fields) {
|
|
315
|
+
const paragraphs = Array.from(document.getElementsByTagNameNS(W_NS, 'p'));
|
|
316
|
+
const paragraphOrdinals = new Map(paragraphs.map((paragraph, index) => [paragraph, index]));
|
|
317
|
+
const nextFieldOrdinal = new Map();
|
|
318
|
+
const locators = new Map();
|
|
319
|
+
for (const field of fields) {
|
|
320
|
+
const paragraph = nearestWordAncestor(field.begin, 'p');
|
|
321
|
+
const fieldOrdinal = nextFieldOrdinal.get(paragraph) ?? 0;
|
|
322
|
+
nextFieldOrdinal.set(paragraph, fieldOrdinal + 1);
|
|
323
|
+
const paragraphOrdinal = paragraph
|
|
324
|
+
? paragraphOrdinals.get(paragraph)
|
|
325
|
+
: undefined;
|
|
326
|
+
locators.set(field, {
|
|
327
|
+
...(paragraphOrdinal === undefined ? {} : { paragraphOrdinal }),
|
|
328
|
+
fieldOrdinal,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
return locators;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Refresh the deterministic subset of complex fields in a main document story.
|
|
335
|
+
*
|
|
336
|
+
* Layout-dependent results are never synthesized. Callers may instead request
|
|
337
|
+
* `w:dirty="true"` on their begin markers so a layout-capable host recalculates
|
|
338
|
+
* them when the document is opened.
|
|
339
|
+
*
|
|
340
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.18
|
|
341
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.5.51
|
|
342
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.5.45
|
|
343
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.5.44
|
|
344
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.16.5.42
|
|
345
|
+
* @see https://github.com/UseJunior/safe-docx/issues/762
|
|
346
|
+
*/
|
|
347
|
+
export function refreshDocumentFieldsXml(documentXml, options = {}) {
|
|
348
|
+
const document = parseXml(documentXml);
|
|
349
|
+
const fields = collectComplexFields(document);
|
|
350
|
+
const elements = enumerateElements(document);
|
|
351
|
+
const indexes = new Map(elements.map((element, index) => [element, index]));
|
|
352
|
+
const bookmarkRanges = resolveBookmarkRanges(elements);
|
|
353
|
+
const locators = fieldLocators(document, fields);
|
|
354
|
+
const outcomes = [];
|
|
355
|
+
let changed = false;
|
|
356
|
+
fields.forEach((field, index) => {
|
|
357
|
+
const classification = classifyFieldInstruction(fieldInstructionView(field));
|
|
358
|
+
const base = {
|
|
359
|
+
index,
|
|
360
|
+
locator: locators.get(field),
|
|
361
|
+
kind: classification.kind,
|
|
362
|
+
instruction: classification.normalizedInstruction,
|
|
363
|
+
target: classification.target,
|
|
364
|
+
};
|
|
365
|
+
const structuralReason = structuralRefreshBlocker(field, indexes, elements) ??
|
|
366
|
+
semanticRefreshBlocker(field, classification);
|
|
367
|
+
if (structuralReason) {
|
|
368
|
+
outcomes.push({ ...base, status: 'unsupported', reason: structuralReason });
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
if (classification.evaluationClass === 'deterministic-ref') {
|
|
372
|
+
const bookmark = bookmarkRanges.get(classification.target);
|
|
373
|
+
if (!bookmark) {
|
|
374
|
+
outcomes.push({ ...base, status: 'unsupported', reason: 'bookmark-not-found' });
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
if (typeof bookmark === 'string') {
|
|
378
|
+
outcomes.push({ ...base, status: 'unsupported', reason: bookmark });
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
const projection = bookmarkText(indexes, elements, bookmark, field);
|
|
382
|
+
if (projection.reason) {
|
|
383
|
+
outcomes.push({ ...base, status: 'unsupported', reason: projection.reason });
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
const replacement = replaceCachedResult(field, projection.value);
|
|
387
|
+
if (replacement === 'missing') {
|
|
388
|
+
outcomes.push({ ...base, status: 'unsupported', reason: 'missing-cached-result-text' });
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
if (replacement === 'unchanged') {
|
|
392
|
+
outcomes.push({ ...base, status: 'unchanged', reason: 'cached-result-current' });
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
changed = true;
|
|
396
|
+
outcomes.push({ ...base, status: 'evaluated' });
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
if (classification.evaluationClass === 'layout-dependent' &&
|
|
400
|
+
options.markLayoutDependentDirty) {
|
|
401
|
+
const dirty = wAttribute(field.begin, 'dirty');
|
|
402
|
+
if (dirty !== 'true' && dirty !== '1') {
|
|
403
|
+
field.begin.setAttributeNS(W_NS, 'w:dirty', 'true');
|
|
404
|
+
changed = true;
|
|
405
|
+
outcomes.push({ ...base, status: 'dirtied' });
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
outcomes.push({ ...base, status: 'unchanged', reason: 'already-dirty' });
|
|
409
|
+
}
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
outcomes.push({
|
|
413
|
+
...base,
|
|
414
|
+
status: classification.evaluationClass === 'layout-dependent'
|
|
415
|
+
? 'preserved'
|
|
416
|
+
: 'unsupported',
|
|
417
|
+
reason: classification.evaluationClass === 'layout-dependent'
|
|
418
|
+
? 'layout-refresh-not-requested'
|
|
419
|
+
: classification.reason,
|
|
420
|
+
});
|
|
421
|
+
});
|
|
422
|
+
return {
|
|
423
|
+
documentXml: changed ? serializeXml(document) : documentXml,
|
|
424
|
+
changed,
|
|
425
|
+
outcomes,
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
const ANCILLARY_STORY_PATTERN = /^word\/(header\d*|footer\d*|footnotes|endnotes|comments)\.xml$/u;
|
|
429
|
+
/**
|
|
430
|
+
* Field-bearing parts this operation does not read.
|
|
431
|
+
*
|
|
432
|
+
* Reported rather than ignored: a caller whose cross-references live in a
|
|
433
|
+
* header cannot tell an empty outcome list from a document without fields.
|
|
434
|
+
*/
|
|
435
|
+
function skippedFieldStories(archive) {
|
|
436
|
+
return archive
|
|
437
|
+
.listFiles()
|
|
438
|
+
.filter((path) => ANCILLARY_STORY_PATTERN.test(path))
|
|
439
|
+
.sort();
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Refresh supported fields in `word/document.xml` of a DOCX package.
|
|
443
|
+
*
|
|
444
|
+
* Only the main story is read. Any other field-bearing part present in the
|
|
445
|
+
* package is named in `skippedStories`.
|
|
446
|
+
*/
|
|
447
|
+
export async function refreshDocxFields(document, options = {}) {
|
|
448
|
+
const archive = await DocxArchive.load(document);
|
|
449
|
+
const skippedStories = skippedFieldStories(archive);
|
|
450
|
+
const result = refreshDocumentFieldsXml(await archive.getDocumentXml(), options);
|
|
451
|
+
if (!result.changed) {
|
|
452
|
+
return { document, changed: false, outcomes: result.outcomes, skippedStories };
|
|
453
|
+
}
|
|
454
|
+
archive.setDocumentXml(result.documentXml);
|
|
455
|
+
return {
|
|
456
|
+
document: await archive.save(),
|
|
457
|
+
changed: true,
|
|
458
|
+
outcomes: result.outcomes,
|
|
459
|
+
skippedStories,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=field_evaluation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field_evaluation.js","sourceRoot":"","sources":["../../src/primitives/field_evaluation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EACL,wBAAwB,GAGzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAyDlD,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,CAAwB;IAErC,YAAY,IAA2B,EAAE,OAAe;QACtD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAgBD;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,KAAmB;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjF,CAAC;AASD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC1E,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;AAEzD,SAAS,UAAU,CAAC,OAAgB,EAAE,SAAiB;IACrD,OAAO,CACL,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC;QACvC,OAAO,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB,EAAE,SAAiB;IACxD,OAAO,OAAO,CAAC,YAAY,KAAK,IAAI,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,IAAU;IACjC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACnE,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAgB,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAU,EAAE,SAAiB;IACxD,KAAK,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1E,IACE,OAAO,CAAC,QAAQ,KAAK,CAAC;YACtB,aAAa,CAAC,OAAkB,EAAE,SAAS,CAAC,EAC5C,CAAC;YACD,OAAO,OAAkB,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAU;IACrC,KAAK,IAAI,OAAO,GAAgB,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5E,IACE,OAAO,CAAC,QAAQ,KAAK,CAAC;YACrB,OAAmB,CAAC,YAAY,KAAK,IAAI;YAC1C,mBAAmB,CAAC,GAAG,CAAE,OAAmB,CAAC,SAAS,CAAC,EACvD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,IAAU;IACnC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,IAAU,EAAQ,EAAE;QACjC,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,IAAI,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC;gBAAE,SAAS;YAChD,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAU;IACrC,KAAK,IAAI,OAAO,GAAgB,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5E,IACE,OAAO,CAAC,QAAQ,KAAK,CAAC;YACrB,OAAmB,CAAC,YAAY,KAAK,IAAI;YAC1C,mBAAmB,CAAC,GAAG,CAAE,OAAmB,CAAC,SAAS,CAAC,EACvD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,QAAkB;IAC9C,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,IAAI,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QACD,IAAI,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAChD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAiB;oBAC1B,KAAK,EAAE,OAAO;oBACd,kBAAkB,EAAE,EAAE;oBACtB,kBAAkB,EAAE,EAAE;oBACtB,WAAW,EAAE,EAAE;oBACf,MAAM,EAAE,MAAM,KAAK,SAAS;oBAC5B,SAAS,EAAE,KAAK;oBAChB,MAAM;iBACP,CAAC;gBACF,IAAI,MAAM;oBAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;gBACpC,IAAI,CAAC,MAAM;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC7B,MAAM,IAAI,iBAAiB,CACzB,0BAA0B,EAC1B,KAAK,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,uBAAuB,CACnF,CAAC;gBACJ,CAAC;gBACD,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;YAC3B,CAAC;iBAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,IAAI,iBAAiB,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAC;gBAC7E,CAAC;gBACD,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,iBAAiB,CACzB,0BAA0B,EAC1B,iCAAiC,IAAI,IAAI,WAAW,EAAE,CACvD,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IACE,CAAC,KAAK,CAAC,QAAQ;YACf,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,EAC/E,CAAC;YACD,0EAA0E;YAC1E,mEAAmE;YACnE,iDAAiD;YACjD,MAAM,MAAM,GACV,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,mBAAmB,CAAC,OAAO,CAAC;gBACpE,CAAC,CAAC,KAAK,CAAC,kBAAkB;gBAC1B,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YACzD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,iBAAiB,CACzB,0BAA0B,EAC1B,wBAAwB,CACzB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAC5B,QAAmB;IAEnB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAElE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,IAAI,IAAI;gBAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/E,IAAI,EAAE;gBAAE,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACvE,CAAC;aAAM,IAAI,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;YACjD,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,IAAI,EAAE;gBAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACzB,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAC;YACtD,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAE,CAAC;QACxC,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,YAAY,CACnB,OAAqC,EACrC,QAAmB,EACnB,KAAoB,EACpB,KAAmB;IAEnB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,IACE,KAAK,CAAC,UAAU,IAAI,UAAU;QAC9B,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAC1B,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,iBAAsC,CAAC;IAC3C,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1E,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAE,CAAC;QACjC,IAAI,mBAAmB,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;QACnF,IACE,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC;YACjC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC;YACnC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC;YACjC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,EAChC,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;QACpD,CAAC;QACD,IACE,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC;YAC7B,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC;YAC5B,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,EAC5B,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC;YAAE,SAAS;QAC3C,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,iBAAiB,IAAI,SAAS,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;YACtE,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;QACnD,CAAC;QACD,IAAI,SAAS;YAAE,iBAAiB,GAAG,SAAS,CAAC;QAC7C,KAAK,IAAI,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,wBAAwB,CAC/B,KAAmB,EACnB,OAAqC,EACrC,QAAmB;IAEnB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO,cAAc,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG;QAAE,OAAO,kBAAkB,CAAC;IAC7D,IAAI,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,OAAO,0BAA0B,CAAC;IACpC,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/D,KAAK,IAAI,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3D,IAAI,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAE,CAAC;YAAE,OAAO,0BAA0B,CAAC;IAC/E,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAClD,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAC/D,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;QAAE,OAAO,yBAAyB,CAAC;IAC7E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAmB,EACnB,cAA8C;IAE9C,IACE,cAAc,CAAC,eAAe,KAAK,mBAAmB;QACtD,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,mBAAmB,CAAC,KAAK,CAAC,GAAI,EAAE,GAAG,CAAC,EAC9E,CAAC;QACD,OAAO,uBAAuB,CAAC;IACjC,CAAC;IACD,OAAO,cAAc,CAAC,MAAM,CAAC;AAC/B,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAmB,EACnB,KAAa;IAEb,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IACE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,EAC1E,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;IAC1B,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,cAAc,CAAC,sCAAsC,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACxF,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,iBAAiB,CAAC,sCAAsC,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACrE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CACpB,QAAkB,EAClB,MAAsB;IAEtB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CACzD,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA+B,CAAC;IAChE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1D,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,gBAAgB,GAAG,SAAS;YAChC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;YAClC,CAAC,CAAC,SAAS,CAAC;QACd,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE;YAClB,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;YAC/D,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,UAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CACnD,CAAC;IACF,MAAM,cAAc,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,MAAM,cAAc,GAAG,wBAAwB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG;YACX,KAAK;YACL,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE;YAC7B,IAAI,EAAE,cAAc,CAAC,IAAI;YACzB,WAAW,EAAE,cAAc,CAAC,qBAAqB;YACjD,MAAM,EAAE,cAAc,CAAC,MAAM;SAC9B,CAAC;QACF,MAAM,gBAAgB,GACpB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC;YAClD,sBAAsB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAChD,IAAI,gBAAgB,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QAED,IAAI,cAAc,CAAC,eAAe,KAAK,mBAAmB,EAAE,CAAC;YAC3D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,MAAO,CAAC,CAAC;YAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACpE,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YACpE,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7E,OAAO;YACT,CAAC;YACD,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,KAAM,CAAC,CAAC;YAClE,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC;gBACxF,OAAO;YACT,CAAC;YACD,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;gBAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,IACE,cAAc,CAAC,eAAe,KAAK,kBAAkB;YACrD,OAAO,CAAC,wBAAwB,EAChC,CAAC;YACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;gBACtC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBACpD,OAAO,GAAG,IAAI,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YAC3E,CAAC;YACD,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,IAAI;YACP,MAAM,EACJ,cAAc,CAAC,eAAe,KAAK,kBAAkB;gBACnD,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,aAAa;YACnB,MAAM,EACJ,cAAc,CAAC,eAAe,KAAK,kBAAkB;gBACnD,CAAC,CAAC,8BAA8B;gBAChC,CAAC,CAAC,cAAc,CAAC,MAAM;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW;QAC3D,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,uBAAuB,GAC3B,iEAAiE,CAAC;AAEpE;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,OAAoB;IAC/C,OAAO,OAAO;SACX,SAAS,EAAE;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACpD,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,UAA+B,EAAE;IAEjC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,OAAO;QACL,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE;QAC9B,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,cAAc;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* and supports reading, updating, and deleting footnotes.
|
|
6
6
|
*/
|
|
7
7
|
import { DocxZip } from './zip.js';
|
|
8
|
-
import { type StylesModel } from './styles.js';
|
|
8
|
+
import { type StylesModel, type ThemeModel } from './styles.js';
|
|
9
9
|
import { type RevisionContext } from './track-changes-emitter.js';
|
|
10
10
|
/**
|
|
11
11
|
* One paragraph of a footnote body, retained at the same node-level fidelity as
|
|
@@ -53,6 +53,20 @@ export type AddFootnoteParams = {
|
|
|
53
53
|
paragraphEl: Element;
|
|
54
54
|
afterText?: string;
|
|
55
55
|
text: string;
|
|
56
|
+
presentation?: FootnoteNotePresentation;
|
|
57
|
+
};
|
|
58
|
+
export type FootnoteRunStyle = {
|
|
59
|
+
bold?: boolean;
|
|
60
|
+
italic?: boolean;
|
|
61
|
+
underline?: boolean;
|
|
62
|
+
color?: string;
|
|
63
|
+
highlight?: 'black' | 'blue' | 'cyan' | 'green' | 'magenta' | 'red' | 'yellow' | 'white' | 'darkBlue' | 'darkCyan' | 'darkGreen' | 'darkMagenta' | 'darkRed' | 'darkYellow' | 'darkGray' | 'lightGray' | 'none';
|
|
64
|
+
};
|
|
65
|
+
export type FootnoteNotePresentation = {
|
|
66
|
+
prefix?: string;
|
|
67
|
+
prefixSeparator?: string;
|
|
68
|
+
prefixStyle?: FootnoteRunStyle;
|
|
69
|
+
bodyStyle?: FootnoteRunStyle;
|
|
56
70
|
};
|
|
57
71
|
export type AddFootnoteResult = {
|
|
58
72
|
noteId: number;
|
|
@@ -73,8 +87,8 @@ export declare function bootstrapFootnoteParts(zip: DocxZip): Promise<BootstrapF
|
|
|
73
87
|
* `text` and the plural anchor map are unaffected either way, so existing
|
|
74
88
|
* callers that pass `(zip, documentXml)` keep their exact behavior.
|
|
75
89
|
*/
|
|
76
|
-
export declare function getFootnotes(zip: DocxZip, documentXml: Document, styles?: StylesModel): Promise<Footnote[]>;
|
|
77
|
-
export declare function getFootnote(zip: DocxZip, documentXml: Document, noteId: number, styles?: StylesModel): Promise<Footnote | null>;
|
|
90
|
+
export declare function getFootnotes(zip: DocxZip, documentXml: Document, styles?: StylesModel, theme?: ThemeModel): Promise<Footnote[]>;
|
|
91
|
+
export declare function getFootnote(zip: DocxZip, documentXml: Document, noteId: number, styles?: StylesModel, theme?: ThemeModel): Promise<Footnote | null>;
|
|
78
92
|
export declare function addFootnote(documentXml: Document, zip: DocxZip, params: AddFootnoteParams, ctx?: RevisionContext): Promise<AddFootnoteResult>;
|
|
79
93
|
export declare function updateFootnoteText(zip: DocxZip, params: {
|
|
80
94
|
noteId: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footnotes.d.ts","sourceRoot":"","sources":["../../src/primitives/footnotes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAMnC,OAAO,
|
|
1
|
+
{"version":3,"file":"footnotes.d.ts","sourceRoot":"","sources":["../../src/primitives/footnotes.ts"],"names":[],"mappings":"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"}
|