@stll/folio-core 0.47.7 → 0.49.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.
Files changed (213) hide show
  1. package/dist/ai-edits/apply.js +565 -121
  2. package/dist/ai-edits/minimal-replacement.d.ts +64 -0
  3. package/dist/ai-edits/minimal-replacement.js +282 -0
  4. package/dist/controller/fontReadiness.js +3 -3
  5. package/dist/controller/hyphenationReadiness.d.ts +19 -0
  6. package/dist/controller/hyphenationReadiness.js +47 -0
  7. package/dist/controller/layoutPipeline.d.ts +3 -0
  8. package/dist/controller/layoutPipeline.js +70 -18
  9. package/dist/display-list/build/buildDisplayList.js +39 -12
  10. package/dist/display-list/build/pageFurniture.d.ts +7 -1
  11. package/dist/display-list/build/pageFurniture.js +21 -8
  12. package/dist/display-list/build/paragraphPrimitives.js +68 -11
  13. package/dist/display-list/build/tablePrimitives.js +10 -6
  14. package/dist/display-list/build/textBoxPrimitives.js +1 -1
  15. package/dist/display-list/build/unsupported.d.ts +2 -2
  16. package/dist/display-list/build/unsupported.js +0 -0
  17. package/dist/display-list/dom/renderDisplayListToDom.js +0 -1
  18. package/dist/docx/attributeRemainder.js +10 -2
  19. package/dist/docx/blockContentParser.d.ts +2 -0
  20. package/dist/docx/blockContentParser.js +79 -64
  21. package/dist/docx/bulletMarkers.d.ts +18 -2
  22. package/dist/docx/bulletMarkers.js +27 -2
  23. package/dist/docx/commentParser.d.ts +2 -1
  24. package/dist/docx/commentParser.js +57 -45
  25. package/dist/docx/containerChildren.d.ts +21 -8
  26. package/dist/docx/containerChildren.js +39 -9
  27. package/dist/docx/documentParser.d.ts +5 -1
  28. package/dist/docx/documentParser.js +8 -5
  29. package/dist/docx/documentSectionFacts.d.ts +22 -0
  30. package/dist/docx/documentSectionFacts.js +43 -0
  31. package/dist/docx/drawingGroupChildren.d.ts +60 -0
  32. package/dist/docx/drawingGroupChildren.js +176 -0
  33. package/dist/docx/drawingUtils.js +3 -0
  34. package/dist/docx/fieldParser.d.ts +8 -1
  35. package/dist/docx/fieldParser.js +47 -3
  36. package/dist/docx/fontTableParser.js +34 -27
  37. package/dist/docx/footnoteParser.d.ts +3 -2
  38. package/dist/docx/footnoteParser.js +15 -12
  39. package/dist/docx/groupDrawingParser.d.ts +9 -2
  40. package/dist/docx/groupDrawingParser.js +125 -37
  41. package/dist/docx/headerFooterParser.d.ts +7 -2
  42. package/dist/docx/headerFooterParser.js +15 -5
  43. package/dist/docx/hyperlinkParser.d.ts +48 -36
  44. package/dist/docx/hyperlinkParser.js +97 -82
  45. package/dist/docx/numberingParser.js +108 -84
  46. package/dist/docx/packageParts.d.ts +45 -1
  47. package/dist/docx/packageParts.js +93 -2
  48. package/dist/docx/paraIdAttribute.d.ts +3 -2
  49. package/dist/docx/paragraphParser.d.ts +5 -1
  50. package/dist/docx/paragraphParser.js +468 -365
  51. package/dist/docx/paragraphProperties.js +123 -109
  52. package/dist/docx/paragraphPropertySource.d.ts +6 -1
  53. package/dist/docx/paragraphPropertySource.js +9 -1
  54. package/dist/docx/paragraphTextBoxEnrichment.d.ts +2 -1
  55. package/dist/docx/paragraphTextBoxEnrichment.js +143 -10
  56. package/dist/docx/parser.d.ts +7 -1
  57. package/dist/docx/parser.js +33 -16
  58. package/dist/docx/previewBudget.d.ts +55 -33
  59. package/dist/docx/previewBudget.js +59 -65
  60. package/dist/docx/rezip.js +41 -58
  61. package/dist/docx/runParser.d.ts +4 -1
  62. package/dist/docx/runParser.js +182 -184
  63. package/dist/docx/sdtProperties.js +87 -84
  64. package/dist/docx/sectionParser.js +169 -160
  65. package/dist/docx/selectiveSaveFlags.d.ts +10 -3
  66. package/dist/docx/selectiveSaveFlags.js +1 -1
  67. package/dist/docx/selectiveXmlPatch.d.ts +56 -34
  68. package/dist/docx/selectiveXmlPatch.js +222 -115
  69. package/dist/docx/serializer/groupTextBoxWriteBack.d.ts +12 -0
  70. package/dist/docx/serializer/groupTextBoxWriteBack.js +101 -0
  71. package/dist/docx/serializer/paragraphSerializer.js +47 -42
  72. package/dist/docx/serializer/runSerializer.d.ts +5 -1
  73. package/dist/docx/serializer/runSerializer.js +4 -3
  74. package/dist/docx/serializer/settingsSerializer.js +19 -1
  75. package/dist/docx/settingsParser.js +8 -0
  76. package/dist/docx/shapeAlternateContent.d.ts +25 -0
  77. package/dist/docx/shapeAlternateContent.js +52 -0
  78. package/dist/docx/streamingXmlParser.d.ts +6 -2
  79. package/dist/docx/streamingXmlParser.js +12 -7
  80. package/dist/docx/styleParser.js +34 -8
  81. package/dist/docx/tableParser.d.ts +21 -12
  82. package/dist/docx/tableParser.js +518 -441
  83. package/dist/docx/textBoxParser.d.ts +18 -5
  84. package/dist/docx/textBoxParser.js +12 -6
  85. package/dist/docx/verbatimCapture.d.ts +10 -8
  86. package/dist/docx/verbatimCapture.js +45 -2
  87. package/dist/docx/vmlImageParser.d.ts +15 -13
  88. package/dist/docx/vmlImageParser.js +75 -60
  89. package/dist/docx/vmlPreview.d.ts +3 -3
  90. package/dist/docx/vmlPreview.js +3 -4
  91. package/dist/docx/xmlNamespaceContext.d.ts +9 -0
  92. package/dist/docx/xmlNamespaceContext.js +54 -0
  93. package/dist/docx/xmlParser.d.ts +6 -3
  94. package/dist/docx/xmlParser.js +11 -41
  95. package/dist/docx/xmlResourceLimits.d.ts +2 -1
  96. package/dist/docx/xmlResourceLimits.js +4 -1
  97. package/dist/fonts/headlessMeasure.js +0 -0
  98. package/dist/headless-layout.d.ts +11 -2
  99. package/dist/headless-layout.js +153 -107
  100. package/dist/internal/headlessRevisionResolution.js +50 -13
  101. package/dist/internal/paragraphFormattingSerialization.js +3 -3
  102. package/dist/layout-bridge/convert/endnoteLayout.d.ts +65 -0
  103. package/dist/layout-bridge/convert/endnoteLayout.js +227 -0
  104. package/dist/layout-bridge/convert/footnoteLayout.d.ts +19 -3
  105. package/dist/layout-bridge/convert/footnoteLayout.js +40 -31
  106. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -7
  107. package/dist/layout-bridge/convert/headerFooterLayout.js +5 -20
  108. package/dist/layout-bridge/convert/paragraphMarkFormatting.d.ts +10 -0
  109. package/dist/layout-bridge/convert/paragraphMarkFormatting.js +59 -0
  110. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +29 -1
  111. package/dist/layout-bridge/convert/toFlowBlocks.js +284 -39
  112. package/dist/layout-bridge/engine/hitTest.js +5 -3
  113. package/dist/layout-bridge/engine/selectionRects.js +5 -3
  114. package/dist/layout-engine/anchorLayoutInCellCompatibility.d.ts +10 -0
  115. package/dist/layout-engine/anchorLayoutInCellCompatibility.js +22 -0
  116. package/dist/layout-engine/index.d.ts +2 -2
  117. package/dist/layout-engine/index.js +102 -14
  118. package/dist/layout-engine/justificationCompatibility.d.ts +1 -1
  119. package/dist/layout-engine/justificationCompatibility.js +9 -5
  120. package/dist/layout-engine/keep-together.d.ts +15 -6
  121. package/dist/layout-engine/keep-together.js +43 -16
  122. package/dist/layout-engine/layoutInstrumentation.d.ts +8 -2
  123. package/dist/layout-engine/layoutInstrumentation.js +8 -1
  124. package/dist/layout-engine/measure/advanceComposition.js +50 -7
  125. package/dist/layout-engine/measure/hyphenationDictionaries.d.ts +74 -0
  126. package/dist/layout-engine/measure/hyphenationDictionaries.js +138 -0
  127. package/dist/layout-engine/measure/hyphenationPreload.d.ts +11 -0
  128. package/dist/layout-engine/measure/hyphenationPreload.js +24 -0
  129. package/dist/layout-engine/measure/lineBreakProvider.d.ts +12 -2
  130. package/dist/layout-engine/measure/lineBreakProvider.js +30 -30
  131. package/dist/layout-engine/measure/lineBreaks.d.ts +6 -1
  132. package/dist/layout-engine/measure/lineBreaks.js +10 -3
  133. package/dist/layout-engine/measure/listMarkerWidth.d.ts +9 -6
  134. package/dist/layout-engine/measure/listMarkerWidth.js +20 -22
  135. package/dist/layout-engine/measure/measureBlocks.js +46 -10
  136. package/dist/layout-engine/measure/measureContainer.js +51 -8
  137. package/dist/layout-engine/measure/measureHelpers.d.ts +15 -3
  138. package/dist/layout-engine/measure/measureHelpers.js +34 -8
  139. package/dist/layout-engine/measure/measureParagraph.js +143 -101
  140. package/dist/layout-engine/measure/measureTypes.d.ts +5 -0
  141. package/dist/layout-engine/measure/smallCapsCasing.d.ts +56 -0
  142. package/dist/layout-engine/measure/smallCapsCasing.js +88 -0
  143. package/dist/layout-engine/measure/tabCalculator.d.ts +2 -0
  144. package/dist/layout-engine/measure/tabCalculator.js +2 -1
  145. package/dist/layout-engine/measure/tableCellFloating.d.ts +2 -0
  146. package/dist/layout-engine/measure/tableCellFloating.js +51 -19
  147. package/dist/layout-engine/measure/tableCellGrid.d.ts +28 -3
  148. package/dist/layout-engine/measure/tableCellGrid.js +45 -5
  149. package/dist/layout-engine/measure/tableFragmentBorderGeometry.js +2 -1
  150. package/dist/layout-engine/noteAreaFlow.d.ts +19 -0
  151. package/dist/layout-engine/noteAreaFlow.js +83 -0
  152. package/dist/layout-engine/paginator.d.ts +12 -1
  153. package/dist/layout-engine/paginator.js +18 -2
  154. package/dist/layout-engine/paragraphSpacing.d.ts +4 -2
  155. package/dist/layout-engine/paragraphSpacing.js +2 -1
  156. package/dist/layout-engine/tableRowBreak.d.ts +8 -1
  157. package/dist/layout-engine/tableRowBreak.js +25 -2
  158. package/dist/layout-engine/types.d.ts +108 -3
  159. package/dist/layout-engine/types.js +96 -1
  160. package/dist/layout-painter/index.d.ts +3 -0
  161. package/dist/layout-painter/renderPage.js +32 -83
  162. package/dist/layout-painter/renderParagraph.d.ts +6 -1
  163. package/dist/layout-painter/renderParagraph.js +75 -26
  164. package/dist/layout-painter/renderTable.js +26 -13
  165. package/dist/layout-painter/renderTextBox.d.ts +12 -2
  166. package/dist/layout-painter/renderTextBox.js +26 -2
  167. package/dist/prosemirror/alternateContentAttrs.d.ts +9 -0
  168. package/dist/prosemirror/alternateContentAttrs.js +35 -0
  169. package/dist/prosemirror/attrs/index.d.ts +9 -9
  170. package/dist/prosemirror/attrs/index.js +133 -11
  171. package/dist/prosemirror/commands/comments.js +51 -41
  172. package/dist/prosemirror/contentControlRevisions.d.ts +43 -0
  173. package/dist/prosemirror/contentControlRevisions.js +84 -0
  174. package/dist/prosemirror/conversion/fromProseDoc.js +54 -23
  175. package/dist/prosemirror/conversion/markInterner.d.ts +21 -0
  176. package/dist/prosemirror/conversion/markInterner.js +90 -0
  177. package/dist/prosemirror/conversion/toProseDoc.js +117 -58
  178. package/dist/prosemirror/extensions/core/DocExtension.js +2 -1
  179. package/dist/prosemirror/extensions/core/ParagraphExtension.js +1 -0
  180. package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.d.ts +7 -7
  181. package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.js +7 -7
  182. package/dist/prosemirror/extensions/marks/markUtils.d.ts +6 -2
  183. package/dist/prosemirror/extensions/marks/markUtils.js +39 -51
  184. package/dist/prosemirror/extensions/nodes/FieldExtension.js +6 -3
  185. package/dist/prosemirror/extensions/nodes/SdtExtension.js +9 -2
  186. package/dist/prosemirror/extensions/nodes/ShapeExtension.js +1 -0
  187. package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +5 -1
  188. package/dist/prosemirror/listMarker.d.ts +1 -0
  189. package/dist/prosemirror/listMarker.js +4 -2
  190. package/dist/prosemirror/listRenderingAttrs.d.ts +1 -0
  191. package/dist/prosemirror/listRenderingAttrs.js +3 -0
  192. package/dist/prosemirror/paragraphDirection.d.ts +29 -2
  193. package/dist/prosemirror/paragraphDirection.js +21 -2
  194. package/dist/prosemirror/plugins/suggestionMode.js +37 -8
  195. package/dist/prosemirror/rejoinRunCarriers.d.ts +27 -0
  196. package/dist/prosemirror/rejoinRunCarriers.js +66 -0
  197. package/dist/prosemirror/runIdentityAcrossRevisions.d.ts +10 -0
  198. package/dist/prosemirror/runIdentityAcrossRevisions.js +90 -0
  199. package/dist/prosemirror/schema/nodes.d.ts +50 -6
  200. package/dist/prosemirror/textBoxHostParagraph.d.ts +13 -0
  201. package/dist/prosemirror/textBoxHostParagraph.js +21 -0
  202. package/dist/prosemirror/validation.js +91 -80
  203. package/dist/types/content.d.ts +2 -2
  204. package/dist/utils/createDocument.js +10 -1
  205. package/dist/utils/scriptSegments.d.ts +33 -4
  206. package/dist/utils/scriptSegments.js +39 -6
  207. package/dist/utils/textFormattingMerge.d.ts +17 -3
  208. package/dist/utils/textFormattingMerge.js +18 -12
  209. package/dist/utils/trailingText.d.ts +22 -0
  210. package/dist/utils/trailingText.js +32 -0
  211. package/package.json +2 -2
  212. package/dist/layout-engine/justifiedLineFit.d.ts +0 -7
  213. package/dist/layout-engine/justifiedLineFit.js +0 -6
