@stll/folio-core 0.15.0 → 0.15.2

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 (449) hide show
  1. package/dist/ai-edits/apply.d.ts +2 -2
  2. package/dist/ai-edits/blockRange.d.ts +3 -17
  3. package/dist/ai-edits/clean-text.d.ts +0 -1
  4. package/dist/ai-edits/headless.d.ts +23 -19
  5. package/dist/ai-edits/read.d.ts +8 -5
  6. package/dist/ai-edits/scoped-reading.d.ts +0 -1
  7. package/dist/ai-edits/snapshot.d.ts +1 -7
  8. package/dist/ai-edits/table-cell-mutations.d.ts +4 -31
  9. package/dist/ai-edits/table-row-column-mutations.d.ts +9 -39
  10. package/dist/ai-edits/table-targets.d.ts +0 -1
  11. package/dist/ai-edits/types.d.ts +32 -17
  12. package/dist/ai-suggestions/apply.d.ts +0 -1
  13. package/dist/ai-suggestions/conflict.d.ts +0 -1
  14. package/dist/ai-suggestions/text-positions.d.ts +2 -2
  15. package/dist/ai-suggestions/types.d.ts +27 -13
  16. package/dist/content-controls/errors.d.ts +0 -1
  17. package/dist/content-controls/findContentControls.d.ts +6 -4
  18. package/dist/content-controls/mutateContentControls.d.ts +0 -1
  19. package/dist/controller/activeEditorStory.d.ts +1 -6
  20. package/dist/controller/collaborationModules.d.ts +0 -1
  21. package/dist/controller/contentControlWidgetController.d.ts +0 -1
  22. package/dist/controller/folioEditor.d.ts +2 -2
  23. package/dist/controller/folioEditorEvents.d.ts +5 -3
  24. package/dist/controller/fontReadiness.d.ts +0 -1
  25. package/dist/controller/headerFooterEditorManager.d.ts +1 -5
  26. package/dist/controller/hiddenEditorApi.d.ts +35 -18
  27. package/dist/controller/hiddenEditorManager.d.ts +5 -3
  28. package/dist/controller/latestRequestGate.d.ts +3 -1
  29. package/dist/controller/layoutPipeline.d.ts +1 -1
  30. package/dist/controller/layoutScheduler.d.ts +8 -5
  31. package/dist/controller/layoutSession.d.ts +0 -1
  32. package/dist/controller/noteEditorManager.d.ts +0 -1
  33. package/dist/document-operations.d.ts +5 -12
  34. package/dist/document-stories.d.ts +0 -1
  35. package/dist/docx/blockContentParser.d.ts +0 -1
  36. package/dist/docx/blockContentParser.js +1 -0
  37. package/dist/docx/bookmarkParser.d.ts +5 -3
  38. package/dist/docx/bookmarkPlacement.d.ts +0 -1
  39. package/dist/docx/commentParser.d.ts +0 -1
  40. package/dist/docx/commentParser.js +30 -2
  41. package/dist/docx/commentRangeIntegrity.d.ts +0 -1
  42. package/dist/docx/commentReferenceNormalization.d.ts +1 -9
  43. package/dist/docx/commentReplyMarkers.d.ts +0 -1
  44. package/dist/docx/compatibility.d.ts +0 -1
  45. package/dist/docx/conformance.d.ts +0 -1
  46. package/dist/docx/corePropertiesParser.d.ts +0 -1
  47. package/dist/docx/documentParser.d.ts +0 -1
  48. package/dist/docx/documentParser.js +3 -1
  49. package/dist/docx/drawingIdNormalization.d.ts +5 -0
  50. package/dist/docx/drawingIdNormalization.js +35 -0
  51. package/dist/docx/drawingUtils.d.ts +24 -3
  52. package/dist/docx/drawingUtils.js +134 -28
  53. package/dist/docx/encryption/agileDecryption.d.ts +0 -1
  54. package/dist/docx/encryption/cryptoBytes.js +4 -1
  55. package/dist/docx/encryption/openEncryptedDocx.d.ts +5 -2
  56. package/dist/docx/ensureParaIds.d.ts +7 -3
  57. package/dist/docx/fieldParser.d.ts +23 -11
  58. package/dist/docx/fontTableParser.d.ts +0 -1
  59. package/dist/docx/footnoteParser.d.ts +26 -13
  60. package/dist/docx/footnoteParser.js +4 -2
  61. package/dist/docx/groupDrawingParser.d.ts +0 -1
  62. package/dist/docx/headerFooterParser.d.ts +9 -5
  63. package/dist/docx/headerFooterRefParser.d.ts +0 -1
  64. package/dist/docx/headerFooterReferenceNormalization.d.ts +1 -6
  65. package/dist/docx/headerFooterVerbatim.d.ts +4 -3
  66. package/dist/docx/headerFooterVerbatim.js +6 -1
  67. package/dist/docx/hyperlinkParser.d.ts +0 -1
  68. package/dist/docx/hyperlinkParser.js +1 -9
  69. package/dist/docx/imageParser.d.ts +0 -1
  70. package/dist/docx/imageParser.js +15 -7
  71. package/dist/docx/mathToMathml.d.ts +0 -1
  72. package/dist/docx/metadataPrivacy.d.ts +1 -3
  73. package/dist/docx/modelValidation.d.ts +0 -1
  74. package/dist/docx/newImage.d.ts +11 -0
  75. package/dist/docx/newImage.js +11 -0
  76. package/dist/docx/normalizeBaseDirection.d.ts +0 -1
  77. package/dist/docx/notePropertiesParser.d.ts +0 -1
  78. package/dist/docx/numberingParser.d.ts +10 -6
  79. package/dist/docx/numberingParser.js +4 -2
  80. package/dist/docx/numberingReferenceNormalization.d.ts +1 -9
  81. package/dist/docx/paragraphParser.d.ts +0 -1
  82. package/dist/docx/paragraphParser.js +31 -15
  83. package/dist/docx/paragraphTextBoxEnrichment.d.ts +0 -1
  84. package/dist/docx/paragraphTextBoxEnrichment.js +2 -1
  85. package/dist/docx/paragraphTraversal.d.ts +5 -10
  86. package/dist/docx/paragraphTraversal.js +20 -13
  87. package/dist/docx/parser.d.ts +15 -8
  88. package/dist/docx/parser.js +22 -1
  89. package/dist/docx/parserEnums.d.ts +5 -2
  90. package/dist/docx/parserEnums.js +6 -2
  91. package/dist/docx/relsParser.d.ts +1 -0
  92. package/dist/docx/renderedPageBreakNormalization.d.ts +12 -0
  93. package/dist/docx/renderedPageBreakNormalization.js +59 -0
  94. package/dist/docx/replyToComment.d.ts +2 -2
  95. package/dist/docx/rezip.d.ts +6 -7
  96. package/dist/docx/rezip.js +136 -102
  97. package/dist/docx/runConsolidator.d.ts +0 -1
  98. package/dist/docx/runConsolidator.js +0 -1
  99. package/dist/docx/runParser.d.ts +0 -1
  100. package/dist/docx/runParser.js +25 -12
  101. package/dist/docx/sdtProperties.d.ts +0 -1
  102. package/dist/docx/sdtPropertiesPatch.d.ts +0 -1
  103. package/dist/docx/sectionParser.d.ts +0 -1
  104. package/dist/docx/selectiveSave.d.ts +5 -3
  105. package/dist/docx/selectiveSave.js +2 -2
  106. package/dist/docx/selectiveSaveFlags.d.ts +4 -2
  107. package/dist/docx/selectiveXmlPatch.js +20 -8
  108. package/dist/docx/serializer/blockSdtSerializer.d.ts +0 -1
  109. package/dist/docx/serializer/blockSdtSerializer.js +2 -1
  110. package/dist/docx/serializer/borderSerializer.d.ts +0 -1
  111. package/dist/docx/serializer/commentSerializer.d.ts +0 -1
  112. package/dist/docx/serializer/commentSerializer.js +19 -40
  113. package/dist/docx/serializer/documentSerializer.d.ts +0 -1
  114. package/dist/docx/serializer/documentSerializer.js +1 -1
  115. package/dist/docx/serializer/fontTableSerializer.d.ts +0 -1
  116. package/dist/docx/serializer/headerFooterSerializer.d.ts +0 -1
  117. package/dist/docx/serializer/headerFooterSerializer.js +1 -1
  118. package/dist/docx/serializer/noteSerializer.d.ts +0 -1
  119. package/dist/docx/serializer/noteSerializer.js +1 -1
  120. package/dist/docx/serializer/numberingSerializer.d.ts +0 -1
  121. package/dist/docx/serializer/paragraphSerializer.d.ts +0 -1
  122. package/dist/docx/serializer/paragraphSerializer.js +10 -23
  123. package/dist/docx/serializer/runSerializer.d.ts +0 -1
  124. package/dist/docx/serializer/runSerializer.js +53 -32
  125. package/dist/docx/serializer/sectionPropertiesSerializer.d.ts +0 -1
  126. package/dist/docx/serializer/sectionPropertiesSerializer.js +7 -5
  127. package/dist/docx/serializer/settingsSerializer.d.ts +0 -1
  128. package/dist/docx/serializer/stylesSerializer.d.ts +0 -1
  129. package/dist/docx/serializer/tableSerializer.d.ts +0 -1
  130. package/dist/docx/serializer/tableSerializer.js +2 -0
  131. package/dist/docx/serializer/themeSerializer.d.ts +0 -1
  132. package/dist/docx/serializer/xmlUtils.js +10 -1
  133. package/dist/docx/server/applyDocxXmlPatchProposal.d.ts +3 -10
  134. package/dist/docx/server/docxToMarkdown.d.ts +0 -1
  135. package/dist/docx/server/evaluateDocxXmlPatchProposal.d.ts +3 -9
  136. package/dist/docx/server/inspectDocxPackage.d.ts +3 -8
  137. package/dist/docx/server/validateDocxConformance.d.ts +0 -1
  138. package/dist/docx/settingsParser.d.ts +2 -2
  139. package/dist/docx/shapeParser.d.ts +0 -1
  140. package/dist/docx/shapeParser.js +16 -123
  141. package/dist/docx/streamingXmlParser.d.ts +16 -0
  142. package/dist/docx/streamingXmlParser.js +248 -0
  143. package/dist/docx/styleParser.d.ts +0 -1
  144. package/dist/docx/styleParser.js +6 -4
  145. package/dist/docx/tableParser.d.ts +1 -2
  146. package/dist/docx/tableParser.js +11 -12
  147. package/dist/docx/textBoxParser.d.ts +1 -2
  148. package/dist/docx/textBoxParser.js +5 -2
  149. package/dist/docx/textWhitespace.d.ts +4 -0
  150. package/dist/docx/textWhitespace.js +4 -0
  151. package/dist/docx/themeParser.d.ts +0 -1
  152. package/dist/docx/trackedMoveRangeNormalization.d.ts +1 -8
  153. package/dist/docx/unzip.d.ts +6 -3
  154. package/dist/docx/unzip.js +96 -40
  155. package/dist/docx/vmlImageParser.d.ts +0 -1
  156. package/dist/docx/vmlImageParser.js +3 -1
  157. package/dist/docx/watermarkParser.d.ts +0 -1
  158. package/dist/docx/xmlParser.d.ts +21 -8
  159. package/dist/docx/xmlParser.js +126 -43
  160. package/dist/fields/bookmarkPages.d.ts +0 -1
  161. package/dist/fields/bookmarkText.d.ts +0 -1
  162. package/dist/fields/evaluateField.d.ts +5 -3
  163. package/dist/fields/fieldContext.d.ts +11 -5
  164. package/dist/fields/resolveFieldValues.d.ts +4 -3
  165. package/dist/fields/sectionPageCounts.d.ts +0 -1
  166. package/dist/fields/seqValues.d.ts +0 -1
  167. package/dist/fonts/embeddedFontTable.d.ts +5 -2
  168. package/dist/fonts/embeddedFonts.d.ts +15 -7
  169. package/dist/index.d.ts +1 -0
  170. package/dist/layout-bridge/cellSelectionHighlight.d.ts +0 -1
  171. package/dist/layout-bridge/convert/footnoteLayout.d.ts +5 -3
  172. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +2 -2
  173. package/dist/layout-bridge/convert/paragraphFrames.d.ts +0 -1
  174. package/dist/layout-bridge/convert/templatePreviewFlow.d.ts +8 -8
  175. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +25 -13
  176. package/dist/layout-bridge/convert/wrapEditorViewAsSurface.d.ts +3 -2
  177. package/dist/layout-bridge/dom/findHfPmSpans.d.ts +2 -1
  178. package/dist/layout-bridge/dom/noteStoryDom.d.ts +0 -1
  179. package/dist/layout-bridge/engine/clickToPosition.d.ts +5 -3
  180. package/dist/layout-bridge/engine/hitTest.d.ts +40 -19
  181. package/dist/layout-bridge/engine/selectionRects.d.ts +16 -8
  182. package/dist/layout-bridge/engine/tableWidthUtils.d.ts +0 -1
  183. package/dist/layout-bridge/headerFooterLayout.d.ts +0 -1
  184. package/dist/layout-bridge/sectionColumns.d.ts +0 -1
  185. package/dist/layout-bridge/tableInsertHover.d.ts +8 -4
  186. package/dist/layout-engine/headerFooterRefs.d.ts +0 -1
  187. package/dist/layout-engine/index.d.ts +0 -1
  188. package/dist/layout-engine/justificationCompatibility.d.ts +0 -1
  189. package/dist/layout-engine/keep-together.d.ts +7 -4
  190. package/dist/layout-engine/layoutInstrumentation.d.ts +0 -1
  191. package/dist/layout-engine/lineFlow.d.ts +0 -1
  192. package/dist/layout-engine/measure/cache.d.ts +0 -1
  193. package/dist/layout-engine/measure/effectiveLineBreakPolicy.d.ts +6 -7
  194. package/dist/layout-engine/measure/floatingTablePosition.d.ts +0 -1
  195. package/dist/layout-engine/measure/floatingZones.d.ts +14 -6
  196. package/dist/layout-engine/measure/font-metrics.worker.d.ts +0 -1
  197. package/dist/layout-engine/measure/lineBreakProvider.d.ts +20 -9
  198. package/dist/layout-engine/measure/lineBreaks.d.ts +0 -1
  199. package/dist/layout-engine/measure/listMarkerWidth.d.ts +0 -1
  200. package/dist/layout-engine/measure/measureBlocks.d.ts +1 -0
  201. package/dist/layout-engine/measure/measureContainer.d.ts +0 -1
  202. package/dist/layout-engine/measure/measureHelpers.d.ts +0 -1
  203. package/dist/layout-engine/measure/measureParagraph.d.ts +3 -2
  204. package/dist/layout-engine/measure/measureParagraph.js +23 -3
  205. package/dist/layout-engine/measure/measureProvider.d.ts +0 -1
  206. package/dist/layout-engine/measure/measureTypes.d.ts +4 -2
  207. package/dist/layout-engine/measure/measureWorker.d.ts +0 -1
  208. package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +0 -1
  209. package/dist/layout-engine/measure/tableCellFloating.d.ts +0 -1
  210. package/dist/layout-engine/measure/tableCellFlow.d.ts +0 -1
  211. package/dist/layout-engine/measure/tableCellGrid.d.ts +0 -1
  212. package/dist/layout-engine/measure/textBoxParagraphLayout.d.ts +0 -1
  213. package/dist/layout-engine/measure/textMeasurementPolicy.d.ts +0 -1
  214. package/dist/layout-engine/paginator.d.ts +66 -33
  215. package/dist/layout-engine/paragraphFragmentRange.d.ts +0 -1
  216. package/dist/layout-engine/paragraphFrame.d.ts +0 -1
  217. package/dist/layout-engine/paragraphSequence.d.ts +0 -1
  218. package/dist/layout-engine/paragraphSpacing.d.ts +1 -5
  219. package/dist/layout-engine/pmPageIndex.d.ts +0 -1
  220. package/dist/layout-engine/renderedBreakReconciliation.d.ts +2 -17
  221. package/dist/layout-engine/section-breaks.d.ts +34 -17
  222. package/dist/layout-engine/tableRowBreak.d.ts +4 -3
  223. package/dist/layout-engine/textBoxFlow.d.ts +0 -1
  224. package/dist/layout-engine/textBoxGroup.d.ts +0 -1
  225. package/dist/layout-engine/types.d.ts +382 -189
  226. package/dist/layout-painter/anchoredImagePosition.d.ts +0 -1
  227. package/dist/layout-painter/borderStroke.d.ts +0 -1
  228. package/dist/layout-painter/imageLayout.d.ts +14 -7
  229. package/dist/layout-painter/index.d.ts +9 -5
  230. package/dist/layout-painter/registry/modules/image.d.ts +0 -1
  231. package/dist/layout-painter/registry/modules/paragraph.d.ts +0 -1
  232. package/dist/layout-painter/registry/modules/table.d.ts +0 -1
  233. package/dist/layout-painter/registry/modules/textBox.d.ts +0 -1
  234. package/dist/layout-painter/registry/modules.d.ts +0 -1
  235. package/dist/layout-painter/registry/registry.d.ts +0 -1
  236. package/dist/layout-painter/registry/types.d.ts +0 -1
  237. package/dist/layout-painter/renderFragment.d.ts +2 -2
  238. package/dist/layout-painter/renderImage.d.ts +0 -1
  239. package/dist/layout-painter/renderPage.d.ts +71 -42
  240. package/dist/layout-painter/renderParagraph.d.ts +28 -14
  241. package/dist/layout-painter/renderParagraph.js +6 -2
  242. package/dist/layout-painter/renderTable.d.ts +0 -1
  243. package/dist/layout-painter/renderTextBox.d.ts +0 -1
  244. package/dist/layout-painter/renderUtils.d.ts +17 -9
  245. package/dist/layout-painter/renderWatermark.d.ts +2 -2
  246. package/dist/layout-painter/sdtBoundary.d.ts +0 -1
  247. package/dist/managers/AutoSaveManager.d.ts +22 -11
  248. package/dist/managers/ClipboardManager.d.ts +0 -1
  249. package/dist/managers/ContextMenuManager.d.ts +5 -8
  250. package/dist/managers/DocumentLoaderManager.d.ts +12 -6
  251. package/dist/managers/EditorModeManager.d.ts +3 -2
  252. package/dist/managers/ErrorManager.d.ts +0 -1
  253. package/dist/managers/FindReplaceManager.d.ts +0 -1
  254. package/dist/managers/HistoryManager.d.ts +19 -9
  255. package/dist/managers/TableSelectionManager.d.ts +0 -1
  256. package/dist/managers/editorShortcuts.d.ts +4 -6
  257. package/dist/markdown/annotations.d.ts +0 -1
  258. package/dist/markdown/fromMarkdown.d.ts +0 -1
  259. package/dist/markdown/images.d.ts +0 -1
  260. package/dist/markdown/index.d.ts +0 -1
  261. package/dist/markdown/internals.d.ts +0 -1
  262. package/dist/markdown/renderBlock.d.ts +0 -1
  263. package/dist/markdown/renderParagraph.d.ts +0 -1
  264. package/dist/markdown/renderRuns.d.ts +0 -1
  265. package/dist/markdown/renderTable.d.ts +0 -1
  266. package/dist/markdown/trailers.d.ts +0 -1
  267. package/dist/markdown/types.d.ts +39 -18
  268. package/dist/model.d.ts +3 -5
  269. package/dist/model.js +2 -2
  270. package/dist/paged-layout/incrementalMeasure.d.ts +1 -10
  271. package/dist/paged-layout/pageText.d.ts +1 -1
  272. package/dist/paged-layout/paragraphFlash.d.ts +0 -1
  273. package/dist/paged-layout/paragraphFlashTypes.d.ts +5 -2
  274. package/dist/paged-layout/rangeProjection.d.ts +10 -5
  275. package/dist/paged-layout/scrollNavigation.d.ts +0 -1
  276. package/dist/paged-layout/scrollPageInfo.d.ts +12 -13
  277. package/dist/paged-layout/scrollToPmPosition.d.ts +0 -1
  278. package/dist/paged-layout/sectionBlockWidths.d.ts +2 -11
  279. package/dist/paged-layout/sectionGeometry.d.ts +0 -1
  280. package/dist/paged-layout/selectionViewportRect.d.ts +0 -1
  281. package/dist/paged-layout/transactionDirtyRange.d.ts +0 -1
  282. package/dist/paged-layout/zoomScrollAnchor.d.ts +2 -12
  283. package/dist/prosemirror/attrs/index.d.ts +6 -4
  284. package/dist/prosemirror/attrs/index.js +22 -2
  285. package/dist/prosemirror/autospacingBase.d.ts +0 -1
  286. package/dist/prosemirror/cellDragSelection.d.ts +6 -4
  287. package/dist/prosemirror/commands/comments.d.ts +6 -4
  288. package/dist/prosemirror/commands/contentControls.d.ts +5 -3
  289. package/dist/prosemirror/commands/contentControlsBlockFill.d.ts +1 -1
  290. package/dist/prosemirror/commands/formatPainter.d.ts +0 -1
  291. package/dist/prosemirror/commands/formatting.d.ts +1 -1
  292. package/dist/prosemirror/commands/hyperlink.d.ts +4 -9
  293. package/dist/prosemirror/commands/image.d.ts +0 -1
  294. package/dist/prosemirror/commands/pageBreak.d.ts +0 -1
  295. package/dist/prosemirror/commands/paragraph.d.ts +0 -1
  296. package/dist/prosemirror/commands/pastePlainText.d.ts +0 -1
  297. package/dist/prosemirror/commands/propertyChangeScope.d.ts +0 -1
  298. package/dist/prosemirror/commands/sectionBreak.d.ts +0 -1
  299. package/dist/prosemirror/commands/table.d.ts +0 -1
  300. package/dist/prosemirror/commands/tableCellMergeResolution.d.ts +0 -1
  301. package/dist/prosemirror/commentIdAllocator.d.ts +2 -2
  302. package/dist/prosemirror/commentOps.d.ts +0 -1
  303. package/dist/prosemirror/conversion/effectiveTableCellFormatting.d.ts +1 -10
  304. package/dist/prosemirror/conversion/fromProseDoc.d.ts +0 -1
  305. package/dist/prosemirror/conversion/fromProseDoc.js +17 -10
  306. package/dist/prosemirror/conversion/runShadingMark.d.ts +0 -1
  307. package/dist/prosemirror/conversion/sdtAttrs.d.ts +0 -1
  308. package/dist/prosemirror/conversion/toProseDoc.d.ts +3 -2
  309. package/dist/prosemirror/conversion/toProseDoc.js +17 -3
  310. package/dist/prosemirror/extensions/ExtensionManager.d.ts +0 -1
  311. package/dist/prosemirror/extensions/StarterKit.d.ts +7 -4
  312. package/dist/prosemirror/extensions/core/DocExtension.d.ts +0 -1
  313. package/dist/prosemirror/extensions/core/HistoryExtension.d.ts +0 -1
  314. package/dist/prosemirror/extensions/core/ParagraphExtension.d.ts +0 -1
  315. package/dist/prosemirror/extensions/core/TextExtension.d.ts +0 -1
  316. package/dist/prosemirror/extensions/create.d.ts +0 -1
  317. package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.d.ts +0 -1
  318. package/dist/prosemirror/extensions/features/BaseKeymapExtension.d.ts +0 -1
  319. package/dist/prosemirror/extensions/features/BidiShortcutExtension.d.ts +0 -1
  320. package/dist/prosemirror/extensions/features/ContentControlWidgetsExtension.d.ts +0 -1
  321. package/dist/prosemirror/extensions/features/DropCursorExtension.d.ts +0 -1
  322. package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.d.ts +0 -1
  323. package/dist/prosemirror/extensions/features/GapCursorExtension.d.ts +0 -1
  324. package/dist/prosemirror/extensions/features/ImageDragExtension.d.ts +0 -1
  325. package/dist/prosemirror/extensions/features/ImagePasteExtension.d.ts +0 -1
  326. package/dist/prosemirror/extensions/features/ListExtension.d.ts +0 -1
  327. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +0 -1
  328. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +7 -4
  329. package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +0 -1
  330. package/dist/prosemirror/extensions/features/PasteStyleInlinerExtension.d.ts +0 -1
  331. package/dist/prosemirror/extensions/features/SelectionTrackerExtension.d.ts +0 -1
  332. package/dist/prosemirror/extensions/features/bidiShortcutController.d.ts +3 -1
  333. package/dist/prosemirror/extensions/marks/AllCapsExtension.d.ts +0 -1
  334. package/dist/prosemirror/extensions/marks/BoldExtension.d.ts +0 -1
  335. package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.d.ts +0 -1
  336. package/dist/prosemirror/extensions/marks/CharacterStyleExtension.d.ts +0 -1
  337. package/dist/prosemirror/extensions/marks/CommentExtension.d.ts +0 -1
  338. package/dist/prosemirror/extensions/marks/FontFamilyExtension.d.ts +0 -1
  339. package/dist/prosemirror/extensions/marks/FontFamilyExtension.js +1 -0
  340. package/dist/prosemirror/extensions/marks/FontSizeExtension.d.ts +0 -1
  341. package/dist/prosemirror/extensions/marks/FootnoteRefExtension.d.ts +0 -1
  342. package/dist/prosemirror/extensions/marks/HiddenTextExtension.d.ts +0 -1
  343. package/dist/prosemirror/extensions/marks/HighlightExtension.d.ts +0 -1
  344. package/dist/prosemirror/extensions/marks/HyperlinkExtension.d.ts +0 -1
  345. package/dist/prosemirror/extensions/marks/ItalicExtension.d.ts +0 -1
  346. package/dist/prosemirror/extensions/marks/LanguageExtension.d.ts +0 -1
  347. package/dist/prosemirror/extensions/marks/RtlExtension.d.ts +0 -1
  348. package/dist/prosemirror/extensions/marks/RunFormattingOverrideExtension.d.ts +0 -1
  349. package/dist/prosemirror/extensions/marks/RunShadingExtension.d.ts +0 -1
  350. package/dist/prosemirror/extensions/marks/SmallCapsExtension.d.ts +0 -1
  351. package/dist/prosemirror/extensions/marks/StrikeExtension.d.ts +0 -1
  352. package/dist/prosemirror/extensions/marks/SubscriptExtension.d.ts +0 -1
  353. package/dist/prosemirror/extensions/marks/SuperscriptExtension.d.ts +0 -1
  354. package/dist/prosemirror/extensions/marks/TextColorExtension.d.ts +0 -1
  355. package/dist/prosemirror/extensions/marks/TextEffectExtension.d.ts +0 -1
  356. package/dist/prosemirror/extensions/marks/TextEffectsExtensions.d.ts +0 -1
  357. package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.d.ts +0 -1
  358. package/dist/prosemirror/extensions/marks/UnderlineExtension.d.ts +0 -1
  359. package/dist/prosemirror/extensions/marks/markUtils.d.ts +0 -1
  360. package/dist/prosemirror/extensions/marks/markUtils.js +4 -1
  361. package/dist/prosemirror/extensions/nodes/BlockSdtExtension.d.ts +0 -1
  362. package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +0 -1
  363. package/dist/prosemirror/extensions/nodes/HardBreakExtension.d.ts +0 -1
  364. package/dist/prosemirror/extensions/nodes/HorizontalRuleExtension.d.ts +0 -1
  365. package/dist/prosemirror/extensions/nodes/ImageExtension.d.ts +0 -1
  366. package/dist/prosemirror/extensions/nodes/ImageExtension.js +2 -0
  367. package/dist/prosemirror/extensions/nodes/MathExtension.d.ts +0 -1
  368. package/dist/prosemirror/extensions/nodes/PageBreakExtension.d.ts +0 -1
  369. package/dist/prosemirror/extensions/nodes/RenderedPageBreakExtension.d.ts +0 -1
  370. package/dist/prosemirror/extensions/nodes/SdtExtension.d.ts +0 -1
  371. package/dist/prosemirror/extensions/nodes/ShapeExtension.d.ts +0 -1
  372. package/dist/prosemirror/extensions/nodes/ShapeExtension.js +2 -0
  373. package/dist/prosemirror/extensions/nodes/TabExtension.d.ts +0 -1
  374. package/dist/prosemirror/extensions/nodes/TabExtension.js +32 -9
  375. package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +4 -3
  376. package/dist/prosemirror/extensions/nodes/TextBoxAnchorExtension.d.ts +0 -1
  377. package/dist/prosemirror/extensions/nodes/TextBoxExtension.d.ts +53 -27
  378. package/dist/prosemirror/extensions/types.d.ts +0 -1
  379. package/dist/prosemirror/findReplaceSelection.d.ts +5 -3
  380. package/dist/prosemirror/imageCommit.d.ts +0 -1
  381. package/dist/prosemirror/index.d.ts +4 -0
  382. package/dist/prosemirror/insertOperations.d.ts +0 -1
  383. package/dist/prosemirror/paraText.d.ts +0 -1
  384. package/dist/prosemirror/plugins/aiCitationDecorations.d.ts +2 -2
  385. package/dist/prosemirror/plugins/aiSuggestionDecorations.d.ts +0 -1
  386. package/dist/prosemirror/plugins/anonymizationDecorations.d.ts +9 -7
  387. package/dist/prosemirror/plugins/autocompleteSuggestion.d.ts +2 -2
  388. package/dist/prosemirror/plugins/contentControlWidgets.d.ts +4 -7
  389. package/dist/prosemirror/plugins/createDocScanPlugin.d.ts +3 -8
  390. package/dist/prosemirror/plugins/documentStyles.d.ts +0 -1
  391. package/dist/prosemirror/plugins/pmTextScan.d.ts +2 -2
  392. package/dist/prosemirror/plugins/revisionIds.d.ts +0 -1
  393. package/dist/prosemirror/plugins/selectionTracker.d.ts +23 -12
  394. package/dist/prosemirror/plugins/suggestionMode.d.ts +0 -1
  395. package/dist/prosemirror/plugins/templateDirectives.d.ts +10 -8
  396. package/dist/prosemirror/plugins/templatePreviewValues.d.ts +10 -5
  397. package/dist/prosemirror/plugins/templateSlashMenu.d.ts +2 -2
  398. package/dist/prosemirror/queries.d.ts +0 -1
  399. package/dist/prosemirror/schema/index.d.ts +2 -3
  400. package/dist/prosemirror/schema/marks.d.ts +8 -5
  401. package/dist/prosemirror/schema/nodes.d.ts +344 -164
  402. package/dist/prosemirror/selectionState.d.ts +13 -7
  403. package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +0 -1
  404. package/dist/prosemirror/styles/styleResolver.d.ts +3 -2
  405. package/dist/prosemirror/tableCellMergeRevision.d.ts +0 -1
  406. package/dist/prosemirror/tableResize.d.ts +0 -1
  407. package/dist/prosemirror/textBoxAnchorAttrs.d.ts +0 -1
  408. package/dist/prosemirror/utils/extractTrackedChanges.d.ts +8 -5
  409. package/dist/prosemirror/utils/findParagraphByParaId.d.ts +0 -1
  410. package/dist/prosemirror/utils/tabCalculator.d.ts +18 -7
  411. package/dist/prosemirror/utils/visualLineNavigation.d.ts +0 -1
  412. package/dist/prosemirror/validation.d.ts +0 -1
  413. package/dist/prosemirror/validation.js +5 -3
  414. package/dist/redline.d.ts +16 -8
  415. package/dist/render-dom/BodySelectionOverlay.d.ts +1 -9
  416. package/dist/render-dom/HeaderFooterSelectionOverlay.d.ts +0 -1
  417. package/dist/render-dom/RemoteSelectionOverlay.d.ts +1 -8
  418. package/dist/render-dom/resolveSidebarItemPositions.d.ts +1 -9
  419. package/dist/style-engine/styleEngine.d.ts +21 -11
  420. package/dist/style-sets/extract.d.ts +4 -3
  421. package/dist/style-sets/stellaStyle.d.ts +0 -1
  422. package/dist/style-sets/types.d.ts +0 -1
  423. package/dist/symbols.d.ts +6 -2
  424. package/dist/types/block-id.d.ts +3 -6
  425. package/dist/types/content.d.ts +2 -2
  426. package/dist/types/document.d.ts +0 -3
  427. package/dist/types/documentEnumValues.d.ts +5 -1
  428. package/dist/types/documentEnumValues.js +19 -1
  429. package/dist/types/index.d.ts +2 -1
  430. package/dist/utils/clipboard.d.ts +17 -8
  431. package/dist/utils/colorResolver.d.ts +9 -5
  432. package/dist/utils/createDocument.d.ts +19 -10
  433. package/dist/utils/documentLoaderBehavior.d.ts +1 -5
  434. package/dist/utils/docxInput.js +1 -0
  435. package/dist/utils/findReplace.d.ts +0 -1
  436. package/dist/utils/fontFamilyMerge.d.ts +0 -1
  437. package/dist/utils/fontResolver.d.ts +10 -4
  438. package/dist/utils/formatToStyle.d.ts +0 -1
  439. package/dist/utils/headerFooter.d.ts +8 -16
  440. package/dist/utils/headingCollector.d.ts +7 -4
  441. package/dist/utils/mergeDocumentContent.d.ts +0 -1
  442. package/dist/utils/paragraphFormattingMerge.d.ts +0 -1
  443. package/dist/utils/replaceText.d.ts +0 -1
  444. package/dist/utils/rotationBoundingBox.d.ts +0 -1
  445. package/dist/utils/tableOperations.d.ts +0 -1
  446. package/dist/utils/textFormattingMerge.d.ts +0 -1
  447. package/dist/version-comparison.d.ts +12 -6
  448. package/dist/watermark/index.d.ts +0 -1
  449. package/package.json +3 -3
