@stll/folio-core 0.45.0 → 0.47.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 (451) hide show
  1. package/dist/ai-edits/apply.js +85 -43
  2. package/dist/ai-edits/headless.js +2 -2
  3. package/dist/ai-edits/read.d.ts +1 -0
  4. package/dist/ai-edits/read.js +1 -0
  5. package/dist/ai-edits/snapshot.js +32 -27
  6. package/dist/ai-edits/table-cell-mutations.js +15 -7
  7. package/dist/ai-edits/table-geometry.js +21 -18
  8. package/dist/ai-edits/table-template.js +2 -2
  9. package/dist/compare/compare.js +2 -5
  10. package/dist/compare/content-alignment.js +108 -12
  11. package/dist/compare/content-types.d.ts +8 -2
  12. package/dist/compare/content.js +2 -11
  13. package/dist/compare/plan.js +7 -4
  14. package/dist/compare/scenario.js +2 -5
  15. package/dist/compare/section-boundary-properties.js +1 -2
  16. package/dist/compare/types.d.ts +9 -1
  17. package/dist/compare/types.js +12 -1
  18. package/dist/compat/eigenpal.d.ts +2 -1
  19. package/dist/compat/eigenpal.js +2 -1
  20. package/dist/content-controls/checkboxDisplay.d.ts +17 -0
  21. package/dist/content-controls/checkboxDisplay.js +46 -0
  22. package/dist/content-controls/findContentControls.js +3 -1
  23. package/dist/content-controls/mutateContentControls.js +57 -43
  24. package/dist/controller/contentControlWidgetController.d.ts +1 -0
  25. package/dist/controller/contentControlWidgetController.js +3 -0
  26. package/dist/controller/hiddenEditorApi.js +3 -1
  27. package/dist/controller/hiddenEditorManager.d.ts +1 -1
  28. package/dist/controller/hiddenEditorManager.js +6 -3
  29. package/dist/controller/layoutPipeline.js +8 -3
  30. package/dist/display-list/build/buildDisplayList.js +20 -1
  31. package/dist/display-list/build/imagePrimitives.d.ts +4 -4
  32. package/dist/display-list/build/imagePrimitives.js +38 -18
  33. package/dist/display-list/build/pageBorderPrimitives.js +2 -1
  34. package/dist/display-list/build/paragraphPrimitives.js +113 -14
  35. package/dist/display-list/build/previewPrimitives.d.ts +10 -0
  36. package/dist/display-list/build/previewPrimitives.js +89 -0
  37. package/dist/display-list/build/strokes.d.ts +177 -8
  38. package/dist/display-list/build/strokes.js +167 -47
  39. package/dist/display-list/build/tablePrimitives.js +4 -2
  40. package/dist/display-list/build/textBoxPrimitives.js +6 -4
  41. package/dist/display-list/build/textDecorations.d.ts +15 -1
  42. package/dist/display-list/build/textDecorations.js +15 -1
  43. package/dist/display-list/dom/renderDisplayListToDom.js +11 -21
  44. package/dist/display-list/primitives.d.ts +13 -2
  45. package/dist/display-list/primitives.js +36 -1
  46. package/dist/display-list/types.d.ts +17 -0
  47. package/dist/document-operations.js +2 -1
  48. package/dist/docx/attributeRemainder.d.ts +76 -0
  49. package/dist/docx/attributeRemainder.js +111 -0
  50. package/dist/docx/blockContentParser.d.ts +3 -1
  51. package/dist/docx/blockContentParser.js +102 -106
  52. package/dist/docx/blockPlainText.d.ts +3 -4
  53. package/dist/docx/blockPlainText.js +3 -0
  54. package/dist/docx/borderParser.js +26 -11
  55. package/dist/docx/builtInStyles.d.ts +8 -16
  56. package/dist/docx/builtInStyles.js +54 -17
  57. package/dist/docx/commentAnchorIndex.d.ts +30 -0
  58. package/dist/docx/commentAnchorIndex.js +50 -0
  59. package/dist/docx/commentParser.d.ts +1 -1
  60. package/dist/docx/commentParser.js +56 -39
  61. package/dist/docx/commentRangeIntegrity.d.ts +16 -1
  62. package/dist/docx/commentRangeIntegrity.js +42 -1
  63. package/dist/docx/commentRangeJoin.d.ts +9 -0
  64. package/dist/docx/commentRangeJoin.js +33 -0
  65. package/dist/docx/commentReferenceCompletion.d.ts +9 -0
  66. package/dist/docx/commentReferenceCompletion.js +47 -0
  67. package/dist/docx/commentReferenceNormalization.js +3 -1
  68. package/dist/docx/commentReplyMarkers.js +11 -19
  69. package/dist/docx/compatibility.js +56 -41
  70. package/dist/docx/containerChildren.d.ts +208 -0
  71. package/dist/docx/containerChildren.gen.d.ts +43 -0
  72. package/dist/docx/containerChildren.gen.js +263 -0
  73. package/dist/docx/containerChildren.js +153 -0
  74. package/dist/docx/diagramPreview.d.ts +14 -2
  75. package/dist/docx/diagramPreview.js +81 -169
  76. package/dist/docx/documentParser.d.ts +1 -1
  77. package/dist/docx/documentParser.js +7 -4
  78. package/dist/docx/drawingAnchor.d.ts +87 -0
  79. package/dist/docx/drawingAnchor.js +201 -0
  80. package/dist/docx/drawingUtils.d.ts +43 -38
  81. package/dist/docx/drawingUtils.js +205 -118
  82. package/dist/docx/ensureParaIds.js +17 -7
  83. package/dist/docx/fieldParser.d.ts +1 -1
  84. package/dist/docx/fieldParser.js +4 -4
  85. package/dist/docx/fieldState.d.ts +26 -0
  86. package/dist/docx/fieldState.js +53 -0
  87. package/dist/docx/fontTableParser.js +102 -41
  88. package/dist/docx/footnoteParser.d.ts +1 -1
  89. package/dist/docx/footnoteParser.js +10 -6
  90. package/dist/docx/graphicFrameLocks.d.ts +16 -4
  91. package/dist/docx/graphicFrameLocks.js +19 -6
  92. package/dist/docx/groupDrawingParser.js +4 -3
  93. package/dist/docx/headerFooterParser.js +1 -1
  94. package/dist/docx/headerFooterReferenceNormalization.js +1 -0
  95. package/dist/docx/hyperlinkParser.d.ts +66 -9
  96. package/dist/docx/hyperlinkParser.js +153 -26
  97. package/dist/docx/imageParser.js +160 -115
  98. package/dist/docx/index.d.ts +2 -1
  99. package/dist/docx/index.js +2 -1
  100. package/dist/docx/inlineContentRemovals.d.ts +28 -0
  101. package/dist/docx/inlineContentRemovals.js +46 -0
  102. package/dist/docx/inlineWrapperContent.d.ts +166 -0
  103. package/dist/docx/inlineWrapperContent.js +165 -0
  104. package/dist/docx/inlineWrapperParser.d.ts +11 -0
  105. package/dist/docx/inlineWrapperParser.js +60 -0
  106. package/dist/docx/nonVisualDrawingProps.d.ts +5 -13
  107. package/dist/docx/normalizeBaseDirection.js +12 -1
  108. package/dist/docx/numberingParser.d.ts +25 -2
  109. package/dist/docx/numberingParser.js +264 -361
  110. package/dist/docx/numberingReference.d.ts +9 -16
  111. package/dist/docx/numberingReference.js +17 -16
  112. package/dist/docx/numberingReferenceNormalization.js +7 -7
  113. package/dist/docx/ooxmlCounterFormatter.d.ts +1 -1
  114. package/dist/docx/ooxmlCounterFormatter.js +4 -1
  115. package/dist/docx/paraIdAttribute.d.ts +111 -0
  116. package/dist/docx/paraIdAttribute.js +142 -0
  117. package/dist/docx/paragraphParser.d.ts +10 -25
  118. package/dist/docx/paragraphParser.js +421 -496
  119. package/dist/docx/paragraphProperties.d.ts +23 -0
  120. package/dist/docx/paragraphProperties.js +279 -0
  121. package/dist/docx/paragraphPropertySource.js +7 -1
  122. package/dist/docx/paragraphTextBoxEnrichment.d.ts +3 -2
  123. package/dist/docx/paragraphTextBoxEnrichment.js +20 -59
  124. package/dist/docx/paragraphTraversal.d.ts +14 -10
  125. package/dist/docx/paragraphTraversal.js +53 -52
  126. package/dist/docx/parseWarningMessage.js +5 -1
  127. package/dist/docx/parserEnums.d.ts +6 -8
  128. package/dist/docx/parserEnums.js +4 -6
  129. package/dist/docx/preservedRunContent.d.ts +32 -0
  130. package/dist/docx/preservedRunContent.js +96 -0
  131. package/dist/docx/previewBudget.d.ts +44 -23
  132. package/dist/docx/previewBudget.js +61 -30
  133. package/dist/docx/propertyElementAttributes.d.ts +178 -0
  134. package/dist/docx/propertyElementAttributes.js +114 -0
  135. package/dist/docx/renderedPageBreakNormalization.js +4 -6
  136. package/dist/docx/rezip.d.ts +28 -2
  137. package/dist/docx/rezip.js +152 -27
  138. package/dist/docx/runConsolidator.d.ts +42 -2
  139. package/dist/docx/runConsolidator.js +60 -6
  140. package/dist/docx/runParser.d.ts +55 -19
  141. package/dist/docx/runParser.js +394 -306
  142. package/dist/docx/runPayload.d.ts +5 -0
  143. package/dist/docx/runPayload.js +4 -0
  144. package/dist/docx/sdtProperties.d.ts +39 -5
  145. package/dist/docx/sdtProperties.js +205 -84
  146. package/dist/docx/sdtPropertiesPatch.d.ts +5 -9
  147. package/dist/docx/sdtPropertiesPatch.js +68 -112
  148. package/dist/docx/sectionParser.d.ts +1 -2
  149. package/dist/docx/sectionParser.js +241 -238
  150. package/dist/docx/selectiveSave.js +3 -2
  151. package/dist/docx/selectiveXmlPatch.d.ts +66 -3
  152. package/dist/docx/selectiveXmlPatch.js +276 -133
  153. package/dist/docx/serializer/blockSdtSerializer.js +2 -96
  154. package/dist/docx/serializer/borderSerializer.d.ts +5 -5
  155. package/dist/docx/serializer/borderSerializer.js +12 -10
  156. package/dist/docx/serializer/commentSerializer.js +5 -7
  157. package/dist/docx/serializer/documentSerializer.js +11 -11
  158. package/dist/docx/serializer/fontTableSerializer.js +31 -3
  159. package/dist/docx/serializer/headerFooterSerializer.js +10 -9
  160. package/dist/docx/serializer/markupRangeAttributes.d.ts +9 -1
  161. package/dist/docx/serializer/markupRangeAttributes.js +9 -1
  162. package/dist/docx/serializer/noteSerializer.js +11 -8
  163. package/dist/docx/serializer/numberingSerializer.d.ts +1 -6
  164. package/dist/docx/serializer/numberingSerializer.js +81 -79
  165. package/dist/docx/serializer/paragraphSerializer.d.ts +1 -9
  166. package/dist/docx/serializer/paragraphSerializer.js +156 -236
  167. package/dist/docx/serializer/runSerializer.d.ts +1 -5
  168. package/dist/docx/serializer/runSerializer.js +134 -75
  169. package/dist/docx/serializer/sdtPropertiesSerializer.d.ts +26 -0
  170. package/dist/docx/serializer/sdtPropertiesSerializer.js +111 -0
  171. package/dist/docx/serializer/sectionPropertiesSerializer.js +42 -49
  172. package/dist/docx/serializer/settingsSerializer.js +6 -4
  173. package/dist/docx/serializer/stylesSerializer.js +8 -11
  174. package/dist/docx/serializer/tableSerializer.js +283 -105
  175. package/dist/docx/serializer/textFormattingSerializer.d.ts +28 -4
  176. package/dist/docx/serializer/textFormattingSerializer.js +111 -101
  177. package/dist/docx/serializer/xmlUtils.d.ts +1 -1
  178. package/dist/docx/serializer/xmlUtils.js +1 -1
  179. package/dist/docx/server/createBilingualDocument.js +20 -16
  180. package/dist/docx/server/materializeYjsDocx.d.ts +1 -1
  181. package/dist/docx/server/materializeYjsDocx.js +9 -1
  182. package/dist/docx/server/migrateYjsAttrSchema.d.ts +55 -0
  183. package/dist/docx/server/migrateYjsAttrSchema.js +95 -0
  184. package/dist/docx/settingsParser.js +7 -4
  185. package/dist/docx/shadingParser.d.ts +2 -1
  186. package/dist/docx/shadingParser.js +43 -7
  187. package/dist/docx/shapeParser.js +13 -8
  188. package/dist/docx/strictNames.d.ts +11 -0
  189. package/dist/docx/strictNames.gen.d.ts +45 -0
  190. package/dist/docx/strictNames.gen.js +50 -0
  191. package/dist/docx/strictNames.js +43 -0
  192. package/dist/docx/strictValueEncodings.gen.js +133 -131
  193. package/dist/docx/styleParser.js +17 -349
  194. package/dist/docx/tableParser.d.ts +11 -2
  195. package/dist/docx/tableParser.js +665 -220
  196. package/dist/docx/textBoxParser.d.ts +28 -3
  197. package/dist/docx/textBoxParser.js +69 -9
  198. package/dist/docx/themeColorAttribute.d.ts +13 -0
  199. package/dist/docx/themeColorAttribute.js +24 -0
  200. package/dist/docx/trackedMoveRangeNormalization.js +2 -1
  201. package/dist/docx/unzip.js +5 -4
  202. package/dist/docx/vmlImageParser.d.ts +30 -5
  203. package/dist/docx/vmlImageParser.js +91 -32
  204. package/dist/docx/vmlPreview.js +2 -2
  205. package/dist/docx/wrapPolygon.d.ts +30 -0
  206. package/dist/docx/wrapPolygon.js +70 -0
  207. package/dist/docx/xmlEncoding.d.ts +5 -0
  208. package/dist/docx/xmlEncoding.js +12 -0
  209. package/dist/docx/xmlParser.d.ts +23 -1
  210. package/dist/docx/xmlParser.js +31 -2
  211. package/dist/fonts/embeddedFonts.js +3 -3
  212. package/dist/headless-layout.js +12 -1
  213. package/dist/i18n/messages/catalogs.gen.d.ts +68 -0
  214. package/dist/i18n/messages/catalogs.gen.js +102 -34
  215. package/dist/i18n/messages/messages.gen.d.ts +4 -0
  216. package/dist/index.d.ts +2 -1
  217. package/dist/index.js +2 -1
  218. package/dist/internal/headlessRevisionResolution.js +9 -0
  219. package/dist/internal/pageBreakRunSourceDescendantIndex.js +7 -2
  220. package/dist/internal/paragraphFormattingSerialization.d.ts +20 -9
  221. package/dist/internal/paragraphFormattingSerialization.js +118 -83
  222. package/dist/layout-bridge/convert/footnoteLayout.d.ts +1 -0
  223. package/dist/layout-bridge/convert/footnoteLayout.js +1 -0
  224. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -0
  225. package/dist/layout-bridge/convert/headerFooterLayout.js +2 -0
  226. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +17 -12
  227. package/dist/layout-bridge/convert/toFlowBlocks.js +267 -101
  228. package/dist/layout-engine/index.d.ts +2 -2
  229. package/dist/layout-engine/index.js +53 -17
  230. package/dist/layout-engine/measure/measureBlocks.d.ts +3 -0
  231. package/dist/layout-engine/measure/measureBlocks.js +6 -10
  232. package/dist/layout-engine/measure/tableCellFloating.d.ts +2 -0
  233. package/dist/layout-engine/measure/tableCellFloating.js +2 -0
  234. package/dist/layout-engine/measure/tableCellGrid.js +2 -1
  235. package/dist/layout-engine/measure/tableFragmentBorderGeometry.js +2 -1
  236. package/dist/layout-engine/measure/tableInlinePlacement.js +2 -5
  237. package/dist/layout-engine/paragraphSequence.js +3 -2
  238. package/dist/layout-engine/renderedBreakReconciliation.js +2 -1
  239. package/dist/layout-engine/section-breaks.d.ts +49 -2
  240. package/dist/layout-engine/section-breaks.js +55 -4
  241. package/dist/layout-engine/types.d.ts +69 -17
  242. package/dist/layout-engine/types.js +16 -1
  243. package/dist/layout-painter/borderStroke.d.ts +18 -4
  244. package/dist/layout-painter/renderImage.d.ts +5 -1
  245. package/dist/layout-painter/renderImage.js +10 -3
  246. package/dist/layout-painter/renderPage.d.ts +2 -0
  247. package/dist/layout-painter/renderPage.js +10 -4
  248. package/dist/layout-painter/renderParagraph.d.ts +14 -1
  249. package/dist/layout-painter/renderParagraph.js +34 -28
  250. package/dist/layout-painter/renderTable.d.ts +4 -1
  251. package/dist/layout-painter/renderTable.js +22 -22
  252. package/dist/layout-painter/renderTextBox.js +5 -3
  253. package/dist/managers/autoSaveCodec.d.ts +9 -1
  254. package/dist/managers/autoSaveCodec.js +12 -4
  255. package/dist/markdown/renderBlock.js +3 -0
  256. package/dist/markdown/renderRuns.d.ts +1 -1
  257. package/dist/markdown/renderRuns.js +34 -6
  258. package/dist/markdown/renderTable.js +24 -6
  259. package/dist/markdown/trailers.js +4 -1
  260. package/dist/model.d.ts +3 -3
  261. package/dist/model.js +2 -2
  262. package/dist/paged-layout/sectionBlockWidths.d.ts +3 -0
  263. package/dist/paged-layout/sectionBlockWidths.js +26 -4
  264. package/dist/pdf/images.js +142 -6
  265. package/dist/prosemirror/attrs/index.d.ts +34 -5
  266. package/dist/prosemirror/attrs/index.js +639 -48
  267. package/dist/prosemirror/authoredTransformAttrs.d.ts +28 -0
  268. package/dist/prosemirror/authoredTransformAttrs.js +64 -0
  269. package/dist/prosemirror/bookmarkBoundaryAttrs.d.ts +9 -1
  270. package/dist/prosemirror/bookmarkBoundaryAttrs.js +22 -3
  271. package/dist/prosemirror/commands/comments.js +68 -53
  272. package/dist/prosemirror/commands/contentControls.js +33 -20
  273. package/dist/prosemirror/commands/image.d.ts +10 -3
  274. package/dist/prosemirror/commands/image.js +46 -29
  275. package/dist/prosemirror/commands/pageBreak.js +1 -1
  276. package/dist/prosemirror/commands/paragraph.d.ts +2 -1
  277. package/dist/prosemirror/commands/propertyChangeScope.d.ts +12 -4
  278. package/dist/prosemirror/commands/propertyChangeScope.js +22 -4
  279. package/dist/prosemirror/commands/sectionBreak.d.ts +33 -1
  280. package/dist/prosemirror/commands/sectionBreak.js +187 -11
  281. package/dist/prosemirror/commentReferenceAttrs.d.ts +8 -0
  282. package/dist/prosemirror/commentReferenceAttrs.js +33 -0
  283. package/dist/prosemirror/commentReferenceIntegrity.d.ts +47 -0
  284. package/dist/prosemirror/commentReferenceIntegrity.js +43 -0
  285. package/dist/prosemirror/conversion/fromProseDoc.d.ts +17 -12
  286. package/dist/prosemirror/conversion/fromProseDoc.js +553 -207
  287. package/dist/prosemirror/conversion/index.d.ts +2 -2
  288. package/dist/prosemirror/conversion/preservedSinkCarriers.d.ts +39 -0
  289. package/dist/prosemirror/conversion/preservedSinkCarriers.js +19 -0
  290. package/dist/prosemirror/conversion/runShadingMark.js +14 -1
  291. package/dist/prosemirror/conversion/sdtAttrs.d.ts +10 -1
  292. package/dist/prosemirror/conversion/sdtAttrs.js +19 -5
  293. package/dist/prosemirror/conversion/toProseDoc.d.ts +7 -9
  294. package/dist/prosemirror/conversion/toProseDoc.js +801 -411
  295. package/dist/prosemirror/emptyRangeAnchor.d.ts +53 -0
  296. package/dist/prosemirror/emptyRangeAnchor.js +158 -0
  297. package/dist/prosemirror/extensions/StarterKit.js +14 -58
  298. package/dist/prosemirror/extensions/core/DocExtension.js +1 -1
  299. package/dist/prosemirror/extensions/core/ParagraphExtension.js +21 -16
  300. package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +48 -29
  301. package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.js +3 -1
  302. package/dist/prosemirror/extensions/features/ImagePasteExtension.js +5 -3
  303. package/dist/prosemirror/extensions/features/ListExtension.js +43 -24
  304. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +1 -0
  305. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +4 -3
  306. package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +3 -3
  307. package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +5 -5
  308. package/dist/prosemirror/extensions/features/pasteCleanup.d.ts +3 -1
  309. package/dist/prosemirror/extensions/features/pasteCleanup.js +56 -2
  310. package/dist/prosemirror/extensions/features/pastedHeadingStyles.js +5 -4
  311. package/dist/prosemirror/extensions/markRegistry.d.ts +65 -0
  312. package/dist/prosemirror/extensions/markRegistry.js +138 -0
  313. package/dist/prosemirror/extensions/marks/InlineWrapperExtension.d.ts +18 -0
  314. package/dist/prosemirror/extensions/marks/InlineWrapperExtension.js +77 -0
  315. package/dist/prosemirror/extensions/marks/RunIdentityExtension.d.ts +26 -0
  316. package/dist/prosemirror/extensions/marks/RunIdentityExtension.js +134 -0
  317. package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +2 -1
  318. package/dist/prosemirror/extensions/marks/UnderlineExtension.js +12 -18
  319. package/dist/prosemirror/extensions/marks/markUtils.d.ts +2 -1
  320. package/dist/prosemirror/extensions/marks/markUtils.js +49 -5
  321. package/dist/prosemirror/extensions/nodes/BlockBookmarkBoundaryExtension.d.ts +29 -0
  322. package/dist/prosemirror/extensions/nodes/BlockBookmarkBoundaryExtension.js +46 -0
  323. package/dist/prosemirror/extensions/nodes/BlockSdtExtension.d.ts +4 -3
  324. package/dist/prosemirror/extensions/nodes/BlockSdtExtension.js +18 -13
  325. package/dist/prosemirror/extensions/nodes/BookmarkBoundaryExtension.js +28 -53
  326. package/dist/prosemirror/extensions/nodes/CommentReferenceExtension.d.ts +11 -0
  327. package/dist/prosemirror/extensions/nodes/CommentReferenceExtension.js +97 -0
  328. package/dist/prosemirror/extensions/nodes/FieldExtension.js +9 -7
  329. package/dist/prosemirror/extensions/nodes/ImageExtension.js +24 -1
  330. package/dist/prosemirror/extensions/nodes/MoveRangeBoundaryExtension.d.ts +11 -0
  331. package/dist/prosemirror/extensions/nodes/MoveRangeBoundaryExtension.js +43 -0
  332. package/dist/prosemirror/extensions/nodes/PreservedBlockExtension.d.ts +32 -0
  333. package/dist/prosemirror/extensions/nodes/PreservedBlockExtension.js +67 -0
  334. package/dist/prosemirror/extensions/nodes/PreservedXmlExtension.d.ts +16 -0
  335. package/dist/prosemirror/extensions/nodes/PreservedXmlExtension.js +60 -0
  336. package/dist/prosemirror/extensions/nodes/RangeAnchorExtension.d.ts +13 -0
  337. package/dist/prosemirror/extensions/nodes/RangeAnchorExtension.js +65 -0
  338. package/dist/prosemirror/extensions/nodes/SdtExtension.d.ts +3 -1
  339. package/dist/prosemirror/extensions/nodes/SdtExtension.js +22 -16
  340. package/dist/prosemirror/extensions/nodes/ShapeExtension.js +7 -0
  341. package/dist/prosemirror/extensions/nodes/TableExtension.js +142 -123
  342. package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +9 -1
  343. package/dist/prosemirror/extensions/nodes/bookmarkBoundaryDom.d.ts +23 -0
  344. package/dist/prosemirror/extensions/nodes/bookmarkBoundaryDom.js +57 -0
  345. package/dist/prosemirror/extensions/types.d.ts +12 -3
  346. package/dist/prosemirror/index.d.ts +4 -2
  347. package/dist/prosemirror/index.js +2 -1
  348. package/dist/prosemirror/inlineWrapperStack.d.ts +39 -0
  349. package/dist/prosemirror/inlineWrapperStack.js +92 -0
  350. package/dist/prosemirror/listMarker.d.ts +2 -2
  351. package/dist/prosemirror/listMarker.js +7 -8
  352. package/dist/prosemirror/listRenderingAttrs.js +11 -1
  353. package/dist/prosemirror/listState.d.ts +62 -0
  354. package/dist/prosemirror/listState.js +49 -0
  355. package/dist/prosemirror/moveRangeBoundaryAttrs.d.ts +13 -0
  356. package/dist/prosemirror/moveRangeBoundaryAttrs.js +114 -0
  357. package/dist/prosemirror/numberedRefFields.js +4 -4
  358. package/dist/prosemirror/numberingAttr.d.ts +55 -0
  359. package/dist/prosemirror/numberingAttr.js +74 -0
  360. package/dist/prosemirror/outlineLevelAttr.d.ts +29 -0
  361. package/dist/prosemirror/outlineLevelAttr.js +42 -0
  362. package/dist/prosemirror/pageBreakRunProjection.d.ts +17 -7
  363. package/dist/prosemirror/pageBreakRunProjection.js +19 -9
  364. package/dist/prosemirror/paragraphFormattingProvenance.d.ts +9 -0
  365. package/dist/prosemirror/paragraphFormattingProvenance.js +4 -1
  366. package/dist/prosemirror/plugins/selectionTracker.d.ts +3 -6
  367. package/dist/prosemirror/plugins/selectionTracker.js +3 -10
  368. package/dist/prosemirror/rangeAnchorAttrs.d.ts +14 -0
  369. package/dist/prosemirror/rangeAnchorAttrs.js +101 -0
  370. package/dist/prosemirror/replacedAnnotations.d.ts +59 -0
  371. package/dist/prosemirror/replacedAnnotations.js +183 -0
  372. package/dist/prosemirror/revisionCarriers.d.ts +86 -2
  373. package/dist/prosemirror/revisionCarriers.js +86 -60
  374. package/dist/prosemirror/runFormattingInlineCarriers.d.ts +5 -1
  375. package/dist/prosemirror/runFormattingInlineCarriers.js +7 -1
  376. package/dist/prosemirror/runIdentity.d.ts +28 -0
  377. package/dist/prosemirror/runIdentity.js +36 -0
  378. package/dist/prosemirror/runStyleFormatting.js +1 -1
  379. package/dist/prosemirror/schema/index.d.ts +3 -3
  380. package/dist/prosemirror/schema/marks.d.ts +47 -4
  381. package/dist/prosemirror/schema/nodes.d.ts +309 -26
  382. package/dist/prosemirror/schema/nodes.js +16 -1
  383. package/dist/prosemirror/sectionCarrier.d.ts +37 -0
  384. package/dist/prosemirror/sectionCarrier.js +40 -0
  385. package/dist/prosemirror/selectionState.d.ts +3 -0
  386. package/dist/prosemirror/selectionState.js +4 -1
  387. package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +5 -4
  388. package/dist/prosemirror/styles/resolvedStyleAttrs.js +15 -13
  389. package/dist/prosemirror/tableResize.js +5 -6
  390. package/dist/prosemirror/trackedRunInlineAtoms.d.ts +4 -0
  391. package/dist/prosemirror/trackedRunInlineAtoms.js +4 -0
  392. package/dist/prosemirror/utils/extractTrackedChanges.d.ts +10 -11
  393. package/dist/prosemirror/utils/extractTrackedChanges.js +109 -92
  394. package/dist/prosemirror/validation.js +31 -6
  395. package/dist/prosemirror/yjsDocumentMetadata.d.ts +73 -0
  396. package/dist/prosemirror/yjsDocumentMetadata.js +592 -0
  397. package/dist/prosemirror/zeroWidthAnchors.js +6 -0
  398. package/dist/render-dom/commentAnchorAttributes.d.ts +37 -0
  399. package/dist/render-dom/commentAnchorAttributes.js +54 -0
  400. package/dist/server.d.ts +3 -1
  401. package/dist/server.js +3 -1
  402. package/dist/style-sets/extract.js +4 -4
  403. package/dist/style-sets/stellaStyle.js +36 -23
  404. package/dist/types/colors.d.ts +2 -2
  405. package/dist/types/content.d.ts +2 -2
  406. package/dist/types/documentEnumValues.d.ts +53 -26
  407. package/dist/types/documentEnumValues.js +72 -174
  408. package/dist/types/formatting.d.ts +2 -2
  409. package/dist/types/index.d.ts +9 -2
  410. package/dist/utils/borderCss.d.ts +246 -0
  411. package/dist/utils/borderCss.js +325 -0
  412. package/dist/utils/clipboard.d.ts +9 -1
  413. package/dist/utils/clipboard.js +27 -1
  414. package/dist/utils/colorResolver.d.ts +4 -3
  415. package/dist/utils/colorResolver.js +45 -76
  416. package/dist/utils/createDocument.js +24 -6
  417. package/dist/utils/findReplace.js +52 -10
  418. package/dist/utils/formatToStyle.d.ts +84 -2
  419. package/dist/utils/formatToStyle.js +133 -52
  420. package/dist/utils/headingCollector.js +3 -2
  421. package/dist/utils/imageLuminance.d.ts +15 -0
  422. package/dist/utils/imageLuminance.js +32 -0
  423. package/dist/utils/mergeDocumentContent.js +12 -20
  424. package/dist/utils/paragraphFormattingMerge.js +27 -6
  425. package/dist/utils/replaceText.js +1 -0
  426. package/dist/utils/tableOperations.d.ts +5 -3
  427. package/dist/utils/tableOperations.js +14 -1
  428. package/dist/utils/tablePlacement.d.ts +7 -0
  429. package/dist/utils/tablePlacement.js +14 -0
  430. package/dist/utils/textDirectionFlow.d.ts +15 -0
  431. package/dist/utils/textDirectionFlow.js +38 -0
  432. package/dist/utils/textFormattingMerge.js +16 -4
  433. package/package.json +10 -10
  434. package/dist/ai-edits/__fixtures__/paragraphs.d.ts +0 -17
  435. package/dist/ai-edits/__fixtures__/paragraphs.js +0 -33
  436. package/dist/compare/__fixtures__/body-sequence.d.ts +0 -119
  437. package/dist/compare/__fixtures__/body-sequence.js +0 -225
  438. package/dist/compare/__fixtures__/nested-table.d.ts +0 -16
  439. package/dist/compare/__fixtures__/nested-table.js +0 -50
  440. package/dist/compare/__fixtures__/numbered-list.d.ts +0 -34
  441. package/dist/compare/__fixtures__/numbered-list.js +0 -85
  442. package/dist/docx/blockRangeMarkers.d.ts +0 -36
  443. package/dist/docx/blockRangeMarkers.js +0 -59
  444. package/dist/docx/bookmarkPlacement.d.ts +0 -9
  445. package/dist/docx/bookmarkPlacement.js +0 -50
  446. package/dist/fonts/embeddedFontTable.d.ts +0 -45
  447. package/dist/fonts/embeddedFontTable.js +0 -80
  448. package/dist/prosemirror/extensions/marks/PageBreakRunOwnerExtension.d.ts +0 -13
  449. package/dist/prosemirror/extensions/marks/PageBreakRunOwnerExtension.js +0 -39
  450. package/dist/prosemirror/yjsParagraphSourceContract.d.ts +0 -9
  451. package/dist/prosemirror/yjsParagraphSourceContract.js +0 -26
