@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,72 +1,29 @@
1
+ import { DERIVED_PART_ROOT_ATTRIBUTES, attributeRemainder } from "./attributeRemainder.js";
2
+ import { CAPTURE, dispatchChildren, sequencePositions } from "./containerChildren.js";
1
3
  import { isNumberingReference } from "./numberingReference.js";
2
4
  import { formatOoxmlCounter, padDecimal } from "./ooxmlCounterFormatter.js";
3
- import { LevelSuffixSchema, narrowEnum } from "./parserEnums.js";
4
- import { parseRunProperties } from "./runParser.js";
5
- import { WORDPROCESSINGML_NAMESPACE_URIS, findChild, findChildren, getAttribute, getLocalName, getNamespaceUri, parseBooleanElement, parseNumericAttribute, parseXmlDocument } from "./xmlParser.js";
5
+ import { parseParagraphProperties } from "./paragraphProperties.js";
6
+ import { LevelSuffixSchema, NumberFormatSchema, ParagraphAlignmentSchema, narrowEnum } from "./parserEnums.js";
7
+ import { RUN_PROPERTY_OWNERS, parseRunProperties } from "./runParser.js";
8
+ import { findChild, getAttribute, parseBooleanElement, parseNumericAttribute, parseOnOffAttribute, parseXmlDocument } from "./xmlParser.js";
6
9
  //#region src/docx/numberingParser.ts
