@stll/folio-core 0.52.0 → 0.54.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 (389) hide show
  1. package/README.md +23 -0
  2. package/dist/ai-edits/apply.d.ts +26 -1
  3. package/dist/ai-edits/apply.js +1779 -141
  4. package/dist/ai-edits/batch-claims.d.ts +145 -0
  5. package/dist/ai-edits/batch-claims.js +275 -0
  6. package/dist/ai-edits/blockRange.js +9 -3
  7. package/dist/ai-edits/character-boundaries.d.ts +43 -0
  8. package/dist/ai-edits/character-boundaries.js +95 -0
  9. package/dist/ai-edits/clean-text.d.ts +33 -3
  10. package/dist/ai-edits/clean-text.js +52 -6
  11. package/dist/ai-edits/comment-lifecycle.d.ts +18 -0
  12. package/dist/ai-edits/comment-lifecycle.js +52 -0
  13. package/dist/ai-edits/headless.d.ts +91 -7
  14. package/dist/ai-edits/headless.js +520 -51
  15. package/dist/ai-edits/index.d.ts +2 -1
  16. package/dist/ai-edits/index.js +2 -1
  17. package/dist/ai-edits/minimal-replacement.d.ts +21 -6
  18. package/dist/ai-edits/minimal-replacement.js +134 -15
  19. package/dist/ai-edits/newListNumbering.d.ts +23 -0
  20. package/dist/ai-edits/newListNumbering.js +94 -0
  21. package/dist/ai-edits/note-references.d.ts +96 -0
  22. package/dist/ai-edits/note-references.js +139 -0
  23. package/dist/ai-edits/pending-suggestions.d.ts +79 -0
  24. package/dist/ai-edits/pending-suggestions.js +306 -0
  25. package/dist/ai-edits/read.d.ts +6 -4
  26. package/dist/ai-edits/read.js +113 -50
  27. package/dist/ai-edits/result-validation.d.ts +29 -0
  28. package/dist/ai-edits/result-validation.js +164 -0
  29. package/dist/ai-edits/revisionStretches.d.ts +17 -0
  30. package/dist/ai-edits/revisionStretches.js +80 -0
  31. package/dist/ai-edits/snapshot.d.ts +36 -3
  32. package/dist/ai-edits/snapshot.js +180 -25
  33. package/dist/ai-edits/table-cell-mutations.d.ts +4 -2
  34. package/dist/ai-edits/table-cell-mutations.js +6 -2
  35. package/dist/ai-edits/table-geometry.d.ts +1 -1
  36. package/dist/ai-edits/table-row-column-mutations.d.ts +44 -17
  37. package/dist/ai-edits/table-row-column-mutations.js +86 -34
  38. package/dist/ai-edits/types.d.ts +155 -16
  39. package/dist/compare/compare.d.ts +1 -1
  40. package/dist/compare/compare.js +65 -16
  41. package/dist/compare/content-alignment.d.ts +5 -1
  42. package/dist/compare/content-alignment.js +52 -34
  43. package/dist/compare/content-types.d.ts +7 -0
  44. package/dist/compare/content.d.ts +4 -1
  45. package/dist/compare/content.js +6 -1
  46. package/dist/compare/formatting.js +2 -1
  47. package/dist/compare/inline-atoms.d.ts +21 -4
  48. package/dist/compare/inline-atoms.js +138 -16
  49. package/dist/compare/inline-provenance.js +1 -1
  50. package/dist/compare/plan.js +10 -5
  51. package/dist/compare/scenario.js +14 -3
  52. package/dist/compare/section-boundary-properties.js +1 -1
  53. package/dist/compare/types.d.ts +4 -2
  54. package/dist/compare/types.js +2 -1
  55. package/dist/compare/verification.d.ts +1 -1
  56. package/dist/compare/verification.js +15 -3
  57. package/dist/controller/committedLayoutDiff.d.ts +25 -0
  58. package/dist/controller/committedLayoutDiff.js +71 -0
  59. package/dist/controller/contentControlWidgetController.d.ts +1 -1
  60. package/dist/controller/folioEditor.d.ts +1 -1
  61. package/dist/controller/fontReadiness.d.ts +70 -3
  62. package/dist/controller/fontReadiness.js +100 -10
  63. package/dist/controller/headerFooterEditorManager.js +6 -1
  64. package/dist/controller/layoutPipeline.d.ts +12 -10
  65. package/dist/controller/layoutPipeline.js +65 -11
  66. package/dist/controller/layoutRunOptions.d.ts +24 -0
  67. package/dist/controller/layoutRunOptions.js +17 -0
  68. package/dist/controller/layoutScheduler.d.ts +19 -14
  69. package/dist/controller/layoutScheduler.js +15 -12
  70. package/dist/controller/layoutSession.d.ts +26 -2
  71. package/dist/controller/layoutSession.js +1 -1
  72. package/dist/controller/noteEditorManager.js +8 -3
  73. package/dist/document-operations.d.ts +11 -2
  74. package/dist/document-operations.js +230 -21
  75. package/dist/docx/altChunk.d.ts +8 -0
  76. package/dist/docx/altChunk.js +17 -0
  77. package/dist/docx/archiveInflation.d.ts +127 -0
  78. package/dist/docx/archiveInflation.js +181 -0
  79. package/dist/docx/attributeRemainder.d.ts +1 -1
  80. package/dist/docx/blockContentParser.d.ts +64 -1
  81. package/dist/docx/blockContentParser.js +17 -4
  82. package/dist/docx/blockCustomXmlShell.d.ts +7 -0
  83. package/dist/docx/blockCustomXmlShell.js +14 -0
  84. package/dist/docx/blockPlainText.js +7 -0
  85. package/dist/docx/commentAnchorIndex.js +1 -1
  86. package/dist/docx/commentRangeIntegrity.js +8 -3
  87. package/dist/docx/commentReferenceNormalization.js +1 -1
  88. package/dist/docx/commentReplyMarkers.js +20 -1
  89. package/dist/docx/compatibility.d.ts +1 -1
  90. package/dist/docx/compatibility.js +34 -13
  91. package/dist/docx/containerChildren.gen.d.ts +1 -1
  92. package/dist/docx/containerChildren.gen.js +1 -0
  93. package/dist/docx/documentParser.js +12 -12
  94. package/dist/docx/drawingIdNormalization.d.ts +3 -1
  95. package/dist/docx/drawingIdNormalization.js +6 -1
  96. package/dist/docx/ensureParaIds.js +119 -97
  97. package/dist/docx/footnoteParser.js +8 -4
  98. package/dist/docx/headerFooterParser.js +3 -3
  99. package/dist/docx/headerFooterReferenceNormalization.d.ts +20 -1
  100. package/dist/docx/headerFooterReferenceNormalization.js +52 -27
  101. package/dist/docx/hyperlinkParser.d.ts +1 -1
  102. package/dist/docx/index.d.ts +1 -1
  103. package/dist/docx/listNumberingInstances.d.ts +59 -0
  104. package/dist/docx/listNumberingInstances.js +249 -0
  105. package/dist/docx/metadataPrivacy.js +24 -1
  106. package/dist/docx/normalizeBaseDirection.js +2 -1
  107. package/dist/docx/noteReferenceMark.d.ts +15 -0
  108. package/dist/docx/noteReferenceMark.js +48 -0
  109. package/dist/docx/opaqueCarrier.d.ts +7 -0
  110. package/dist/docx/opaqueCarrier.js +38 -0
  111. package/dist/docx/packageParts.js +4 -1
  112. package/dist/docx/paragraphParser.js +96 -27
  113. package/dist/docx/paragraphPropertySource.d.ts +4 -2
  114. package/dist/docx/paragraphPropertySource.js +10 -2
  115. package/dist/docx/paragraphTraversal.js +1 -0
  116. package/dist/docx/parseWarningMessage.js +4 -1
  117. package/dist/docx/parser.js +175 -22
  118. package/dist/docx/rezip.js +31 -7
  119. package/dist/docx/sdtProperties.js +1 -1
  120. package/dist/docx/sdtPropertiesPatch.js +3 -0
  121. package/dist/docx/selectiveSave.js +16 -9
  122. package/dist/docx/selectiveXmlPatch.d.ts +3 -1
  123. package/dist/docx/selectiveXmlPatch.js +186 -39
  124. package/dist/docx/serializer/blockCustomXmlSerializer.d.ts +5 -0
  125. package/dist/docx/serializer/blockCustomXmlSerializer.js +4 -0
  126. package/dist/docx/serializer/documentSerializer.js +2 -0
  127. package/dist/docx/serializer/headerFooterSerializer.js +2 -0
  128. package/dist/docx/serializer/noteSerializer.js +3 -1
  129. package/dist/docx/serializer/paragraphSerializer.js +33 -9
  130. package/dist/docx/serializer/tableSerializer.js +25 -38
  131. package/dist/docx/server/boundedArchive.d.ts +8 -13
  132. package/dist/docx/server/boundedArchive.js +70 -59
  133. package/dist/docx/server/createBilingualDocument.js +3 -3
  134. package/dist/docx/server/extractDocxText.d.ts +8 -2
  135. package/dist/docx/server/extractDocxText.js +2 -2
  136. package/dist/docx/server/validateDocxConformance.d.ts +1 -1
  137. package/dist/docx/server/validateDocxConformance.js +1 -0
  138. package/dist/docx/tableParser.d.ts +157 -1
  139. package/dist/docx/tableParser.js +89 -10
  140. package/dist/docx/textBoxParser.js +1 -1
  141. package/dist/docx/unzip.d.ts +20 -2
  142. package/dist/docx/unzip.js +136 -25
  143. package/dist/docx/wordprocessingPrefixes.d.ts +78 -0
  144. package/dist/docx/wordprocessingPrefixes.js +286 -0
  145. package/dist/fonts/embeddedFonts.js +1 -1
  146. package/dist/i18n/messages/catalogs.gen.d.ts +170 -34
  147. package/dist/i18n/messages/catalogs.gen.js +187 -51
  148. package/dist/i18n/messages/messages.gen.d.ts +10 -2
  149. package/dist/internal/compare/inline-presentation.d.ts +2 -1
  150. package/dist/internal/compare/inline-presentation.js +11 -10
  151. package/dist/internal/headlessRevisionResolutionGuard.d.ts +2 -8
  152. package/dist/internal/headlessRevisionResolutionGuard.js +2 -11
  153. package/dist/internal/indexedPositionMap.d.ts +11 -0
  154. package/dist/internal/indexedPositionMap.js +42 -0
  155. package/dist/internal/pageBreakRunSourceDescendantIndex.js +2 -1
  156. package/dist/internal/revisionResolutionEdits.d.ts +13 -0
  157. package/dist/internal/revisionResolutionEdits.js +19 -0
  158. package/dist/internal/revisionResolutionInline.d.ts +24 -0
  159. package/dist/internal/{headlessRevisionResolution.js → revisionResolutionInline.js} +61 -43
  160. package/dist/internal/revisionResolutionStep.d.ts +34 -0
  161. package/dist/internal/revisionResolutionStep.js +282 -0
  162. package/dist/internal/revisionResolutionTracking.d.ts +11 -0
  163. package/dist/internal/revisionResolutionTracking.js +124 -0
  164. package/dist/internal/wholeStoryRevisionResolution.d.ts +56 -0
  165. package/dist/internal/wholeStoryRevisionResolution.js +600 -0
  166. package/dist/layout-bridge/convert/markupViewFlow.d.ts +20 -0
  167. package/dist/layout-bridge/convert/markupViewFlow.js +123 -0
  168. package/dist/layout-bridge/convert/tableConversion.js +1 -1
  169. package/dist/layout-bridge/convert/toFlowBlocks.js +10 -1
  170. package/dist/layout-engine/layoutInstrumentation.d.ts +9 -1
  171. package/dist/layout-engine/layoutInstrumentation.js +4 -1
  172. package/dist/layout-engine/measure/cache.d.ts +18 -1
  173. package/dist/layout-engine/measure/cache.js +31 -1
  174. package/dist/layout-engine/measure/font-metrics.worker.js +3 -7
  175. package/dist/layout-engine/measure/measureContainer.js +7 -47
  176. package/dist/layout-engine/measure/measureHelpers.d.ts +6 -1
  177. package/dist/layout-engine/measure/measureHelpers.js +22 -2
  178. package/dist/layout-engine/measure/measureParagraph.js +2 -2
  179. package/dist/layout-engine/measure/measureWorker.js +2 -3
  180. package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +6 -7
  181. package/dist/layout-engine/measure/measureWorkerProtocol.js +1 -2
  182. package/dist/layout-engine/measure/paragraphMeasureShared.d.ts +12 -1
  183. package/dist/layout-engine/measure/paragraphMeasureShared.js +14 -1
  184. package/dist/layout-engine/types.d.ts +6 -0
  185. package/dist/layout-painter/renderPage.js +1 -0
  186. package/dist/layout-painter/renderParagraph.js +1 -1
  187. package/dist/managers/ContextMenuManager.js +5 -2
  188. package/dist/managers/types.d.ts +3 -0
  189. package/dist/markdown/escape.d.ts +2 -2
  190. package/dist/markdown/escape.js +4 -5
  191. package/dist/markdown/fromMarkdown.js +2 -1
  192. package/dist/markdown/internals.d.ts +11 -1
  193. package/dist/markdown/internals.js +24 -3
  194. package/dist/markdown/renderBlock.js +121 -25
  195. package/dist/markdown/renderParagraph.d.ts +13 -1
  196. package/dist/markdown/renderParagraph.js +85 -38
  197. package/dist/markdown/renderRuns.d.ts +10 -1
  198. package/dist/markdown/renderRuns.js +323 -69
  199. package/dist/markdown/renderTable.js +24 -12
  200. package/dist/markdown/trailers.js +2 -2
  201. package/dist/markdown/types.d.ts +29 -7
  202. package/dist/paged-layout/incrementalMeasure.d.ts +1 -2
  203. package/dist/paged-layout/incrementalMeasure.js +1 -9
  204. package/dist/paged-layout/transactionDirtyRange.d.ts +1 -3
  205. package/dist/paged-layout/transactionDirtyRange.js +29 -41
  206. package/dist/panel-layout.d.ts +83 -0
  207. package/dist/panel-layout.js +96 -0
  208. package/dist/prosemirror/anchoredTextBoxes.d.ts +37 -0
  209. package/dist/prosemirror/anchoredTextBoxes.js +156 -0
  210. package/dist/prosemirror/attrs/index.d.ts +6 -2
  211. package/dist/prosemirror/attrs/index.js +172 -1
  212. package/dist/prosemirror/clearRunColor.d.ts +6 -0
  213. package/dist/prosemirror/clearRunColor.js +46 -0
  214. package/dist/prosemirror/commands/comments.d.ts +7 -8
  215. package/dist/prosemirror/commands/comments.js +281 -212
  216. package/dist/prosemirror/commands/contentControls.d.ts +1 -1
  217. package/dist/prosemirror/commands/formatPainter.d.ts +1 -1
  218. package/dist/prosemirror/commands/formatPainter.js +1 -1
  219. package/dist/prosemirror/commands/formatting.d.ts +1 -1
  220. package/dist/prosemirror/commands/hyperlink.js +2 -1
  221. package/dist/prosemirror/commands/index.d.ts +2 -2
  222. package/dist/prosemirror/commands/index.js +2 -2
  223. package/dist/prosemirror/commands/paragraph.d.ts +7 -1
  224. package/dist/prosemirror/commands/paragraph.js +9 -1
  225. package/dist/prosemirror/commands/paragraphBookmarkJoin.d.ts +13 -0
  226. package/dist/prosemirror/commands/paragraphBookmarkJoin.js +22 -0
  227. package/dist/prosemirror/commands/pastePlainText.d.ts +1 -1
  228. package/dist/prosemirror/commands/propertyChangeScope.d.ts +3 -2
  229. package/dist/prosemirror/commands/propertyChangeScope.js +24 -3
  230. package/dist/prosemirror/commands/resolveAllTableChanges.d.ts +40 -0
  231. package/dist/prosemirror/commands/resolveAllTableChanges.js +620 -0
  232. package/dist/prosemirror/commands/resolveNodePropertyChangeAttrs.d.ts +15 -0
  233. package/dist/prosemirror/commands/resolveNodePropertyChangeAttrs.js +46 -0
  234. package/dist/prosemirror/commands/resolveParagraphProperties.d.ts +16 -0
  235. package/dist/prosemirror/commands/resolveParagraphProperties.js +73 -0
  236. package/dist/prosemirror/commands/sectionBreak.js +2 -1
  237. package/dist/prosemirror/commands/tableCellMergeResolution.d.ts +15 -2
  238. package/dist/prosemirror/commands/tableCellMergeResolution.js +23 -7
  239. package/dist/prosemirror/containerFinalParagraph.d.ts +11 -5
  240. package/dist/prosemirror/containerFinalParagraph.js +7 -6
  241. package/dist/prosemirror/contentControlRevisions.d.ts +1 -1
  242. package/dist/prosemirror/conversion/fromProseDoc.d.ts +2 -13
  243. package/dist/prosemirror/conversion/fromProseDoc.js +177 -605
  244. package/dist/prosemirror/conversion/toProseDoc.d.ts +4 -11
  245. package/dist/prosemirror/conversion/toProseDoc.js +70 -154
  246. package/dist/prosemirror/documentSchema.d.ts +8 -0
  247. package/dist/prosemirror/documentSchema.js +18 -0
  248. package/dist/prosemirror/emptyFieldResultRuns.d.ts +18 -0
  249. package/dist/prosemirror/emptyFieldResultRuns.js +33 -0
  250. package/dist/prosemirror/extensions/ExtensionManager.d.ts +1 -1
  251. package/dist/prosemirror/extensions/ExtensionManager.js +3 -1
  252. package/dist/prosemirror/extensions/StarterKit.js +5 -1
  253. package/dist/prosemirror/extensions/core/DocExtension.js +1 -1
  254. package/dist/prosemirror/extensions/core/ParagraphExtension.js +116 -63
  255. package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +4 -1
  256. package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.js +24 -3
  257. package/dist/prosemirror/extensions/features/JoinedRunStyleExtension.d.ts +20 -0
  258. package/dist/prosemirror/extensions/features/JoinedRunStyleExtension.js +43 -0
  259. package/dist/prosemirror/extensions/features/ListExtension.js +167 -128
  260. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +19 -2
  261. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +33 -20
  262. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +31 -2
  263. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +270 -99
  264. package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +3 -2
  265. package/dist/prosemirror/extensions/features/pasteCleanup.js +2 -1
  266. package/dist/prosemirror/extensions/features/pastedHeadingStyles.js +1 -1
  267. package/dist/prosemirror/extensions/features/pastedHtmlLists.d.ts +12 -0
  268. package/dist/prosemirror/extensions/features/pastedHtmlLists.js +124 -0
  269. package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +33 -11
  270. package/dist/prosemirror/extensions/marks/HyperlinkExtension.js +8 -4
  271. package/dist/prosemirror/extensions/marks/RunIdentityExtension.d.ts +21 -18
  272. package/dist/prosemirror/extensions/marks/RunIdentityExtension.js +37 -17
  273. package/dist/prosemirror/extensions/marks/StrikeExtension.js +2 -2
  274. package/dist/prosemirror/extensions/marks/SubscriptExtension.js +2 -2
  275. package/dist/prosemirror/extensions/marks/SuperscriptExtension.js +2 -2
  276. package/dist/prosemirror/extensions/marks/TextColorExtension.js +4 -3
  277. package/dist/prosemirror/extensions/marks/markUtils.d.ts +15 -8
  278. package/dist/prosemirror/extensions/marks/markUtils.js +25 -10
  279. package/dist/prosemirror/extensions/marks/noteReferenceDeletion.d.ts +12 -0
  280. package/dist/prosemirror/extensions/marks/noteReferenceDeletion.js +46 -0
  281. package/dist/prosemirror/extensions/nodes/BlockCustomXmlExtension.d.ts +6 -0
  282. package/dist/prosemirror/extensions/nodes/BlockCustomXmlExtension.js +52 -0
  283. package/dist/prosemirror/extensions/nodes/CommentReferenceExtension.js +2 -2
  284. package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +3 -3
  285. package/dist/prosemirror/extensions/nodes/FieldExtension.js +50 -15
  286. package/dist/prosemirror/extensions/nodes/HardBreakExtension.js +5 -3
  287. package/dist/prosemirror/extensions/nodes/PreservedBlockExtension.js +4 -1
  288. package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +1 -1
  289. package/dist/prosemirror/extensions/nodes/TableExtension.js +121 -226
  290. package/dist/prosemirror/extensions/types.d.ts +11 -1
  291. package/dist/prosemirror/findReplaceSelection.js +1 -1
  292. package/dist/prosemirror/hyperlinkRemoval.d.ts +9 -0
  293. package/dist/prosemirror/hyperlinkRemoval.js +129 -0
  294. package/dist/prosemirror/index.d.ts +5 -3
  295. package/dist/prosemirror/index.js +5 -3
  296. package/dist/prosemirror/indexedNodeLookup.d.ts +17 -0
  297. package/dist/prosemirror/indexedNodeLookup.js +103 -0
  298. package/dist/prosemirror/listAutoformatMarkers.d.ts +19 -0
  299. package/dist/prosemirror/listAutoformatMarkers.js +98 -0
  300. package/dist/prosemirror/listInstanceReferences.d.ts +12 -0
  301. package/dist/prosemirror/listInstanceReferences.js +72 -0
  302. package/dist/prosemirror/listLabels.d.ts +24 -0
  303. package/dist/prosemirror/listLabels.js +111 -0
  304. package/dist/prosemirror/listNumbering.d.ts +92 -0
  305. package/dist/prosemirror/listNumbering.js +330 -0
  306. package/dist/prosemirror/listRendering.d.ts +27 -0
  307. package/dist/prosemirror/listRendering.js +27 -0
  308. package/dist/prosemirror/listRenderingAttrs.d.ts +11 -2
  309. package/dist/prosemirror/listRenderingAttrs.js +8 -1
  310. package/dist/prosemirror/markupViewNotes.d.ts +8 -0
  311. package/dist/prosemirror/markupViewNotes.js +49 -0
  312. package/dist/prosemirror/markupViewProjection.d.ts +97 -0
  313. package/dist/prosemirror/markupViewProjection.js +88 -0
  314. package/dist/prosemirror/noteReferenceReview.d.ts +77 -0
  315. package/dist/prosemirror/noteReferenceReview.js +332 -0
  316. package/dist/prosemirror/numberingAttr.d.ts +9 -1
  317. package/dist/prosemirror/numberingAttr.js +9 -1
  318. package/dist/prosemirror/outlineLevelAttr.js +1 -1
  319. package/dist/prosemirror/paragraphIndentation.d.ts +10 -1
  320. package/dist/prosemirror/paragraphIndentation.js +32 -7
  321. package/dist/prosemirror/paragraphMarkJoin.d.ts +21 -0
  322. package/dist/prosemirror/paragraphMarkJoin.js +26 -0
  323. package/dist/prosemirror/paragraphPropertyCarry.d.ts +64 -0
  324. package/dist/prosemirror/paragraphPropertyCarry.js +158 -0
  325. package/dist/prosemirror/plugins/createDocScanPlugin.d.ts +1 -1
  326. package/dist/prosemirror/plugins/documentNumbering.d.ts +27 -1
  327. package/dist/prosemirror/plugins/documentNumbering.js +97 -11
  328. package/dist/prosemirror/plugins/documentStyleState.d.ts +26 -0
  329. package/dist/prosemirror/plugins/documentStyleState.js +32 -0
  330. package/dist/prosemirror/plugins/documentStyles.d.ts +3 -13
  331. package/dist/prosemirror/plugins/documentStyles.js +67 -17
  332. package/dist/prosemirror/plugins/index.d.ts +2 -1
  333. package/dist/prosemirror/plugins/index.js +2 -1
  334. package/dist/prosemirror/plugins/paragraphStyleResolution.d.ts +15 -0
  335. package/dist/prosemirror/plugins/paragraphStyleResolution.js +230 -0
  336. package/dist/prosemirror/plugins/suggestionMode.d.ts +27 -3
  337. package/dist/prosemirror/plugins/suggestionMode.js +490 -63
  338. package/dist/prosemirror/plugins/templateDirectives.d.ts +1 -1
  339. package/dist/prosemirror/plugins/transactionInvariants.d.ts +32 -0
  340. package/dist/prosemirror/plugins/transactionInvariants.js +86 -0
  341. package/dist/prosemirror/positionSweep.d.ts +24 -0
  342. package/dist/prosemirror/positionSweep.js +222 -0
  343. package/dist/prosemirror/rebaseParagraphRunFormatting.d.ts +23 -3
  344. package/dist/prosemirror/rebaseParagraphRunFormatting.js +39 -13
  345. package/dist/prosemirror/rebaseParagraphRuns.d.ts +36 -0
  346. package/dist/prosemirror/rebaseParagraphRuns.js +99 -0
  347. package/dist/prosemirror/rejoinRunCarriers.d.ts +1 -1
  348. package/dist/prosemirror/replacedAnnotations.d.ts +33 -1
  349. package/dist/prosemirror/replacedAnnotations.js +170 -1
  350. package/dist/prosemirror/runFormattingFromMarks.d.ts +18 -0
  351. package/dist/prosemirror/runFormattingFromMarks.js +567 -0
  352. package/dist/prosemirror/runFormattingInlineCarriers.d.ts +1 -1
  353. package/dist/prosemirror/runFormattingReconciliation.js +10 -9
  354. package/dist/prosemirror/schema/index.d.ts +2 -2
  355. package/dist/prosemirror/schema/index.js +3 -0
  356. package/dist/prosemirror/schema/nodes.d.ts +44 -11
  357. package/dist/prosemirror/sectionMarkEdits.d.ts +20 -0
  358. package/dist/prosemirror/sectionMarkEdits.js +59 -0
  359. package/dist/prosemirror/storyListNumbering.d.ts +17 -0
  360. package/dist/prosemirror/storyListNumbering.js +102 -0
  361. package/dist/prosemirror/styles/paragraphStyleCascade.d.ts +59 -0
  362. package/dist/prosemirror/styles/paragraphStyleCascade.js +145 -0
  363. package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +21 -2
  364. package/dist/prosemirror/styles/resolvedStyleAttrs.js +38 -1
  365. package/dist/prosemirror/styles/tableStyleRegions.d.ts +31 -0
  366. package/dist/prosemirror/styles/tableStyleRegions.js +55 -0
  367. package/dist/prosemirror/tableCellPaste.d.ts +74 -0
  368. package/dist/prosemirror/tableCellPaste.js +525 -0
  369. package/dist/prosemirror/tableGridMutation.d.ts +87 -2
  370. package/dist/prosemirror/tableGridMutation.js +255 -2
  371. package/dist/prosemirror/tableRunIn.d.ts +51 -0
  372. package/dist/prosemirror/tableRunIn.js +165 -0
  373. package/dist/prosemirror/textInput.js +11 -2
  374. package/dist/prosemirror/trackedRevisionPath.d.ts +17 -0
  375. package/dist/prosemirror/trackedRevisionPath.js +32 -0
  376. package/dist/prosemirror/validation.js +5 -1
  377. package/dist/redline.js +93 -9
  378. package/dist/render-dom/BodySelectionOverlay.d.ts +4 -1
  379. package/dist/render-dom/BodySelectionOverlay.js +3 -2
  380. package/dist/server.d.ts +2 -2
  381. package/dist/utils/findReplace.js +2 -2
  382. package/dist/utils/mergeDocumentContent.js +1 -1
  383. package/dist/utils/noteReferenceLabels.d.ts +36 -0
  384. package/dist/utils/noteReferenceLabels.js +32 -0
  385. package/dist/utils/replaceText.js +1 -1
  386. package/dist/version-comparison.d.ts +1 -0
  387. package/dist/version-comparison.js +1 -0
  388. package/package.json +6 -5
  389. package/dist/internal/headlessRevisionResolution.d.ts +0 -23