@@ -1,4 +1,6 @@
1
- import { findChild, findChildren, getAttribute, parseXmlDocument } from "./xmlParser.js";
1
+ import { DERIVED_PART_ROOT_ATTRIBUTES, attributeRemainder } from "./attributeRemainder.js";
2
+ import { CAPTURE, dispatchChildren } from "./containerChildren.js";
3
+ import { getAttribute, parseXmlDocument } from "./xmlParser.js";
2
4
  //#region src/docx/fontTableParser.ts
3
5
  const FONT_FAMILIES = [
4
6
  "decorative",
@@ -13,60 +15,119 @@ const FONT_PITCHES = [
13
15
  "fixed",
14
16
  "variable"
15
17
  ];
18
+ /** `w:font` reads its name; everything else it carries is the remainder's. */
19
+ const MODELLED_FONT_ATTRIBUTES = /* @__PURE__ */ new Set(["name"]);
16
20
  const parseFontTable = (xml) => {
17
21
  if (!xml) return;
18
22
  const root = parseXmlDocument(xml);
19
23
  if (!root) return;
20
24
  const fonts = [];
21
- for (const element of findChildren(root, "w", "font")) {
22
- const font = parseFont(element);
23
- if (font) fonts.push(font);
24
- }
25
- return fonts.length > 0 ? { fonts } : void 0;
25
+ const preserved = dispatchChildren({
26
+ element: root,
27
+ container: "w:fonts",
28
+ capturePosition: () => fonts.length,
29
+ handlers: { font: (element) => {
30
+ const font = parseFont(element);
31
+ if (font) fonts.push(font);
32
+ } }
33
+ });
34
+ const preservedAttributes = attributeRemainder({
35
+ element: root,
36
+ modelled: DERIVED_PART_ROOT_ATTRIBUTES
37
+ });
38
+ if (fonts.length === 0 && preserved === void 0 && preservedAttributes === void 0) return;
39
+ return {
40
+ fonts,
41
+ ...preserved === void 0 ? {} : { preserved },
42
+ ...preservedAttributes === void 0 ? {} : { preservedAttributes }
43
+ };
26
44
  };
27
45
  const parseFont = (element) => {
28
46
  const name = getAttribute(element, "w", "name");
29
47
  if (!name) return;
30
48
  const font = { name };
31
- assignValue(font, "altName", childValue(element, "altName"));
32
- assignValue(font, "panose1", childValue(element, "panose1"));
33
- assignValue(font, "charset", childValue(element, "charset"));
34
- const family = childValue(element, "family");
35
- if (family && isFontFamily(family)) font.family = family;
36
- const pitch = childValue(element, "pitch");
37
- if (pitch && isFontPitch(pitch)) font.pitch = pitch;
38
- const sig = findChild(element, "w", "sig");
39
- if (sig) {
40
- const parsed = {};
41
- assignSignatureValue(parsed, "usb0", getAttribute(sig, "w", "usb0") ?? void 0);
42
- assignSignatureValue(parsed, "usb1", getAttribute(sig, "w", "usb1") ?? void 0);
43
- assignSignatureValue(parsed, "usb2", getAttribute(sig, "w", "usb2") ?? void 0);
44
- assignSignatureValue(parsed, "usb3", getAttribute(sig, "w", "usb3") ?? void 0);
45
- assignSignatureValue(parsed, "csb0", getAttribute(sig, "w", "csb0") ?? void 0);
46
- assignSignatureValue(parsed, "csb1", getAttribute(sig, "w", "csb1") ?? void 0);
47
- if (Object.values(parsed).some((value) => value !== void 0)) font.sig = parsed;
48
- }
49
- assignValue(font, "embedRegular", relationshipId(element, "embedRegular"));
50
- assignValue(font, "embedBold", relationshipId(element, "embedBold"));
51
- assignValue(font, "embedItalic", relationshipId(element, "embedItalic"));
52
- assignValue(font, "embedBoldItalic", relationshipId(element, "embedBoldItalic"));
49
+ let modelled = 0;
50
+ const read = (key, value) => {
51
+ if (value === void 0) return;
52
+ font[key] = value;
53
+ modelled += 1;
54
+ };
55
+ const preserved = dispatchChildren({
56
+ element,
57
+ container: "w:font",
58
+ capturePosition: () => modelled,
59
+ handlers: {
60
+ altName: (child) => read("altName", value(child)),
61
+ panose1: (child) => read("panose1", value(child)),
62
+ charset: (child) => read("charset", charsetOf(child)),
63
+ family: (child) => read("family", narrow(value(child), FONT_FAMILIES)),
64
+ notTrueType: CAPTURE,
65
+ pitch: (child) => read("pitch", narrow(value(child), FONT_PITCHES)),
66
+ sig: (child) => read("sig", signatureOf(child)),
67
+ embedRegular: (child) => read("embedRegular", embedOf(child)),
68
+ embedBold: (child) => read("embedBold", embedOf(child)),
69
+ embedItalic: (child) => read("embedItalic", embedOf(child)),
70
+ embedBoldItalic: (child) => read("embedBoldItalic", embedOf(child))
71
+ }
72
+ });
73
+ if (preserved !== void 0) font.preserved = preserved;
74
+ const preservedAttributes = attributeRemainder({
75
+ element,
76
+ modelled: MODELLED_FONT_ATTRIBUTES
77
+ });
78
+ if (preservedAttributes !== void 0) font.preservedAttributes = preservedAttributes;
53
79
  return font;
54
80
  };
55
- const childValue = (element, name) => {
56
- const child = findChild(element, "w", name);
57
- return child ? getAttribute(child, "w", "val") ?? void 0 : void 0;
58
- };
59
- const relationshipId = (element, name) => {
60
- const child = findChild(element, "w", name);
61
- return child ? getAttribute(child, "r", "id") ?? void 0 : void 0;
81
+ const value = (element) => getAttribute(element, "w", "val") ?? void 0;
82
+ /**
83
+ * An empty `w:charset` is not an absent one.
84
+ *
85
+ * Both of `CT_Charset`'s attributes are optional, so a bare `<w:charset/>` is
86
+ * legal and says the font uses the default code page. Reading it as nothing
87
+ * would write it as nothing, and the document would come back saying something
88
+ * else: the record is what carries the element's presence.
89
+ */
90
+ const charsetOf = (element) => {
91
+ const val = value(element);
92
+ const characterSet = getAttribute(element, "w", "characterSet") ?? void 0;
93
+ return {
94
+ ...val === void 0 ? {} : { val },
95
+ ...characterSet === void 0 ? {} : { characterSet }
96
+ };
62
97
  };
63
- const assignValue = (font, key, value) => {
64
- if (value !== void 0) font[key] = value;
98
+ /**
99
+ * An embedded face with no relationship points at no binary.
100
+ *
101
+ * Writing the element back without one would declare a face nothing can
102
+ * resolve, so the reference is only a reference when it has an `r:id`.
103
+ */
104
+ const embedOf = (element) => {
105
+ const id = getAttribute(element, "r", "id");
106
+ if (!id) return;
107
+ const fontKey = getAttribute(element, "w", "fontKey") ?? void 0;
108
+ const subsetted = getAttribute(element, "w", "subsetted");
109
+ return {
110
+ id,
111
+ ...fontKey === void 0 ? {} : { fontKey },
112
+ ...subsetted === null || subsetted === void 0 ? {} : { subsetted: subsetted === "true" || subsetted === "1" || subsetted === "on" }
113
+ };
65
114
  };
66
- const assignSignatureValue = (signature, key, value) => {
67
- if (value !== void 0) signature[key] = value;
115
+ const SIGNATURE_ATTRIBUTES = [
116
+ "usb0",
117
+ "usb1",
118
+ "usb2",
119
+ "usb3",
120
+ "csb0",
121
+ "csb1"
122
+ ];
123
+ const signatureOf = (element) => {
124
+ const signature = {};
125
+ for (const attribute of SIGNATURE_ATTRIBUTES) {
126
+ const carried = getAttribute(element, "w", attribute);
127
+ if (carried !== null && carried !== void 0) signature[attribute] = carried;
128
+ }
129
+ return Object.keys(signature).length === 0 ? void 0 : signature;
68
130
  };
69
- const isFontFamily = (value) => FONT_FAMILIES.some((family) => family === value);
70
- const isFontPitch = (value) => FONT_PITCHES.some((pitch) => pitch === value);
131
+ const narrow = (carried, members) => members.find((member) => member === carried);
71
132
  //#endregion
72
133
  export { parseFontTable };
@@ -1,7 +1,7 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
2
  import { NumberingMap } from "./numberingParser.js";
3
- import { StyleMap } from "./styleParser.js";
4
3
  import { ParseContext } from "./parseContext.js";
4
+ import { StyleMap } from "./styleParser.js";
5
5
  import { parseEndnoteProperties, parseFootnoteProperties } from "./notePropertiesParser.js";
6
6
  //#region src/docx/footnoteParser.d.ts
7
7
  /**
@@ -1,9 +1,9 @@
1
1
  import { blockPlainText } from "./blockPlainText.js";
2
2
  import { parseEndnoteProperties, parseFootnoteProperties } from "./notePropertiesParser.js";
3
3
  import { parseParagraph } from "./paragraphParser.js";
4
- import { parseSdtProperties } from "./sdtProperties.js";
4
+ import { captureSdtSiblingMarkers, parseSdtProperties } from "./sdtProperties.js";
5
5
  import { parseTable } from "./tableParser.js";
6
- import { findChild, findChildren, getAttributes, getChildElements, getLocalName, parseXml } from "./xmlParser.js";
6
+ import { findChildren, findWordprocessingChild, getAttributes, getChildElements, getLocalName, parseXml } from "./xmlParser.js";
7
7
  import { PARSE_WARNING_CODES } from "@stll/docx-core/model";
8
8
  //#region src/docx/footnoteParser.ts
9
9
  /**
@@ -36,12 +36,16 @@ function parseNoteBlockContent(element, styles, theme, numbering, rels, media) {
36
36
  const table = parseTable(child, styles, theme, numbering, rels, media);
37
37
  if (table) blocks.push(table);
38
38
  } else if (localName === "sdt") {
39
- const sdtPr = findChild(child, "w", "sdtPr");
40
- const sdtEndPr = findChild(child, "w", "sdtEndPr");
41
- const sdtContent = findChild(child, "w", "sdtContent");
39
+ const sdtPr = findWordprocessingChild(child, "sdtPr");
40
+ const sdtEndPr = findWordprocessingChild(child, "sdtEndPr");
41
+ const sdtContent = findWordprocessingChild(child, "sdtContent");
42
+ const properties = parseSdtProperties(sdtPr, sdtEndPr);
43
+ const captured = captureSdtSiblingMarkers(child);
44
+ if (captured.before.length > 0) properties.rawSdtChildrenBeforeContent = captured.before;
45
+ if (captured.after.length > 0) properties.rawSdtChildrenAfterContent = captured.after;
42
46
  blocks.push({
43
47
  type: "blockSdt",
44
- properties: parseSdtProperties(sdtPr, sdtEndPr),
48
+ properties,
45
49
  content: sdtContent ? parseNoteBlockContent(sdtContent, styles, theme, numbering, rels, media) : []
46
50
  });
47
51
  }
@@ -12,11 +12,23 @@ declare const GRAPHIC_FRAME_LOCK_KEYS: ("noGrp" | "noDrilldown" | "noSelect" | "
12
12
  */
13
13
  declare const parseGraphicFrameLocks: (parent: XmlElement) => document_d_exports.ImageFrameLocks | undefined;
14
14
  /**
15
- * Emit the whole `wp:cNvGraphicFramePr` element for regenerated DrawingML.
15
+ * The locks folio gives a picture it creates itself, at the insert that creates
16
+ * it: Word writes `noChangeAspect="1"` on a picture inserted through its own
17
+ * UI, and an inserted picture should behave the same in both.
16
18
  *
17
- * Absent locks mean no authored frame was ever parsed (a Folio-created
18
- * picture), which keeps the historical `noChangeAspect="1"`.
19
+ * It lives here because it is a fact about this element, and it is applied at
20
+ * construction rather than at serialization, where "the author wrote no frame"
21
+ * and "folio made this picture" are the same `undefined`.
22
+ */
23
+ declare const FOLIO_INSERTED_PICTURE_FRAME_LOCKS: document_d_exports.ImageFrameLocks;
24
+ /**
25
+ * Emit `wp:cNvGraphicFramePr` for regenerated DrawingML, or nothing.
26
+ *
27
+ * Absent locks are the author's silence, and silence is written back as
28
+ * silence: a frame the source never carried is not invented on the rebuild
29
+ * path, where it would appear on every edited document and on none of the
30
+ * replayed ones.
19
31
  */
20
32
  declare const serializeGraphicFrameLocks: (locks: document_d_exports.ImageFrameLocks | undefined) => string;
21
33
  //#endregion
22
- export { GRAPHIC_FRAME_LOCK_KEYS, parseGraphicFrameLocks, serializeGraphicFrameLocks };
34
+ export { FOLIO_INSERTED_PICTURE_FRAME_LOCKS, GRAPHIC_FRAME_LOCK_KEYS, parseGraphicFrameLocks, serializeGraphicFrameLocks };
@@ -38,18 +38,31 @@ const parseGraphicFrameLocks = (parent) => {
38
38
  return present ? locks : void 0;
39
39
  };
40
40
  /**
41
- * Emit the whole `wp:cNvGraphicFramePr` element for regenerated DrawingML.
41
+ * The locks folio gives a picture it creates itself, at the insert that creates
42
+ * it: Word writes `noChangeAspect="1"` on a picture inserted through its own
43
+ * UI, and an inserted picture should behave the same in both.
42
44
  *
43
- * Absent locks mean no authored frame was ever parsed (a Folio-created
44
- * picture), which keeps the historical `noChangeAspect="1"`.
45
+ * It lives here because it is a fact about this element, and it is applied at
46
+ * construction rather than at serialization, where "the author wrote no frame"
47
+ * and "folio made this picture" are the same `undefined`.
48
+ */
49
+ const FOLIO_INSERTED_PICTURE_FRAME_LOCKS = { noChangeAspect: true };
50
+ /**
51
+ * Emit `wp:cNvGraphicFramePr` for regenerated DrawingML, or nothing.
52
+ *
53
+ * Absent locks are the author's silence, and silence is written back as
54
+ * silence: a frame the source never carried is not invented on the rebuild
55
+ * path, where it would appear on every edited document and on none of the
56
+ * replayed ones.
45
57
  */
46
58
  const serializeGraphicFrameLocks = (locks) => {
47
- const attrs = locks ? GRAPHIC_FRAME_LOCK_KEYS.flatMap((key) => {
59
+ if (!locks) return "";
60
+ const attrs = GRAPHIC_FRAME_LOCK_KEYS.flatMap((key) => {
48
61
  const value = locks[key];
49
62
  return value === void 0 ? [] : [`${GRAPHIC_FRAME_LOCK_ATTRIBUTES[key]}="${value ? "1" : "0"}"`];
50
- }) : ["noChangeAspect=\"1\""];
63
+ });
51
64
  const attrList = attrs.length > 0 ? ` ${attrs.join(" ")}` : "";
52
65
  return `<wp:cNvGraphicFramePr><a:graphicFrameLocks ${DRAWINGML_NAMESPACE}${attrList}/></wp:cNvGraphicFramePr>`;
53
66
  };
54
67
  //#endregion
55
- export { GRAPHIC_FRAME_LOCK_KEYS, parseGraphicFrameLocks, serializeGraphicFrameLocks };
68
+ export { FOLIO_INSERTED_PICTURE_FRAME_LOCKS, GRAPHIC_FRAME_LOCK_KEYS, parseGraphicFrameLocks, serializeGraphicFrameLocks };
@@ -1,5 +1,6 @@
1
1
  import { emuToPixels } from "../utils/units.js";
2
2
  import { parseImage, resolveImageData } from "./imageParser.js";
3
+ import { PREVIEW_KINDS } from "./previewBudget.js";
3
4
  import { findAllDeep, findChildByLocalName, findChildrenByLocalName, getAttribute, getChildElements, getLocalName, getTextContent, parseNumericAttribute } from "./xmlParser.js";
4
5
  import { escapeXmlAttribute, escapeXmlText } from "@stll/docx-core";
5
6
  //#region src/docx/groupDrawingParser.ts
@@ -182,9 +183,9 @@ const parseGroupDrawing = (drawing, rels, media) => {
182
183
  if (!image || image.size.width <= 0 || image.size.height <= 0) return null;
183
184
  const svg = createSvg(group, image.size.width, image.size.height, rels, media);
184
185
  if (!svg || svg.length > MAX_SVG_CHARACTERS) return null;
185
- image.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
186
- image.mimeType = "image/svg+xml";
187
- image.filename = "wordprocessing-group.svg";
186
+ image.src = `${PREVIEW_KINDS.wpGroup.srcPrefix}${encodeURIComponent(svg)}`;
187
+ image.mimeType = PREVIEW_KINDS.wpGroup.mimeType;
188
+ image.filename = PREVIEW_KINDS.wpGroup.filename;
188
189
  return image;
189
190
  };
190
191
  //#endregion
@@ -155,7 +155,7 @@ function getHeaderFooterText(hf) {
155
155
  function isEmptyHeaderFooter(hf) {
156
156
  if (hf.content.length === 0) return true;
157
157
  for (const item of hf.content) {
158
- if (item.type === "table") return false;
158
+ if (item.type !== "paragraph") return false;
159
159
  if (item.content.length > 0) for (const content of item.content) {
160
160
  if (content.type !== "run") return false;
161
161
  for (const rc of content.content) {
@@ -38,6 +38,7 @@ const normalizeHeaderFooterReferences = ({ documentBody, headers, footers }) =>
38
38
  normalizeTable(block);
39
39
  return;
40
40
  }
41
+ if (block.type !== "blockSdt") return;
41
42
  normalizeBlocks(block.content);
42
43
  };
43
44
  const normalizeBlocks = (blocks) => {
@@ -1,6 +1,6 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
- import { StyleMap } from "./styleParser.js";
3
2
  import { XmlElement } from "./xmlParser.js";
3
+ import { StyleMap } from "./styleParser.js";
4
4
  //#region src/docx/hyperlinkParser.d.ts
5
5
  /**
6
6
  * Parse a hyperlink element (w:hyperlink)
@@ -16,14 +16,67 @@ import { XmlElement } from "./xmlParser.js";
16
16
  * @returns Parsed Hyperlink object
17
17
  */
18
18
  declare function parseHyperlink(node: XmlElement, rels: document_d_exports.RelationshipMap | null, styles?: StyleMap | null, theme?: document_d_exports.Theme | null, media?: Map<string, document_d_exports.MediaFile> | null, rootXmlns?: Record<string, string>): document_d_exports.Hyperlink;
19
+ /** What {@link hyperlinkChildHandlers} needs to read one child of a link. */
20
+ type HyperlinkChildContext = {
21
+ /** Where a parsed or captured child lands, in source order. */
22
+ push: (child: document_d_exports.Hyperlink["children"][number]) => void;
23
+ styles: StyleMap | null;
24
+ theme: document_d_exports.Theme | null;
25
+ rels: document_d_exports.RelationshipMap | null;
26
+ media: Map<string, document_d_exports.MediaFile> | null;
27
+ inScopeXmlns: Record<string, string>;
28
+ };
19
29
  /**
20
- * One `w:hyperlink` child, or `null` for markup the model does not carry.
21
- *
22
- * Exposed so a caller that has to segment a hyperlink — one holding revision
23
- * wrappers, which the model nests the other way round — parses its plain
24
- * children exactly as {@link parseHyperlink} does.
30
+ * What a `w:hyperlink` does with every child its content model declares.
31
+ *
32
+ * `CT_Hyperlink` is `EG_PContent`, so a link may hold a permission range, a
33
+ * proofing error, a nested field or one of the eight custom-XML revision
34
+ * ranges between its runs; folio models three of the thirty-two names and
35
+ * used to drop the other twenty-nine off the end of a `switch`.
36
+ *
37
+ * Three callers read this one map: {@link parseHyperlink}, the paragraph
38
+ * parser's revision-segmenting walk, which overrides the four
39
+ * `CT_RunTrackChange` wrappers because OOXML nests a revision inside a link
40
+ * and the model nests the link inside the revision, and
41
+ * {@link parseLinkedInlineWrapper}, which walks a transparent wrapper the link
42
+ * holds. Everything else is decided here once, so a child one caller starts
43
+ * recognising is recognised by all of them rather than by whichever list
44
+ * somebody remembered to update.
25
45
  */
26
- declare function parseHyperlinkChild(node: XmlElement, styles: StyleMap | null, theme: document_d_exports.Theme | null, rels: document_d_exports.RelationshipMap | null, media: Map<string, document_d_exports.MediaFile> | null, inScopeXmlns: Record<string, string>): document_d_exports.Hyperlink["children"][number] | null;
46
+ declare const hyperlinkChildHandlers: (context: HyperlinkChildContext) => {
47
+ r: (child: XmlElement) => void;
48
+ bookmarkStart: (child: XmlElement) => void;
49
+ bookmarkEnd: (child: XmlElement) => void;
50
+ bdo: (child: XmlElement) => void;
51
+ dir: (child: XmlElement) => void;
52
+ customXml: (child: XmlElement) => void;
53
+ smartTag: (child: XmlElement) => void;
54
+ del: "capture";
55
+ ins: "capture";
56
+ moveFrom: "capture";
57
+ moveTo: "capture";
58
+ commentRangeEnd: "capture";
59
+ commentRangeStart: "capture";
60
+ customXmlDelRangeEnd: "capture";
61
+ customXmlDelRangeStart: "capture";
62
+ customXmlInsRangeEnd: "capture";
63
+ customXmlInsRangeStart: "capture";
64
+ customXmlMoveFromRangeEnd: "capture";
65
+ customXmlMoveFromRangeStart: "capture";
66
+ customXmlMoveToRangeEnd: "capture";
67
+ customXmlMoveToRangeStart: "capture";
68
+ fldSimple: (child: XmlElement) => void;
69
+ hyperlink: (child: XmlElement) => void;
70
+ moveFromRangeEnd: "capture";
71
+ moveFromRangeStart: "capture";
72
+ moveToRangeEnd: "capture";
73
+ moveToRangeStart: "capture";
74
+ permEnd: "capture";
75
+ permStart: "capture";
76
+ proofErr: "capture";
77
+ sdt: "capture";
78
+ subDoc: "capture";
79
+ };
27
80
  /**
28
81
  * Get the display text of a hyperlink
29
82
  *
@@ -66,7 +119,11 @@ declare function getHyperlinkUrl(hyperlink: document_d_exports.Hyperlink): strin
66
119
  */
67
120
  declare function hasContent(hyperlink: document_d_exports.Hyperlink): boolean;
68
121
  /**
69
- * Get all runs from a hyperlink
122
+ * Get all runs from a hyperlink, including those inside a transparent wrapper
123
+ *
124
+ * A `w:bdo`, `w:dir`, `w:smartTag` or run-level `w:customXml` says how the
125
+ * linked text is laid out or what it is tagged as, never that it is not the
126
+ * link's text, so the walk goes through it.
70
127
  *
71
128
  * @param hyperlink - Parsed Hyperlink object
72
129
  * @returns Array of Run objects
@@ -112,4 +169,4 @@ declare function createExternalHyperlink(url: string, children: document_d_expor
112
169
  target?: string;
113
170
  }): document_d_exports.Hyperlink;
114
171
  //#endregion
115
- export { createExternalHyperlink, createInternalHyperlink, getHyperlinkRuns, getHyperlinkText, getHyperlinkUrl, hasContent, isExternalLink, isInternalLink, parseHyperlink, parseHyperlinkChild, resolveHyperlinkUrl };
172
+ export { HyperlinkChildContext, createExternalHyperlink, createInternalHyperlink, getHyperlinkRuns, getHyperlinkText, getHyperlinkUrl, hasContent, hyperlinkChildHandlers, isExternalLink, isInternalLink, parseHyperlink, resolveHyperlinkUrl };
@@ -1,7 +1,11 @@
1
1
  import { sanitizeExternalUrl } from "../utils/urlSecurity.js";
2
+ import { CAPTURE, dispatchChildren, ownedElsewhere, withPreservedChildren } from "./containerChildren.js";
3
+ import { inlineWrapperOf } from "./inlineWrapperParser.js";
4
+ import { preserveInlineChild, preservedInlineCapture } from "./preservedRunContent.js";
2
5
  import { RELATIONSHIP_TYPES, resolveRelationshipIdOfType } from "./relsParser.js";
3
6
  import { parseRun } from "./runParser.js";
4
- import { getAttribute, getChildElements, getLocalName, mergeXmlnsDeclarations, parseNumericAttribute, parseOnOffAttribute } from "./xmlParser.js";
7
+ import { runHoldsPayload } from "./runPayload.js";
8
+ import { getAttribute, mergeXmlnsDeclarations, parseNumericAttribute, parseOnOffAttribute } from "./xmlParser.js";
5
9
  //#region src/docx/hyperlinkParser.ts
6
10
  /**
7
11
  * Parse bookmark start (w:bookmarkStart)
@@ -64,31 +68,141 @@ function parseHyperlink(node, rels, styles = null, theme = null, media = null, r
64
68
  if (tooltip) hyperlink.tooltip = tooltip;
65
69
  const tgtFrame = getAttribute(node, "w", "tgtFrame");
66
70
  if (tgtFrame) hyperlink.target = tgtFrame;
67
- if (parseOnOffAttribute(node, "w", "history") === true) hyperlink.history = true;
71
+ const history = parseOnOffAttribute(node, "w", "history");
72
+ if (history !== void 0) hyperlink.history = history;
68
73
  const docLocation = getAttribute(node, "w", "docLocation");
69
74
  if (docLocation) hyperlink.docLocation = docLocation;
70
75
  const inScopeXmlns = mergeXmlnsDeclarations(rootXmlns, node);
71
- for (const child of getChildElements(node)) {
72
- const parsed = parseHyperlinkChild(child, styles, theme, rels, media, inScopeXmlns);
73
- if (parsed) hyperlink.children.push(parsed);
74
- }
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);
75
92
  return hyperlink;
76
93
  }
77
94
  /**
78
- * One `w:hyperlink` child, or `null` for markup the model does not carry.
95
+ * What a `w:hyperlink` does with every child its content model declares.
96
+ *
97
+ * `CT_Hyperlink` is `EG_PContent`, so a link may hold a permission range, a
98
+ * proofing error, a nested field or one of the eight custom-XML revision
99
+ * ranges between its runs; folio models three of the thirty-two names and
100
+ * used to drop the other twenty-nine off the end of a `switch`.
79
101
  *
80
- * Exposed so a caller that has to segment a hyperlink — one holding revision
81
- * wrappers, which the model nests the other way round — parses its plain
82
- * children exactly as {@link parseHyperlink} does.
102
+ * Three callers read this one map: {@link parseHyperlink}, the paragraph
103
+ * parser's revision-segmenting walk, which overrides the four
104
+ * `CT_RunTrackChange` wrappers because OOXML nests a revision inside a link
105
+ * and the model nests the link inside the revision, and
106
+ * {@link parseLinkedInlineWrapper}, which walks a transparent wrapper the link
107
+ * holds. Everything else is decided here once, so a child one caller starts
108
+ * recognising is recognised by all of them rather than by whichever list
109
+ * somebody remembered to update.
83
110
  */
84
- function parseHyperlinkChild(node, styles, theme, rels, media, inScopeXmlns) {
85
- switch (getLocalName(node.name)) {
86
- case "r": return parseRun(node, styles, theme, rels, media, inScopeXmlns);
87
- case "bookmarkStart": return parseBookmarkStart(node);
88
- case "bookmarkEnd": return parseBookmarkEnd(node);
89
- default: return null;
90
- }
91
- }
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
+ };
161
+ };
162
+ const LINKED_SMART_TAG_PROPERTIES_OWNER = ownedElsewhere({
163
+ container: "run-level-content",
164
+ child: "smartTagPr",
165
+ reader: "inlineWrapperParser#inlineWrapperOf"
166
+ });
167
+ const LINKED_CUSTOM_XML_PROPERTIES_OWNER = ownedElsewhere({
168
+ container: "run-level-content",
169
+ child: "customXmlPr",
170
+ reader: "inlineWrapperParser#inlineWrapperOf"
171
+ });
172
+ /**
173
+ * A transparent wrapper a link holds, with the content the link would hold.
174
+ *
175
+ * `CT_BdoContentRun` and its three siblings are `EG_PContent`, the group
176
+ * `CT_Hyperlink` is, so the wrapper's declared children are run-level content
177
+ * and the decision per child is the link's own map. That is what keeps the two
178
+ * from drifting: a `w:ins` inside a `w:bdo` inside a link is captured for the
179
+ * same reason a `w:ins` directly inside the link is.
180
+ *
181
+ * The wrapper's own `w:smartTagPr` / `w:customXmlPr` is read by
182
+ * {@link inlineWrapperOf}, so it is declared owned here rather than captured a
183
+ * second time by the sink.
184
+ */
185
+ const parseLinkedInlineWrapper = (element, node, context) => {
186
+ const inScopeXmlns = mergeXmlnsDeclarations(context.inScopeXmlns, node);
187
+ const content = [];
188
+ return inlineWrapperOf(element, node, withPreservedChildren(content, dispatchChildren({
189
+ element: node,
190
+ container: "run-level-content",
191
+ 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
203
+ }
204
+ }), preservedInlineCapture));
205
+ };
92
206
  /**
93
207
  * Get the display text of a hyperlink
94
208
  *
@@ -99,10 +213,8 @@ function parseHyperlinkChild(node, styles, theme, rels, media, inScopeXmlns) {
99
213
  */
100
214
  function getHyperlinkText(hyperlink) {
101
215
  let text = "";
102
- for (const child of hyperlink.children) if (child.type === "run") {
103
- for (const content of child.content) if (content.type === "text") text += content.text;
104
- else if (content.type === "tab") text += " ";
105
- }
216
+ for (const run of getHyperlinkRuns(hyperlink)) for (const content of run.content) if (content.type === "text") text += content.text;
217
+ else if (content.type === "tab") text += " ";
106
218
  return text;
107
219
  }
108
220
  /**
@@ -144,16 +256,31 @@ function getHyperlinkUrl(hyperlink) {
144
256
  * @returns true if hyperlink has child runs
145
257
  */
146
258
  function hasContent(hyperlink) {
147
- return hyperlink.children.some((child) => child.type === "run");
259
+ return getHyperlinkRuns(hyperlink).length > 0;
148
260
  }
149
261
  /**
150
- * Get all runs from a hyperlink
262
+ * Get all runs from a hyperlink, including those inside a transparent wrapper
263
+ *
264
+ * A `w:bdo`, `w:dir`, `w:smartTag` or run-level `w:customXml` says how the
265
+ * linked text is laid out or what it is tagged as, never that it is not the
266
+ * link's text, so the walk goes through it.
151
267
  *
152
268
  * @param hyperlink - Parsed Hyperlink object
153
269
  * @returns Array of Run objects
154
270
  */
155
271
  function getHyperlinkRuns(hyperlink) {
156
- return hyperlink.children.filter((child) => child.type === "run");
272
+ const runs = [];
273
+ const collect = (items) => {
274
+ for (const item of items) {
275
+ if (item.type === "run") {
276
+ runs.push(item);
277
+ continue;
278
+ }
279
+ if (item.type === "inlineWrapper") collect(item.content);
280
+ }
281
+ };
282
+ collect(hyperlink.children);
283
+ return runs;
157
284
  }
158
285
  /**
159
286
  * Resolve a hyperlink's rId to a URL using a relationship map
@@ -219,4 +346,4 @@ function createExternalHyperlink(url, children, options) {
219
346
  };
220
347
  }
221
348
  //#endregion
222
- export { createExternalHyperlink, createInternalHyperlink, getHyperlinkRuns, getHyperlinkText, getHyperlinkUrl, hasContent, isExternalLink, isInternalLink, parseHyperlink, parseHyperlinkChild, resolveHyperlinkUrl };
349
+ export { createExternalHyperlink, createInternalHyperlink, getHyperlinkRuns, getHyperlinkText, getHyperlinkUrl, hasContent, hyperlinkChildHandlers, isExternalLink, isInternalLink, parseHyperlink, resolveHyperlinkUrl };