@stll/folio-core 0.46.0 → 0.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/dist/ai-edits/apply.d.ts +17 -1
  2. package/dist/ai-edits/apply.js +31 -27
  3. package/dist/ai-edits/headless.d.ts +9 -2
  4. package/dist/ai-edits/headless.js +5 -3
  5. package/dist/ai-edits/read.d.ts +1 -0
  6. package/dist/ai-edits/read.js +1 -0
  7. package/dist/ai-edits/snapshot.js +32 -27
  8. package/dist/ai-edits/table-cell-mutations.js +15 -7
  9. package/dist/ai-edits/table-geometry.js +21 -18
  10. package/dist/ai-edits/table-template.js +2 -2
  11. package/dist/compare/compare.js +2 -1
  12. package/dist/compare/content-alignment.js +192 -46
  13. package/dist/compare/content-types.d.ts +8 -2
  14. package/dist/compare/content.js +2 -11
  15. package/dist/compare/plan.js +7 -4
  16. package/dist/compare/section-boundary-properties.js +1 -2
  17. package/dist/content-controls/checkboxDisplay.d.ts +8 -2
  18. package/dist/content-controls/checkboxDisplay.js +11 -5
  19. package/dist/content-controls/mutateContentControls.js +41 -42
  20. package/dist/controller/layoutPipeline.js +8 -3
  21. package/dist/display-list/build/buildDisplayList.js +7 -7
  22. package/dist/display-list/build/imagePrimitives.d.ts +4 -4
  23. package/dist/display-list/build/imagePrimitives.js +38 -20
  24. package/dist/display-list/build/pageBorderPrimitives.js +2 -1
  25. package/dist/display-list/build/paragraphPrimitives.js +93 -13
  26. package/dist/display-list/build/previewPrimitives.d.ts +10 -0
  27. package/dist/display-list/build/previewPrimitives.js +89 -0
  28. package/dist/display-list/build/strokes.d.ts +177 -8
  29. package/dist/display-list/build/strokes.js +167 -47
  30. package/dist/display-list/build/tablePrimitives.js +4 -2
  31. package/dist/display-list/build/textBoxPrimitives.js +6 -4
  32. package/dist/display-list/build/textDecorations.d.ts +15 -1
  33. package/dist/display-list/build/textDecorations.js +15 -1
  34. package/dist/display-list/dom/renderDisplayListToDom.js +1 -19
  35. package/dist/display-list/primitives.d.ts +13 -2
  36. package/dist/display-list/primitives.js +36 -1
  37. package/dist/document-operations.d.ts +9 -2
  38. package/dist/document-operations.js +5 -3
  39. package/dist/docx/attributeRemainder.d.ts +34 -1
  40. package/dist/docx/attributeRemainder.js +49 -3
  41. package/dist/docx/blockContentParser.d.ts +2 -0
  42. package/dist/docx/blockContentParser.js +39 -67
  43. package/dist/docx/blockPlainText.js +3 -1
  44. package/dist/docx/borderParser.js +26 -11
  45. package/dist/docx/builtInStyles.d.ts +8 -16
  46. package/dist/docx/builtInStyles.js +54 -17
  47. package/dist/docx/commentAnchorIndex.js +1 -1
  48. package/dist/docx/commentParser.js +3 -3
  49. package/dist/docx/commentRangeIntegrity.js +1 -1
  50. package/dist/docx/commentRangeJoin.js +1 -1
  51. package/dist/docx/commentReferenceNormalization.js +3 -2
  52. package/dist/docx/commentReplyMarkers.js +1 -1
  53. package/dist/docx/compatibility.js +56 -42
  54. package/dist/docx/containerChildren.d.ts +110 -13
  55. package/dist/docx/containerChildren.gen.d.ts +16 -1
  56. package/dist/docx/containerChildren.gen.js +18 -1
  57. package/dist/docx/containerChildren.js +63 -13
  58. package/dist/docx/diagramPreview.d.ts +14 -2
  59. package/dist/docx/diagramPreview.js +81 -169
  60. package/dist/docx/documentParser.js +4 -1
  61. package/dist/docx/drawingAnchor.d.ts +87 -0
  62. package/dist/docx/drawingAnchor.js +201 -0
  63. package/dist/docx/drawingUtils.d.ts +43 -38
  64. package/dist/docx/drawingUtils.js +205 -118
  65. package/dist/docx/fontTableParser.js +102 -41
  66. package/dist/docx/footnoteParser.js +10 -6
  67. package/dist/docx/groupDrawingParser.js +4 -3
  68. package/dist/docx/headerFooterReferenceNormalization.js +1 -1
  69. package/dist/docx/hyperlinkParser.d.ts +45 -7
  70. package/dist/docx/hyperlinkParser.js +126 -57
  71. package/dist/docx/imageParser.js +127 -107
  72. package/dist/docx/index.d.ts +2 -1
  73. package/dist/docx/index.js +2 -1
  74. package/dist/docx/inlineContentRemovals.d.ts +28 -0
  75. package/dist/docx/inlineContentRemovals.js +46 -0
  76. package/dist/docx/inlineWrapperContent.d.ts +84 -3
  77. package/dist/docx/inlineWrapperContent.js +85 -4
  78. package/dist/docx/inlineWrapperParser.d.ts +11 -0
  79. package/dist/docx/inlineWrapperParser.js +60 -0
  80. package/dist/docx/nonVisualDrawingProps.d.ts +5 -13
  81. package/dist/docx/normalizeBaseDirection.js +4 -2
  82. package/dist/docx/numberingParser.d.ts +25 -2
  83. package/dist/docx/numberingParser.js +264 -361
  84. package/dist/docx/numberingReference.d.ts +9 -16
  85. package/dist/docx/numberingReference.js +17 -16
  86. package/dist/docx/numberingReferenceNormalization.js +7 -7
  87. package/dist/docx/ooxmlCounterFormatter.d.ts +1 -1
  88. package/dist/docx/ooxmlCounterFormatter.js +4 -1
  89. package/dist/docx/paraIdAttribute.d.ts +91 -1
  90. package/dist/docx/paraIdAttribute.js +79 -1
  91. package/dist/docx/paragraphParser.d.ts +9 -24
  92. package/dist/docx/paragraphParser.js +212 -396
  93. package/dist/docx/paragraphProperties.d.ts +23 -0
  94. package/dist/docx/paragraphProperties.js +279 -0
  95. package/dist/docx/paragraphPropertySource.js +2 -0
  96. package/dist/docx/paragraphTextBoxEnrichment.d.ts +2 -1
  97. package/dist/docx/paragraphTextBoxEnrichment.js +14 -7
  98. package/dist/docx/paragraphTraversal.d.ts +14 -10
  99. package/dist/docx/paragraphTraversal.js +47 -49
  100. package/dist/docx/parseWarningMessage.js +3 -0
  101. package/dist/docx/parserEnums.d.ts +6 -8
  102. package/dist/docx/parserEnums.js +4 -6
  103. package/dist/docx/preservedRunContent.js +16 -6
  104. package/dist/docx/previewBudget.d.ts +44 -23
  105. package/dist/docx/previewBudget.js +61 -30
  106. package/dist/docx/propertyElementAttributes.d.ts +178 -0
  107. package/dist/docx/propertyElementAttributes.js +114 -0
  108. package/dist/docx/renderedPageBreakNormalization.js +2 -2
  109. package/dist/docx/rezip.d.ts +28 -2
  110. package/dist/docx/rezip.js +78 -9
  111. package/dist/docx/runConsolidator.d.ts +42 -2
  112. package/dist/docx/runConsolidator.js +60 -6
  113. package/dist/docx/runParser.d.ts +54 -18
  114. package/dist/docx/runParser.js +379 -295
  115. package/dist/docx/runPayload.d.ts +5 -0
  116. package/dist/docx/runPayload.js +4 -0
  117. package/dist/docx/sdtProperties.d.ts +39 -5
  118. package/dist/docx/sdtProperties.js +205 -84
  119. package/dist/docx/sdtPropertiesPatch.d.ts +5 -9
  120. package/dist/docx/sdtPropertiesPatch.js +68 -112
  121. package/dist/docx/sectionParser.d.ts +1 -2
  122. package/dist/docx/sectionParser.js +236 -240
  123. package/dist/docx/selectiveSave.js +3 -2
  124. package/dist/docx/selectiveXmlPatch.d.ts +21 -2
  125. package/dist/docx/selectiveXmlPatch.js +195 -99
  126. package/dist/docx/serializer/blockSdtSerializer.js +2 -96
  127. package/dist/docx/serializer/borderSerializer.d.ts +5 -5
  128. package/dist/docx/serializer/borderSerializer.js +10 -8
  129. package/dist/docx/serializer/documentSerializer.js +3 -0
  130. package/dist/docx/serializer/fontTableSerializer.js +31 -3
  131. package/dist/docx/serializer/headerFooterSerializer.js +3 -0
  132. package/dist/docx/serializer/markupRangeAttributes.d.ts +9 -1
  133. package/dist/docx/serializer/markupRangeAttributes.js +9 -1
  134. package/dist/docx/serializer/noteSerializer.js +3 -0
  135. package/dist/docx/serializer/numberingSerializer.d.ts +1 -6
  136. package/dist/docx/serializer/numberingSerializer.js +81 -79
  137. package/dist/docx/serializer/paragraphSerializer.d.ts +1 -9
  138. package/dist/docx/serializer/paragraphSerializer.js +88 -188
  139. package/dist/docx/serializer/runSerializer.d.ts +1 -5
  140. package/dist/docx/serializer/runSerializer.js +109 -59
  141. package/dist/docx/serializer/sdtPropertiesSerializer.d.ts +26 -0
  142. package/dist/docx/serializer/sdtPropertiesSerializer.js +111 -0
  143. package/dist/docx/serializer/sectionPropertiesSerializer.js +34 -45
  144. package/dist/docx/serializer/settingsSerializer.js +6 -4
  145. package/dist/docx/serializer/stylesSerializer.js +8 -11
  146. package/dist/docx/serializer/tableSerializer.js +268 -100
  147. package/dist/docx/serializer/textFormattingSerializer.d.ts +28 -4
  148. package/dist/docx/serializer/textFormattingSerializer.js +111 -101
  149. package/dist/docx/serializer/xmlUtils.d.ts +1 -1
  150. package/dist/docx/serializer/xmlUtils.js +1 -1
  151. package/dist/docx/server/createBilingualDocument.js +18 -16
  152. package/dist/docx/server/migrateYjsAttrSchema.js +3 -3
  153. package/dist/docx/settingsParser.js +7 -4
  154. package/dist/docx/shadingParser.d.ts +2 -1
  155. package/dist/docx/shadingParser.js +43 -7
  156. package/dist/docx/shapeParser.js +8 -3
  157. package/dist/docx/strictNames.d.ts +11 -0
  158. package/dist/docx/strictNames.gen.d.ts +45 -0
  159. package/dist/docx/strictNames.gen.js +50 -0
  160. package/dist/docx/strictNames.js +43 -0
  161. package/dist/docx/strictValueEncodings.gen.js +133 -131
  162. package/dist/docx/styleParser.js +17 -349
  163. package/dist/docx/tableParser.d.ts +10 -1
  164. package/dist/docx/tableParser.js +505 -181
  165. package/dist/docx/textBoxParser.d.ts +3 -1
  166. package/dist/docx/textBoxParser.js +18 -8
  167. package/dist/docx/themeColorAttribute.d.ts +13 -0
  168. package/dist/docx/themeColorAttribute.js +24 -0
  169. package/dist/docx/trackedMoveRangeNormalization.js +2 -1
  170. package/dist/docx/vmlImageParser.d.ts +13 -4
  171. package/dist/docx/vmlImageParser.js +74 -31
  172. package/dist/docx/vmlPreview.js +2 -2
  173. package/dist/docx/wrapPolygon.d.ts +30 -0
  174. package/dist/docx/wrapPolygon.js +70 -0
  175. package/dist/docx/xmlParser.d.ts +14 -1
  176. package/dist/docx/xmlParser.js +18 -2
  177. package/dist/fonts/embeddedFonts.js +3 -3
  178. package/dist/headless-layout.js +2 -0
  179. package/dist/i18n/messages/catalogs.gen.d.ts +68 -0
  180. package/dist/i18n/messages/catalogs.gen.js +102 -34
  181. package/dist/i18n/messages/messages.gen.d.ts +4 -0
  182. package/dist/internal/headlessRevisionResolution.js +9 -0
  183. package/dist/internal/pageBreakRunSourceDescendantIndex.js +3 -1
  184. package/dist/internal/paragraphFormattingSerialization.d.ts +20 -9
  185. package/dist/internal/paragraphFormattingSerialization.js +118 -83
  186. package/dist/layout-bridge/convert/footnoteLayout.d.ts +1 -0
  187. package/dist/layout-bridge/convert/footnoteLayout.js +1 -0
  188. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -0
  189. package/dist/layout-bridge/convert/headerFooterLayout.js +2 -0
  190. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +17 -12
  191. package/dist/layout-bridge/convert/toFlowBlocks.js +177 -101
  192. package/dist/layout-engine/index.d.ts +2 -2
  193. package/dist/layout-engine/index.js +53 -17
  194. package/dist/layout-engine/measure/measureBlocks.d.ts +3 -0
  195. package/dist/layout-engine/measure/measureBlocks.js +6 -10
  196. package/dist/layout-engine/measure/tableCellGrid.js +2 -1
  197. package/dist/layout-engine/measure/tableFragmentBorderGeometry.js +2 -1
  198. package/dist/layout-engine/measure/tableInlinePlacement.js +2 -5
  199. package/dist/layout-engine/paragraphSequence.js +3 -2
  200. package/dist/layout-engine/renderedBreakReconciliation.js +2 -1
  201. package/dist/layout-engine/section-breaks.d.ts +49 -2
  202. package/dist/layout-engine/section-breaks.js +55 -4
  203. package/dist/layout-engine/types.d.ts +47 -17
  204. package/dist/layout-engine/types.js +16 -1
  205. package/dist/layout-painter/borderStroke.d.ts +18 -4
  206. package/dist/layout-painter/renderPage.js +6 -4
  207. package/dist/layout-painter/renderParagraph.d.ts +2 -1
  208. package/dist/layout-painter/renderParagraph.js +13 -26
  209. package/dist/layout-painter/renderTable.d.ts +4 -1
  210. package/dist/layout-painter/renderTable.js +22 -22
  211. package/dist/layout-painter/renderTextBox.js +5 -3
  212. package/dist/markdown/renderBlock.js +3 -1
  213. package/dist/markdown/renderRuns.js +7 -2
  214. package/dist/markdown/renderTable.js +2 -1
  215. package/dist/model.d.ts +3 -3
  216. package/dist/model.js +2 -2
  217. package/dist/paged-layout/sectionBlockWidths.d.ts +3 -0
  218. package/dist/paged-layout/sectionBlockWidths.js +26 -4
  219. package/dist/prosemirror/attrs/index.d.ts +22 -4
  220. package/dist/prosemirror/attrs/index.js +498 -60
  221. package/dist/prosemirror/bookmarkBoundaryAttrs.d.ts +9 -1
  222. package/dist/prosemirror/bookmarkBoundaryAttrs.js +22 -3
  223. package/dist/prosemirror/commands/comments.js +68 -53
  224. package/dist/prosemirror/commands/contentControls.js +24 -19
  225. package/dist/prosemirror/commands/image.d.ts +1 -1
  226. package/dist/prosemirror/commands/image.js +4 -1
  227. package/dist/prosemirror/commands/paragraph.d.ts +2 -1
  228. package/dist/prosemirror/commands/propertyChangeScope.d.ts +12 -4
  229. package/dist/prosemirror/commands/propertyChangeScope.js +22 -4
  230. package/dist/prosemirror/commands/sectionBreak.d.ts +33 -1
  231. package/dist/prosemirror/commands/sectionBreak.js +187 -11
  232. package/dist/prosemirror/conversion/fromProseDoc.d.ts +18 -2
  233. package/dist/prosemirror/conversion/fromProseDoc.js +330 -183
  234. package/dist/prosemirror/conversion/index.d.ts +2 -2
  235. package/dist/prosemirror/conversion/preservedSinkCarriers.d.ts +39 -0
  236. package/dist/prosemirror/conversion/preservedSinkCarriers.js +19 -0
  237. package/dist/prosemirror/conversion/runShadingMark.js +14 -1
  238. package/dist/prosemirror/conversion/sdtAttrs.d.ts +10 -1
  239. package/dist/prosemirror/conversion/sdtAttrs.js +19 -5
  240. package/dist/prosemirror/conversion/toProseDoc.js +371 -141
  241. package/dist/prosemirror/emptyRangeAnchor.d.ts +53 -0
  242. package/dist/prosemirror/emptyRangeAnchor.js +158 -0
  243. package/dist/prosemirror/extensions/StarterKit.js +8 -2
  244. package/dist/prosemirror/extensions/core/DocExtension.js +1 -1
  245. package/dist/prosemirror/extensions/core/ParagraphExtension.js +19 -15
  246. package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +3 -2
  247. package/dist/prosemirror/extensions/features/ListExtension.js +43 -24
  248. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +4 -3
  249. package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +3 -3
  250. package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +5 -5
  251. package/dist/prosemirror/extensions/features/pasteCleanup.d.ts +3 -1
  252. package/dist/prosemirror/extensions/features/pasteCleanup.js +56 -2
  253. package/dist/prosemirror/extensions/features/pastedHeadingStyles.js +5 -4
  254. package/dist/prosemirror/extensions/markRegistry.d.ts +26 -2
  255. package/dist/prosemirror/extensions/markRegistry.js +73 -10
  256. package/dist/prosemirror/extensions/marks/InlineWrapperExtension.js +17 -3
  257. package/dist/prosemirror/extensions/marks/RunIdentityExtension.d.ts +26 -0
  258. package/dist/prosemirror/extensions/marks/RunIdentityExtension.js +134 -0
  259. package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +2 -1
  260. package/dist/prosemirror/extensions/marks/UnderlineExtension.js +12 -18
  261. package/dist/prosemirror/extensions/marks/markUtils.js +2 -1
  262. package/dist/prosemirror/extensions/nodes/BlockBookmarkBoundaryExtension.d.ts +29 -0
  263. package/dist/prosemirror/extensions/nodes/BlockBookmarkBoundaryExtension.js +46 -0
  264. package/dist/prosemirror/extensions/nodes/BlockSdtExtension.d.ts +4 -3
  265. package/dist/prosemirror/extensions/nodes/BlockSdtExtension.js +18 -13
  266. package/dist/prosemirror/extensions/nodes/BookmarkBoundaryExtension.js +28 -53
  267. package/dist/prosemirror/extensions/nodes/CommentReferenceExtension.js +10 -0
  268. package/dist/prosemirror/extensions/nodes/ImageExtension.js +8 -1
  269. package/dist/prosemirror/extensions/nodes/MoveRangeBoundaryExtension.d.ts +11 -0
  270. package/dist/prosemirror/extensions/nodes/MoveRangeBoundaryExtension.js +43 -0
  271. package/dist/prosemirror/extensions/nodes/RangeAnchorExtension.d.ts +13 -0
  272. package/dist/prosemirror/extensions/nodes/RangeAnchorExtension.js +65 -0
  273. package/dist/prosemirror/extensions/nodes/SdtExtension.d.ts +3 -1
  274. package/dist/prosemirror/extensions/nodes/SdtExtension.js +22 -16
  275. package/dist/prosemirror/extensions/nodes/ShapeExtension.js +4 -0
  276. package/dist/prosemirror/extensions/nodes/TableExtension.js +141 -123
  277. package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +4 -0
  278. package/dist/prosemirror/extensions/nodes/bookmarkBoundaryDom.d.ts +23 -0
  279. package/dist/prosemirror/extensions/nodes/bookmarkBoundaryDom.js +57 -0
  280. package/dist/prosemirror/extensions/types.d.ts +12 -3
  281. package/dist/prosemirror/index.d.ts +4 -2
  282. package/dist/prosemirror/index.js +2 -1
  283. package/dist/prosemirror/inlineWrapperStack.js +20 -3
  284. package/dist/prosemirror/listMarker.d.ts +2 -2
  285. package/dist/prosemirror/listMarker.js +7 -8
  286. package/dist/prosemirror/listRenderingAttrs.js +11 -1
  287. package/dist/prosemirror/listState.d.ts +62 -0
  288. package/dist/prosemirror/listState.js +49 -0
  289. package/dist/prosemirror/moveRangeBoundaryAttrs.d.ts +13 -0
  290. package/dist/prosemirror/moveRangeBoundaryAttrs.js +114 -0
  291. package/dist/prosemirror/numberedRefFields.js +4 -4
  292. package/dist/prosemirror/numberingAttr.d.ts +55 -0
  293. package/dist/prosemirror/numberingAttr.js +74 -0
  294. package/dist/prosemirror/outlineLevelAttr.d.ts +29 -0
  295. package/dist/prosemirror/outlineLevelAttr.js +42 -0
  296. package/dist/prosemirror/paragraphFormattingProvenance.d.ts +9 -0
  297. package/dist/prosemirror/paragraphFormattingProvenance.js +4 -1
  298. package/dist/prosemirror/plugins/selectionTracker.d.ts +3 -6
  299. package/dist/prosemirror/plugins/selectionTracker.js +3 -10
  300. package/dist/prosemirror/rangeAnchorAttrs.d.ts +14 -0
  301. package/dist/prosemirror/rangeAnchorAttrs.js +101 -0
  302. package/dist/prosemirror/replacedAnnotations.d.ts +1 -1
  303. package/dist/prosemirror/replacedAnnotations.js +24 -6
  304. package/dist/prosemirror/revisionCarriers.d.ts +86 -2
  305. package/dist/prosemirror/revisionCarriers.js +86 -60
  306. package/dist/prosemirror/runFormattingInlineCarriers.d.ts +2 -0
  307. package/dist/prosemirror/runFormattingInlineCarriers.js +2 -0
  308. package/dist/prosemirror/runIdentity.d.ts +28 -0
  309. package/dist/prosemirror/runIdentity.js +36 -0
  310. package/dist/prosemirror/runStyleFormatting.js +1 -1
  311. package/dist/prosemirror/schema/index.d.ts +2 -2
  312. package/dist/prosemirror/schema/marks.d.ts +23 -4
  313. package/dist/prosemirror/schema/nodes.d.ts +220 -24
  314. package/dist/prosemirror/sectionCarrier.d.ts +37 -0
  315. package/dist/prosemirror/sectionCarrier.js +40 -0
  316. package/dist/prosemirror/selectionState.d.ts +3 -0
  317. package/dist/prosemirror/selectionState.js +4 -1
  318. package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +5 -4
  319. package/dist/prosemirror/styles/resolvedStyleAttrs.js +15 -13
  320. package/dist/prosemirror/tableResize.js +5 -6
  321. package/dist/prosemirror/trackedRunInlineAtoms.d.ts +2 -0
  322. package/dist/prosemirror/trackedRunInlineAtoms.js +2 -0
  323. package/dist/prosemirror/utils/extractTrackedChanges.d.ts +10 -11
  324. package/dist/prosemirror/utils/extractTrackedChanges.js +109 -92
  325. package/dist/prosemirror/validation.js +17 -6
  326. package/dist/prosemirror/yjsDocumentMetadata.d.ts +2 -2
  327. package/dist/prosemirror/yjsDocumentMetadata.js +428 -7
  328. package/dist/prosemirror/zeroWidthAnchors.js +4 -0
  329. package/dist/style-sets/extract.js +4 -4
  330. package/dist/style-sets/stellaStyle.js +36 -23
  331. package/dist/types/colors.d.ts +2 -2
  332. package/dist/types/content.d.ts +2 -2
  333. package/dist/types/documentEnumValues.d.ts +53 -26
  334. package/dist/types/documentEnumValues.js +72 -174
  335. package/dist/types/formatting.d.ts +2 -2
  336. package/dist/types/index.d.ts +9 -2
  337. package/dist/utils/borderCss.d.ts +246 -0
  338. package/dist/utils/borderCss.js +325 -0
  339. package/dist/utils/colorResolver.d.ts +4 -3
  340. package/dist/utils/colorResolver.js +45 -76
  341. package/dist/utils/createDocument.js +24 -6
  342. package/dist/utils/findReplace.js +52 -10
  343. package/dist/utils/formatToStyle.d.ts +84 -2
  344. package/dist/utils/formatToStyle.js +133 -52
  345. package/dist/utils/headingCollector.js +3 -2
  346. package/dist/utils/mergeDocumentContent.js +5 -3
  347. package/dist/utils/paragraphFormattingMerge.js +27 -6
  348. package/dist/utils/replaceText.js +1 -1
  349. package/dist/utils/tableOperations.d.ts +5 -3
  350. package/dist/utils/tableOperations.js +14 -1
  351. package/dist/utils/tablePlacement.d.ts +7 -0
  352. package/dist/utils/tablePlacement.js +14 -0
  353. package/dist/utils/textDirectionFlow.d.ts +15 -0
  354. package/dist/utils/textDirectionFlow.js +38 -0
  355. package/dist/utils/textFormattingMerge.js +16 -4
  356. package/package.json +10 -10
  357. package/dist/ai-edits/__fixtures__/paragraphs.d.ts +0 -17
  358. package/dist/ai-edits/__fixtures__/paragraphs.js +0 -33
  359. package/dist/compare/__fixtures__/body-sequence.d.ts +0 -119
  360. package/dist/compare/__fixtures__/body-sequence.js +0 -225
  361. package/dist/compare/__fixtures__/nested-table.d.ts +0 -16
  362. package/dist/compare/__fixtures__/nested-table.js +0 -50
  363. package/dist/compare/__fixtures__/numbered-list.d.ts +0 -34
  364. package/dist/compare/__fixtures__/numbered-list.js +0 -85
  365. package/dist/docx/bookmarkPlacement.d.ts +0 -9
  366. package/dist/docx/bookmarkPlacement.js +0 -52
  367. package/dist/fonts/embeddedFontTable.d.ts +0 -45
  368. package/dist/fonts/embeddedFontTable.js +0 -80
  369. package/dist/prosemirror/extensions/marks/PageBreakRunOwnerExtension.d.ts +0 -13
  370. package/dist/prosemirror/extensions/marks/PageBreakRunOwnerExtension.js +0 -39
