@stll/folio-core 0.47.7 → 0.48.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/controller/fontReadiness.js +3 -3
- package/dist/controller/hyphenationReadiness.d.ts +19 -0
- package/dist/controller/hyphenationReadiness.js +47 -0
- package/dist/controller/layoutPipeline.d.ts +3 -0
- package/dist/controller/layoutPipeline.js +59 -17
- package/dist/display-list/build/buildDisplayList.js +39 -12
- package/dist/display-list/build/pageFurniture.d.ts +7 -1
- package/dist/display-list/build/pageFurniture.js +21 -8
- package/dist/display-list/build/paragraphPrimitives.js +5 -4
- package/dist/display-list/build/tablePrimitives.js +10 -6
- package/dist/docx/attributeRemainder.js +10 -2
- package/dist/docx/blockContentParser.d.ts +2 -0
- package/dist/docx/blockContentParser.js +77 -62
- package/dist/docx/commentParser.d.ts +2 -1
- package/dist/docx/commentParser.js +57 -45
- package/dist/docx/containerChildren.d.ts +21 -8
- package/dist/docx/containerChildren.js +39 -9
- package/dist/docx/documentParser.d.ts +5 -1
- package/dist/docx/documentParser.js +8 -5
- package/dist/docx/documentSectionFacts.d.ts +22 -0
- package/dist/docx/documentSectionFacts.js +43 -0
- package/dist/docx/fieldParser.d.ts +8 -1
- package/dist/docx/fieldParser.js +47 -3
- package/dist/docx/fontTableParser.js +34 -27
- package/dist/docx/footnoteParser.d.ts +3 -2
- package/dist/docx/footnoteParser.js +15 -12
- package/dist/docx/groupDrawingParser.d.ts +2 -1
- package/dist/docx/groupDrawingParser.js +3 -6
- package/dist/docx/headerFooterParser.d.ts +7 -2
- package/dist/docx/headerFooterParser.js +15 -5
- package/dist/docx/hyperlinkParser.d.ts +48 -36
- package/dist/docx/hyperlinkParser.js +97 -82
- package/dist/docx/numberingParser.js +108 -84
- package/dist/docx/paragraphParser.d.ts +5 -1
- package/dist/docx/paragraphParser.js +381 -362
- package/dist/docx/paragraphProperties.js +123 -109
- package/dist/docx/paragraphPropertySource.d.ts +6 -1
- package/dist/docx/paragraphPropertySource.js +9 -1
- package/dist/docx/paragraphTextBoxEnrichment.d.ts +2 -1
- package/dist/docx/paragraphTextBoxEnrichment.js +17 -6
- package/dist/docx/parser.d.ts +7 -1
- package/dist/docx/parser.js +33 -16
- package/dist/docx/previewBudget.d.ts +55 -33
- package/dist/docx/previewBudget.js +59 -65
- package/dist/docx/rezip.js +41 -58
- package/dist/docx/runParser.d.ts +4 -1
- package/dist/docx/runParser.js +172 -184
- package/dist/docx/sdtProperties.js +87 -84
- package/dist/docx/sectionParser.js +169 -160
- package/dist/docx/serializer/paragraphSerializer.js +42 -38
- package/dist/docx/serializer/settingsSerializer.js +19 -1
- package/dist/docx/settingsParser.js +8 -0
- package/dist/docx/streamingXmlParser.d.ts +6 -2
- package/dist/docx/streamingXmlParser.js +12 -7
- package/dist/docx/styleParser.js +34 -8
- package/dist/docx/tableParser.d.ts +21 -12
- package/dist/docx/tableParser.js +518 -441
- package/dist/docx/textBoxParser.d.ts +8 -3
- package/dist/docx/textBoxParser.js +3 -3
- package/dist/docx/verbatimCapture.d.ts +10 -8
- package/dist/docx/verbatimCapture.js +45 -2
- package/dist/docx/vmlImageParser.d.ts +15 -13
- package/dist/docx/vmlImageParser.js +75 -60
- package/dist/docx/vmlPreview.d.ts +3 -3
- package/dist/docx/vmlPreview.js +3 -4
- package/dist/docx/xmlNamespaceContext.d.ts +9 -0
- package/dist/docx/xmlNamespaceContext.js +54 -0
- package/dist/docx/xmlParser.d.ts +6 -3
- package/dist/docx/xmlParser.js +11 -41
- package/dist/docx/xmlResourceLimits.d.ts +2 -1
- package/dist/docx/xmlResourceLimits.js +4 -1
- package/dist/fonts/headlessMeasure.js +0 -0
- package/dist/headless-layout.d.ts +11 -2
- package/dist/headless-layout.js +153 -107
- package/dist/internal/paragraphFormattingSerialization.js +3 -3
- package/dist/layout-bridge/convert/endnoteLayout.d.ts +65 -0
- package/dist/layout-bridge/convert/endnoteLayout.js +227 -0
- package/dist/layout-bridge/convert/footnoteLayout.d.ts +19 -3
- package/dist/layout-bridge/convert/footnoteLayout.js +40 -31
- package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -7
- package/dist/layout-bridge/convert/headerFooterLayout.js +5 -20
- package/dist/layout-bridge/convert/paragraphMarkFormatting.d.ts +10 -0
- package/dist/layout-bridge/convert/paragraphMarkFormatting.js +59 -0
- package/dist/layout-bridge/convert/toFlowBlocks.d.ts +29 -1
- package/dist/layout-bridge/convert/toFlowBlocks.js +258 -35
- package/dist/layout-bridge/engine/hitTest.js +5 -3
- package/dist/layout-bridge/engine/selectionRects.js +5 -3
- package/dist/layout-engine/anchorLayoutInCellCompatibility.d.ts +10 -0
- package/dist/layout-engine/anchorLayoutInCellCompatibility.js +22 -0
- package/dist/layout-engine/index.d.ts +2 -2
- package/dist/layout-engine/index.js +70 -11
- package/dist/layout-engine/justificationCompatibility.d.ts +1 -1
- package/dist/layout-engine/justificationCompatibility.js +9 -5
- package/dist/layout-engine/keep-together.d.ts +11 -5
- package/dist/layout-engine/keep-together.js +39 -16
- package/dist/layout-engine/layoutInstrumentation.d.ts +8 -2
- package/dist/layout-engine/layoutInstrumentation.js +8 -1
- package/dist/layout-engine/measure/advanceComposition.js +4 -7
- package/dist/layout-engine/measure/hyphenationDictionaries.d.ts +74 -0
- package/dist/layout-engine/measure/hyphenationDictionaries.js +138 -0
- package/dist/layout-engine/measure/hyphenationPreload.d.ts +11 -0
- package/dist/layout-engine/measure/hyphenationPreload.js +24 -0
- package/dist/layout-engine/measure/lineBreakProvider.d.ts +12 -2
- package/dist/layout-engine/measure/lineBreakProvider.js +30 -30
- package/dist/layout-engine/measure/lineBreaks.d.ts +6 -1
- package/dist/layout-engine/measure/lineBreaks.js +10 -3
- package/dist/layout-engine/measure/listMarkerWidth.d.ts +9 -6
- package/dist/layout-engine/measure/listMarkerWidth.js +20 -22
- package/dist/layout-engine/measure/measureBlocks.js +42 -8
- package/dist/layout-engine/measure/measureContainer.js +5 -5
- package/dist/layout-engine/measure/measureHelpers.d.ts +15 -3
- package/dist/layout-engine/measure/measureHelpers.js +21 -5
- package/dist/layout-engine/measure/measureParagraph.js +109 -30
- package/dist/layout-engine/measure/measureTypes.d.ts +5 -0
- package/dist/layout-engine/measure/tabCalculator.d.ts +2 -0
- package/dist/layout-engine/measure/tabCalculator.js +2 -1
- package/dist/layout-engine/measure/tableCellFloating.d.ts +2 -0
- package/dist/layout-engine/measure/tableCellFloating.js +51 -19
- package/dist/layout-engine/measure/tableCellGrid.d.ts +28 -3
- package/dist/layout-engine/measure/tableCellGrid.js +45 -5
- package/dist/layout-engine/measure/tableFragmentBorderGeometry.js +2 -1
- package/dist/layout-engine/noteAreaFlow.d.ts +19 -0
- package/dist/layout-engine/noteAreaFlow.js +83 -0
- package/dist/layout-engine/paginator.d.ts +10 -1
- package/dist/layout-engine/paginator.js +13 -1
- package/dist/layout-engine/tableRowBreak.js +3 -1
- package/dist/layout-engine/types.d.ts +89 -3
- package/dist/layout-engine/types.js +96 -1
- package/dist/layout-painter/index.d.ts +3 -0
- package/dist/layout-painter/renderPage.js +32 -83
- package/dist/layout-painter/renderParagraph.d.ts +6 -1
- package/dist/layout-painter/renderParagraph.js +34 -22
- package/dist/layout-painter/renderTable.js +26 -13
- package/dist/prosemirror/attrs/index.d.ts +9 -9
- package/dist/prosemirror/attrs/index.js +43 -11
- package/dist/prosemirror/conversion/fromProseDoc.js +8 -1
- package/dist/prosemirror/conversion/markInterner.d.ts +21 -0
- package/dist/prosemirror/conversion/markInterner.js +90 -0
- package/dist/prosemirror/conversion/toProseDoc.js +77 -41
- package/dist/prosemirror/extensions/core/DocExtension.js +2 -1
- package/dist/prosemirror/extensions/core/ParagraphExtension.js +1 -0
- package/dist/prosemirror/extensions/marks/markUtils.d.ts +6 -2
- package/dist/prosemirror/extensions/marks/markUtils.js +39 -51
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +2 -1
- package/dist/prosemirror/listMarker.d.ts +1 -0
- package/dist/prosemirror/listMarker.js +2 -0
- package/dist/prosemirror/listRenderingAttrs.d.ts +1 -0
- package/dist/prosemirror/listRenderingAttrs.js +3 -0
- package/dist/prosemirror/schema/nodes.d.ts +13 -1
- package/dist/prosemirror/textBoxHostParagraph.d.ts +13 -0
- package/dist/prosemirror/textBoxHostParagraph.js +21 -0
- package/dist/prosemirror/validation.js +91 -80
- package/dist/utils/createDocument.js +10 -1
- package/dist/utils/scriptSegments.d.ts +33 -4
- package/dist/utils/scriptSegments.js +39 -6
- package/dist/utils/textFormattingMerge.d.ts +17 -3
- package/dist/utils/textFormattingMerge.js +18 -12
- package/dist/utils/trailingText.d.ts +22 -0
- package/dist/utils/trailingText.js +32 -0
- package/package.json +2 -2
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { sanitizeExternalUrl } from "../utils/urlSecurity.js";
|
|
2
|
-
import { CAPTURE,
|
|
2
|
+
import { CAPTURE, dispatchChildrenWithContext, ownedElsewhere, withPreservedChildren } from "./containerChildren.js";
|
|
3
3
|
import { inlineWrapperOf } from "./inlineWrapperParser.js";
|
|
4
4
|
import { preserveInlineChild, preservedInlineCapture } from "./preservedRunContent.js";
|
|
5
|
+
import { standalonePreviewLedger } from "./previewBudget.js";
|
|
5
6
|
import { RELATIONSHIP_TYPES, resolveRelationshipIdOfType } from "./relsParser.js";
|
|
6
7
|
import { parseRun } from "./runParser.js";
|
|
7
8
|
import { runHoldsPayload } from "./runPayload.js";
|
|
@@ -44,9 +45,40 @@ function parseBookmarkEnd(node) {
|
|
|
44
45
|
* @param styles - Style map for resolving run styles
|
|
45
46
|
* @param theme - Theme for resolving colors/fonts
|
|
46
47
|
* @param media - Media files map for image data
|
|
48
|
+
* @param previews - The ledger of the package this link belongs to; a link
|
|
49
|
+
* read on its own charges its previews to no package
|
|
47
50
|
* @returns Parsed Hyperlink object
|
|
48
51
|
*/
|
|
49
|
-
function parseHyperlink(node, rels, styles = null, theme = null, media = null, rootXmlns = {}) {
|
|
52
|
+
function parseHyperlink(node, rels, styles = null, theme = null, media = null, rootXmlns = {}, previews = standalonePreviewLedger()) {
|
|
53
|
+
const hyperlink = parseHyperlinkShell(node, rels);
|
|
54
|
+
const inScopeXmlns = mergeXmlnsDeclarations(rootXmlns, node);
|
|
55
|
+
const children = [];
|
|
56
|
+
hyperlink.children = withPreservedChildren(children, dispatchChildrenWithContext({
|
|
57
|
+
element: node,
|
|
58
|
+
container: "w:hyperlink",
|
|
59
|
+
capturePosition: () => children.length,
|
|
60
|
+
handlers: HYPERLINK_CHILD_HANDLERS,
|
|
61
|
+
context: {
|
|
62
|
+
push: (child) => {
|
|
63
|
+
children.push(child);
|
|
64
|
+
},
|
|
65
|
+
styles,
|
|
66
|
+
theme,
|
|
67
|
+
rels,
|
|
68
|
+
media,
|
|
69
|
+
previews,
|
|
70
|
+
inScopeXmlns
|
|
71
|
+
}
|
|
72
|
+
}), preservedInlineCapture);
|
|
73
|
+
return hyperlink;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A `w:hyperlink`'s own attributes as a link with no children yet.
|
|
77
|
+
*
|
|
78
|
+
* The paragraph parser's revision-segmenting walk reads the children itself,
|
|
79
|
+
* so it takes the shell rather than a link whose children it would discard.
|
|
80
|
+
*/
|
|
81
|
+
function parseHyperlinkShell(node, rels) {
|
|
50
82
|
const hyperlink = {
|
|
51
83
|
type: "hyperlink",
|
|
52
84
|
children: []
|
|
@@ -72,25 +104,12 @@ function parseHyperlink(node, rels, styles = null, theme = null, media = null, r
|
|
|
72
104
|
if (history !== void 0) hyperlink.history = history;
|
|
73
105
|
const docLocation = getAttribute(node, "w", "docLocation");
|
|
74
106
|
if (docLocation) hyperlink.docLocation = docLocation;
|
|
75
|
-
const inScopeXmlns = mergeXmlnsDeclarations(rootXmlns, node);
|
|
76
|
-
const children = [];
|
|
77
|
-
hyperlink.children = withPreservedChildren(children, dispatchChildren({
|
|
78
|
-
element: node,
|
|
79
|
-
container: "w:hyperlink",
|
|
80
|
-
capturePosition: () => children.length,
|
|
81
|
-
handlers: hyperlinkChildHandlers({
|
|
82
|
-
push: (child) => {
|
|
83
|
-
children.push(child);
|
|
84
|
-
},
|
|
85
|
-
styles,
|
|
86
|
-
theme,
|
|
87
|
-
rels,
|
|
88
|
-
media,
|
|
89
|
-
inScopeXmlns
|
|
90
|
-
})
|
|
91
|
-
}), preservedInlineCapture);
|
|
92
107
|
return hyperlink;
|
|
93
108
|
}
|
|
109
|
+
/** A transparent wrapper the link holds, read as the wrapper it is. */
|
|
110
|
+
const linkedInlineWrapper = (element) => (child, context) => {
|
|
111
|
+
context.push(parseLinkedInlineWrapper(element, child, context));
|
|
112
|
+
};
|
|
94
113
|
/**
|
|
95
114
|
* What a `w:hyperlink` does with every child its content model declares.
|
|
96
115
|
*
|
|
@@ -108,56 +127,50 @@ function parseHyperlink(node, rels, styles = null, theme = null, media = null, r
|
|
|
108
127
|
* recognising is recognised by all of them rather than by whichever list
|
|
109
128
|
* somebody remembered to update.
|
|
110
129
|
*/
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
permEnd: CAPTURE,
|
|
156
|
-
permStart: CAPTURE,
|
|
157
|
-
proofErr: CAPTURE,
|
|
158
|
-
sdt: CAPTURE,
|
|
159
|
-
subDoc: CAPTURE
|
|
160
|
-
};
|
|
130
|
+
const HYPERLINK_CHILD_HANDLERS = {
|
|
131
|
+
r: (child, { push, styles, theme, rels, media, previews, inScopeXmlns }) => {
|
|
132
|
+
const run = parseRun(child, styles, theme, rels, media, inScopeXmlns, previews);
|
|
133
|
+
if (runHoldsPayload(run)) push(run);
|
|
134
|
+
},
|
|
135
|
+
bookmarkStart: (child, { push }) => {
|
|
136
|
+
push(parseBookmarkStart(child));
|
|
137
|
+
},
|
|
138
|
+
bookmarkEnd: (child, { push }) => {
|
|
139
|
+
push(parseBookmarkEnd(child));
|
|
140
|
+
},
|
|
141
|
+
bdo: linkedInlineWrapper("bdo"),
|
|
142
|
+
dir: linkedInlineWrapper("dir"),
|
|
143
|
+
customXml: linkedInlineWrapper("customXml"),
|
|
144
|
+
smartTag: linkedInlineWrapper("smartTag"),
|
|
145
|
+
del: CAPTURE,
|
|
146
|
+
ins: CAPTURE,
|
|
147
|
+
moveFrom: CAPTURE,
|
|
148
|
+
moveTo: CAPTURE,
|
|
149
|
+
commentRangeEnd: CAPTURE,
|
|
150
|
+
commentRangeStart: CAPTURE,
|
|
151
|
+
customXmlDelRangeEnd: CAPTURE,
|
|
152
|
+
customXmlDelRangeStart: CAPTURE,
|
|
153
|
+
customXmlInsRangeEnd: CAPTURE,
|
|
154
|
+
customXmlInsRangeStart: CAPTURE,
|
|
155
|
+
customXmlMoveFromRangeEnd: CAPTURE,
|
|
156
|
+
customXmlMoveFromRangeStart: CAPTURE,
|
|
157
|
+
customXmlMoveToRangeEnd: CAPTURE,
|
|
158
|
+
customXmlMoveToRangeStart: CAPTURE,
|
|
159
|
+
fldSimple: (child, { push }) => {
|
|
160
|
+
push(preserveInlineChild(child));
|
|
161
|
+
},
|
|
162
|
+
hyperlink: (child, { push }) => {
|
|
163
|
+
push(preserveInlineChild(child));
|
|
164
|
+
},
|
|
165
|
+
moveFromRangeEnd: CAPTURE,
|
|
166
|
+
moveFromRangeStart: CAPTURE,
|
|
167
|
+
moveToRangeEnd: CAPTURE,
|
|
168
|
+
moveToRangeStart: CAPTURE,
|
|
169
|
+
permEnd: CAPTURE,
|
|
170
|
+
permStart: CAPTURE,
|
|
171
|
+
proofErr: CAPTURE,
|
|
172
|
+
sdt: CAPTURE,
|
|
173
|
+
subDoc: CAPTURE
|
|
161
174
|
};
|
|
162
175
|
const LINKED_SMART_TAG_PROPERTIES_OWNER = ownedElsewhere({
|
|
163
176
|
container: "run-level-content",
|
|
@@ -169,6 +182,12 @@ const LINKED_CUSTOM_XML_PROPERTIES_OWNER = ownedElsewhere({
|
|
|
169
182
|
child: "customXmlPr",
|
|
170
183
|
reader: "inlineWrapperParser#inlineWrapperOf"
|
|
171
184
|
});
|
|
185
|
+
const LINKED_INLINE_WRAPPER_HANDLERS = {
|
|
186
|
+
...HYPERLINK_CHILD_HANDLERS,
|
|
187
|
+
customXmlPr: LINKED_CUSTOM_XML_PROPERTIES_OWNER,
|
|
188
|
+
smartTagPr: LINKED_SMART_TAG_PROPERTIES_OWNER,
|
|
189
|
+
pPr: CAPTURE
|
|
190
|
+
};
|
|
172
191
|
/**
|
|
173
192
|
* A transparent wrapper a link holds, with the content the link would hold.
|
|
174
193
|
*
|
|
@@ -185,21 +204,17 @@ const LINKED_CUSTOM_XML_PROPERTIES_OWNER = ownedElsewhere({
|
|
|
185
204
|
const parseLinkedInlineWrapper = (element, node, context) => {
|
|
186
205
|
const inScopeXmlns = mergeXmlnsDeclarations(context.inScopeXmlns, node);
|
|
187
206
|
const content = [];
|
|
188
|
-
return inlineWrapperOf(element, node, withPreservedChildren(content,
|
|
207
|
+
return inlineWrapperOf(element, node, withPreservedChildren(content, dispatchChildrenWithContext({
|
|
189
208
|
element: node,
|
|
190
209
|
container: "run-level-content",
|
|
191
210
|
capturePosition: () => content.length,
|
|
192
|
-
handlers:
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}),
|
|
200
|
-
customXmlPr: LINKED_CUSTOM_XML_PROPERTIES_OWNER,
|
|
201
|
-
smartTagPr: LINKED_SMART_TAG_PROPERTIES_OWNER,
|
|
202
|
-
pPr: CAPTURE
|
|
211
|
+
handlers: LINKED_INLINE_WRAPPER_HANDLERS,
|
|
212
|
+
context: {
|
|
213
|
+
...context,
|
|
214
|
+
inScopeXmlns,
|
|
215
|
+
push: (child) => {
|
|
216
|
+
content.push(child);
|
|
217
|
+
}
|
|
203
218
|
}
|
|
204
219
|
}), preservedInlineCapture));
|
|
205
220
|
};
|
|
@@ -346,4 +361,4 @@ function createExternalHyperlink(url, children, options) {
|
|
|
346
361
|
};
|
|
347
362
|
}
|
|
348
363
|
//#endregion
|
|
349
|
-
export { createExternalHyperlink, createInternalHyperlink, getHyperlinkRuns, getHyperlinkText, getHyperlinkUrl, hasContent,
|
|
364
|
+
export { HYPERLINK_CHILD_HANDLERS, createExternalHyperlink, createInternalHyperlink, getHyperlinkRuns, getHyperlinkText, getHyperlinkUrl, hasContent, isExternalLink, isInternalLink, parseHyperlink, parseHyperlinkShell, resolveHyperlinkUrl };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DERIVED_PART_ROOT_ATTRIBUTES, attributeRemainder } from "./attributeRemainder.js";
|
|
2
|
-
import { CAPTURE,
|
|
2
|
+
import { CAPTURE, dispatchChildrenWithContext, sequencePositions } from "./containerChildren.js";
|
|
3
3
|
import { isNumberingReference } from "./numberingReference.js";
|
|
4
4
|
import { formatOoxmlCounter, padDecimal } from "./ooxmlCounterFormatter.js";
|
|
5
5
|
import { parseParagraphProperties } from "./paragraphProperties.js";
|
|
@@ -25,6 +25,29 @@ const integerValue = (element) => {
|
|
|
25
25
|
return parsed === void 0 || !Number.isFinite(parsed) ? void 0 : parsed;
|
|
26
26
|
};
|
|
27
27
|
/**
|
|
28
|
+
* A field read off a sequence child, when the child stated one.
|
|
29
|
+
*
|
|
30
|
+
* `CT_AbstractNum` and `CT_Lvl` are sequences and the serializer writes these
|
|
31
|
+
* fields back in that order, so the sink's index is a count of what has been
|
|
32
|
+
* read and a capture lands between the same two neighbours it sat between.
|
|
33
|
+
*/
|
|
34
|
+
const assignDefined = (target, key, carried) => {
|
|
35
|
+
if (carried === void 0) return;
|
|
36
|
+
target[key] = carried;
|
|
37
|
+
};
|
|
38
|
+
const NUMBERING_HANDLERS = {
|
|
39
|
+
abstractNum: (child, definitions) => {
|
|
40
|
+
const parsed = parseAbstractNumbering(child);
|
|
41
|
+
if (parsed) definitions.abstractNums.push(parsed);
|
|
42
|
+
},
|
|
43
|
+
num: (child, definitions) => {
|
|
44
|
+
const parsed = parseNumberingInstance(child);
|
|
45
|
+
if (parsed) definitions.nums.push(parsed);
|
|
46
|
+
},
|
|
47
|
+
numPicBullet: CAPTURE,
|
|
48
|
+
numIdMacAtCleanup: CAPTURE
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
28
51
|
* Parse numbering.xml into NumberingDefinitions
|
|
29
52
|
*
|
|
30
53
|
* @param numberingXml - Raw XML string from word/numbering.xml (or null if not present)
|
|
@@ -38,22 +61,12 @@ function parseNumbering(numberingXml) {
|
|
|
38
61
|
if (!numberingXml) return createNumberingMap(definitions);
|
|
39
62
|
const root = parseXmlDocument(numberingXml);
|
|
40
63
|
if (!root) return createNumberingMap(definitions);
|
|
41
|
-
const preserved =
|
|
64
|
+
const preserved = dispatchChildrenWithContext({
|
|
42
65
|
element: root,
|
|
43
66
|
container: "w:numbering",
|
|
44
67
|
capturePosition: sequencePositions("w:numbering", root),
|
|
45
|
-
handlers:
|
|
46
|
-
|
|
47
|
-
const parsed = parseAbstractNumbering(child);
|
|
48
|
-
if (parsed) definitions.abstractNums.push(parsed);
|
|
49
|
-
},
|
|
50
|
-
num: (child) => {
|
|
51
|
-
const parsed = parseNumberingInstance(child);
|
|
52
|
-
if (parsed) definitions.nums.push(parsed);
|
|
53
|
-
},
|
|
54
|
-
numPicBullet: CAPTURE,
|
|
55
|
-
numIdMacAtCleanup: CAPTURE
|
|
56
|
-
}
|
|
68
|
+
handlers: NUMBERING_HANDLERS,
|
|
69
|
+
context: definitions
|
|
57
70
|
});
|
|
58
71
|
if (preserved !== void 0) definitions.preserved = preserved;
|
|
59
72
|
const preservedAttributes = attributeRemainder({
|
|
@@ -63,6 +76,18 @@ function parseNumbering(numberingXml) {
|
|
|
63
76
|
if (preservedAttributes !== void 0) definitions.preservedAttributes = preservedAttributes;
|
|
64
77
|
return createNumberingMap(definitions);
|
|
65
78
|
}
|
|
79
|
+
const ABSTRACT_NUM_HANDLERS = {
|
|
80
|
+
nsid: (child, abstractNum) => assignDefined(abstractNum, "nsid", attributeValue(child)),
|
|
81
|
+
multiLevelType: (child, abstractNum) => assignDefined(abstractNum, "multiLevelType", narrow(attributeValue(child), MULTI_LEVEL_TYPES)),
|
|
82
|
+
tmpl: (child, abstractNum) => assignDefined(abstractNum, "tmpl", attributeValue(child)),
|
|
83
|
+
name: (child, abstractNum) => assignDefined(abstractNum, "name", attributeValue(child)),
|
|
84
|
+
styleLink: (child, abstractNum) => assignDefined(abstractNum, "styleLink", attributeValue(child)),
|
|
85
|
+
numStyleLink: (child, abstractNum) => assignDefined(abstractNum, "numStyleLink", attributeValue(child)),
|
|
86
|
+
lvl: (child, abstractNum) => {
|
|
87
|
+
const level = parseListLevel(child);
|
|
88
|
+
if (level) abstractNum.levels.push(level);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
66
91
|
/**
|
|
67
92
|
* Parse a single w:abstractNum element
|
|
68
93
|
*/
|
|
@@ -75,26 +100,12 @@ function parseAbstractNumbering(element) {
|
|
|
75
100
|
abstractNumId,
|
|
76
101
|
levels: []
|
|
77
102
|
};
|
|
78
|
-
const
|
|
79
|
-
if (value === void 0) return;
|
|
80
|
-
abstractNum[key] = value;
|
|
81
|
-
};
|
|
82
|
-
const preserved = dispatchChildren({
|
|
103
|
+
const preserved = dispatchChildrenWithContext({
|
|
83
104
|
element,
|
|
84
105
|
container: "w:abstractNum",
|
|
85
106
|
capturePosition: sequencePositions("w:abstractNum", element),
|
|
86
|
-
handlers:
|
|
87
|
-
|
|
88
|
-
multiLevelType: (child) => read("multiLevelType", narrow(attributeValue(child), MULTI_LEVEL_TYPES)),
|
|
89
|
-
tmpl: (child) => read("tmpl", attributeValue(child)),
|
|
90
|
-
name: (child) => read("name", attributeValue(child)),
|
|
91
|
-
styleLink: (child) => read("styleLink", attributeValue(child)),
|
|
92
|
-
numStyleLink: (child) => read("numStyleLink", attributeValue(child)),
|
|
93
|
-
lvl: (child) => {
|
|
94
|
-
const level = parseListLevel(child);
|
|
95
|
-
if (level) abstractNum.levels.push(level);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
107
|
+
handlers: ABSTRACT_NUM_HANDLERS,
|
|
108
|
+
context: abstractNum
|
|
98
109
|
});
|
|
99
110
|
if (preserved !== void 0) abstractNum.preserved = preserved;
|
|
100
111
|
const preservedAttributes = attributeRemainder({
|
|
@@ -113,6 +124,16 @@ const MULTI_LEVEL_TYPES = [
|
|
|
113
124
|
"singleLevel"
|
|
114
125
|
];
|
|
115
126
|
const narrow = (carried, members) => members.find((member) => member === carried);
|
|
127
|
+
const NUMBERING_INSTANCE_HANDLERS = {
|
|
128
|
+
abstractNumId: (child, walk) => {
|
|
129
|
+
if (walk.abstractNumId !== void 0) return;
|
|
130
|
+
walk.abstractNumId = integerValue(child);
|
|
131
|
+
},
|
|
132
|
+
lvlOverride: (child, { levelOverrides }) => {
|
|
133
|
+
const override = parseLevelOverride(child);
|
|
134
|
+
if (override) levelOverrides.push(override);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
116
137
|
/**
|
|
117
138
|
* Parse a single w:num element (numbering instance)
|
|
118
139
|
*/
|
|
@@ -121,23 +142,18 @@ function parseNumberingInstance(element) {
|
|
|
121
142
|
if (numIdStr === null) return null;
|
|
122
143
|
const numId = Number.parseInt(numIdStr, 10);
|
|
123
144
|
if (Number.isNaN(numId)) return null;
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
145
|
+
const walk = {
|
|
146
|
+
abstractNumId: void 0,
|
|
147
|
+
levelOverrides: []
|
|
148
|
+
};
|
|
149
|
+
const preserved = dispatchChildrenWithContext({
|
|
127
150
|
element,
|
|
128
151
|
container: "w:num",
|
|
129
152
|
capturePosition: sequencePositions("w:num", element),
|
|
130
|
-
handlers:
|
|
131
|
-
|
|
132
|
-
if (abstractNumId !== void 0) return;
|
|
133
|
-
abstractNumId = integerValue(child);
|
|
134
|
-
},
|
|
135
|
-
lvlOverride: (child) => {
|
|
136
|
-
const override = parseLevelOverride(child);
|
|
137
|
-
if (override) levelOverrides.push(override);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
153
|
+
handlers: NUMBERING_INSTANCE_HANDLERS,
|
|
154
|
+
context: walk
|
|
140
155
|
});
|
|
156
|
+
const { abstractNumId, levelOverrides } = walk;
|
|
141
157
|
if (abstractNumId === void 0) return null;
|
|
142
158
|
const instance = {
|
|
143
159
|
numId,
|
|
@@ -152,6 +168,16 @@ function parseNumberingInstance(element) {
|
|
|
152
168
|
if (preservedAttributes !== void 0) instance.preservedAttributes = preservedAttributes;
|
|
153
169
|
return instance;
|
|
154
170
|
}
|
|
171
|
+
const LEVEL_OVERRIDE_HANDLERS = {
|
|
172
|
+
startOverride: (child, override) => {
|
|
173
|
+
const start = integerValue(child);
|
|
174
|
+
if (start !== void 0 && override.startOverride === void 0) override.startOverride = start;
|
|
175
|
+
},
|
|
176
|
+
lvl: (child, override) => {
|
|
177
|
+
const level = parseListLevel(child);
|
|
178
|
+
if (level && override.lvl === void 0) override.lvl = level;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
155
181
|
/**
|
|
156
182
|
* Parse a single w:lvlOverride element (one level of one numbering instance)
|
|
157
183
|
*/
|
|
@@ -159,20 +185,12 @@ function parseLevelOverride(element) {
|
|
|
159
185
|
const ilvl = parseNumericAttribute(element, "w", "ilvl");
|
|
160
186
|
if (ilvl === void 0) return null;
|
|
161
187
|
const override = { ilvl };
|
|
162
|
-
const preserved =
|
|
188
|
+
const preserved = dispatchChildrenWithContext({
|
|
163
189
|
element,
|
|
164
190
|
container: "w:lvlOverride",
|
|
165
191
|
capturePosition: sequencePositions("w:lvlOverride", element),
|
|
166
|
-
handlers:
|
|
167
|
-
|
|
168
|
-
const start = integerValue(child);
|
|
169
|
-
if (start !== void 0 && override.startOverride === void 0) override.startOverride = start;
|
|
170
|
-
},
|
|
171
|
-
lvl: (child) => {
|
|
172
|
-
const level = parseListLevel(child);
|
|
173
|
-
if (level && override.lvl === void 0) override.lvl = level;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
192
|
+
handlers: LEVEL_OVERRIDE_HANDLERS,
|
|
193
|
+
context: override
|
|
176
194
|
});
|
|
177
195
|
if (preserved !== void 0) override.preserved = preserved;
|
|
178
196
|
const preservedAttributes = attributeRemainder({
|
|
@@ -182,6 +200,34 @@ function parseLevelOverride(element) {
|
|
|
182
200
|
if (preservedAttributes !== void 0) override.preservedAttributes = preservedAttributes;
|
|
183
201
|
return override;
|
|
184
202
|
}
|
|
203
|
+
const LIST_LEVEL_HANDLERS = {
|
|
204
|
+
start: (child, level) => assignDefined(level, "start", integerValue(child)),
|
|
205
|
+
numFmt: (child, level) => {
|
|
206
|
+
const resolved = resolveNumFmt(child);
|
|
207
|
+
if (resolved === null) return CAPTURE;
|
|
208
|
+
Object.assign(level, resolved);
|
|
209
|
+
},
|
|
210
|
+
lvlRestart: (child, level) => assignDefined(level, "lvlRestart", integerValue(child)),
|
|
211
|
+
pStyle: (child, level) => assignDefined(level, "pStyle", attributeValue(child)),
|
|
212
|
+
isLgl: (child, level) => assignDefined(level, "isLgl", parseBooleanElement(child)),
|
|
213
|
+
suff: (child, level) => assignDefined(level, "suffix", narrowEnum(attributeValue(child), LevelSuffixSchema)),
|
|
214
|
+
lvlText: (child, level) => {
|
|
215
|
+
assignDefined(level, "lvlText", attributeValue(child) ?? "");
|
|
216
|
+
const isNull = parseOnOffAttribute(child, "w", "null");
|
|
217
|
+
if (isNull !== void 0) level.lvlTextNull = isNull;
|
|
218
|
+
},
|
|
219
|
+
lvlPicBulletId: (child, level) => assignDefined(level, "lvlPicBulletId", integerValue(child)),
|
|
220
|
+
legacy: (child, level) => assignDefined(level, "legacy", legacyOf(child)),
|
|
221
|
+
lvlJc: (child, level) => assignDefined(level, "lvlJc", narrowEnum(attributeValue(child), ParagraphAlignmentSchema)),
|
|
222
|
+
pPr: (child, level) => assignDefined(level, "pPr", parseParagraphProperties(child, null) ?? {}),
|
|
223
|
+
rPr: (child, level) => assignDefined(level, "rPr", parseRunProperties(child, null, RUN_PROPERTY_OWNERS.standalone) ?? {})
|
|
224
|
+
};
|
|
225
|
+
/**
|
|
226
|
+
* `mc:AlternateContent` around a custom `w:numFmt` is read for its format by
|
|
227
|
+
* {@link parseListLevel}, and the writer re-emits that format as the level's
|
|
228
|
+
* own `w:numFmt`, so the walk takes it without a capture.
|
|
229
|
+
*/
|
|
230
|
+
const LIST_LEVEL_UNDECLARED = { AlternateContent: () => void 0 };
|
|
185
231
|
/**
|
|
186
232
|
* Parse a single w:lvl element (list level definition)
|
|
187
233
|
*/
|
|
@@ -194,37 +240,13 @@ function parseListLevel(element) {
|
|
|
194
240
|
lvlText: ""
|
|
195
241
|
};
|
|
196
242
|
const alternateEl = findChild(element, "mc", "AlternateContent");
|
|
197
|
-
const
|
|
198
|
-
if (value === void 0) return;
|
|
199
|
-
level[key] = value;
|
|
200
|
-
};
|
|
201
|
-
const preserved = dispatchChildren({
|
|
243
|
+
const preserved = dispatchChildrenWithContext({
|
|
202
244
|
element,
|
|
203
245
|
container: "w:lvl",
|
|
204
246
|
capturePosition: sequencePositions("w:lvl", element),
|
|
205
|
-
handlers:
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const resolved = resolveNumFmt(child);
|
|
209
|
-
if (resolved === null) return CAPTURE;
|
|
210
|
-
Object.assign(level, resolved);
|
|
211
|
-
},
|
|
212
|
-
lvlRestart: (child) => read("lvlRestart", integerValue(child)),
|
|
213
|
-
pStyle: (child) => read("pStyle", attributeValue(child)),
|
|
214
|
-
isLgl: (child) => read("isLgl", parseBooleanElement(child)),
|
|
215
|
-
suff: (child) => read("suffix", narrowEnum(attributeValue(child), LevelSuffixSchema)),
|
|
216
|
-
lvlText: (child) => {
|
|
217
|
-
read("lvlText", attributeValue(child) ?? "");
|
|
218
|
-
const isNull = parseOnOffAttribute(child, "w", "null");
|
|
219
|
-
if (isNull !== void 0) level.lvlTextNull = isNull;
|
|
220
|
-
},
|
|
221
|
-
lvlPicBulletId: (child) => read("lvlPicBulletId", integerValue(child)),
|
|
222
|
-
legacy: (child) => read("legacy", legacyOf(child)),
|
|
223
|
-
lvlJc: (child) => read("lvlJc", narrowEnum(attributeValue(child), ParagraphAlignmentSchema)),
|
|
224
|
-
pPr: (child) => read("pPr", parseParagraphProperties(child, null) ?? {}),
|
|
225
|
-
rPr: (child) => read("rPr", parseRunProperties(child, null, RUN_PROPERTY_OWNERS.standalone) ?? {})
|
|
226
|
-
},
|
|
227
|
-
undeclared: { AlternateContent: () => void 0 }
|
|
247
|
+
handlers: LIST_LEVEL_HANDLERS,
|
|
248
|
+
undeclared: LIST_LEVEL_UNDECLARED,
|
|
249
|
+
context: level
|
|
228
250
|
});
|
|
229
251
|
if (preserved !== void 0) level.preserved = preserved;
|
|
230
252
|
const preservedAttributes = attributeRemainder({
|
|
@@ -340,7 +362,8 @@ const markerFormattingFromLevel = (formatting) => {
|
|
|
340
362
|
...formatting.italic !== void 0 ? { italic: formatting.italic } : {},
|
|
341
363
|
...formatting.italicCs !== void 0 ? { italicCs: formatting.italicCs } : {},
|
|
342
364
|
...formatting.rtl !== void 0 ? { rtl: formatting.rtl } : {},
|
|
343
|
-
...formatting.cs !== void 0 ? { cs: formatting.cs } : {}
|
|
365
|
+
...formatting.cs !== void 0 ? { cs: formatting.cs } : {},
|
|
366
|
+
...formatting.color !== void 0 ? { color: formatting.color } : {}
|
|
344
367
|
};
|
|
345
368
|
return Object.keys(markerFormatting).length > 0 ? markerFormatting : void 0;
|
|
346
369
|
};
|
|
@@ -450,6 +473,7 @@ function computeListRendering(numPr, numbering) {
|
|
|
450
473
|
if (level.rPr?.hidden) rendering.markerHidden = true;
|
|
451
474
|
const markerFormatting = markerFormattingFromLevel(level.rPr);
|
|
452
475
|
if (markerFormatting) rendering.markerFormatting = markerFormatting;
|
|
476
|
+
if (level.pPr?.tabs?.length) rendering.levelTabs = level.pPr.tabs;
|
|
453
477
|
if (level.rPr?.allCaps) rendering.markerAllCaps = true;
|
|
454
478
|
const markerAlignment = markerAlignmentForLevel(level.lvlJc);
|
|
455
479
|
if (markerAlignment !== void 0) rendering.markerAlignment = markerAlignment;
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { document_d_exports } from "../types/document.js";
|
|
2
2
|
import { NumberingMap } from "./numberingParser.js";
|
|
3
3
|
import { XmlElement } from "./xmlParser.js";
|
|
4
|
+
import { PreviewLedger } from "./previewBudget.js";
|
|
4
5
|
import { StyleMap } from "./styleParser.js";
|
|
5
6
|
//#region src/docx/paragraphParser.d.ts
|
|
6
7
|
declare function parseParagraphPropertyChanges(pPr: XmlElement | null, theme: document_d_exports.Theme | null, currentFormatting: document_d_exports.ParagraphFormatting | undefined): document_d_exports.ParagraphPropertyChange[] | undefined;
|
|
7
8
|
type ParseParagraphOptions = {
|
|
8
9
|
inHeaderFooter?: boolean;
|
|
9
10
|
rootXmlns?: Record<string, string>;
|
|
11
|
+
/** The ledger of the package this paragraph belongs to. */
|
|
12
|
+
previews: PreviewLedger;
|
|
10
13
|
/** Delay run merging until a source-position-dependent enrichment pass completes. */
|
|
11
14
|
runConsolidation?: "immediate" | "deferred";
|
|
12
15
|
};
|
|
@@ -19,7 +22,8 @@ type ParseParagraphOptions = {
|
|
|
19
22
|
* @param numbering - Numbering definitions for list info
|
|
20
23
|
* @param rels - Relationship map for resolving hyperlink URLs
|
|
21
24
|
* @param media - Media files map for image data
|
|
22
|
-
* @param options - Parsing options for context-specific body behavior
|
|
25
|
+
* @param options - Parsing options for context-specific body behavior; a
|
|
26
|
+
* paragraph read without them charges its previews to no package
|
|
23
27
|
* @returns Parsed Paragraph object
|
|
24
28
|
*/
|
|
25
29
|
declare function parseParagraph(node: XmlElement, styles: StyleMap | null, theme: document_d_exports.Theme | null, numbering: NumberingMap | null, rels?: document_d_exports.RelationshipMap | null, media?: Map<string, document_d_exports.MediaFile> | null, options?: ParseParagraphOptions): document_d_exports.Paragraph;
|