@@ -1,3 +1,4 @@
1
+ import { findChild, getChildElements, matchesName, parseXml } from "./xmlParser.js";
1
2
  import { parseNumbering } from "./numberingParser.js";
2
3
  import { RELATIONSHIP_TYPES, parseRelationships, resolveRelativePath } from "./relsParser.js";
3
4
  import { parseEndnotes, parseFootnotes } from "./footnoteParser.js";
@@ -5,6 +6,7 @@ import { assertValidFolioDocumentModel } from "./modelValidation.js";
5
6
  import { isPreservableDocxEntry } from "./unzip.js";
6
7
  import { applyReplyThreadMarkers } from "./commentReplyMarkers.js";
7
8
  import { withoutOrphanCommentRanges } from "./commentRangeIntegrity.js";
9
+ import { isNewDataUrlDrawing } from "./newImage.js";
8
10
  import { buildParagraphOffsetIndex, buildPatchedNoteXml, buildPatchedNumberingXml, collectChangedNumberingDefs, collectParaIds } from "./selectiveXmlPatch.js";
9
11
  import { escapeXml } from "./serializer/xmlUtils.js";
10
12
  import { ensureThreadedCommentParaIds, serializeComments, serializeCommentsExtended } from "./serializer/commentSerializer.js";
@@ -95,11 +97,15 @@ function assertDocumentPackageFidelity(originalDocumentXml, serializedDocumentXm
95
97
  }