@@ -1,11 +1,14 @@
1
- import { bytesToDataUrl } from "../utils/base64.js";
2
- import { PREVIEW_KINDS } from "./previewBudget.js";
3
1
  import { resolveRelationshipIdOfType, resolveRelativePath } from "./relsParser.js";
4
2
  import { OFFICE_RELATIONSHIP_NAMESPACE_URIS, findChildByNamespaceUri, getAttribute, getAttributeByNamespaceUri, getLocalName, parseNumericAttribute, parseXmlDocument } from "./xmlParser.js";
5
3
  //#region src/docx/diagramPreview.ts
4
+ /**
5
+ * How many `dsp:sp` a preview describes at most.
6
+ *
7
+ * The bound is on the description rather than on any picture built from it:
8
+ * the shapes are what a backend draws, and a drawing with ten thousand of them
9
+ * is a drawing folio summarises rather than reproduces.
10
+ */
6
11
  const MAX_PREVIEW_SHAPES = 128;
7
- const MAX_PREVIEW_PIXELS = 144e4;
8
- const MAX_PREVIEW_PAINT_PIXELS = MAX_PREVIEW_PIXELS * 4;
9
12
  const DRAWINGML_NAMESPACE_URIS = /* @__PURE__ */ new Set(["http://schemas.openxmlformats.org/drawingml/2006/main", "http://purl.oclc.org/ooxml/drawingml/main"]);