@@ -1,7 +1,8 @@
1
1
  import { sanitizeExternalUrl } from "../utils/urlSecurity.js";
2
- import { CAPTURE, dispatchChildren, ownedElsewhere, withPreservedChildren } from "./containerChildren.js";
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 hyperlinkChildHandlers = (context) => {
112
- const { push, styles, theme, rels, media, inScopeXmlns } = context;
113
- const wrapper = (element) => (child) => {
114
- push(parseLinkedInlineWrapper(element, child, context));
115
- };
116
- return {
117
- r: (child) => {
118
- const run = parseRun(child, styles, theme, rels, media, inScopeXmlns);
119
- if (runHoldsPayload(run)) push(run);
120
- },
121
- bookmarkStart: (child) => {
122
- push(parseBookmarkStart(child));
123
- },
124
- bookmarkEnd: (child) => {
125
- push(parseBookmarkEnd(child));
126
- },
127
- bdo: wrapper("bdo"),
128
- dir: wrapper("dir"),
129
- customXml: wrapper("customXml"),
130
- smartTag: wrapper("smartTag"),
131
- del: CAPTURE,
132
- ins: CAPTURE,
133
- moveFrom: CAPTURE,
134
- moveTo: CAPTURE,
135
- commentRangeEnd: CAPTURE,
136
- commentRangeStart: CAPTURE,
137
- customXmlDelRangeEnd: CAPTURE,
138
- customXmlDelRangeStart: CAPTURE,
139
- customXmlInsRangeEnd: CAPTURE,
140
- customXmlInsRangeStart: CAPTURE,
141
- customXmlMoveFromRangeEnd: CAPTURE,
142
- customXmlMoveFromRangeStart: CAPTURE,
143
- customXmlMoveToRangeEnd: CAPTURE,
144
- customXmlMoveToRangeStart: CAPTURE,
145
- fldSimple: (child) => {
146
- push(preserveInlineChild(child));
147
- },
148
- hyperlink: (child) => {
149
- push(preserveInlineChild(child));
150
- },
151
- moveFromRangeEnd: CAPTURE,
152
- moveFromRangeStart: CAPTURE,
153
- moveToRangeEnd: CAPTURE,
154
- moveToRangeStart: CAPTURE,
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, dispatchChildren({
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
- ...hyperlinkChildHandlers({
194
- ...context,
195
- inScopeXmlns,
196
- push: (child) => {
197
- content.push(child);
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, hyperlinkChildHandlers, isExternalLink, isInternalLink, parseHyperlink, resolveHyperlinkUrl };
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, dispatchChildren, sequencePositions } from "./containerChildren.js";
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 = dispatchChildren({
64
+ const preserved = dispatchChildrenWithContext({
42
65
  element: root,
43
66
  container: "w:numbering",
44
67
  capturePosition: sequencePositions("w:numbering", root),
45
- handlers: {
46
- abstractNum: (child) => {
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 read = (key, value) => {
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
- nsid: (child) => read("nsid", attributeValue(child)),
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 levelOverrides = [];
125
- let abstractNumId;
126
- const preserved = dispatchChildren({
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
- abstractNumId: (child) => {
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 = dispatchChildren({
188
+ const preserved = dispatchChildrenWithContext({
163
189
  element,
164
190
  container: "w:lvlOverride",
165
191
  capturePosition: sequencePositions("w:lvlOverride", element),
166
- handlers: {
167
- startOverride: (child) => {
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 read = (key, value) => {
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
- start: (child) => read("start", integerValue(child)),
207
- numFmt: (child) => {
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;
@@ -19,6 +19,16 @@ type PackageReferenceRepair = {
19
19
  danglingRelationships: string[];
20
20
  /** Parts a content-type override named that the package does not hold. */
21
21
  danglingOverrides: string[];
22
+ /**
23
+ * `<part>|<id>` pairs: an `r:*`-style attribute in `part` named a
24
+ * relationship id that reconciliation just removed from `part`'s own
25
+ * `.rels` (because that relationship's target was itself a dangling
26
+ * reference). Dropping the relationship without also dropping the
27
+ * attribute that names it would trade one dangling reference for another —
28
+ * a `.rels` entry pointing nowhere becomes a content attribute pointing at
29
+ * nothing in its own `.rels`, which is no more valid.
30
+ */
31
+ orphanedIdReferences: string[];
22
32
  };
23
33
  /**
24
34
  * Make the package internally consistent before it is written: every internal
@@ -31,5 +41,39 @@ type PackageReferenceRepair = {
31
41
  * which is what the repack tests assert about their own output.
32
42
  */
33
43
  declare const reconcilePackageReferences: (zip: JSZip, compressionLevel: number) => Promise<PackageReferenceRepair>;
44
+ /**
45
+ * What {@link checkPackageIntegrity} found wrong with a package. Both fields
46
+ * are empty for a package where every internal relationship resolves and
47
+ * every reference to one does too — the state {@link reconcilePackageReferences}
48
+ * is meant to leave behind, and the state a save must never regress from.
49
+ */
50
+ type PackageIntegrityReport = {
51
+ /**
52
+ * `<part>|<id>` pairs: an `r:*`-style attribute in `part` names a
53
+ * relationship id absent from `part`'s own `.rels` — the id was never
54
+ * declared, or a repair (this module's or any other) dropped it without
55
+ * also dropping the attribute that names it.
56
+ */
57
+ unresolvedReferences: string[];
58
+ /**
59
+ * `<relsPart>|<target>` pairs: an internal (non-external) relationship in
60
+ * `relsPart` names a target the package does not hold.
61
+ */
62
+ danglingRelationshipTargets: string[];
63
+ };
64
+ /**
65
+ * Verify the two invariants an OPC package must hold for a conforming
66
+ * consumer to accept it: every `r:*` reference in an XML part resolves in
67
+ * that part's own `.rels`, and every internal relationship target names a
68
+ * part the package actually holds.
69
+ *
70
+ * A read-only counterpart to {@link reconcilePackageReferences} — that
71
+ * function repairs a package by removing what does not resolve; this one
72
+ * only reports what still does not, so a test can assert a save produced
73
+ * nothing for it to find. Cheap enough to run after every repack in a test
74
+ * or a corpus-gate invariant: one pass over the `.rels` parts building an id
75
+ * census, one pass over the XML parts checking references against it.
76
+ */
77
+ declare const checkPackageIntegrity: (zip: JSZip) => Promise<PackageIntegrityReport>;
34
78
  //#endregion
35
- export { PackageReferenceRepair, isUnsafePackagePath, reconcilePackageReferences, removeUnsafeEntries };
79
+ export { PackageIntegrityReport, PackageReferenceRepair, checkPackageIntegrity, isUnsafePackagePath, reconcilePackageReferences, removeUnsafeEntries };