96
98
  async function serializeCommentsToZip(doc, zip, compressionLevel) {
97
99
  const comments = doc.package.document.comments ?? [];
98
- const hadCommentsFile = zip.file("word/comments.xml") !== null;
99
- if (comments.length === 0 && !hadCommentsFile) return;
100
+ const sourceCommentsFile = findZipEntryCaseInsensitive(zip, "word/comments.xml");
101
+ if (comments.length === 0) {
102
+ if (!sourceCommentsFile) return;
103
+ const sourceCommentsXml = await sourceCommentsFile.async("text");
104
+ if (!hasCommentEntries(sourceCommentsXml)) return;
105
+ }
100
106
  ensureThreadedCommentParaIds(comments);
101
107
  const commentsXml = serializeComments(comments);
102
- zip.file("word/comments.xml", commentsXml, {
108
+ zip.file(sourceCommentsFile?.name ?? "word/comments.xml", commentsXml, {
103
109
  compression: "DEFLATE",
104
110
  compressionOptions: { level: compressionLevel }
105
111
  });
@@ -107,6 +113,10 @@ async function serializeCommentsToZip(doc, zip, compressionLevel) {
107
113
  await ensureCommentsRelationship(zip, compressionLevel);
108
114
  await syncCommentsExtendedPart(comments, zip, compressionLevel);
109
115
  }
116
+ const hasCommentEntries = (xml) => {
117
+ const root = parseXml(xml);
118
+ return getChildElements(findChild(root, "w", "comments") ?? root).some((element) => matchesName(element, "w", "comment"));
119
+ };
110
120
  /**
111
121
  * Bring `word/commentsExtended.xml` and its packaging (content-type override +
112
122
  * relationship) in line with the model: write the part when there is thread /
@@ -235,18 +245,10 @@ async function registerImageExtensions(zip, extensions, compressionLevel) {
235
245
  compressionOptions: { level: compressionLevel }
236
246
  });
237
247
  }
238
- /**
239
- * Collect all newly inserted images with data-URL src from the document content.
240
- * Existing DOCX images may also have a resolved data URL for preview; those must
241
- * continue to reference their original media part. Editor-created images use a
242
- * synthetic rId until they are assigned a real DOCX relationship here.
243
- */
244
- const SYNTHETIC_IMAGE_RID_PREFIX = "rId_img_";
245
- const isNewDataUrlImage = (image) => image.src?.startsWith("data:") && (!image.rId || image.rId.startsWith(SYNTHETIC_IMAGE_RID_PREFIX));
246
248
  function collectNewImages(blocks) {
247
249
  const images = [];
248
250
  const collectFromRun = (run) => {
249
- for (const c of run.content) if (c.type === "drawing" && c.image && isNewDataUrlImage(c.image)) images.push(c.image);
251
+ for (const c of run.content) if (isNewDataUrlDrawing(c)) images.push(c.image);
250
252
  };
251
253
  for (const block of blocks) if (block.type === "paragraph") {
252
254
  for (const item of block.content) if (item.type === "run") collectFromRun(item);
@@ -270,13 +272,18 @@ const MIME_TO_EXT = {
270
272
  * Decode a data URL to binary ArrayBuffer and file extension.
271
273
  */
272
274
  function decodeDataUrl(dataUrl) {
273
- const match = /^data:(?<mime>[^;]+);base64,(?<data>.+)$/u.exec(dataUrl);
275
+ const match = /^data:(?<mime>[^;,]+)(?<parameters>(?:;[^,]*)?),(?<data>[\s\S]*)$/u.exec(dataUrl);
274
276
  if (!match) panic("Invalid data URL");
275
- const binary = atob(match.groups["data"]);
276
- const bytes = new Uint8Array(binary.length);
277
- for (let i = 0; i < binary.length; i++) bytes[i] = binary.codePointAt(i) ?? 0;
277
+ const payload = match.groups["data"];
278
+ const parameters = match.groups["parameters"];
279
+ let bytes;
280
+ if (parameters.split(";").some((parameter) => parameter.toLowerCase() === "base64")) {
281
+ const binary = atob(payload);
282
+ bytes = new Uint8Array(binary.length);
283
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.codePointAt(i) ?? 0;
284
+ } else bytes = new TextEncoder().encode(decodeURIComponent(payload));
278
285
  return {
279
- data: bytes.buffer,
286
+ data: bytes.slice().buffer,
280
287
  extension: MIME_TO_EXT[match.groups["mime"]] ?? "png"
281
288
  };
282
289
  }
@@ -360,6 +367,64 @@ async function processNewHyperlinks(newHyperlinks, zip, compressionLevel) {
360
367
  });
361
368
  }
362
369
  }
370
+ const generateDocxZip = (zip, compressionLevel) => zip.generateAsync({
371
+ type: "arraybuffer",
372
+ compression: "DEFLATE",
373
+ compressionOptions: { level: compressionLevel }
374
+ });
375
+ const parsedZipSources = /* @__PURE__ */ new WeakMap();
376
+ const removeNonPreservableEntries = (zip) => {
377
+ for (const [path, file] of Object.entries(zip.files)) if (!file.dir && !isPreservableDocxEntry(path)) zip.remove(path);
378
+ };
379
+ const loadParsedZipSource = async (document, buffer) => {
380
+ const cached = parsedZipSources.get(document);
381
+ if (cached?.buffer === buffer) return cached;
382
+ const zip = await JSZip.loadAsync(buffer);
383
+ removeNonPreservableEntries(zip);
384
+ const [documentXml, corePropertiesXml] = await Promise.all([zip.file("word/document.xml")?.async("text"), zip.file("docProps/core.xml")?.async("text")]);
385
+ const source = {
386
+ buffer,
387
+ zip,
388
+ documentXml,
389
+ corePropertiesXml
390
+ };
391
+ parsedZipSources.set(document, source);
392
+ return source;
393
+ };
394
+ const cloneDocxZip = (source) => {
395
+ const clone = new JSZip();
396
+ clone.files = { ...source.files };
397
+ return clone;
398
+ };
399
+ const finishRepack = async ({ document, originalZip, outputZip, originalDocumentXml, originalCorePropertiesXml, compressionLevel, updateModifiedDate, modifiedBy }) => {
400
+ await materializeNewHeaderFooterParts(document, outputZip, compressionLevel);
401
+ await processNewImages(collectImageParts(document), outputZip, compressionLevel);
402
+ await processNewHyperlinks(collectHyperlinksWithoutRId(document.package.document.content), outputZip, compressionLevel);
403
+ assertValidFolioDocumentModel(document, "Cannot repack invalid DOCX document model");
404
+ applyReplyThreadMarkers(document);
405
+ const documentXml = serializeDocument(document);
406
+ if (originalDocumentXml) assertDocumentPackageFidelity(originalDocumentXml, documentXml, document);
407
+ outputZip.file("word/document.xml", documentXml, {
408
+ compression: "DEFLATE",
409
+ compressionOptions: { level: compressionLevel }
410
+ });
411
+ await rebindWatermarkRelIds(document, outputZip, compressionLevel);
412
+ serializeHeadersFootersToZip(document, outputZip, compressionLevel);
413
+ await serializeNotesToZip(document, originalZip, outputZip, compressionLevel);
414
+ await serializeNumberingIntoZip(document, originalZip, outputZip, compressionLevel);
415
+ await serializeCommentsToZip(document, outputZip, compressionLevel);
416
+ if (updateModifiedDate && originalCorePropertiesXml) {
417
+ const updatedCoreProperties = updateCoreProperties(originalCorePropertiesXml, {
418
+ updateModifiedDate,
419
+ ...modifiedBy !== void 0 ? { modifiedBy } : {}
420
+ });
421
+ outputZip.file("docProps/core.xml", updatedCoreProperties, {
422
+ compression: "DEFLATE",
423
+ compressionOptions: { level: compressionLevel }
424
+ });
425
+ }
426
+ return generateDocxZip(outputZip, compressionLevel);
427
+ };
363
428
  /**
364
429
  * Repack a Document into a valid DOCX file
365
430
  *
@@ -373,54 +438,18 @@ async function repackDocx(doc, options = {}) {
373
438
  const { compressionLevel = 6, updateModifiedDate = true, modifiedBy } = options;
374
439
  const exportDocument = withoutOrphanCommentRanges(doc);
375
440
  const originalZip = await JSZip.loadAsync(doc.originalBuffer);
376
- const newZip = new JSZip();
377
- for (const [path, file] of Object.entries(originalZip.files)) {
378
- if (file.dir) {
379
- newZip.folder(path.replace(/\/$/u, ""));
380
- continue;
381
- }
382
- if (!isPreservableDocxEntry(path)) continue;
383
- const content = await file.async("arraybuffer");
384
- newZip.file(path, content, {
385
- compression: "DEFLATE",
386
- compressionOptions: { level: compressionLevel }
387
- });
388
- }
389
- await materializeNewHeaderFooterParts(exportDocument, newZip, compressionLevel);
390
- await processNewImages(collectImageParts(exportDocument), newZip, compressionLevel);
391
- await processNewHyperlinks(collectHyperlinksWithoutRId(exportDocument.package.document.content), newZip, compressionLevel);
392
- assertValidFolioDocumentModel(exportDocument, "Cannot repack invalid DOCX document model");
393
- applyReplyThreadMarkers(exportDocument);
394
- const documentXml = serializeDocument(exportDocument);
395
- const originalDocumentXml = await originalZip.file("word/document.xml")?.async("text");
396
- if (originalDocumentXml) assertDocumentPackageFidelity(originalDocumentXml, documentXml, exportDocument);
397
- newZip.file("word/document.xml", documentXml, {
398
- compression: "DEFLATE",
399
- compressionOptions: { level: compressionLevel }
400
- });
401
- await rebindWatermarkRelIds(exportDocument, newZip, compressionLevel);
402
- serializeHeadersFootersToZip(exportDocument, newZip, compressionLevel);
403
- await serializeNotesToZip(exportDocument, originalZip, newZip, compressionLevel);
404
- await serializeNumberingIntoZip(exportDocument, originalZip, newZip, compressionLevel);
405
- await serializeCommentsToZip(exportDocument, newZip, compressionLevel);
406
- if (updateModifiedDate) {
407
- const corePropsPath = "docProps/core.xml";
408
- const corePropsFile = originalZip.file(corePropsPath);
409
- if (corePropsFile) {
410
- const updatedCoreProps = updateCoreProperties(await corePropsFile.async("text"), {
411
- updateModifiedDate,
412
- ...modifiedBy !== void 0 ? { modifiedBy } : {}
413
- });
414
- newZip.file(corePropsPath, updatedCoreProps, {
415
- compression: "DEFLATE",
416
- compressionOptions: { level: compressionLevel }
417
- });
418
- }
419
- }
420
- return await newZip.generateAsync({
421
- type: "arraybuffer",
422
- compression: "DEFLATE",
423
- compressionOptions: { level: compressionLevel }
441
+ const [originalDocumentXml, originalCorePropertiesXml] = await Promise.all([originalZip.file("word/document.xml")?.async("text"), originalZip.file("docProps/core.xml")?.async("text")]);
442
+ removeNonPreservableEntries(originalZip);
443
+ const newZip = cloneDocxZip(originalZip);
444
+ return finishRepack({
445
+ document: exportDocument,
446
+ originalZip,
447
+ outputZip: newZip,
448
+ originalDocumentXml,
449
+ originalCorePropertiesXml,
450
+ compressionLevel,
451
+ updateModifiedDate,
452
+ ...modifiedBy !== void 0 ? { modifiedBy } : {}
424
453
  });
425
454
  }
426
455
  /**
@@ -953,32 +982,26 @@ async function serializeNotesToZip(doc, originalZip, newZip, compressionLevel) {
953
982
  const endnotes = doc.package.endnotes ?? [];
954
983
  if (endnotes.length > 0) await patchNotePartIntoZip("word/endnotes.xml", serializeEndnotes(endnotes), (xml) => serializeEndnotes(parseEndnotes(xml).getNormalEndnotes()), originalZip, newZip, compressionLevel);
955
984
  }
956
- /**
957
- * Write edited numbering definitions into word/numbering.xml.
958
- *
959
- * Like the note parts, numbering.xml is preserved verbatim by the copy loop:
960
- * the model does not faithfully retain it (abstractNums drop `w:nsid`/`w:tmpl`,
961
- * custom number formats collapse, level `w:pPr`/`w:rPr` keep only a subset), so
962
- * re-emitting the whole part would lose those pieces. Instead each edited
963
- * `w:abstractNum` / `w:num` is spliced by id into the ORIGINAL part.
964
- *
965
- * Full repack has no change-tracking signal, so "edited" is detected by
966
- * comparing the model's numbering serialization against a BASELINE that
967
- * re-parses and re-serializes the original part. Both go through the same
968
- * (lossy) parse+serialize, so an unedited definition matches its baseline and
969
- * is left byte-exact; only a genuine definition edit differs and is spliced.
970
- */
985
+ const numberingBaselines = /* @__PURE__ */ new WeakMap();
971
986
  async function serializeNumberingIntoZip(doc, originalZip, newZip, compressionLevel) {
972
987
  const numbering = doc.package.numbering;
973
988
  if (!numbering || numbering.abstractNums.length === 0 && numbering.nums.length === 0) return;
974
989
  const file = findNotePartEntry(originalZip, "word/numbering.xml");
975
990
  if (!file) return;
976
- const originalXml = await file.async("text");
977
- const baselineXml = serializeNumberingXml(parseNumbering(originalXml).definitions);
991
+ let baseline = doc.originalBuffer ? numberingBaselines.get(doc) : void 0;
992
+ if (!baseline || baseline.originalBuffer !== doc.originalBuffer) {
993
+ const originalXml = await file.async("text");
994
+ baseline = {
995
+ originalBuffer: doc.originalBuffer,
996
+ originalXml,
997
+ serializedXml: serializeNumberingXml(parseNumbering(originalXml).definitions)
998
+ };
999
+ if (doc.originalBuffer) numberingBaselines.set(doc, baseline);
1000
+ }
978
1001
  const currentXml = serializeNumberingXml(numbering);
979
- const changed = collectChangedNumberingDefs(baselineXml, currentXml);
1002
+ const changed = collectChangedNumberingDefs(baseline.serializedXml, currentXml);
980
1003
  if (changed.abstractNums.size === 0 && changed.nums.size === 0) return;
981
- const patched = buildPatchedNumberingXml(originalXml, currentXml, changed);
1004
+ const patched = buildPatchedNumberingXml(baseline.originalXml, currentXml, changed);
982
1005
  if (patched === null) return;
983
1006
  newZip.file(file.name, patched, {
984
1007
  compression: "DEFLATE",
@@ -1119,6 +1142,9 @@ function isDocxBuffer(buffer) {
1119
1142
  * @returns Promise resolving to minimal DOCX as ArrayBuffer
1120
1143
  */
1121
1144
  function createEmptyDocx() {
1145
+ return generateDocxZip(createEmptyDocxZip(), 6);
1146
+ }
1147
+ const createEmptyDocxZip = () => {
1122
1148
  const zip = new JSZip();
1123
1149
  zip.file("[Content_Types].xml", `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
1124
1150
  <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
@@ -1184,12 +1210,8 @@ function createEmptyDocx() {
1184
1210
  <Application>EigenPal DOCX Editor</Application>
1185
1211
  <AppVersion>1.0000</AppVersion>
1186
1212
  </Properties>`);
1187
- return zip.generateAsync({
1188
- type: "arraybuffer",
1189
- compression: "DEFLATE",
1190
- compressionOptions: { level: 6 }
1191
- });
1192
- }
1213
+ return zip;
1214
+ };
1193
1215
  /**
1194
1216
  * Create a new DOCX from a Document (without requiring original buffer)
1195
1217
  *
@@ -1197,15 +1219,31 @@ function createEmptyDocx() {
1197
1219
  * @returns Promise resolving to DOCX as ArrayBuffer
1198
1220
  */
1199
1221
  async function createDocx(doc) {
1200
- const emptyBuffer = await createDocumentSeedDocx(doc);
1201
- return repackDocx({
1202
- ...doc,
1203
- originalBuffer: emptyBuffer
1222
+ if (doc.originalBuffer) {
1223
+ const source = await loadParsedZipSource(doc, doc.originalBuffer);
1224
+ return finishRepack({
1225
+ document: withoutOrphanCommentRanges(doc),
1226
+ originalZip: source.zip,
1227
+ outputZip: cloneDocxZip(source.zip),
1228
+ originalDocumentXml: source.documentXml,
1229
+ originalCorePropertiesXml: source.corePropertiesXml,
1230
+ compressionLevel: 6,
1231
+ updateModifiedDate: true
1232
+ });
1233
+ }
1234
+ const zip = await createDocumentSeedZip(doc);
1235
+ return finishRepack({
1236
+ document: withoutOrphanCommentRanges(doc),
1237
+ originalZip: zip,
1238
+ outputZip: zip,
1239
+ originalDocumentXml: void 0,
1240
+ originalCorePropertiesXml: await zip.file("docProps/core.xml")?.async("text"),
1241
+ compressionLevel: 6,
1242
+ updateModifiedDate: true
1204
1243
  });
1205
1244
  }
1206
- const createDocumentSeedDocx = async (doc) => {
1207
- const buffer = await createEmptyDocx();
1208
- const zip = await JSZip.loadAsync(buffer);
1245
+ const createDocumentSeedZip = async (doc) => {
1246
+ const zip = createEmptyDocxZip();
1209
1247
  const relationships = ["<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>"];
1210
1248
  const overrides = [];
1211
1249
  let nextRelationshipId = 2;
@@ -1244,11 +1282,7 @@ const createDocumentSeedDocx = async (doc) => {
1244
1282
  const contentTypes = await contentTypesFile.async("string");
1245
1283
  zip.file("[Content_Types].xml", contentTypes.replace("</Types>", `${overrides.join("")}\n</Types>`));
1246
1284
  }
1247
- return zip.generateAsync({
1248
- type: "arraybuffer",
1249
- compression: "DEFLATE",
1250
- compressionOptions: { level: 6 }
1251
- });
1285
+ return zip;
1252
1286
  };
1253
1287
  const relationshipXml = (id, type, target) => `<Relationship Id="rId${id}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/${type}" Target="${target}"/>`;
1254
1288
  const overrideXml = (partName, contentType) => `<Override PartName="${partName}" ContentType="${contentType}"/>`;
@@ -1,5 +1,4 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
-
3
2
  //#region src/docx/runConsolidator.d.ts
4
3
  /**
5
4
  * Check if two TextFormatting objects are equivalent
@@ -161,7 +161,6 @@ function consolidateRuns(runs) {
161
161
  return result;
162
162
  }
163
163
  function consolidateParagraphContent(content) {
164
- if (content.length <= 1) return content;
165
164
  const result = [];
166
165
  const pendingRuns = [];
167
166
  function flushRuns() {
@@ -1,7 +1,6 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
2
  import { StyleMap } from "./styleParser.js";
3
3
  import { XmlElement } from "./xmlParser.js";
4
-
5
4
  //#region src/docx/runParser.d.ts
6
5
  /**
7
6
  * Parse run formatting properties (w:rPr)
@@ -1,10 +1,12 @@
1
- import { EmphasisMarkSchema, FontThemeSchema, HighlightColorSchema, ShadingPatternSchema, TextEffectSchema, ThemeColorSlotSchema, UnderlineStyleSchema, narrowEnum } from "./parserEnums.js";
2
- import { cloneWithXmlnsDeclarations, elementToXml, findAllDeep, findChild, findChildren, getAttribute, getChildElements, getTextContent, mergeXmlnsDeclarations, parseBooleanElement, parseNumericAttribute } from "./xmlParser.js";
1
+ import { EmphasisMarkSchema, FontHintSchema, FontThemeSchema, HighlightColorSchema, PositionalTabAlignmentSchema, PositionalTabLeaderSchema, PositionalTabRelativeToSchema, ShadingPatternSchema, TextEffectSchema, ThemeColorSlotSchema, UnderlineStyleSchema, narrowEnum } from "./parserEnums.js";
2
+ import { cloneWithXmlnsDeclarations, elementToXml, findAllDeep, findChild, findChildren, getAttribute, getChildElements, getLocalName, getTextContent, mergeXmlnsDeclarations, parseBooleanElement, parseNumericAttribute } from "./xmlParser.js";
3
+ import { isTextBoxDrawing } from "./textBoxParser.js";
3
4
  import { parseImage } from "./imageParser.js";
4
5
  import { parseGroupDrawing } from "./groupDrawingParser.js";
5
6
  import { parseShapeFromDrawing, shouldPreserveRawShapeDrawing } from "./shapeParser.js";
6
7
  import { parseVmlImageContent } from "./vmlImageParser.js";
7
8
  import { resolveThemeFontRef } from "./themeParser.js";
9
+ import { requiresXmlSpacePreserve } from "./textWhitespace.js";
8
10
  import { normalizeRevisionId } from "@stll/docx-core/model";
9
11
  //#region src/docx/runParser.ts
10
12
  /**
@@ -240,6 +242,8 @@ function parseRunProperties(rPr, theme, _styles) {
240
242
  if (eastAsia) fontFamily.eastAsia = eastAsia;
241
243
  const csFont = getAttribute(rFonts, "w", "cs");
242
244
  if (csFont) fontFamily.cs = csFont;
245
+ const hint = narrowEnum(getAttribute(rFonts, "w", "hint"), FontHintSchema);
246
+ if (hint) fontFamily.hint = hint;
243
247
  const asciiTheme = narrowEnum(getAttribute(rFonts, "w", "asciiTheme"), FontThemeSchema);
244
248
  if (asciiTheme) {
245
249
  fontFamily.asciiTheme = asciiTheme;
@@ -368,7 +372,7 @@ function parseRunPropertyChanges(rPr, theme, styles, currentFormatting) {
368
372
  */
369
373
  function parseTextContent(element) {
370
374
  const text = getTextContent(element);
371
- const preserveSpace = getAttribute(element, "xml", "space") === "preserve";
375
+ const preserveSpace = getAttribute(element, "xml", "space") === "preserve" || requiresXmlSpacePreserve(text);
372
376
  const content = {
373
377
  type: "text",
374
378
  text
@@ -382,6 +386,19 @@ function parseTextContent(element) {
382
386
  function parseTabContent() {
383
387
  return { type: "tab" };
384
388
  }
389
+ function parsePositionalTabContent(element) {
390
+ const positional = {};
391
+ const relativeTo = narrowEnum(getAttribute(element, "w", "relativeTo"), PositionalTabRelativeToSchema);
392
+ const alignment = narrowEnum(getAttribute(element, "w", "alignment"), PositionalTabAlignmentSchema);
393
+ const leader = narrowEnum(getAttribute(element, "w", "leader"), PositionalTabLeaderSchema);
394
+ if (relativeTo !== void 0) positional.relativeTo = relativeTo;
395
+ if (alignment !== void 0) positional.alignment = alignment;
396
+ if (leader !== void 0) positional.leader = leader;
397
+ return {
398
+ type: "tab",
399
+ positional
400
+ };
401
+ }
385
402
  /**
386
403
  * Parse break element (w:br)
387
404
  */
@@ -500,14 +517,6 @@ function parseDrawingContent(element, rels, media) {
500
517
  return drawing;
501
518
  }
502
519
  /**
503
- * Get the local name of an element (without namespace prefix)
504
- */
505
- function getLocalName(name) {
506
- if (!name) return "";
507
- const colonIndex = name.indexOf(":");
508
- return colonIndex !== -1 ? name.slice(colonIndex + 1) : name;
509
- }
510
- /**
511
520
  * Parse all content within a run element
512
521
  */
513
522
  function parseRunContents(runElement, rels, media, rootXmlns = {}) {
@@ -520,6 +529,9 @@ function parseRunContents(runElement, rels, media, rootXmlns = {}) {
520
529
  case "tab":
521
530
  contents.push(parseTabContent());
522
531
  break;
532
+ case "ptab":
533
+ contents.push(parsePositionalTabContent(child));
534
+ break;
523
535
  case "br":
524
536
  contents.push(parseBreakContent(child));
525
537
  break;
@@ -573,6 +585,7 @@ function parseRunContents(runElement, rels, media, rootXmlns = {}) {
573
585
  const alternateChildren = getChildElements(child);
574
586
  const choiceEl = alternateChildren.find((el) => getLocalName(el.name) === "Choice");
575
587
  const fallbackEl = alternateChildren.find((el) => getLocalName(el.name) === "Fallback");
588
+ const choiceTextBoxDrawing = choiceEl ? getChildElements(choiceEl).find((element) => getLocalName(element.name) === "drawing" && isTextBoxDrawing(element)) : void 0;
576
589
  const groupedChoiceDrawing = choiceEl ? getChildElements(choiceEl).find((element) => getLocalName(element.name) === "drawing" && findAllDeep(element, "wpg", "wgp").length > 0) : void 0;
577
590
  if (groupedChoiceDrawing) {
578
591
  const groupedDrawing = parseDrawingContent(groupedChoiceDrawing, rels, media);
@@ -583,7 +596,7 @@ function parseRunContents(runElement, rels, media, rootXmlns = {}) {
583
596
  }
584
597
  }
585
598
  const fallbackPict = fallbackEl ? getChildElements(fallbackEl).find((el) => getLocalName(el.name) === "pict") : void 0;
586
- const fallbackVml = fallbackPict ? parseVmlImageContent(fallbackPict, rels, media, rootXmlns) : null;
599
+ const fallbackVml = fallbackPict && !choiceTextBoxDrawing ? parseVmlImageContent(fallbackPict, rels, media, rootXmlns) : null;
587
600
  if (fallbackVml?.image.src) {
588
601
  fallbackVml.rawXml = elementToXml(cloneWithXmlnsDeclarations(child, rootXmlns));
589
602
  contents.push(fallbackVml);
@@ -1,6 +1,5 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
2
  import { XmlElement } from "./xmlParser.js";
3
-
4
3
  //#region src/docx/sdtProperties.d.ts
5
4
  /**
6
5
  * Parse `<w:sdtPr>` (and optional `<w:sdtEndPr>`) into {@link SdtProperties}.
@@ -1,5 +1,4 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
-
3
2
  //#region src/docx/sdtPropertiesPatch.d.ts
4
3
  /**
5
4
  * Rewrite the relevant child elements of `<w:sdtPr>` so the modeled
@@ -1,6 +1,5 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
2
  import { XmlElement } from "./xmlParser.js";
3
-
4
3
  //#region src/docx/sectionParser.d.ts
5
4
  declare function getUnserializedSectionPropertyChildNames(props: document_d_exports.SectionProperties): readonly string[] | undefined;
6
5
  /**
@@ -1,9 +1,11 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
-
3
2
  //#region src/docx/selectiveSave.d.ts
4
3
  type SelectiveSaveOptions = {
5
- /** Changed paragraph IDs to selectively patch */changedParaIds: Set<string>; /** Whether structural changes occurred (paragraph add/delete) */
6
- structuralChange: boolean; /** Whether any changes affected paragraphs without paraId */
4
+ /** Changed paragraph IDs to selectively patch */
5
+ changedParaIds: Set<string>;
6
+ /** Whether structural changes occurred (paragraph add/delete) */
7
+ structuralChange: boolean;
8
+ /** Whether any changes affected paragraphs without paraId */
7
9
  hasUntrackedChanges: boolean;
8
10
  /**
9
11
  * Maximum allowed `originalBuffer.byteLength` for the selective path. Above
@@ -5,6 +5,7 @@ import { validateFolioDocumentModel } from "./modelValidation.js";
5
5
  import { isPreservableDocxEntry } from "./unzip.js";
6
6
  import { hasUnsynthesizedReplyRanges } from "./commentReplyMarkers.js";
7
7
  import { withoutOrphanCommentRanges } from "./commentRangeIntegrity.js";
8
+ import { isNewDataUrlDrawing } from "./newImage.js";
8
9
  import { buildPatchedDocumentXml, buildPatchedNoteXml, buildPatchedNumberingXml, collectChangedNumberingDefs, collectParaIds } from "./selectiveXmlPatch.js";
9
10
  import { ensureThreadedCommentParaIds, serializeComments, serializeCommentsExtended } from "./serializer/commentSerializer.js";
10
11
  import { serializeDocument } from "./serializer/documentSerializer.js";
@@ -13,14 +14,13 @@ import { serializeNumberingXml } from "./serializer/numberingSerializer.js";
13
14
  import { COMMENTS_CONTENT_TYPE, COMMENTS_EXTENDED_PART_LOWER, addCommentsExtendedOverride, addCommentsExtendedRelationship, applyUpdatesToZip, collectHeaderFooterUpdates, findMaxRId, hasModelDrivenPictureWatermark, hasUnmaterializedHeaderFooter, updateCoreProperties } from "./rezip.js";
14
15
  import "./selectiveSaveFlags.js";
15
16
  //#region src/docx/selectiveSave.ts
16
- const SYNTHETIC_IMAGE_RID_PREFIX = "rId_img_";
17
17
  /**
18
18
  * Check if document content has new images (data: URL without rId) or
19
19
  * new hyperlinks (href without rId). Combined into a single traversal
20
20
  * to avoid walking the block tree twice.
21
21
  */
22
22
  function hasNewImagesOrHyperlinks(blocks) {
23
- const runHasNewImage = (run) => run.content.some((c) => c.type === "drawing" && c.image?.src?.startsWith("data:") === true && (!c.image.rId || c.image.rId.startsWith(SYNTHETIC_IMAGE_RID_PREFIX)));
23
+ const runHasNewImage = (run) => run.content.some(isNewDataUrlDrawing);
24
24
  for (const block of blocks) if (block.type === "paragraph") {
25
25
  for (const item of block.content) if (item.type === "run") {
26
26
  if (runHasNewImage(item)) return true;
@@ -13,13 +13,15 @@
13
13
  * the dominant cost.
14
14
  */
15
15
  type FolioSelectiveSaveFlags = {
16
- /** Enable the selective save path. Default: false (full repack only). */selectiveSave?: boolean;
16
+ /** Enable the selective save path. Default: false (full repack only). */
17
+ selectiveSave?: boolean;
17
18
  /**
18
19
  * Run selective save and full repack on every save, compare bytes, and emit
19
20
  * a `TripwireResult` via `onSelectiveSaveTripwire`. Independent of
20
21
  * `selectiveSave`: the tripwire always observes both paths.
21
22
  */
22
- selectiveSaveTripwire?: boolean; /** Maximum original buffer size, in bytes, for which selective save is allowed. */
23
+ selectiveSaveTripwire?: boolean;
24
+ /** Maximum original buffer size, in bytes, for which selective save is allowed. */
23
25
  selectiveSaveMaxBytes?: number;
24
26
  };
25
27
  declare const DEFAULT_SELECTIVE_SAVE_MAX_BYTES: number;
@@ -367,8 +367,20 @@ function findNumberingElementOffsets(xml, kind, id) {
367
367
  function extractNumberingElementXml(xml, kind, id) {
368
368
  return extractElementByIdAttr(xml, NUMBERING_OPEN_LITERAL[kind], NUMBERING_CLOSE_TAG[kind], NUMBERING_ID_ATTR[kind], id);
369
369
  }
370
- function collectNumberingElementIds(xml, kind) {
371
- return collectElementIds(xml, NUMBERING_OPEN_LITERAL[kind], NUMBERING_ID_ATTR[kind]);
370
+ function buildNumberingElementOffsetIndex(xml, kind) {
371
+ const index = /* @__PURE__ */ new Map();
372
+ const openLiteral = NUMBERING_OPEN_LITERAL[kind];
373
+ const pattern = new RegExp(`${escapeRegExp(openLiteral)}[\\s][^>]*?${escapeRegExp(NUMBERING_ID_ATTR[kind])}="(?<id>[^"]+)"`, "gu");
374
+ let match;
375
+ while ((match = pattern.exec(xml)) !== null) {
376
+ const id = match.groups["id"];
377
+ if (index.has(id)) {
378
+ index.set(id, null);
379
+ continue;
380
+ }
381
+ index.set(id, scanElementRange(xml, match.index, openLiteral, NUMBERING_CLOSE_TAG[kind]));
382
+ }
383
+ return index;
372
384
  }
373
385
  const SYNTHETIC_NUM_FMT_PATTERN = /<w:numFmt w:val="decimalZero(?<width>[345])"\/>/u;
374
386
  /**
@@ -381,12 +393,12 @@ const SYNTHETIC_NUM_FMT_PATTERN = /<w:numFmt w:val="decimalZero(?<width>[345])"\
381
393
  function collectChangedNumberingDefs(baselineXml, currentXml) {
382
394
  const changedForKind = (kind) => {
383
395
  const changed = /* @__PURE__ */ new Set();
384
- const baselineIds = collectNumberingElementIds(baselineXml, kind);
385
- for (const [id, count] of collectNumberingElementIds(currentXml, kind)) {
386
- if (count !== 1 || baselineIds.get(id) !== 1) continue;
387
- const before = extractNumberingElementXml(baselineXml, kind, id);
388
- const after = extractNumberingElementXml(currentXml, kind, id);
389
- if (before !== null && after !== null && before !== after) changed.add(id);
396
+ const baselineIndex = buildNumberingElementOffsetIndex(baselineXml, kind);
397
+ const currentIndex = buildNumberingElementOffsetIndex(currentXml, kind);
398
+ for (const [id, afterRange] of currentIndex) {
399
+ const beforeRange = baselineIndex.get(id);
400
+ if (!beforeRange || !afterRange) continue;
401
+ if (baselineXml.slice(beforeRange.start, beforeRange.end) !== currentXml.slice(afterRange.start, afterRange.end)) changed.add(id);
390
402
  }
391
403
  return changed;
392
404
  };
@@ -1,5 +1,4 @@
1
1
  import { document_d_exports } from "../../types/document.js";
2
-
3
2
  //#region src/docx/serializer/blockSdtSerializer.d.ts
4
3
  declare function serializeBlockSdt(blockSdt: document_d_exports.BlockSdt, serializeChild: (block: document_d_exports.BlockContent) => string): string;
5
4
  //#endregion
@@ -1,5 +1,5 @@
1
- import { isSingleWellFormedElement } from "./xmlUtils.js";
2
1
  import { reconcileRawSdtPr } from "../sdtPropertiesPatch.js";
2
+ import { isSingleWellFormedElement } from "./xmlUtils.js";
3
3
  //#region src/docx/serializer/blockSdtSerializer.ts
4
4
  function escapeXmlAttr(value) {
5
5
  return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;");
@@ -52,6 +52,7 @@ function extractDropdownLastValue(blockSdt) {
52
52
  if (blockSdt.properties.sdtType !== "dropdown" && blockSdt.properties.sdtType !== "comboBox") return;
53
53
  const modeled = blockSdt.properties.dropdownLastValue;
54
54
  if (modeled !== void 0) return modeled;
55
+ if (blockSdt.properties.rawPropertiesXml !== void 0) return;
55
56
  const firstBlock = blockSdt.content[0];
56
57
  if (!firstBlock || firstBlock.type !== "paragraph") return;
57
58
  const parts = [];
@@ -1,5 +1,4 @@
1
1
  import { document_d_exports } from "../../types/document.js";
2
-
3
2
  //#region src/docx/serializer/borderSerializer.d.ts
4
3
  /**
5
4
  * Serialize a single border element (`<w:top .../>`, `<w:left .../>`, ...).
@@ -1,5 +1,4 @@
1
1
  import { Comment } from "../../types/content.js";
2
-
3
2
  //#region src/docx/serializer/commentSerializer.d.ts
4
3
  /**
5
4
  * Serialize comments array to comments.xml content. Returns a valid empty