@@ -4,12 +4,9 @@ import { PARSE_WARNING_CODES } from "@stll/docx-core/model";
4
4
  const DANGLING_HEADER_REFERENCE_WARNING = PARSE_WARNING_CODES.danglingHeaderReference;
5
5
  const DANGLING_FOOTER_REFERENCE_WARNING = PARSE_WARNING_CODES.danglingFooterReference;
6
6
  const normalizeHeaderFooterReferences = ({ documentBody, headers, footers }) => {
7
- const seenSectionProperties = /* @__PURE__ */ new Set();
8
7
  let removedDanglingHeaderReferences = 0;
9
8
  let removedDanglingFooterReferences = 0;
10
9
  const normalizeSectionProperties = (sectionProperties) => {
11
- if (!sectionProperties || seenSectionProperties.has(sectionProperties)) return;
12
- seenSectionProperties.add(sectionProperties);
13
10
  const headerResult = removeDanglingReferences(sectionProperties.headerReferences, headers);
14
11
  if (headerResult.changed) {
15
12
  removedDanglingHeaderReferences += headerResult.removed;
@@ -23,34 +20,62 @@ const normalizeHeaderFooterReferences = ({ documentBody, headers, footers }) =>
23
20
  else delete sectionProperties.footerReferences;
24
21
  }
25
22
  };
26
- const normalizeParagraph = (paragraph) => {
27
- normalizeSectionProperties(paragraph.sectionProperties);
23
+ forEachSectionProperties(documentBody, normalizeSectionProperties);
24
+ return {
25
+ removedDanglingHeaderReferences,
26
+ removedDanglingFooterReferences
28
27
  };
29
- const normalizeTable = (table) => {
30
- for (const row of table.rows) for (const cell of row.cells) normalizeBlocks(cell.content);
28
+ };
29
+ /**
30
+ * Visit every distinct section record once, in section order: the paragraph
31
+ * carriers in document order, then the body's final `w:sectPr`.
32
+ */
33
+ const forEachSectionProperties = (documentBody, visit) => {
34
+ const seen = /* @__PURE__ */ new Set();
35
+ const visitOnce = (sectionProperties) => {
36
+ if (!sectionProperties || seen.has(sectionProperties)) return;
37
+ seen.add(sectionProperties);
38
+ visit(sectionProperties);
31
39
  };
32
- const normalizeBlock = (block) => {
33
- if (block.type === "paragraph") {
34
- normalizeParagraph(block);
35
- return;
36
- }
37
- if (block.type === "table") {
38
- normalizeTable(block);
39
- return;
40
- }
41
- if (block.type !== "blockSdt") return;
42
- normalizeBlocks(block.content);
40
+ const visitBlocks = (blocks) => {
41
+ for (const block of blocks) if (block.type === "paragraph") visitOnce(block.sectionProperties);
42
+ else if (block.type === "table") visitTable(block);
43
+ else if (block.type === "blockSdt" || block.type === "blockCustomXml") visitBlocks(block.content);
43
44
  };
44
- const normalizeBlocks = (blocks) => {
45
- for (const block of blocks) normalizeBlock(block);
45
+ const visitTable = (table) => {
46
+ for (const row of table.rows) for (const cell of row.cells) visitBlocks(cell.content);
46
47
  };
47
- normalizeBlocks(documentBody.content);
48
- normalizeSectionProperties(documentBody.finalSectionProperties);
49
- for (const section of documentBody.sections ?? []) normalizeSectionProperties(section.properties);
50
- return {
51
- removedDanglingHeaderReferences,
52
- removedDanglingFooterReferences
48
+ visitBlocks(documentBody.content);
49
+ visitOnce(documentBody.finalSectionProperties);
50
+ for (const section of documentBody.sections ?? []) visitOnce(section.properties);
51
+ };
52
+ /**
53
+ * Give each header and footer part the role a section reference states for
54
+ * it.
55
+ *
56
+ * A part says nothing about which pages it serves: the `w:type` of the
57
+ * `w:headerReference` / `w:footerReference` naming it does (ECMA-376 Part 1
58
+ * §17.10.5, `ST_HdrFtr`). The parts are read from the document's
59
+ * relationships, before any section is consulted, so each is read as a
60
+ * default part and takes its role here, from the first section that
61
+ * references it. A part no section references stays default; one several
62
+ * sections reference in different roles keeps the first, and a reader that
63
+ * needs every role reads the section references themselves.
64
+ */
65
+ const assignHeaderFooterRoles = ({ documentBody, headers, footers }) => {
66
+ const assigned = /* @__PURE__ */ new Set();
67
+ const assign = (references, parts) => {
68
+ for (const { type, rId } of references ?? []) {
69
+ const part = parts?.get(rId);
70
+ if (!part || assigned.has(part)) continue;
71
+ assigned.add(part);
72
+ part.hdrFtrType = type;
73
+ }
53
74
  };
75
+ forEachSectionProperties(documentBody, (sectionProperties) => {
76
+ assign(sectionProperties.headerReferences, headers);
77
+ assign(sectionProperties.footerReferences, footers);
78
+ });
54
79
  };
55
80
  const removeDanglingReferences = (references, validParts) => {
56
81
  if (!references || !validParts) return {
@@ -66,4 +91,4 @@ const removeDanglingReferences = (references, validParts) => {
66
91
  };
67
92
  };
68
93
  //#endregion
69
- export { DANGLING_FOOTER_REFERENCE_WARNING, DANGLING_HEADER_REFERENCE_WARNING, normalizeHeaderFooterReferences };
94
+ export { DANGLING_FOOTER_REFERENCE_WARNING, DANGLING_HEADER_REFERENCE_WARNING, assignHeaderFooterRoles, normalizeHeaderFooterReferences };
@@ -1,8 +1,8 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
2
  import { XmlElement } from "./xmlParser.js";
3
+ import { ChildReader } from "./containerChildren.js";
3
4
  import { PreviewLedger } from "./previewBudget.js";
4
5
  import { StyleMap } from "./styleParser.js";
5
- import { ChildReader } from "./containerChildren.js";
6
6
  //#region src/docx/hyperlinkParser.d.ts
7
7
  /**
8
8
  * Parse a hyperlink element (w:hyperlink)
@@ -1,6 +1,6 @@
1
1
  import { getCachedNumberingMap } from "./numberingParser.js";
2
+ import { NO_NUMBERING_NUM_ID, NO_PARAGRAPH_NUMBERING, ParagraphNumberingOverride, ParagraphNumberingSlots, ResolvedParagraphNumbering, isNumberingReference, mergeParagraphNumbering, paragraphNumberingFromSlots, paragraphNumberingLevel, paragraphNumberingReferenceId, paragraphNumberingSlots, readParagraphNumbering, resolveParagraphNumbering, sameEffectiveParagraphNumbering, sameStatedParagraphNumbering } from "./numberingReference.js";
2
3
  import { DOCX_ENCRYPTION_ERROR_CODES, DocxEncryptionError, DocxEncryptionErrorCode, isDocxEncryptionError } from "./encryption/errors.js";
3
4
  import { DecryptDocxOptions, DecryptDocxResult, decryptDocxIfNeeded, openDocxBuffer } from "./encryption/openEncryptedDocx.js";
4
- import { NO_NUMBERING_NUM_ID, NO_PARAGRAPH_NUMBERING, ParagraphNumberingOverride, ParagraphNumberingSlots, ResolvedParagraphNumbering, isNumberingReference, mergeParagraphNumbering, paragraphNumberingFromSlots, paragraphNumberingLevel, paragraphNumberingReferenceId, paragraphNumberingSlots, readParagraphNumbering, resolveParagraphNumbering, sameEffectiveParagraphNumbering, sameStatedParagraphNumbering } from "./numberingReference.js";
5
5
  import { FOLIO_DOCUMENT_METADATA_PROPERTIES, FOLIO_DOCUMENT_PRIVACY_TRANSFORMS, FolioDocumentMetadataProperty, FolioDocumentPrivacyArchiveError, FolioDocumentPrivacyOptions, FolioDocumentPrivacyReport, FolioDocumentPrivacyTransform, InvalidFolioDocumentPrivacyOptionsError, RewriteDocxMetadataPrivacyResult, isFolioDocumentPrivacyTransform, rewriteDocxMetadataPrivacy } from "./metadataPrivacy.js";
6
6
  export { DOCX_ENCRYPTION_ERROR_CODES, type DecryptDocxOptions, type DecryptDocxResult, DocxEncryptionError, type DocxEncryptionErrorCode, FOLIO_DOCUMENT_METADATA_PROPERTIES, FOLIO_DOCUMENT_PRIVACY_TRANSFORMS, type FolioDocumentMetadataProperty, FolioDocumentPrivacyArchiveError, type FolioDocumentPrivacyOptions, type FolioDocumentPrivacyReport, type FolioDocumentPrivacyTransform, InvalidFolioDocumentPrivacyOptionsError, NO_NUMBERING_NUM_ID, NO_PARAGRAPH_NUMBERING, type ParagraphNumberingOverride, type ParagraphNumberingSlots, type ResolvedParagraphNumbering, type RewriteDocxMetadataPrivacyResult, decryptDocxIfNeeded, getCachedNumberingMap, isDocxEncryptionError, isFolioDocumentPrivacyTransform, isNumberingReference, mergeParagraphNumbering, openDocxBuffer, paragraphNumberingFromSlots, paragraphNumberingLevel, paragraphNumberingReferenceId, paragraphNumberingSlots, readParagraphNumbering, resolveParagraphNumbering, rewriteDocxMetadataPrivacy, sameEffectiveParagraphNumbering, sameStatedParagraphNumbering };
@@ -0,0 +1,59 @@
1
+ import { document_d_exports } from "../types/document.js";
2
+ //#region src/docx/listNumberingInstances.d.ts
3
+ /** The two kinds of list a command can create. */
4
+ declare const LIST_KINDS: readonly ["bullet", "numbered"];
5
+ type ListKind = (typeof LIST_KINDS)[number];
6
+ /** What a numbered list's first level counts in and how its marker reads. */
7
+ type ListLevelFormat = {
8
+ numFmt: document_d_exports.NumberFormat;
9
+ /** `w:lvlText` for level 0, e.g. `%1.` or `%1)`. */
10
+ lvlText: string;
11
+ };
12
+ /** The first-level appearance and start a new list is minted with. */
13
+ type NewListDefinition = {
14
+ kind: ListKind;
15
+ /** Level-0 format of a numbered list; the template's `%1.` decimal otherwise. */
16
+ format?: ListLevelFormat | undefined;
17
+ /** The value the first item shows, stated as a level-0 `w:startOverride`. */
18
+ start?: number | undefined;
19
+ };
20
+ type MintedListInstance = {
21
+ definitions: document_d_exports.NumberingDefinitions;
22
+ numId: number;
23
+ };
24
+ /**
25
+ * Define a new list: a new `w:abstractNum` of the requested kind and the
26
+ * `w:num` naming it. `definitions` must already hold every instance the
27
+ * document references (see {@link completeListNumbering}), so the new ids
28
+ * collide with none of them.
29
+ */
30
+ declare const mintListInstance: (definitions: document_d_exports.NumberingDefinitions | null | undefined, { kind, format, start }: NewListDefinition) => MintedListInstance;
31
+ type RestartListInstanceOptions = {
32
+ abstractNumId: number;
33
+ ilvl: number;
34
+ start: number;
35
+ };
36
+ /**
37
+ * A new `w:num` over an existing `w:abstractNum`, with a `w:startOverride` at
38
+ * `ilvl`: *Restart Numbering* and *Set Numbering Value*. The override is what
39
+ * makes a consumer count the instance on its own rather than continue the
40
+ * other instances of the same definition.
41
+ */
42
+ declare const restartListInstance: (definitions: document_d_exports.NumberingDefinitions | null | undefined, { abstractNumId, ilvl, start }: RestartListInstanceOptions) => MintedListInstance;
43
+ /** One paragraph's numbering reference and the rendering it resolved to. */
44
+ type ListInstanceReference = {
45
+ numId: number;
46
+ ilvl: number;
47
+ rendering: document_d_exports.ListRendering;
48
+ };
49
+ /**
50
+ * Define every instance `references` name that `definitions` does not.
51
+ *
52
+ * A reference the editor resolved carries its rendering, and a rendering is
53
+ * what a minted instance leaves behind; a reference without one (a dangling
54
+ * id read from a file) has no rendering and so is never defined here. Returns
55
+ * `definitions` itself when nothing is missing.
56
+ */
57
+ declare const completeListNumbering: (definitions: document_d_exports.NumberingDefinitions | undefined, references: Iterable<ListInstanceReference>) => document_d_exports.NumberingDefinitions | undefined;
58
+ //#endregion
59
+ export { LIST_KINDS, ListInstanceReference, ListKind, ListLevelFormat, completeListNumbering, mintListInstance, restartListInstance };
@@ -0,0 +1,249 @@
1
+ import { NUMBER_FORMATS } from "@stll/docx-core/model";
2
+ //#region src/docx/listNumberingInstances.ts
3
+ /**
4
+ * Numbering instances the editor defines itself.
5
+ *
6
+ * A list command in a document with no list of the requested kind has nothing
7
+ * to reference: the package may have no numbering part at all. The command
8
+ * then defines one, an `w:abstractNum` built from {@link defaultListLevels}
9
+ * plus the `w:num` naming it, as a word processor does when a list is
10
+ * started in a document without lists.
11
+ *
12
+ * The definition lives in two places without being stored twice. While the
13
+ * document is edited, the paragraphs that reference the instance carry the
14
+ * rendering it resolved to (`listAbstractNumId`, `listNumFmt`,
15
+ * `listMarkerTemplate`, `listStartOverride`, …), and those attrs travel with
16
+ * the paragraph through undo, collaboration and every save path.
17
+ * {@link completeListNumbering} turns them back into the definition wherever
18
+ * the package's own numbering has no entry for the id. Because a minted
19
+ * definition is the template plus level-0 facts that the rendering states, the
20
+ * definition it rebuilds is the one the command minted.
21
+ */
22
+ /** The two kinds of list a command can create. */
23
+ const LIST_KINDS = ["bullet", "numbered"];
24
+ const INDENT_STEP_TWIPS = 720;
25
+ const HANGING_TWIPS = 360;
26
+ const ROMAN_HANGING_TWIPS = 180;
27
+ const LEVEL_COUNT = 9;
28
+ const levelIndent = (ilvl, hanging) => ({
29
+ indentLeft: INDENT_STEP_TWIPS * (ilvl + 1),
30
+ indentFirstLine: -hanging,
31
+ hangingIndent: true
32
+ });
33
+ /** The customary numbered-list cycle: `1.`, `a.`, `i.`, then again one level deeper. */
34
+ const NUMBERED_CYCLE = [
35
+ {
36
+ numFmt: "decimal",
37
+ lvlJc: "left",
38
+ hanging: HANGING_TWIPS
39
+ },
40
+ {
41
+ numFmt: "lowerLetter",
42
+ lvlJc: "left",
43
+ hanging: HANGING_TWIPS
44
+ },
45
+ {
46
+ numFmt: "lowerRoman",
47
+ lvlJc: "right",
48
+ hanging: ROMAN_HANGING_TWIPS
49
+ }
50
+ ];
51
+ /** The customary bullet cycle: a round bullet, an open circle, a square. */
52
+ const BULLET_CYCLE = [
53
+ {
54
+ text: "•",
55
+ font: null
56
+ },
57
+ {
58
+ text: "o",
59
+ font: "Courier New"
60
+ },
61
+ {
62
+ text: "▪",
63
+ font: null
64
+ }
65
+ ];
66
+ const cycleEntry = (cycle, ilvl) => cycle.at(ilvl % cycle.length) ?? cycle[0];
67
+ const numberedLevel = (ilvl) => {
68
+ const { numFmt, lvlJc, hanging } = cycleEntry(NUMBERED_CYCLE, ilvl);
69
+ return {
70
+ ilvl,
71
+ start: 1,
72
+ numFmt,
73
+ lvlText: `%${ilvl + 1}.`,
74
+ lvlJc,
75
+ pPr: levelIndent(ilvl, hanging)
76
+ };
77
+ };
78
+ const bulletLevel = (ilvl) => {
79
+ const { text, font } = cycleEntry(BULLET_CYCLE, ilvl);
80
+ return {
81
+ ilvl,
82
+ start: 1,
83
+ numFmt: "bullet",
84
+ lvlText: text,
85
+ lvlJc: "left",
86
+ pPr: levelIndent(ilvl, HANGING_TWIPS),
87
+ ...font === null ? {} : { rPr: { fontFamily: {
88
+ ascii: font,
89
+ hAnsi: font
90
+ } } }
91
+ };
92
+ };
93
+ /** The nine levels a list of `kind` is minted with. */
94
+ const defaultListLevels = (kind) => Array.from({ length: LEVEL_COUNT }, (_, ilvl) => kind === "bullet" ? bulletLevel(ilvl) : numberedLevel(ilvl));
95
+ const mintAbstractNumbering = ({ abstractNumId, kind, format }) => {
96
+ const levels = defaultListLevels(kind);
97
+ const first = levels[0];
98
+ if (first && kind === "numbered" && format) levels[0] = {
99
+ ...first,
100
+ numFmt: format.numFmt,
101
+ lvlText: format.lvlText
102
+ };
103
+ return {
104
+ abstractNumId,
105
+ multiLevelType: "hybridMultilevel",
106
+ levels
107
+ };
108
+ };
109
+ /** The template counts from one, so only another first value needs an override. */
110
+ const levelZeroStart = (start) => start === void 0 || start === 1 ? void 0 : [{
111
+ ilvl: 0,
112
+ startOverride: start
113
+ }];
114
+ const EMPTY_DEFINITIONS = {
115
+ abstractNums: [],
116
+ nums: []
117
+ };
118
+ const nextId = (ids, floor) => {
119
+ let next = floor;
120
+ for (const id of ids) next = Math.max(next, id + 1);
121
+ return next;
122
+ };
123
+ /** A fresh `w:numId` for `definitions`; zero is reserved for "no numbering". */
124
+ const nextNumId = (definitions) => nextId((definitions?.nums ?? []).map(({ numId }) => numId), 1);
125
+ /** A fresh `w:abstractNumId` for `definitions`. */
126
+ const nextAbstractNumId = (definitions) => nextId((definitions?.abstractNums ?? []).map(({ abstractNumId }) => abstractNumId), 0);
127
+ /**
128
+ * Define a new list: a new `w:abstractNum` of the requested kind and the
129
+ * `w:num` naming it. `definitions` must already hold every instance the
130
+ * document references (see {@link completeListNumbering}), so the new ids
131
+ * collide with none of them.
132
+ */
133
+ const mintListInstance = (definitions, { kind, format, start }) => {
134
+ const current = definitions ?? EMPTY_DEFINITIONS;
135
+ const numId = nextNumId(current);
136
+ const abstractNumId = nextAbstractNumId(current);
137
+ const levelOverrides = levelZeroStart(start);
138
+ const instance = {
139
+ numId,
140
+ abstractNumId,
141
+ ...levelOverrides ? { levelOverrides } : {}
142
+ };
143
+ return {
144
+ numId,
145
+ definitions: {
146
+ ...current,
147
+ abstractNums: [...current.abstractNums, mintAbstractNumbering({
148
+ abstractNumId,
149
+ kind,
150
+ format
151
+ })],
152
+ nums: [...current.nums, instance]
153
+ }
154
+ };
155
+ };
156
+ /**
157
+ * A new `w:num` over an existing `w:abstractNum`, with a `w:startOverride` at
158
+ * `ilvl`: *Restart Numbering* and *Set Numbering Value*. The override is what
159
+ * makes a consumer count the instance on its own rather than continue the
160
+ * other instances of the same definition.
161
+ */
162
+ const restartListInstance = (definitions, { abstractNumId, ilvl, start }) => {
163
+ const current = definitions ?? EMPTY_DEFINITIONS;
164
+ const numId = nextNumId(current);
165
+ const instance = {
166
+ numId,
167
+ abstractNumId,
168
+ levelOverrides: [{
169
+ ilvl,
170
+ startOverride: start
171
+ }]
172
+ };
173
+ return {
174
+ numId,
175
+ definitions: {
176
+ ...current,
177
+ nums: [...current.nums, instance]
178
+ }
179
+ };
180
+ };
181
+ const NUMBER_FORMAT_SET = new Set(NUMBER_FORMATS);
182
+ const isNumberFormat = (format) => format !== void 0 && NUMBER_FORMAT_SET.has(format);
183
+ const levelZeroFormat = (references) => {
184
+ const first = references.find(({ ilvl }) => ilvl === 0)?.rendering;
185
+ const numFmt = first?.numFmt ?? references.find(({ rendering }) => rendering.levelNumFmts?.[0])?.rendering.levelNumFmts?.[0];
186
+ if (!isNumberFormat(numFmt)) return;
187
+ return {
188
+ numFmt,
189
+ lvlText: first?.markerTemplate ?? "%1."
190
+ };
191
+ };
192
+ const startOverridesOf = (references) => {
193
+ const byLevel = /* @__PURE__ */ new Map();
194
+ for (const { ilvl, rendering } of references) if (rendering.startOverride !== void 0 && !byLevel.has(ilvl)) byLevel.set(ilvl, rendering.startOverride);
195
+ return [...byLevel.entries()].toSorted(([left], [right]) => left - right).map(([ilvl, startOverride]) => ({
196
+ ilvl,
197
+ startOverride
198
+ }));
199
+ };
200
+ /**
201
+ * Define every instance `references` name that `definitions` does not.
202
+ *
203
+ * A reference the editor resolved carries its rendering, and a rendering is
204
+ * what a minted instance leaves behind; a reference without one (a dangling
205
+ * id read from a file) has no rendering and so is never defined here. Returns
206
+ * `definitions` itself when nothing is missing.
207
+ */
208
+ const completeListNumbering = (definitions, references) => {
209
+ const definedNums = new Set((definitions?.nums ?? []).map(({ numId }) => numId));
210
+ const missing = /* @__PURE__ */ new Map();
211
+ for (const reference of references) {
212
+ if (definedNums.has(reference.numId)) continue;
213
+ const group = missing.get(reference.numId);
214
+ if (group) group.push(reference);
215
+ else missing.set(reference.numId, [reference]);
216
+ }
217
+ if (missing.size === 0) return definitions;
218
+ const current = definitions ?? EMPTY_DEFINITIONS;
219
+ const abstractIds = new Set(current.abstractNums.map(({ abstractNumId }) => abstractNumId));
220
+ const statedAbstractIds = [...missing.values()].flatMap((group) => group.flatMap(({ rendering }) => rendering.abstractNumId === void 0 ? [] : [rendering.abstractNumId]));
221
+ let freeAbstractId = nextId([...abstractIds, ...statedAbstractIds], 0);
222
+ const abstractNums = [];
223
+ const nums = [];
224
+ for (const [numId, group] of missing) {
225
+ const abstractNumId = group.find(({ rendering }) => rendering.abstractNumId !== void 0)?.rendering.abstractNumId ?? freeAbstractId++;
226
+ if (!abstractIds.has(abstractNumId)) {
227
+ abstractIds.add(abstractNumId);
228
+ const kind = group.some(({ rendering }) => rendering.isBullet) ? "bullet" : "numbered";
229
+ abstractNums.push(mintAbstractNumbering({
230
+ abstractNumId,
231
+ kind,
232
+ format: levelZeroFormat(group)
233
+ }));
234
+ }
235
+ const levelOverrides = startOverridesOf(group);
236
+ nums.push({
237
+ numId,
238
+ abstractNumId,
239
+ ...levelOverrides.length > 0 ? { levelOverrides } : {}
240
+ });
241
+ }
242
+ return {
243
+ ...current,
244
+ abstractNums: [...current.abstractNums, ...abstractNums],
245
+ nums: [...current.nums, ...nums]
246
+ };
247
+ };
248
+ //#endregion
249
+ export { LIST_KINDS, completeListNumbering, mintListInstance, restartListInstance };
@@ -1,3 +1,4 @@
1
+ import { countCentralDirectoryRecords, createInflationBudget, inflateEntryWithinLimits } from "./archiveInflation.js";
1
2
  import { elementToXml, getLocalName, parseXmlDocument } from "./xmlParser.js";
2
3
  import { TaggedError } from "better-result";
3
4
  import JSZip from "jszip";
@@ -63,6 +64,10 @@ const loadPrivacyArchive = async (buffer) => {
63
64
  message: "Document privacy input exceeded the compressed-size limit",
64
65
  reason: "input-too-large"
65
66
  });
67
+ if (countCentralDirectoryRecords(new Uint8Array(buffer), MAX_ARCHIVE_ENTRIES) > MAX_ARCHIVE_ENTRIES) throw new FolioDocumentPrivacyArchiveError({
68
+ message: "Document privacy input exceeded the package-entry limit",
69
+ reason: "too-many-entries"
70
+ });
66
71
  let zip;
67
72
  try {
68
73
  zip = await JSZip.loadAsync(buffer);
@@ -109,6 +114,24 @@ const rewriteCorePropertiesPrivacy = (xml, transforms) => {
109
114
  removedMetadataProperties: FOLIO_DOCUMENT_METADATA_PROPERTIES.filter((property) => removedPropertySet.has(property))
110
115
  };
111
116
  };
117
+ /**
118
+ * Read the core-properties part within its size limit. The declared size was
119
+ * checked when the archive loaded, but only the inflation itself can show that
120
+ * the part is no larger than it claims.
121
+ */
122
+ const readCoreProperties = async (entry) => {
123
+ const result = await inflateEntryWithinLimits({
124
+ entry,
125
+ maxEntryBytes: MAX_CORE_PROPERTIES_BYTES,
126
+ maxCompressionRatio: 200,
127
+ budget: createInflationBudget(MAX_CORE_PROPERTIES_BYTES)
128
+ });
129
+ if (!result.ok) throw new FolioDocumentPrivacyArchiveError({
130
+ message: "Document privacy core properties exceeded the part-size limit",
131
+ reason: "core-properties-too-large"
132
+ });
133
+ return new TextDecoder("utf-8", { ignoreBOM: true }).decode(result.bytes);
134
+ };
112
135
  /** Rewrite selected package metadata fields without changing other package parts. */
113
136
  const rewriteDocxMetadataPrivacy = async (buffer, { transforms }) => {
114
137
  const appliedTransforms = resolveFolioDocumentPrivacyTransforms(transforms);
@@ -121,7 +144,7 @@ const rewriteDocxMetadataPrivacy = async (buffer, { transforms }) => {
121
144
  removedMetadataProperties: []
122
145
  }
123
146
  };
124
- const rewritten = rewriteCorePropertiesPrivacy(await coreProperties.async("text"), appliedTransforms);
147
+ const rewritten = rewriteCorePropertiesPrivacy(await readCoreProperties(coreProperties), appliedTransforms);
125
148
  if (rewritten.removedMetadataProperties.length === 0) return {
126
149
  buffer,
127
150
  privacyReport: {
@@ -52,7 +52,8 @@ const normalizeCellBlock = (block, styles) => {
52
52
  switch (block.type) {
53
53
  case "paragraph": return normalizeParagraph(block, styles);
54
54
  case "table": return normalizeTable(block, styles);
55
- case "blockSdt": return {
55
+ case "blockSdt":
56
+ case "blockCustomXml": return {
56
57
  ...block,
57
58
  content: block.content.map((child) => normalizeCellBlock(child, styles))
58
59
  };
@@ -0,0 +1,15 @@
1
+ import { document_d_exports } from "../types/document.js";
2
+ //#region src/docx/noteReferenceMark.d.ts
3
+ type NoteKind = "footnote" | "endnote";
4
+ /** The run carrying a note's in-note reference mark, in the note reference style. */
5
+ declare const noteReferenceMarkRun: (kind: NoteKind) => document_d_exports.Run;
6
+ /**
7
+ * A note's content with its reference mark run at the start of its first
8
+ * paragraph, added when the note has none.
9
+ */
10
+ declare const withNoteReferenceMark: (kind: NoteKind, content: readonly document_d_exports.BlockContent[]) => document_d_exports.BlockContent[];
11
+ /** A new note, as an editor adds one: its content led by its own reference mark. */
12
+ declare function createNote(kind: "footnote", id: number, content: readonly document_d_exports.BlockContent[]): document_d_exports.Footnote;
13
+ declare function createNote(kind: "endnote", id: number, content: readonly document_d_exports.BlockContent[]): document_d_exports.Endnote;
14
+ //#endregion
15
+ export { createNote, noteReferenceMarkRun, withNoteReferenceMark };
@@ -0,0 +1,48 @@
1
+ import { cloneParagraphWithPropertySource } from "./paragraphPropertySource.js";
2
+ //#region src/docx/noteReferenceMark.ts
3
+ const MARK_ELEMENT = /<(?:[\w.-]+:)?(?:footnote|endnote)Ref[\s/>]/u;
4
+ /** The run carrying a note's in-note reference mark, in the note reference style. */
5
+ const noteReferenceMarkRun = (kind) => ({
6
+ type: "run",
7
+ formatting: { styleId: kind === "footnote" ? "FootnoteReference" : "EndnoteReference" },
8
+ content: [{
9
+ type: "preservedXml",
10
+ xml: `<w:${kind}Ref/>`,
11
+ text: ""
12
+ }]
13
+ });
14
+ const holdsReferenceMark = (value) => {
15
+ if (Array.isArray(value)) return value.some(holdsReferenceMark);
16
+ if (typeof value !== "object" || value === null) return false;
17
+ const record = value;
18
+ if (record["type"] === "preservedXml" && typeof record["xml"] === "string") return MARK_ELEMENT.test(record["xml"]);
19
+ return Object.values(record).some(holdsReferenceMark);
20
+ };
21
+ /**
22
+ * A note's content with its reference mark run at the start of its first
23
+ * paragraph, added when the note has none.
24
+ */
25
+ const withNoteReferenceMark = (kind, content) => {
26
+ if (holdsReferenceMark(content)) return [...content];
27
+ const index = content.findIndex((block) => block.type === "paragraph");
28
+ const mark = noteReferenceMarkRun(kind);
29
+ if (index === -1) return [{
30
+ type: "paragraph",
31
+ content: [mark]
32
+ }, ...content];
33
+ const paragraph = content[index];
34
+ return content.map((block, position) => position === index ? cloneParagraphWithPropertySource(paragraph, { content: [mark, ...paragraph.content] }) : block);
35
+ };
36
+ function createNote(kind, id, content) {
37
+ return kind === "footnote" ? {
38
+ type: "footnote",
39
+ id,
40
+ content: withNoteReferenceMark(kind, content)
41
+ } : {
42
+ type: "endnote",
43
+ id,
44
+ content: withNoteReferenceMark(kind, content)
45
+ };
46
+ }
47
+ //#endregion
48
+ export { createNote, noteReferenceMarkRun, withNoteReferenceMark };
@@ -0,0 +1,7 @@
1
+ //#region src/docx/opaqueCarrier.d.ts
2
+ declare const OPAQUE_REVISION_CARRIER_READER_DIAGNOSTIC = "[Unsupported block-level tracked-change content]";
3
+ declare const opaqueRevisionCarrierName: (xml: string) => string | undefined;
4
+ declare const countOpaqueRevisionWrappers: (xml: string) => number;
5
+ declare const isOpaqueNestedRowMarkup: (xml: string) => boolean;
6
+ //#endregion
7
+ export { OPAQUE_REVISION_CARRIER_READER_DIAGNOSTIC, countOpaqueRevisionWrappers, isOpaqueNestedRowMarkup, opaqueRevisionCarrierName };
@@ -0,0 +1,38 @@
1
+ import { OOXML_NAMESPACE_SCOPE, WORDPROCESSINGML_NAMESPACE_URIS, getChildElements, getLocalName, parseXml } from "./xmlParser.js";
2
+ //#region src/docx/opaqueCarrier.ts
3
+ const OPAQUE_REVISION_CARRIER_READER_DIAGNOSTIC = "[Unsupported block-level tracked-change content]";
4
+ const REVISION_WRAPPERS = /* @__PURE__ */ new Set([
5
+ "ins",
6
+ "del",
7
+ "moveFrom",
8
+ "moveTo"
9
+ ]);
10
+ const opaqueRevisionCarrierName = (xml) => {
11
+ const visit = (element) => {
12
+ const localName = getLocalName(element.name);
13
+ if (WORDPROCESSINGML_NAMESPACE_URIS.has(element.namespaceUri ?? "") && REVISION_WRAPPERS.has(localName)) return `w:${localName}`;
14
+ for (const child of getChildElements(element)) {
15
+ const match = visit(child);
16
+ if (match !== void 0) return match;
17
+ }
18
+ };
19
+ for (const root of getChildElements(parseXml(xml, OOXML_NAMESPACE_SCOPE))) {
20
+ const match = visit(root);
21
+ if (match !== void 0) return match;
22
+ }
23
+ };
24
+ const countOpaqueRevisionWrappers = (xml) => {
25
+ const count = (element) => {
26
+ const localName = getLocalName(element.name);
27
+ let total = WORDPROCESSINGML_NAMESPACE_URIS.has(element.namespaceUri ?? "") && REVISION_WRAPPERS.has(localName) ? 1 : 0;
28
+ for (const child of getChildElements(element)) total += count(child);
29
+ return total;
30
+ };
31
+ return getChildElements(parseXml(xml, OOXML_NAMESPACE_SCOPE)).reduce((total, element) => total + count(element), 0);
32
+ };
33
+ const isOpaqueNestedRowMarkup = (xml) => {
34
+ const element = getChildElements(parseXml(xml, OOXML_NAMESPACE_SCOPE)).at(0);
35
+ return element !== void 0 && getLocalName(element.name) === "tr" && WORDPROCESSINGML_NAMESPACE_URIS.has(element.namespaceUri ?? "");
36
+ };
37
+ //#endregion
38
+ export { OPAQUE_REVISION_CARRIER_READER_DIAGNOSTIC, countOpaqueRevisionWrappers, isOpaqueNestedRowMarkup, opaqueRevisionCarrierName };
@@ -58,7 +58,10 @@ const isPresent = (present, partPath) => present.has(normalizePartPath(partPath)
58
58
  const relationshipTarget = (element, relsPath) => {
59
59
  if (TARGET_MODE_ATTRIBUTE.exec(element)?.groups?.["value"] === "External") return null;
60
60
  const target = TARGET_ATTRIBUTE.exec(element)?.groups?.["value"];
61
- return target === void 0 ? null : resolveRelativePath(relsPath, target);
61
+ if (target === void 0) return null;
62
+ const fragment = target.indexOf("#");
63
+ if (fragment === 0) return owningPartPath(relsPath) ?? "";
64
+ return resolveRelativePath(relsPath, fragment > 0 ? target.slice(0, fragment) : target);
62
65
  };
63
66
  /**
64
67
  * Every `.rels` part with its text. Read one at a time rather than through