10
13
  const DIAGRAM_NAMESPACE_URIS = /* @__PURE__ */ new Set(["http://schemas.openxmlformats.org/drawingml/2006/diagram", "http://purl.oclc.org/ooxml/drawingml/diagram"]);
11
14
  const DIAGRAM_DRAWING_NAMESPACE_URIS = /* @__PURE__ */ new Set(["http://schemas.microsoft.com/office/drawing/2008/diagram"]);
@@ -13,140 +16,6 @@ const DIAGRAM_DATA_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/office
13
16
  const DIAGRAM_DRAWING_RELATIONSHIP_TYPE = "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing";
14
17
  const DOCUMENT_PART_PATH = "word/document.xml";
15
18
  const WORD_DRAWING_NAMESPACE_URIS = /* @__PURE__ */ new Set(["http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing", "http://purl.oclc.org/ooxml/drawingml/wordprocessingDrawing"]);
16
- /**
17
- * The preview is a megapixel raster, so both checksums run over megabytes.
18
- * `for (const byte of bytes)` drives the array iterator protocol once per
19
- * byte, which profiles as the dominant cost of parsing a SmartArt document;
20
- * indexed loops and a table-driven CRC produce the same numbers without it.
21
- */
22
- const CRC32_TABLE = (() => {
23
- const table = /* @__PURE__ */ new Uint32Array(256);
24
- for (let index = 0; index < 256; index += 1) {
25
- let value = index;
26
- for (let bit = 0; bit < 8; bit += 1) value = value >>> 1 ^ (value & 1 ? 3988292384 : 0);
27
- table[index] = value >>> 0;
28
- }
29
- return table;
30
- })();
31
- const crc32 = (bytes) => {
32
- let crc = 4294967295;
33
- for (let index = 0; index < bytes.length; index += 1) crc = crc >>> 8 ^ CRC32_TABLE[(crc ^ bytes[index]) & 255];
34
- return (crc ^ 4294967295) >>> 0;
35
- };
36
- /**
37
- * `a` and `b` stay below 2^31 for 5552 iterations from any legal state, so the
38
- * modulo runs per block rather than per byte.
39
- */
40
- const ADLER32_BLOCK = 5552;
41
- const adler32 = (bytes) => {
42
- let a = 1;
43
- let b = 0;
44
- let index = 0;
45
- while (index < bytes.length) {
46
- const end = Math.min(index + ADLER32_BLOCK, bytes.length);
47
- for (; index < end; index += 1) {
48
- a += bytes[index];
49
- b += a;
50
- }
51
- a %= 65521;
52
- b %= 65521;
53
- }
54
- return b << 16 | a;
55
- };
56
- const pngChunk = (type, data) => {
57
- const name = new TextEncoder().encode(type);
58
- const output = new Uint8Array(12 + data.length);
59
- const view = new DataView(output.buffer);
60
- view.setUint32(0, data.length);
61
- output.set(name, 4);
62
- output.set(data, 8);
63
- view.setUint32(8 + data.length, crc32(output.subarray(4, 8 + data.length)));
64
- return output;
65
- };
66
- const previewPng = (width, height, shapes) => {
67
- const scale = Math.min(1, Math.sqrt(MAX_PREVIEW_PIXELS / (width * height)));
68
- const w = Math.max(1, Math.round(width * scale));
69
- const h = Math.max(1, Math.round(height * scale));
70
- const pixels = new Uint8Array((w * 4 + 1) * h);
71
- for (let y = 0; y < h; y += 1) {
72
- const row = y * (w * 4 + 1);
73
- pixels[row] = 0;
74
- for (let x = 0; x < w; x += 1) {
75
- const index = row + 1 + x * 4;
76
- pixels[index] = 238;
77
- pixels[index + 1] = 242;
78
- pixels[index + 2] = 247;
79
- pixels[index + 3] = 255;
80
- }
81
- }
82
- let paintedPixels = 0;
83
- for (const shape of shapes) {
84
- const sx = Math.max(0, Math.round(shape.x / width * w));
85
- const sy = Math.max(0, Math.round(shape.y / height * h));
86
- const ex = Math.min(w, Math.round((shape.x + shape.width) / width * w));
87
- const ey = Math.min(h, Math.round((shape.y + shape.height) / height * h));
88
- const red = Number.parseInt(shape.color.slice(0, 2), 16) || 232;
89
- const green = Number.parseInt(shape.color.slice(2, 4), 16) || 238;
90
- const blue = Number.parseInt(shape.color.slice(4, 6), 16) || 247;
91
- const shapePixels = Math.max(0, ex - sx) * Math.max(0, ey - sy);
92
- if (paintedPixels + shapePixels > MAX_PREVIEW_PAINT_PIXELS) break;
93
- paintedPixels += shapePixels;
94
- for (let y = sy; y < ey; y += 1) {
95
- const row = y * (w * 4 + 1);
96
- for (let x = sx; x < ex; x += 1) {
97
- const index = row + 1 + x * 4;
98
- pixels[index] = red;
99
- pixels[index + 1] = green;
100
- pixels[index + 2] = blue;
101
- }
102
- }
103
- }
104
- const compressed = new Uint8Array(2 + pixels.length + Math.ceil(pixels.length / 65535) * 5 + 4);
105
- compressed[0] = 120;
106
- compressed[1] = 1;
107
- let cursor = 2;
108
- for (let offset = 0; offset < pixels.length;) {
109
- const length = Math.min(65535, pixels.length - offset);
110
- compressed[cursor++] = offset + length === pixels.length ? 1 : 0;
111
- compressed[cursor++] = length & 255;
112
- compressed[cursor++] = length >>> 8;
113
- compressed[cursor++] = ~length & 255;
114
- compressed[cursor++] = ~length >>> 8 & 255;
115
- compressed.set(pixels.subarray(offset, offset + length), cursor);
116
- cursor += length;
117
- offset += length;
118
- }
119
- new DataView(compressed.buffer).setUint32(cursor, adler32(pixels));
120
- const output = compressed;
121
- const signature = new Uint8Array([
122
- 137,
123
- 80,
124
- 78,
125
- 71,
126
- 13,
127
- 10,
128
- 26,
129
- 10
130
- ]);
131
- const header = /* @__PURE__ */ new Uint8Array(13);
132
- new DataView(header.buffer).setUint32(0, w);
133
- new DataView(header.buffer).setUint32(4, h);
134
- header[8] = 8;
135
- header[9] = 6;
136
- const chunks = [
137
- signature,
138
- pngChunk("IHDR", header),
139
- pngChunk("IDAT", output),
140
- pngChunk("IEND", /* @__PURE__ */ new Uint8Array())
141
- ];
142
- const png = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0));
143
- let position = 0;
144
- for (const chunk of chunks) {
145
- png.set(chunk, position);
146
- position += chunk.length;
147
- }
148
- return png;
149
- };
150
19
  const extent = (drawing) => {
151
20
  const value = findChildByNamespaceUri(findChildByNamespaceUri(drawing, WORD_DRAWING_NAMESPACE_URIS, "inline") ?? findChildByNamespaceUri(drawing, WORD_DRAWING_NAMESPACE_URIS, "anchor"), WORD_DRAWING_NAMESPACE_URIS, "extent");
152
21
  return {
@@ -155,11 +24,47 @@ const extent = (drawing) => {
155
24
  };
156
25
  };
157
26
  /** Parse the part a relationship of the given type names, by that relationship's id. */
158
- const partByRelationshipId = ({ rels, media, rId, type }) => {
27
+ const partByRelationshipId = ({ rels, media, rId, type, cache }) => {
159
28
  const resolved = resolveRelationshipIdOfType(rels, rId ?? void 0, type);
160
29
  if (resolved.status !== "resolved" || !resolved.relationship.target) return null;
161
- const file = media.get(resolveRelativePath(DOCUMENT_PART_PATH, resolved.relationship.target));
162
- return file?.data ? parseXmlDocument(new TextDecoder().decode(file.data)) : null;
30
+ const path = resolveRelativePath(DOCUMENT_PART_PATH, resolved.relationship.target);
31
+ const cached = cache.get(path);
32
+ if (cached !== void 0) return cached;
33
+ const file = media.get(path);
34
+ const parsed = file?.data ? parseXmlDocument(new TextDecoder().decode(file.data)) : null;
35
+ cache.set(path, parsed);
36
+ return parsed;
37
+ };
38
+ const matchesNamespace = (element, namespaceUris, localName) => element.namespaceUri !== void 0 && namespaceUris.has(element.namespaceUri) && getLocalName(element.name ?? "") === localName;
39
+ /**
40
+ * Descendants in document order, stopping once `limit` of them are found.
41
+ *
42
+ * The walk used to collect every match and slice afterwards, so a drawing with
43
+ * ten thousand shapes built a ten-thousand-element array to keep a hundred and
44
+ * twenty-eight of them. The bound belongs in the walk, not after it.
45
+ */
46
+ const descendantsByNamespace = (root, namespaceUris, localName, limit) => {
47
+ const result = [];
48
+ const visit = (element) => {
49
+ if (matchesNamespace(element, namespaceUris, localName)) {
50
+ result.push(element);
51
+ return result.length < limit;
52
+ }
53
+ for (const child of element.elements ?? []) if (child.type === "element" && !visit(child)) return false;
54
+ return true;
55
+ };
56
+ visit(root);
57
+ return result;
58
+ };
59
+ /** The first match in document order, without walking the rest of the subtree. */
60
+ const firstDescendantByNamespace = (root, namespaceUris, localName) => {
61
+ if (matchesNamespace(root, namespaceUris, localName)) return root;
62
+ for (const child of root.elements ?? []) {
63
+ if (child.type !== "element") continue;
64
+ const found = firstDescendantByNamespace(child, namespaceUris, localName);
65
+ if (found) return found;
66
+ }
67
+ return null;
163
68
  };
164
69
  /**
165
70
  * The drawing cache this diagram points at, reached through its own ids.
@@ -170,25 +75,27 @@ const partByRelationshipId = ({ rels, media, rId, type }) => {
170
75
  * more than one, which is why the scan refused outright on a second match:
171
76
  * both diagrams in a two-diagram document then got no preview at all.
172
77
  */
173
- const cachedDiagramShapes = (graphicData, rels, media) => {
78
+ const cachedDiagramShapes = (graphicData, rels, media, cache) => {
174
79
  const relIds = findChildByNamespaceUri(graphicData, DIAGRAM_NAMESPACE_URIS, "relIds");
175
80
  const data = partByRelationshipId({
176
81
  rels,
177
82
  media,
83
+ cache,
178
84
  rId: getAttributeByNamespaceUri(relIds, OFFICE_RELATIONSHIP_NAMESPACE_URIS, "dm"),
179
85
  type: DIAGRAM_DATA_RELATIONSHIP_TYPE
180
86
  });
181
87
  if (!data) return [];
182
- const dataModelExt = descendantsByNamespace(data, DIAGRAM_DRAWING_NAMESPACE_URIS, "dataModelExt").at(0);
88
+ const dataModelExt = firstDescendantByNamespace(data, DIAGRAM_DRAWING_NAMESPACE_URIS, "dataModelExt");
183
89
  const root = partByRelationshipId({
184
90
  rels,
185
91
  media,
92
+ cache,
186
93
  rId: getAttribute(dataModelExt, null, "relId"),
187
94
  type: DIAGRAM_DRAWING_RELATIONSHIP_TYPE
188
95
  });
189
96
  if (!root) return [];
190
97
  const shapes = [];
191
- for (const shape of descendantsByNamespace(root, DIAGRAM_DRAWING_NAMESPACE_URIS, "sp").slice(0, MAX_PREVIEW_SHAPES)) {
98
+ for (const shape of descendantsByNamespace(root, DIAGRAM_DRAWING_NAMESPACE_URIS, "sp", 128)) {
192
99
  const properties = findChildByNamespaceUri(shape, DIAGRAM_DRAWING_NAMESPACE_URIS, "spPr");
193
100
  const transform = findChildByNamespaceUri(properties, DRAWINGML_NAMESPACE_URIS, "xfrm");
194
101
  const offset = findChildByNamespaceUri(transform, DRAWINGML_NAMESPACE_URIS, "off");
@@ -207,27 +114,28 @@ const cachedDiagramShapes = (graphicData, rels, media) => {
207
114
  }
208
115
  return shapes;
209
116
  };
210
- const matchesNamespace = (element, namespaceUris, localName) => element.namespaceUri !== void 0 && namespaceUris.has(element.namespaceUri) && getLocalName(element.name ?? "") === localName;
211
- const descendantsByNamespace = (root, namespaceUris, localName) => {
212
- const result = [];
213
- const visit = (element) => {
214
- if (matchesNamespace(element, namespaceUris, localName)) result.push(element);
215
- for (const child of element.elements ?? []) if (child.type === "element") visit(child);
216
- };
217
- visit(root);
218
- return result;
219
- };
220
- /** The first match in document order, without walking the rest of the subtree. */
221
- const firstDescendantByNamespace = (root, namespaceUris, localName) => {
222
- if (matchesNamespace(root, namespaceUris, localName)) return root;
223
- for (const child of root.elements ?? []) {
224
- if (child.type !== "element") continue;
225
- const found = firstDescendantByNamespace(child, namespaceUris, localName);
226
- if (found) return found;
227
- }
228
- return null;
117
+ /**
118
+ * The part cache, keyed by the package's own media map.
119
+ *
120
+ * The cache has to be per package: a global one would answer one document's
121
+ * `word/diagrams/data1.xml` with another's. Keying it on the media map gets
122
+ * that lifetime for free and without threading a reader through every drawing
123
+ * call site, and a weak key means the cache dies with the package rather than
124
+ * retaining its parts.
125
+ */
126
+ const PART_CACHES = /* @__PURE__ */ new WeakMap();
127
+ const partCacheFor = (media) => {
128
+ const existing = PART_CACHES.get(media);
129
+ if (existing) return existing;
130
+ const created = /* @__PURE__ */ new Map();
131
+ PART_CACHES.set(media, created);
132
+ return created;
229
133
  };
230
- /** Create a deliberately simple, bounded preview; it is never an editable diagram projection. */
134
+ /**
135
+ * Describe a diagram drawing, without drawing it.
136
+ *
137
+ * Deliberately simple and bounded; it is never an editable diagram projection.
138
+ */
231
139
  const parseDiagramPreview = (drawing, rels, media) => {
232
140
  if (!rels || !media) return null;
233
141
  const graphicData = firstDescendantByNamespace(drawing, DRAWINGML_NAMESPACE_URIS, "graphicData");
@@ -236,10 +144,14 @@ const parseDiagramPreview = (drawing, rels, media) => {
236
144
  if (width <= 0 || height <= 0) return null;
237
145
  return {
238
146
  type: "image",
239
- rId: "",
240
- src: bytesToDataUrl(previewPng(width, height, cachedDiagramShapes(graphicData, rels, media)), PREVIEW_KINDS.smartArt.mimeType),
241
- mimeType: PREVIEW_KINDS.smartArt.mimeType,
242
- filename: PREVIEW_KINDS.smartArt.filename,
147
+ preview: {
148
+ kind: "diagram",
149
+ extent: {
150
+ width,
151
+ height
152
+ },
153
+ shapes: cachedDiagramShapes(graphicData, rels, media, partCacheFor(media))
154
+ },
243
155
  size: {
244
156
  width,
245
157
  height
@@ -248,4 +160,4 @@ const parseDiagramPreview = (drawing, rels, media) => {
248
160
  };
249
161
  };
250
162
  //#endregion
251
- export { parseDiagramPreview };
163
+ export { MAX_PREVIEW_SHAPES, parseDiagramPreview };
@@ -127,7 +127,10 @@ function parseDocumentBody(xml, styles = null, theme = null, numbering = null, r
127
127
  if (!documentEl) return result;
128
128
  const bodyEl = findChild(documentEl, "w", "body");
129
129
  if (!bodyEl) return result;
130
- result.content = parseBlockContent(bodyEl, styles, theme, numbering, rels, media, { rootXmlns: collectXmlnsDeclarations(documentEl) });
130
+ result.content = parseBlockContent(bodyEl, styles, theme, numbering, rels, media, {
131
+ rootXmlns: collectXmlnsDeclarations(documentEl),
132
+ context
133
+ });
131
134
  const finalSectPr = findChild(bodyEl, "w", "sectPr");
132
135
  if (finalSectPr) result.finalSectionProperties = parseSectionProperties(finalSectPr, context);
133
136
  canonicalizeLeadingBodySectionProperties(bodyEl, result);
@@ -0,0 +1,87 @@
1
+ import { document_d_exports } from "../types/document.js";
2
+ import { XmlElement } from "./xmlParser.js";
3
+ //#region src/docx/drawingAnchor.d.ts
4
+ /** WordprocessingDrawing, Transitional and Strict (ECMA-376 Parts 1 and 4). */
5
+ declare const WORDPROCESSING_DRAWING_NAMESPACE_URIS: ReadonlySet<string>;
6
+ /** The anchor fields that are a single `ST_OnOff`-style attribute. */
7
+ type DrawingAnchorFlag = { [Key in keyof document_d_exports.DrawingAnchor]-?: NonNullable<document_d_exports.DrawingAnchor[Key]> extends boolean ? Key : never; }[keyof document_d_exports.DrawingAnchor];
8
+ /** Every boolean the anchor models, from the total map above. */
9
+ declare const DRAWING_ANCHOR_FLAG_KEYS: DrawingAnchorFlag[];
10
+ /**
11
+ * Read `CT_Anchor`'s own attributes and its `wp:simplePos` offsets.
12
+ *
13
+ * Undefined when the element states none of them: an anchor whose every
14
+ * attribute is the spec default holds nothing the model needs to remember, and
15
+ * recording an empty record would make a rebuild write values the source did
16
+ * not.
17
+ */
18
+ declare const parseDrawingAnchor: (anchorEl: XmlElement) => document_d_exports.DrawingAnchor | undefined;
19
+ /**
20
+ * The insets to write on each of the two elements that can carry them.
21
+ *
22
+ * A drawing whose slots say where its insets were authored gets each one back
23
+ * on that element, which is the only way the wrap child's own set survives a
24
+ * rebuild. A drawing with no slots, or one an editor command has moved an inset
25
+ * on, states the value in force on the drawing: that is where OOXML reads an
26
+ * inset from when the wrap child states none, so the effective value is right
27
+ * either way, and inventing a wrap-child inset from a moved value would not be.
28
+ */
29
+ declare const resolveWrapDistances: (wrap: document_d_exports.ImageWrap | undefined) => {
30
+ drawing: document_d_exports.WrapDistances;
31
+ wrapChild: document_d_exports.WrapDistances;
32
+ };
33
+ type ResolvedEffectExtents = {
34
+ /** `wp:inline` or `wp:anchor`; undefined writes the all-zero reservation. */
35
+ drawing: document_d_exports.ImagePadding | undefined;
36
+ /** `wp:wrapSquare` or `wp:wrapTopAndBottom`, which write nothing when undefined. */
37
+ wrapChild: document_d_exports.ImagePadding | undefined;
38
+ };
39
+ /**
40
+ * The `wp:effectExtent` to write on each of the two elements that carry one.
41
+ *
42
+ * {@link resolveWrapDistances}'s rule, one element over: a drawing whose slots
43
+ * say where the reservations were authored gets each one back on that element,
44
+ * which is the only way the wrap child's own survives a rebuild. Once the
45
+ * drawing's reservation has been resized the two no longer describe the same
46
+ * object, so the rebuild states the value in force on the drawing and lets
47
+ * OOXML's own default apply to the wrap — keeping a wrap reservation computed
48
+ * against the old size would flow text around a shape that is no longer there.
49
+ *
50
+ * `effective` is the reservation the model holds for the drawing itself:
51
+ * `Image.padding`. A shape and a text box have no such field — the rebuild has
52
+ * always written zeros — so they pass the drawing slot back and nothing can
53
+ * have moved a value the model cannot hold.
54
+ */
55
+ declare const resolveEffectExtents: (wrap: document_d_exports.ImageWrap | undefined, effective: document_d_exports.ImagePadding | undefined) => ResolvedEffectExtents;
56
+ /** `wp:effectExtent`, whose four sides `CT_EffectExtent` all requires. */
57
+ declare const serializeEffectExtent: (extent: document_d_exports.ImagePadding | undefined) => string;
58
+ /** The inset attributes an element states, in schema order, or nothing. */
59
+ declare const serializeWrapDistances: (distances: document_d_exports.WrapDistances) => string;
60
+ /**
61
+ * Only the wrap insets `wp:inline` or `wp:anchor` itself carries. OOXML
62
+ * defaults an omitted one to zero, so writing all four would put a value on
63
+ * every drawing that never had one.
64
+ */
65
+ declare const serializeWrapDistanceAttributes: (wrap: document_d_exports.ImageWrap | undefined) => string;
66
+ /** `wp:inline` carries the wrap insets and nothing else of `CT_Anchor`'s set. */
67
+ declare const serializeInlineAttributes: (wrap: document_d_exports.ImageWrap | undefined) => string;
68
+ type AnchorAttributesOptions = {
69
+ anchor: document_d_exports.DrawingAnchor | undefined;
70
+ wrap: document_d_exports.ImageWrap | undefined;
71
+ /** `@behindDoc`, which the wrap type decides rather than the anchor record. */
72
+ behindDoc: boolean;
73
+ };
74
+ /**
75
+ * Every attribute `CT_Anchor` declares of its own, in schema order.
76
+ *
77
+ * The walk is over {@link DRAWING_ANCHOR_FLAG_KEYS} rather than a hand-written list, so
78
+ * a flag added to the model cannot be written by the parser and forgotten here.
79
+ */
80
+ declare const serializeAnchorAttributes: ({ anchor, wrap, behindDoc }: AnchorAttributesOptions) => string;
81
+ /**
82
+ * `wp:simplePos`, which `CT_Anchor` requires whether or not `@simplePos` says to
83
+ * use it, so an anchor that authored no offsets still writes the origin.
84
+ */
85
+ declare const serializeSimplePos: (anchor: document_d_exports.DrawingAnchor | undefined) => string;
86
+ //#endregion
87
+ export { AnchorAttributesOptions, DRAWING_ANCHOR_FLAG_KEYS, ResolvedEffectExtents, WORDPROCESSING_DRAWING_NAMESPACE_URIS, parseDrawingAnchor, resolveEffectExtents, resolveWrapDistances, serializeAnchorAttributes, serializeEffectExtent, serializeInlineAttributes, serializeSimplePos, serializeWrapDistanceAttributes, serializeWrapDistances };
@@ -0,0 +1,201 @@
1
+ import { intAttr } from "./serializer/xmlUtils.js";
2
+ import { findChildByNamespaceUri, getAttribute, parseNumericAttribute, parseOnOffValue } from "./xmlParser.js";
3
+ //#region src/docx/drawingAnchor.ts
4
+ /** WordprocessingDrawing, Transitional and Strict (ECMA-376 Parts 1 and 4). */
5
+ const WORDPROCESSING_DRAWING_NAMESPACE_URIS = /* @__PURE__ */ new Set(["http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing", "http://purl.oclc.org/ooxml/drawingml/wordprocessingDrawing"]);
6
+ /**
7
+ * Model key → attribute, total over the boolean half of {@link DrawingAnchor}.
8
+ *
9
+ * A flag added to the model fails this map until the rebuild path decides what
10
+ * an anchor that does not state it is.
11
+ */
12
+ const ANCHOR_FLAGS = {
13
+ useSimplePosition: {
14
+ spelling: "simplePos",
15
+ whenUnstated: false
16
+ },
17
+ locked: {
18
+ spelling: "locked",
19
+ whenUnstated: false
20
+ },
21
+ layoutInCell: {
22
+ spelling: "layoutInCell",
23
+ whenUnstated: true
24
+ },
25
+ allowOverlap: {
26
+ spelling: "allowOverlap",
27
+ whenUnstated: true
28
+ },
29
+ hidden: {
30
+ spelling: "hidden",
31
+ whenUnstated: "omit"
32
+ }
33
+ };
34
+ /** Every boolean the anchor models, from the total map above. */
35
+ const DRAWING_ANCHOR_FLAG_KEYS = Object.keys(ANCHOR_FLAGS);
36
+ /**
37
+ * `@relativeHeight` is required and unsigned; this is the value Word writes for
38
+ * the first floating object it anchors, and the only one folio may invent.
39
+ */
40
+ const DEFAULT_RELATIVE_HEIGHT = 251658240;
41
+ /** The wrap insets, which `CT_Inline` and `CT_Anchor` both carry. */
42
+ const WRAP_DISTANCE_ATTRIBUTES = {
43
+ distT: "distT",
44
+ distB: "distB",
45
+ distL: "distL",
46
+ distR: "distR"
47
+ };
48
+ const WRAP_DISTANCE_KEYS = Object.keys(WRAP_DISTANCE_ATTRIBUTES);
49
+ /**
50
+ * Read `CT_Anchor`'s own attributes and its `wp:simplePos` offsets.
51
+ *
52
+ * Undefined when the element states none of them: an anchor whose every
53
+ * attribute is the spec default holds nothing the model needs to remember, and
54
+ * recording an empty record would make a rebuild write values the source did
55
+ * not.
56
+ */
57
+ const parseDrawingAnchor = (anchorEl) => {
58
+ const anchor = {};
59
+ let stated = false;
60
+ for (const key of DRAWING_ANCHOR_FLAG_KEYS) {
61
+ const value = parseOnOffValue(getAttribute(anchorEl, null, ANCHOR_FLAGS[key].spelling));
62
+ if (value !== void 0) {
63
+ anchor[key] = value;
64
+ stated = true;
65
+ }
66
+ }
67
+ const relativeHeight = parseNumericAttribute(anchorEl, null, "relativeHeight");
68
+ if (relativeHeight !== void 0) {
69
+ anchor.relativeHeight = relativeHeight;
70
+ stated = true;
71
+ }
72
+ const simplePosEl = findChildByNamespaceUri(anchorEl, WORDPROCESSING_DRAWING_NAMESPACE_URIS, "simplePos");
73
+ const x = parseNumericAttribute(simplePosEl, null, "x");
74
+ const y = parseNumericAttribute(simplePosEl, null, "y");
75
+ if (x !== void 0 && y !== void 0) {
76
+ anchor.simplePosition = {
77
+ x,
78
+ y
79
+ };
80
+ stated = true;
81
+ }
82
+ return stated ? anchor : void 0;
83
+ };
84
+ /**
85
+ * The insets to write on each of the two elements that can carry them.
86
+ *
87
+ * A drawing whose slots say where its insets were authored gets each one back
88
+ * on that element, which is the only way the wrap child's own set survives a
89
+ * rebuild. A drawing with no slots, or one an editor command has moved an inset
90
+ * on, states the value in force on the drawing: that is where OOXML reads an
91
+ * inset from when the wrap child states none, so the effective value is right
92
+ * either way, and inventing a wrap-child inset from a moved value would not be.
93
+ */
94
+ const resolveWrapDistances = (wrap) => {
95
+ const slots = wrap?.distanceSlots;
96
+ if (slots !== void 0 && WRAP_DISTANCE_KEYS.every((key) => wrap?.[key] === (slots.wrapChild?.[key] ?? slots.drawing?.[key]))) return {
97
+ drawing: slots.drawing ?? {},
98
+ wrapChild: slots.wrapChild ?? {}
99
+ };
100
+ const drawing = {};
101
+ for (const key of WRAP_DISTANCE_KEYS) {
102
+ const value = wrap?.[key];
103
+ if (value !== void 0) drawing[key] = value;
104
+ }
105
+ return {
106
+ drawing,
107
+ wrapChild: {}
108
+ };
109
+ };
110
+ /** `CT_EffectExtent`'s four sides, in the order the type declares them. */
111
+ const EFFECT_EXTENT_SIDES = [
112
+ "left",
113
+ "top",
114
+ "right",
115
+ "bottom"
116
+ ];
117
+ /**
118
+ * Two reservations are the same document when every side matches.
119
+ *
120
+ * An absent side and a zero one are one value: `CT_EffectExtent` requires all
121
+ * four and the rebuild writes zero for a side the record holds nothing for, so
122
+ * an all-zero record and no record at all say the same thing.
123
+ */
124
+ const sameEffectExtent = (left, right) => EFFECT_EXTENT_SIDES.every((side) => (left?.[side] ?? 0) === (right?.[side] ?? 0));
125
+ /**
126
+ * The `wp:effectExtent` to write on each of the two elements that carry one.
127
+ *
128
+ * {@link resolveWrapDistances}'s rule, one element over: a drawing whose slots
129
+ * say where the reservations were authored gets each one back on that element,
130
+ * which is the only way the wrap child's own survives a rebuild. Once the
131
+ * drawing's reservation has been resized the two no longer describe the same
132
+ * object, so the rebuild states the value in force on the drawing and lets
133
+ * OOXML's own default apply to the wrap — keeping a wrap reservation computed
134
+ * against the old size would flow text around a shape that is no longer there.
135
+ *
136
+ * `effective` is the reservation the model holds for the drawing itself:
137
+ * `Image.padding`. A shape and a text box have no such field — the rebuild has
138
+ * always written zeros — so they pass the drawing slot back and nothing can
139
+ * have moved a value the model cannot hold.
140
+ */
141
+ const resolveEffectExtents = (wrap, effective) => {
142
+ const slots = wrap?.effectExtentSlots;
143
+ if (slots === void 0 || !sameEffectExtent(effective, slots.drawing)) return {
144
+ drawing: effective,
145
+ wrapChild: void 0
146
+ };
147
+ return {
148
+ drawing: slots.drawing,
149
+ wrapChild: slots.wrapChild
150
+ };
151
+ };
152
+ /** `wp:effectExtent`, whose four sides `CT_EffectExtent` all requires. */
153
+ const serializeEffectExtent = (extent) => `<wp:effectExtent l="${intAttr(extent?.left ?? 0)}" t="${intAttr(extent?.top ?? 0)}" r="${intAttr(extent?.right ?? 0)}" b="${intAttr(extent?.bottom ?? 0)}"/>`;
154
+ /** The inset attributes an element states, in schema order, or nothing. */
155
+ const serializeWrapDistances = (distances) => {
156
+ const attrs = WRAP_DISTANCE_KEYS.flatMap((key) => {
157
+ const value = distances[key];
158
+ return value === void 0 ? [] : [`${WRAP_DISTANCE_ATTRIBUTES[key]}="${intAttr(value)}"`];
159
+ });
160
+ return attrs.length > 0 ? ` ${attrs.join(" ")}` : "";
161
+ };
162
+ /**
163
+ * Only the wrap insets `wp:inline` or `wp:anchor` itself carries. OOXML
164
+ * defaults an omitted one to zero, so writing all four would put a value on
165
+ * every drawing that never had one.
166
+ */
167
+ const serializeWrapDistanceAttributes = (wrap) => serializeWrapDistances(resolveWrapDistances(wrap).drawing);
168
+ /** `wp:inline` carries the wrap insets and nothing else of `CT_Anchor`'s set. */
169
+ const serializeInlineAttributes = (wrap) => serializeWrapDistanceAttributes(wrap);
170
+ /**
171
+ * Every attribute `CT_Anchor` declares of its own, in schema order.
172
+ *
173
+ * The walk is over {@link DRAWING_ANCHOR_FLAG_KEYS} rather than a hand-written list, so
174
+ * a flag added to the model cannot be written by the parser and forgotten here.
175
+ */
176
+ const serializeAnchorAttributes = ({ anchor, wrap, behindDoc }) => {
177
+ const attrs = [];
178
+ for (const key of DRAWING_ANCHOR_FLAG_KEYS) {
179
+ const { spelling, whenUnstated } = ANCHOR_FLAGS[key];
180
+ const stated = anchor?.[key] ?? whenUnstated;
181
+ if (stated !== "omit") attrs.push(`${spelling}="${stated ? "1" : "0"}"`);
182
+ if (key === "useSimplePosition") {
183
+ attrs.push(`relativeHeight="${intAttr(anchor?.relativeHeight ?? DEFAULT_RELATIVE_HEIGHT)}"`);
184
+ attrs.push(`behindDoc="${behindDoc ? "1" : "0"}"`);
185
+ }
186
+ }
187
+ return `${serializeWrapDistanceAttributes(wrap)} ${attrs.join(" ")}`;
188
+ };
189
+ /**
190
+ * `wp:simplePos`, which `CT_Anchor` requires whether or not `@simplePos` says to
191
+ * use it, so an anchor that authored no offsets still writes the origin.
192
+ */
193
+ const serializeSimplePos = (anchor) => {
194
+ const { x, y } = anchor?.simplePosition ?? {
195
+ x: 0,
196
+ y: 0
197
+ };
198
+ return `<wp:simplePos x="${intAttr(x)}" y="${intAttr(y)}"/>`;
199
+ };
200
+ //#endregion
201
+ export { DRAWING_ANCHOR_FLAG_KEYS, WORDPROCESSING_DRAWING_NAMESPACE_URIS, parseDrawingAnchor, resolveEffectExtents, resolveWrapDistances, serializeAnchorAttributes, serializeEffectExtent, serializeInlineAttributes, serializeSimplePos, serializeWrapDistanceAttributes, serializeWrapDistances };