7
- const NUMBER_FORMAT_MAP = {
8
- decimal: "decimal",
9
- upperRoman: "upperRoman",
10
- lowerRoman: "lowerRoman",
11
- upperLetter: "upperLetter",
12
- lowerLetter: "lowerLetter",
13
- ordinal: "ordinal",
14
- cardinalText: "cardinalText",
15
- ordinalText: "ordinalText",
16
- hex: "hex",
17
- chicago: "chicago",
18
- bullet: "bullet",
19
- none: "none",
20
- decimalZero: "decimalZero",
21
- ganada: "ganada",
22
- chosung: "chosung",
23
- ideographDigital: "ideographDigital",
24
- japaneseCounting: "japaneseCounting",
25
- aiueo: "aiueo",
26
- iroha: "iroha",
27
- decimalFullWidth: "decimalFullWidth",
28
- decimalHalfWidth: "decimalHalfWidth",
29
- japaneseLegal: "japaneseLegal",
30
- japaneseDigitalTenThousand: "japaneseDigitalTenThousand",
31
- decimalEnclosedCircle: "decimalEnclosedCircle",
32
- decimalFullWidth2: "decimalFullWidth2",
33
- aiueoFullWidth: "aiueoFullWidth",
34
- irohaFullWidth: "irohaFullWidth",
35
- decimalEnclosedFullstop: "decimalEnclosedFullstop",
36
- decimalEnclosedParen: "decimalEnclosedParen",
37
- decimalEnclosedCircleChinese: "decimalEnclosedCircleChinese",
38
- ideographEnclosedCircle: "ideographEnclosedCircle",
39
- ideographTraditional: "ideographTraditional",
40
- ideographZodiac: "ideographZodiac",
41
- ideographZodiacTraditional: "ideographZodiacTraditional",
42
- taiwaneseCounting: "taiwaneseCounting",
43
- ideographLegalTraditional: "ideographLegalTraditional",
44
- taiwaneseCountingThousand: "taiwaneseCountingThousand",
45
- taiwaneseDigital: "taiwaneseDigital",
46
- chineseCounting: "chineseCounting",
47
- chineseLegalSimplified: "chineseLegalSimplified",
48
- chineseCountingThousand: "chineseCountingThousand",
49
- koreanDigital: "koreanDigital",
50
- koreanCounting: "koreanCounting",
51
- koreanLegal: "koreanLegal",
52
- koreanDigital2: "koreanDigital2",
53
- vietnameseCounting: "vietnameseCounting",
54
- russianLower: "russianLower",
55
- russianUpper: "russianUpper",
56
- numberInDash: "numberInDash",
57
- hebrew1: "hebrew1",
58
- hebrew2: "hebrew2",
59
- arabicAlpha: "arabicAlpha",
60
- arabicAbjad: "arabicAbjad",
61
- hindiVowels: "hindiVowels",
62
- hindiConsonants: "hindiConsonants",
63
- hindiNumbers: "hindiNumbers",
64
- hindiCounting: "hindiCounting",
65
- thaiLetters: "thaiLetters",
66
- thaiNumbers: "thaiNumbers",
67
- thaiCounting: "thaiCounting"
10
+ /** `w:abstractNum` reads its id; everything else it carries is the remainder's. */
11
+ const MODELLED_ABSTRACT_NUM_ATTRIBUTES = /* @__PURE__ */ new Set(["abstractNumId"]);
12
+ /** `w:lvl` reads the level it defines and Word's two template markers. */
13
+ const MODELLED_LVL_ATTRIBUTES = /* @__PURE__ */ new Set([
14
+ "ilvl",
15
+ "tplc",
16
+ "tentative"
17
+ ]);
18
+ /** `w:num` reads the id paragraphs reference it by. */
19
+ const MODELLED_NUM_ATTRIBUTES = /* @__PURE__ */ new Set(["numId"]);
20
+ /** `w:lvlOverride` reads the level it overrides. */
21
+ const MODELLED_LVL_OVERRIDE_ATTRIBUTES = /* @__PURE__ */ new Set(["ilvl"]);
22
+ const attributeValue = (element) => getAttribute(element, "w", "val") ?? void 0;
23
+ const integerValue = (element) => {
24
+ const parsed = parseNumericAttribute(element, "w", "val");
25
+ return parsed === void 0 || !Number.isFinite(parsed) ? void 0 : parsed;
68
26
  };
69
- const wordprocessingLocalName = (element) => WORDPROCESSINGML_NAMESPACE_URIS.has(getNamespaceUri(element) ?? "") ? getLocalName(element.name) : null;
70
27
  /**
71
28
  * Parse numbering.xml into NumberingDefinitions
72
29
  *
@@ -81,16 +38,29 @@ function parseNumbering(numberingXml) {
81
38
  if (!numberingXml) return createNumberingMap(definitions);
82
39
  const root = parseXmlDocument(numberingXml);
83
40
  if (!root) return createNumberingMap(definitions);
84
- const abstractNumElements = findChildren(root, "w", "abstractNum");
85
- for (const abstractNum of abstractNumElements) {
86
- const parsed = parseAbstractNumbering(abstractNum);
87
- if (parsed) definitions.abstractNums.push(parsed);
88
- }
89
- const numElements = findChildren(root, "w", "num");
90
- for (const num of numElements) {
91
- const parsed = parseNumberingInstance(num);
92
- if (parsed) definitions.nums.push(parsed);
93
- }
41
+ const preserved = dispatchChildren({
42
+ element: root,
43
+ container: "w:numbering",
44
+ capturePosition: sequencePositions("w:numbering", root),
45
+ handlers: {
46
+ abstractNum: (child) => {
47
+ const parsed = parseAbstractNumbering(child);
48
+ if (parsed) definitions.abstractNums.push(parsed);
49
+ },
50
+ num: (child) => {
51
+ const parsed = parseNumberingInstance(child);
52
+ if (parsed) definitions.nums.push(parsed);
53
+ },
54
+ numPicBullet: CAPTURE,
55
+ numIdMacAtCleanup: CAPTURE
56
+ }
57
+ });
58
+ if (preserved !== void 0) definitions.preserved = preserved;
59
+ const preservedAttributes = attributeRemainder({
60
+ element: root,
61
+ modelled: DERIVED_PART_ROOT_ATTRIBUTES
62
+ });
63
+ if (preservedAttributes !== void 0) definitions.preservedAttributes = preservedAttributes;
94
64
  return createNumberingMap(definitions);
95
65
  }
96
66
  /**
@@ -105,55 +75,44 @@ function parseAbstractNumbering(element) {
105
75
  abstractNumId,
106
76
  levels: []
107
77
  };
108
- let multiLevelTypeEl;
109
- let nameEl;
110
- let numStyleLinkEl;
111
- let styleLinkEl;
112
- const levelElements = [];
113
- for (const child of element.elements ?? []) {
114
- if (child.type !== "element") continue;
115
- switch (wordprocessingLocalName(child)) {
116
- case "multiLevelType":
117
- multiLevelTypeEl ??= child;
118
- break;
119
- case "name":
120
- nameEl ??= child;
121
- break;
122
- case "numStyleLink":
123
- numStyleLinkEl ??= child;
124
- break;
125
- case "styleLink":
126
- styleLinkEl ??= child;
127
- break;
128
- case "lvl":
129
- levelElements.push(child);
130
- break;
131
- default: break;
78
+ const read = (key, value) => {
79
+ if (value === void 0) return;
80
+ abstractNum[key] = value;
81
+ };
82
+ const preserved = dispatchChildren({
83
+ element,
84
+ container: "w:abstractNum",
85
+ capturePosition: sequencePositions("w:abstractNum", element),
86
+ handlers: {
87
+ nsid: (child) => read("nsid", attributeValue(child)),
88
+ multiLevelType: (child) => read("multiLevelType", narrow(attributeValue(child), MULTI_LEVEL_TYPES)),
89
+ tmpl: (child) => read("tmpl", attributeValue(child)),
90
+ name: (child) => read("name", attributeValue(child)),
91
+ styleLink: (child) => read("styleLink", attributeValue(child)),
92
+ numStyleLink: (child) => read("numStyleLink", attributeValue(child)),
93
+ lvl: (child) => {
94
+ const level = parseListLevel(child);
95
+ if (level) abstractNum.levels.push(level);
96
+ }
132
97
  }
133
- }
134
- if (multiLevelTypeEl) {
135
- const mlType = getAttribute(multiLevelTypeEl, "w", "val");
136
- if (mlType === "hybridMultilevel" || mlType === "multilevel" || mlType === "singleLevel") abstractNum.multiLevelType = mlType;
137
- }
138
- if (nameEl) {
139
- const nameVal = getAttribute(nameEl, "w", "val");
140
- if (nameVal != null) abstractNum.name = nameVal;
141
- }
142
- if (numStyleLinkEl) {
143
- const numStyleLinkVal = getAttribute(numStyleLinkEl, "w", "val");
144
- if (numStyleLinkVal != null) abstractNum.numStyleLink = numStyleLinkVal;
145
- }
146
- if (styleLinkEl) {
147
- const styleLinkVal = getAttribute(styleLinkEl, "w", "val");
148
- if (styleLinkVal != null) abstractNum.styleLink = styleLinkVal;
149
- }
150
- for (const lvlEl of levelElements) {
151
- const level = parseListLevel(lvlEl);
152
- if (level) abstractNum.levels.push(level);
153
- }
98
+ });
99
+ if (preserved !== void 0) abstractNum.preserved = preserved;
100
+ const preservedAttributes = attributeRemainder({
101
+ element,
102
+ modelled: MODELLED_ABSTRACT_NUM_ATTRIBUTES
103
+ });
104
+ if (preservedAttributes !== void 0) abstractNum.preservedAttributes = preservedAttributes;
154
105
  abstractNum.levels.sort((a, b) => a.ilvl - b.ilvl);
155
106
  return abstractNum;
156
107
  }
108
+ /** ECMA-376 §17.9.1: a `w:abstractNum` defines levels 0 through 8 and no more. */
109
+ const MAX_LIST_LEVEL = 8;
110
+ const MULTI_LEVEL_TYPES = [
111
+ "hybridMultilevel",
112
+ "multilevel",
113
+ "singleLevel"
114
+ ];
115
+ const narrow = (carried, members) => members.find((member) => member === carried);
157
116
  /**
158
117
  * Parse a single w:num element (numbering instance)
159
118
  */
@@ -162,280 +121,222 @@ function parseNumberingInstance(element) {
162
121
  if (numIdStr === null) return null;
163
122
  const numId = Number.parseInt(numIdStr, 10);
164
123
  if (Number.isNaN(numId)) return null;
165
- let abstractNumIdEl;
166
- const overrideElements = [];
167
- for (const child of element.elements ?? []) {
168
- if (child.type !== "element") continue;
169
- if (wordprocessingLocalName(child) === "abstractNumId") {
170
- abstractNumIdEl ??= child;
171
- continue;
124
+ const levelOverrides = [];
125
+ let abstractNumId;
126
+ const preserved = dispatchChildren({
127
+ element,
128
+ container: "w:num",
129
+ capturePosition: sequencePositions("w:num", element),
130
+ handlers: {
131
+ abstractNumId: (child) => {
132
+ if (abstractNumId !== void 0) return;
133
+ abstractNumId = integerValue(child);
134
+ },
135
+ lvlOverride: (child) => {
136
+ const override = parseLevelOverride(child);
137
+ if (override) levelOverrides.push(override);
138
+ }
172
139
  }
173
- if (wordprocessingLocalName(child) === "lvlOverride") overrideElements.push(child);
174
- }
175
- if (!abstractNumIdEl) return null;
176
- const abstractNumIdStr = getAttribute(abstractNumIdEl, "w", "val");
177
- if (abstractNumIdStr === null) return null;
178
- const abstractNumId = Number.parseInt(abstractNumIdStr, 10);
179
- if (Number.isNaN(abstractNumId)) return null;
140
+ });
141
+ if (abstractNumId === void 0) return null;
180
142
  const instance = {
181
143
  numId,
182
144
  abstractNumId
183
145
  };
184
- if (overrideElements.length > 0) {
185
- instance.levelOverrides = [];
186
- for (const overrideEl of overrideElements) {
187
- const ilvlStr = getAttribute(overrideEl, "w", "ilvl");
188
- if (ilvlStr === null) continue;
189
- const ilvl = Number.parseInt(ilvlStr, 10);
190
- if (Number.isNaN(ilvl)) continue;
191
- const override = { ilvl };
192
- let startOverrideEl;
193
- let lvlEl;
194
- for (const child of overrideEl.elements ?? []) {
195
- if (child.type !== "element") continue;
196
- if (wordprocessingLocalName(child) === "startOverride") {
197
- startOverrideEl ??= child;
198
- continue;
199
- }
200
- if (wordprocessingLocalName(child) === "lvl") lvlEl ??= child;
201
- }
202
- if (startOverrideEl) {
203
- const startVal = getAttribute(startOverrideEl, "w", "val");
204
- if (startVal !== null) {
205
- const startNum = Number.parseInt(startVal, 10);
206
- if (!Number.isNaN(startNum)) override.startOverride = startNum;
207
- }
208
- }
209
- if (lvlEl) {
210
- const parsedLvl = parseListLevel(lvlEl);
211
- if (parsedLvl != null) override.lvl = parsedLvl;
146
+ if (levelOverrides.length > 0) instance.levelOverrides = levelOverrides;
147
+ if (preserved !== void 0) instance.preserved = preserved;
148
+ const preservedAttributes = attributeRemainder({
149
+ element,
150
+ modelled: MODELLED_NUM_ATTRIBUTES
151
+ });
152
+ if (preservedAttributes !== void 0) instance.preservedAttributes = preservedAttributes;
153
+ return instance;
154
+ }
155
+ /**
156
+ * Parse a single w:lvlOverride element (one level of one numbering instance)
157
+ */
158
+ function parseLevelOverride(element) {
159
+ const ilvl = parseNumericAttribute(element, "w", "ilvl");
160
+ if (ilvl === void 0) return null;
161
+ const override = { ilvl };
162
+ const preserved = dispatchChildren({
163
+ element,
164
+ container: "w:lvlOverride",
165
+ capturePosition: sequencePositions("w:lvlOverride", element),
166
+ handlers: {
167
+ startOverride: (child) => {
168
+ const start = integerValue(child);
169
+ if (start !== void 0 && override.startOverride === void 0) override.startOverride = start;
170
+ },
171
+ lvl: (child) => {
172
+ const level = parseListLevel(child);
173
+ if (level && override.lvl === void 0) override.lvl = level;
212
174
  }
213
- instance.levelOverrides.push(override);
214
175
  }
215
- }
216
- return instance;
176
+ });
177
+ if (preserved !== void 0) override.preserved = preserved;
178
+ const preservedAttributes = attributeRemainder({
179
+ element,
180
+ modelled: MODELLED_LVL_OVERRIDE_ATTRIBUTES
181
+ });
182
+ if (preservedAttributes !== void 0) override.preservedAttributes = preservedAttributes;
183
+ return override;
217
184
  }
218
185
  /**
219
186
  * Parse a single w:lvl element (list level definition)
220
187
  */
221
188
  function parseListLevel(element) {
222
- const ilvlStr = getAttribute(element, "w", "ilvl");
223
- if (ilvlStr === null) return null;
224
- const ilvl = Number.parseInt(ilvlStr, 10);
225
- if (Number.isNaN(ilvl) || ilvl < 0 || ilvl > 8) return null;
189
+ const ilvl = parseNumericAttribute(element, "w", "ilvl");
190
+ if (ilvl === void 0) return null;
226
191
  const level = {
227
192
  ilvl,
228
193
  numFmt: "decimal",
229
194
  lvlText: ""
230
195
  };
231
- let startEl;
232
- let numFmtEl;
233
- let alternateEl;
234
- let lvlTextEl;
235
- let lvlJcEl;
236
- let suffEl;
237
- let isLglEl;
238
- let lvlRestartEl;
239
- let legacyEl;
240
- let pPrEl;
241
- let rPrEl;
242
- for (const child of element.elements ?? []) {
243
- if (child.type !== "element") continue;
244
- const localName = wordprocessingLocalName(child);
245
- if (localName === null) {
246
- if (getLocalName(child.name) === "AlternateContent") alternateEl ??= child;
247
- continue;
248
- }
249
- switch (localName) {
250
- case "start":
251
- startEl ??= child;
252
- break;
253
- case "numFmt":
254
- numFmtEl ??= child;
255
- break;
256
- case "lvlText":
257
- lvlTextEl ??= child;
258
- break;
259
- case "lvlJc":
260
- lvlJcEl ??= child;
261
- break;
262
- case "suff":
263
- suffEl ??= child;
264
- break;
265
- case "isLgl":
266
- isLglEl ??= child;
267
- break;
268
- case "lvlRestart":
269
- lvlRestartEl ??= child;
270
- break;
271
- case "legacy":
272
- legacyEl ??= child;
273
- break;
274
- case "pPr":
275
- pPrEl ??= child;
276
- break;
277
- case "rPr":
278
- rPrEl ??= child;
279
- break;
280
- default: break;
281
- }
282
- }
283
- if (startEl) {
284
- const startVal = getAttribute(startEl, "w", "val");
285
- if (startVal !== null) {
286
- const startNum = Number.parseInt(startVal, 10);
287
- if (!Number.isNaN(startNum)) level.start = startNum;
288
- }
289
- }
290
- if (numFmtEl) level.numFmt = resolveNumFmt(numFmtEl) ?? "decimal";
291
- else if (alternateEl) {
196
+ const alternateEl = findChild(element, "mc", "AlternateContent");
197
+ const read = (key, value) => {
198
+ if (value === void 0) return;
199
+ level[key] = value;
200
+ };
201
+ const preserved = dispatchChildren({
202
+ element,
203
+ container: "w:lvl",
204
+ capturePosition: sequencePositions("w:lvl", element),
205
+ handlers: {
206
+ start: (child) => read("start", integerValue(child)),
207
+ numFmt: (child) => {
208
+ const resolved = resolveNumFmt(child);
209
+ if (resolved === null) return CAPTURE;
210
+ Object.assign(level, resolved);
211
+ },
212
+ lvlRestart: (child) => read("lvlRestart", integerValue(child)),
213
+ pStyle: (child) => read("pStyle", attributeValue(child)),
214
+ isLgl: (child) => read("isLgl", parseBooleanElement(child)),
215
+ suff: (child) => read("suffix", narrowEnum(attributeValue(child), LevelSuffixSchema)),
216
+ lvlText: (child) => {
217
+ read("lvlText", attributeValue(child) ?? "");
218
+ const isNull = parseOnOffAttribute(child, "w", "null");
219
+ if (isNull !== void 0) level.lvlTextNull = isNull;
220
+ },
221
+ lvlPicBulletId: (child) => read("lvlPicBulletId", integerValue(child)),
222
+ legacy: (child) => read("legacy", legacyOf(child)),
223
+ lvlJc: (child) => read("lvlJc", narrowEnum(attributeValue(child), ParagraphAlignmentSchema)),
224
+ pPr: (child) => read("pPr", parseParagraphProperties(child, null) ?? {}),
225
+ rPr: (child) => read("rPr", parseRunProperties(child, null, RUN_PROPERTY_OWNERS.standalone) ?? {})
226
+ },
227
+ undeclared: { AlternateContent: () => void 0 }
228
+ });
229
+ if (preserved !== void 0) level.preserved = preserved;
230
+ const preservedAttributes = attributeRemainder({
231
+ element,
232
+ modelled: MODELLED_LVL_ATTRIBUTES
233
+ });
234
+ if (preservedAttributes !== void 0) level.preservedAttributes = preservedAttributes;
235
+ const tplc = getAttribute(element, "w", "tplc");
236
+ if (tplc !== null) level.tplc = tplc;
237
+ const tentative = parseOnOffAttribute(element, "w", "tentative");
238
+ if (tentative !== void 0) level.tentative = tentative;
239
+ if (alternateEl && findChild(element, "w", "numFmt") === null) {
292
240
  const choiceFmt = resolveNumFmt(findChild(findChild(alternateEl, "mc", "Choice"), "w", "numFmt"));
293
241
  const fallbackFmt = resolveNumFmt(findChild(findChild(alternateEl, "mc", "Fallback"), "w", "numFmt"));
294
- level.numFmt = choiceFmt ?? fallbackFmt ?? level.numFmt;
295
- }
296
- if (lvlTextEl) level.lvlText = getAttribute(lvlTextEl, "w", "val") ?? "";
297
- if (lvlJcEl) {
298
- const jcVal = getAttribute(lvlJcEl, "w", "val");
299
- if (jcVal === "left" || jcVal === "center" || jcVal === "right") level.lvlJc = jcVal;
300
- }
301
- if (suffEl) {
302
- const suffix = narrowEnum(getAttribute(suffEl, "w", "val"), LevelSuffixSchema);
303
- if (suffix) level.suffix = suffix;
304
- }
305
- if (isLglEl) level.isLgl = parseBooleanElement(isLglEl);
306
- if (lvlRestartEl) {
307
- const restartVal = getAttribute(lvlRestartEl, "w", "val");
308
- if (restartVal !== null) {
309
- const restartNum = Number.parseInt(restartVal, 10);
310
- if (!Number.isNaN(restartNum)) level.lvlRestart = restartNum;
311
- }
312
- }
313
- if (legacyEl) {
314
- const legacySpace = parseNumericAttribute(legacyEl, "w", "legacySpace");
315
- const legacyIndent = parseNumericAttribute(legacyEl, "w", "legacyIndent");
316
- level.legacy = {
317
- legacy: parseBooleanElement(legacyEl),
318
- ...legacySpace !== void 0 ? { legacySpace } : {},
319
- ...legacyIndent !== void 0 ? { legacyIndent } : {}
320
- };
321
- }
322
- if (pPrEl) level.pPr = parseLevelParagraphProps(pPrEl);
323
- if (rPrEl) {
324
- const runProperties = parseRunProperties(rPrEl, null);
325
- if (runProperties) level.rPr = runProperties;
242
+ const resolved = choiceFmt && counterFormatOf(choiceFmt) !== "custom" ? choiceFmt : fallbackFmt ?? choiceFmt;
243
+ if (resolved) Object.assign(level, resolved);
326
244
  }
327
245
  return level;
328
246
  }
329
247
  /**
330
- * Resolve a `<w:numFmt>` element to a NumberFormat we can render, or null
331
- * when the element is absent or its format is one we don't implement (an
332
- * mc:Fallback can then supply a closer rendering).
248
+ * Resolve a `<w:numFmt>` element, or null when it is absent or carries a token
249
+ * outside `ST_NumberFormat` (an mc:Fallback can then supply the rendering).
250
+ *
251
+ * `custom` stays `custom`, with its `@w:format` beside it. It used to be
252
+ * decoded here into a synthetic `decimalZero{3,4,5}` the enumeration does not
253
+ * declare, which the serializer wrote back as a `w:val` no consumer can read.
254
+ * The pad width belongs to the renderer, not to the model.
333
255
  */
334
256
  function resolveNumFmt(numFmtEl) {
335
257
  if (!numFmtEl) return null;
336
- const fmtVal = getAttribute(numFmtEl, "w", "val");
337
- if (!fmtVal) return null;
338
- if (fmtVal === "custom") return parseCustomNumberFormat(getAttribute(numFmtEl, "w", "format"));
339
- return NUMBER_FORMAT_MAP[fmtVal] ?? null;
258
+ const numFmt = narrowEnum(getAttribute(numFmtEl, "w", "val"), NumberFormatSchema);
259
+ if (numFmt === void 0) return null;
260
+ if (numFmt !== "custom") return { numFmt };
261
+ const format = getAttribute(numFmtEl, "w", "format");
262
+ return format === null ? { numFmt } : {
263
+ numFmt,
264
+ numFmtFormat: format
265
+ };
340
266
  }
341
267
  /**
342
- * Map a `w:numFmt w:val="custom"` format string (ECMA-376 §17.9.17 — an XSLT
343
- * `format` token list like "0001, 0002, 0003, ...") to a NumberFormat. Word
344
- * only emits zero-padded decimal customs this way; the pad width is the digit
345
- * count of the first token (clamped to 5). Unknown patterns return null so
346
- * the caller can fall back to an mc:Fallback or plain decimal.
268
+ * `w:legacy`: the flag is the element's own `w:legacy` attribute.
269
+ *
270
+ * `CT_LvlLegacy` has no `w:val`, so reading one turned every explicit
271
+ * `w:legacy="0"` into the `w:legacy="1"` a rebuild wrote back.
347
272
  */
348
- function parseCustomNumberFormat(format) {
349
- const firstToken = format?.split(",")[0]?.trim() ?? "";
350
- if (/^0+1$/u.test(firstToken)) switch (Math.min(firstToken.length, 5)) {
351
- case 2: return "decimalZero";
352
- case 3: return "decimalZero3";
353
- case 4: return "decimalZero4";
354
- case 5: return "decimalZero5";
355
- }
356
- return null;
273
+ function legacyOf(element) {
274
+ const legacy = parseOnOffAttribute(element, "w", "legacy");
275
+ const legacySpace = parseNumericAttribute(element, "w", "legacySpace");
276
+ const legacyIndent = parseNumericAttribute(element, "w", "legacyIndent");
277
+ return {
278
+ ...legacy === void 0 ? {} : { legacy },
279
+ ...legacySpace === void 0 ? {} : { legacySpace },
280
+ ...legacyIndent === void 0 ? {} : { legacyIndent }
281
+ };
357
282
  }
358
283
  /**
359
- * Parse paragraph properties for a list level (subset of full pPr)
360
- * Main concern: indentation and tabs
284
+ * The width a `custom` format's zero-padded first token counts to, or
285
+ * `undefined` for a pattern folio does not render.
286
+ *
287
+ * ECMA-376 §17.9.17: `@w:format` is an XSLT token list like
288
+ * "0001, 0002, 0003, ...". Word only emits zero-padded decimal customs this
289
+ * way; the width is the digit count of the first token, clamped to five.
361
290
  */
362
- function parseLevelParagraphProps(pPr) {
363
- const formatting = {};
364
- let indEl;
365
- let tabsEl;
366
- for (const child of pPr.elements ?? []) {
367
- if (child.type !== "element") continue;
368
- if (wordprocessingLocalName(child) === "ind") {
369
- indEl ??= child;
370
- continue;
371
- }
372
- if (wordprocessingLocalName(child) === "tabs") tabsEl ??= child;
373
- }
374
- if (indEl) {
375
- const left = parseNumericAttribute(indEl, "w", "left");
376
- const right = parseNumericAttribute(indEl, "w", "right");
377
- const start = parseNumericAttribute(indEl, "w", "start");
378
- const end = parseNumericAttribute(indEl, "w", "end");
379
- const firstLine = parseNumericAttribute(indEl, "w", "firstLine");
380
- const hanging = parseNumericAttribute(indEl, "w", "hanging");
381
- const resolvedLeft = left ?? start;
382
- const resolvedRight = right ?? end;
383
- if (resolvedLeft !== void 0) formatting.indentLeft = resolvedLeft;
384
- if (resolvedRight !== void 0) formatting.indentRight = resolvedRight;
385
- if (hanging !== void 0) {
386
- formatting.indentFirstLine = -hanging;
387
- formatting.hangingIndent = true;
388
- } else if (firstLine !== void 0) formatting.indentFirstLine = firstLine;
389
- }
390
- if (tabsEl) {
391
- formatting.tabs = [];
392
- const tabElements = findChildren(tabsEl, "w", "tab");
393
- for (const tabEl of tabElements) {
394
- const pos = parseNumericAttribute(tabEl, "w", "pos");
395
- const val = getAttribute(tabEl, "w", "val");
396
- const leader = getAttribute(tabEl, "w", "leader");
397
- if (pos !== void 0 && val) {
398
- const parsedLeader = parseTabLeader(leader);
399
- formatting.tabs.push({
400
- position: pos,
401
- alignment: parseTabAlignment(val),
402
- ...parsedLeader !== void 0 ? { leader: parsedLeader } : {}
403
- });
404
- }
405
- }
406
- }
407
- return formatting;
408
- }
291
+ const customNumberFormatPadWidth = (format) => {
292
+ const firstToken = format?.split(",")[0]?.trim() ?? "";
293
+ if (!/^0+1$/u.test(firstToken)) return;
294
+ return Math.min(firstToken.length, 5);
295
+ };
409
296
  /**
410
- * Parse tab alignment value
297
+ * The `@w:format` a level's `w:numFmt` writes, which only `custom` carries.
298
+ *
299
+ * `custom` is the reserved member that defers to another attribute, so the
300
+ * comparison lives here, in the module the reserved-value registry names as
301
+ * its owner, rather than in the serializer that needs the answer.
411
302
  */
412
- function parseTabAlignment(val) {
413
- switch (val) {
414
- case "left": return "left";
415
- case "center": return "center";
416
- case "right": return "right";
417
- case "decimal": return "decimal";
418
- case "bar": return "bar";
419
- case "clear": return "clear";
420
- case "num": return "num";
421
- default: return "left";
303
+ const customNumberFormatOf = (level) => level.numFmt === "custom" ? level.numFmtFormat : void 0;
304
+ /** What the marker renderer counts a level in; `custom` decides by pad width. */
305
+ const counterFormatOf = (level) => {
306
+ if (level.numFmt !== "custom") return level.numFmt;
307
+ switch (customNumberFormatPadWidth(level.numFmtFormat)) {
308
+ case 2: return "decimalZero";
309
+ case 3: return "decimalZero3";
310
+ case 4: return "decimalZero4";
311
+ case 5: return "decimalZero5";
312
+ default: return "custom";
422
313
  }
423
- }
314
+ };
424
315
  /**
425
- * Parse tab leader value
316
+ * How a `w:lvlJc` lays a marker out, for the three alignments layout has.
317
+ *
318
+ * `start` and `end` are the Strict logical-direction spellings folio
319
+ * canonicalises to `left` and `right` everywhere it rebuilds a part. The
320
+ * justification members describe how a *line* of text is spread and say nothing
321
+ * about a marker, so they resolve to no alignment rather than to a guess; the
322
+ * value itself is still carried on the level and written back.
426
323
  */
427
- function parseTabLeader(val) {
428
- if (!val) return;
429
- switch (val) {
430
- case "none": return "none";
431
- case "dot": return "dot";
432
- case "hyphen": return "hyphen";
433
- case "underscore": return "underscore";
434
- case "heavy": return "heavy";
435
- case "middleDot": return "middleDot";
436
- default: return;
437
- }
438
- }
324
+ const MARKER_ALIGNMENT = {
325
+ start: "left",
326
+ left: "left",
327
+ center: "center",
328
+ end: "right",
329
+ right: "right",
330
+ both: void 0,
331
+ distribute: void 0,
332
+ mediumKashida: void 0,
333
+ highKashida: void 0,
334
+ lowKashida: void 0,
335
+ numTab: void 0,
336
+ thaiDistribute: void 0
337
+ };
338
+ /** {@link MARKER_ALIGNMENT} for a level that may not state a justification. */
339
+ const markerAlignmentForLevel = (lvlJc) => lvlJc === void 0 ? void 0 : MARKER_ALIGNMENT[lvlJc];
439
340
  const markerFormattingFromLevel = (formatting) => {
440
341
  if (!formatting) return;
441
342
  const markerFormatting = {
@@ -476,6 +377,7 @@ function createNumberingMap(definitions) {
476
377
  return {
477
378
  definitions,
478
379
  getLevel(numId, ilvl) {
380
+ if (ilvl < 0 || ilvl > MAX_LIST_LEVEL) return null;
479
381
  const num = numMap.get(numId);
480
382
  if (!num) return null;
481
383
  if (num.levelOverrides) {
@@ -537,7 +439,7 @@ function computeListRendering(numPr, numbering) {
537
439
  const levelStarts = [];
538
440
  for (let i = 0; i <= ilvl; i += 1) {
539
441
  const listLevel = numbering.getLevel(numId, i);
540
- levelNumFmts.push(level.isLgl ? "decimal" : listLevel?.numFmt ?? "decimal");
442
+ levelNumFmts.push(level.isLgl || !listLevel ? "decimal" : counterFormatOf(listLevel));
541
443
  levelStarts.push(listLevel?.start ?? 1);
542
444
  }
543
445
  const instance = numbering.getInstance(numId);
@@ -548,7 +450,7 @@ function computeListRendering(numPr, numbering) {
548
450
  marker: level.lvlText,
549
451
  markerTemplate: level.lvlText,
550
452
  isBullet: level.numFmt === "bullet",
551
- numFmt: level.isLgl ? "decimal" : level.numFmt,
453
+ numFmt: level.isLgl ? "decimal" : counterFormatOf(level),
552
454
  levelNumFmts,
553
455
  levelStarts
554
456
  };
@@ -557,7 +459,8 @@ function computeListRendering(numPr, numbering) {
557
459
  const markerFormatting = markerFormattingFromLevel(level.rPr);
558
460
  if (markerFormatting) rendering.markerFormatting = markerFormatting;
559
461
  if (level.rPr?.allCaps) rendering.markerAllCaps = true;
560
- if (level.lvlJc) rendering.markerAlignment = level.lvlJc;
462
+ const markerAlignment = markerAlignmentForLevel(level.lvlJc);
463
+ if (markerAlignment !== void 0) rendering.markerAlignment = markerAlignment;
561
464
  if (level.suffix) rendering.markerSuffix = level.suffix;
562
465
  if (instance?.abstractNumId !== void 0) rendering.abstractNumId = instance.abstractNumId;
563
466
  if (overrideForLevel?.startOverride !== void 0) rendering.startOverride = overrideForLevel.startOverride;
@@ -608,4 +511,4 @@ function isBulletLevel(level) {
608
511
  /** Whether a numbering level reserves horizontal space for a visible marker. */
609
512
  const numberingLevelHasMarkerSlot = (level) => level.numFmt !== "none";
610
513
  //#endregion
611
- export { computeListRendering, createNumberingMap, formatOoxmlCounter as formatNumber, getBulletCharacter, getCachedNumberingMap, isBulletLevel, markerFormattingFromLevel, numberingLevelHasMarkerSlot, padDecimal, parseNumbering, renderListMarker };
514
+ export { computeListRendering, counterFormatOf, createNumberingMap, customNumberFormatOf, customNumberFormatPadWidth, formatOoxmlCounter as formatNumber, getBulletCharacter, getCachedNumberingMap, isBulletLevel, markerAlignmentForLevel, markerFormattingFromLevel, numberingLevelHasMarkerSlot, padDecimal, parseNumbering, renderListMarker };