@stll/folio-core 0.51.0 → 0.53.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 (316) 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 +1519 -105
  4. package/dist/ai-edits/batch-claims.d.ts +130 -0
  5. package/dist/ai-edits/batch-claims.js +244 -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 +71 -7
  14. package/dist/ai-edits/headless.js +381 -41
  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 +1 -1
  26. package/dist/ai-edits/read.js +56 -43
  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/snapshot.d.ts +36 -3
  30. package/dist/ai-edits/snapshot.js +177 -23
  31. package/dist/ai-edits/table-cell-mutations.d.ts +1 -1
  32. package/dist/ai-edits/table-cell-mutations.js +4 -1
  33. package/dist/ai-edits/table-geometry.d.ts +1 -1
  34. package/dist/ai-edits/table-row-column-mutations.d.ts +38 -16
  35. package/dist/ai-edits/table-row-column-mutations.js +61 -26
  36. package/dist/ai-edits/types.d.ts +155 -16
  37. package/dist/compare/compare.d.ts +1 -1
  38. package/dist/compare/compare.js +65 -16
  39. package/dist/compare/content-alignment.js +13 -2
  40. package/dist/compare/content-types.d.ts +7 -0
  41. package/dist/compare/content.d.ts +4 -1
  42. package/dist/compare/content.js +6 -1
  43. package/dist/compare/formatting.js +2 -1
  44. package/dist/compare/inline-atoms.d.ts +21 -4
  45. package/dist/compare/inline-atoms.js +138 -16
  46. package/dist/compare/inline-provenance.js +18 -22
  47. package/dist/compare/plan.js +10 -5
  48. package/dist/compare/scenario.js +14 -3
  49. package/dist/compare/section-boundary-properties.js +14 -1
  50. package/dist/compare/types.d.ts +4 -2
  51. package/dist/compare/types.js +2 -1
  52. package/dist/compare/verification.d.ts +1 -1
  53. package/dist/compare/verification.js +15 -3
  54. package/dist/controller/committedLayoutDiff.d.ts +25 -0
  55. package/dist/controller/committedLayoutDiff.js +71 -0
  56. package/dist/controller/contentControlWidgetController.d.ts +1 -1
  57. package/dist/controller/folioEditor.d.ts +1 -1
  58. package/dist/controller/fontReadiness.d.ts +70 -3
  59. package/dist/controller/fontReadiness.js +100 -10
  60. package/dist/controller/headerFooterEditorManager.js +6 -1
  61. package/dist/controller/layoutPipeline.d.ts +12 -10
  62. package/dist/controller/layoutPipeline.js +62 -9
  63. package/dist/controller/layoutRunOptions.d.ts +24 -0
  64. package/dist/controller/layoutRunOptions.js +17 -0
  65. package/dist/controller/layoutScheduler.d.ts +19 -14
  66. package/dist/controller/layoutScheduler.js +15 -12
  67. package/dist/controller/layoutSession.d.ts +26 -2
  68. package/dist/controller/layoutSession.js +1 -1
  69. package/dist/controller/noteEditorManager.js +8 -3
  70. package/dist/document-operations.d.ts +11 -2
  71. package/dist/document-operations.js +230 -21
  72. package/dist/docx/altChunk.d.ts +8 -0
  73. package/dist/docx/altChunk.js +17 -0
  74. package/dist/docx/attributeRemainder.d.ts +1 -1
  75. package/dist/docx/blockContentParser.d.ts +64 -1
  76. package/dist/docx/blockContentParser.js +17 -4
  77. package/dist/docx/blockCustomXmlShell.d.ts +7 -0
  78. package/dist/docx/blockCustomXmlShell.js +14 -0
  79. package/dist/docx/blockPlainText.js +7 -0
  80. package/dist/docx/commentAnchorIndex.js +1 -1
  81. package/dist/docx/commentRangeIntegrity.js +8 -3
  82. package/dist/docx/commentReferenceNormalization.js +1 -1
  83. package/dist/docx/commentReplyMarkers.js +20 -1
  84. package/dist/docx/compatibility.d.ts +1 -1
  85. package/dist/docx/compatibility.js +34 -13
  86. package/dist/docx/containerChildren.gen.d.ts +1 -1
  87. package/dist/docx/containerChildren.gen.js +1 -0
  88. package/dist/docx/documentParser.js +12 -12
  89. package/dist/docx/drawingIdNormalization.d.ts +3 -1
  90. package/dist/docx/drawingIdNormalization.js +6 -1
  91. package/dist/docx/ensureParaIds.js +119 -97
  92. package/dist/docx/footnoteParser.js +8 -4
  93. package/dist/docx/headerFooterParser.js +3 -3
  94. package/dist/docx/headerFooterReferenceNormalization.d.ts +20 -1
  95. package/dist/docx/headerFooterReferenceNormalization.js +52 -27
  96. package/dist/docx/hyperlinkParser.d.ts +1 -1
  97. package/dist/docx/index.d.ts +1 -1
  98. package/dist/docx/listNumberingInstances.d.ts +59 -0
  99. package/dist/docx/listNumberingInstances.js +249 -0
  100. package/dist/docx/normalizeBaseDirection.js +2 -1
  101. package/dist/docx/opaqueCarrier.d.ts +7 -0
  102. package/dist/docx/opaqueCarrier.js +38 -0
  103. package/dist/docx/packageParts.js +4 -1
  104. package/dist/docx/paragraphParser.js +91 -24
  105. package/dist/docx/paragraphPropertySource.d.ts +4 -2
  106. package/dist/docx/paragraphPropertySource.js +7 -1
  107. package/dist/docx/paragraphTraversal.js +1 -0
  108. package/dist/docx/parseWarningMessage.js +4 -1
  109. package/dist/docx/parser.js +173 -20
  110. package/dist/docx/rezip.js +27 -5
  111. package/dist/docx/sdtProperties.js +1 -1
  112. package/dist/docx/sdtPropertiesPatch.js +3 -0
  113. package/dist/docx/selectiveSave.js +16 -9
  114. package/dist/docx/selectiveXmlPatch.js +106 -37
  115. package/dist/docx/serializer/blockCustomXmlSerializer.d.ts +5 -0
  116. package/dist/docx/serializer/blockCustomXmlSerializer.js +4 -0
  117. package/dist/docx/serializer/documentSerializer.js +2 -0
  118. package/dist/docx/serializer/headerFooterSerializer.js +2 -0
  119. package/dist/docx/serializer/noteSerializer.js +3 -1
  120. package/dist/docx/serializer/paragraphSerializer.js +33 -9
  121. package/dist/docx/serializer/tableSerializer.js +25 -38
  122. package/dist/docx/server/createBilingualDocument.js +3 -3
  123. package/dist/docx/tableParser.d.ts +157 -1
  124. package/dist/docx/tableParser.js +89 -10
  125. package/dist/docx/textBoxParser.js +1 -1
  126. package/dist/docx/unzip.d.ts +2 -1
  127. package/dist/docx/unzip.js +1 -1
  128. package/dist/docx/wordprocessingPrefixes.d.ts +78 -0
  129. package/dist/docx/wordprocessingPrefixes.js +286 -0
  130. package/dist/generated/text_shaper.js +26 -0
  131. package/dist/generated/text_shaper_bg.wasm +0 -0
  132. package/dist/i18n/messages/catalogs.gen.d.ts +136 -0
  133. package/dist/i18n/messages/catalogs.gen.js +153 -17
  134. package/dist/i18n/messages/messages.gen.d.ts +8 -0
  135. package/dist/internal/compare/inline-presentation.d.ts +2 -1
  136. package/dist/internal/compare/inline-presentation.js +11 -10
  137. package/dist/internal/headlessRevisionResolutionGuard.d.ts +2 -8
  138. package/dist/internal/headlessRevisionResolutionGuard.js +2 -11
  139. package/dist/internal/indexedPositionMap.d.ts +11 -0
  140. package/dist/internal/indexedPositionMap.js +42 -0
  141. package/dist/internal/pageBreakRunSourceDescendantIndex.js +2 -1
  142. package/dist/internal/revisionResolutionEdits.d.ts +13 -0
  143. package/dist/internal/revisionResolutionEdits.js +19 -0
  144. package/dist/internal/revisionResolutionInline.d.ts +24 -0
  145. package/dist/internal/{headlessRevisionResolution.js → revisionResolutionInline.js} +61 -43
  146. package/dist/internal/revisionResolutionStep.d.ts +34 -0
  147. package/dist/internal/revisionResolutionStep.js +282 -0
  148. package/dist/internal/revisionResolutionTracking.d.ts +11 -0
  149. package/dist/internal/revisionResolutionTracking.js +124 -0
  150. package/dist/internal/wholeStoryRevisionResolution.d.ts +56 -0
  151. package/dist/internal/wholeStoryRevisionResolution.js +530 -0
  152. package/dist/layout-bridge/convert/markupViewFlow.d.ts +20 -0
  153. package/dist/layout-bridge/convert/markupViewFlow.js +123 -0
  154. package/dist/layout-bridge/convert/tableConversion.js +1 -1
  155. package/dist/layout-bridge/convert/toFlowBlocks.js +10 -1
  156. package/dist/layout-engine/layoutInstrumentation.d.ts +9 -1
  157. package/dist/layout-engine/layoutInstrumentation.js +4 -1
  158. package/dist/layout-engine/measure/cache.d.ts +18 -1
  159. package/dist/layout-engine/measure/cache.js +31 -1
  160. package/dist/layout-engine/measure/font-metrics.worker.js +3 -7
  161. package/dist/layout-engine/measure/measureContainer.js +7 -47
  162. package/dist/layout-engine/measure/measureHelpers.d.ts +6 -1
  163. package/dist/layout-engine/measure/measureHelpers.js +22 -2
  164. package/dist/layout-engine/measure/measureWorker.js +2 -3
  165. package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +6 -7
  166. package/dist/layout-engine/measure/measureWorkerProtocol.js +1 -2
  167. package/dist/layout-engine/types.d.ts +6 -0
  168. package/dist/layout-painter/renderPage.js +1 -0
  169. package/dist/layout-painter/renderParagraph.js +1 -1
  170. package/dist/managers/ContextMenuManager.js +5 -2
  171. package/dist/managers/types.d.ts +3 -0
  172. package/dist/markdown/fromMarkdown.js +2 -1
  173. package/dist/markdown/internals.d.ts +11 -1
  174. package/dist/markdown/internals.js +24 -3
  175. package/dist/markdown/renderBlock.js +39 -9
  176. package/dist/markdown/renderParagraph.d.ts +13 -1
  177. package/dist/markdown/renderParagraph.js +85 -38
  178. package/dist/markdown/renderRuns.js +3 -10
  179. package/dist/markdown/renderTable.js +24 -12
  180. package/dist/markdown/trailers.js +2 -2
  181. package/dist/markdown/types.d.ts +29 -7
  182. package/dist/paged-layout/incrementalMeasure.d.ts +1 -2
  183. package/dist/paged-layout/incrementalMeasure.js +1 -9
  184. package/dist/paged-layout/transactionDirtyRange.d.ts +1 -3
  185. package/dist/paged-layout/transactionDirtyRange.js +29 -41
  186. package/dist/panel-layout.d.ts +83 -0
  187. package/dist/panel-layout.js +96 -0
  188. package/dist/prosemirror/anchoredTextBoxes.d.ts +37 -0
  189. package/dist/prosemirror/anchoredTextBoxes.js +156 -0
  190. package/dist/prosemirror/attrs/index.d.ts +6 -2
  191. package/dist/prosemirror/attrs/index.js +172 -1
  192. package/dist/prosemirror/commands/comments.d.ts +7 -8
  193. package/dist/prosemirror/commands/comments.js +241 -207
  194. package/dist/prosemirror/commands/contentControls.d.ts +1 -1
  195. package/dist/prosemirror/commands/formatPainter.d.ts +1 -1
  196. package/dist/prosemirror/commands/formatting.d.ts +1 -1
  197. package/dist/prosemirror/commands/index.d.ts +2 -2
  198. package/dist/prosemirror/commands/index.js +2 -2
  199. package/dist/prosemirror/commands/paragraph.d.ts +7 -1
  200. package/dist/prosemirror/commands/paragraph.js +9 -1
  201. package/dist/prosemirror/commands/paragraphBookmarkJoin.d.ts +13 -0
  202. package/dist/prosemirror/commands/paragraphBookmarkJoin.js +22 -0
  203. package/dist/prosemirror/commands/pastePlainText.d.ts +1 -1
  204. package/dist/prosemirror/commands/resolveAllTableChanges.d.ts +40 -0
  205. package/dist/prosemirror/commands/resolveAllTableChanges.js +615 -0
  206. package/dist/prosemirror/commands/resolveNodePropertyChangeAttrs.d.ts +15 -0
  207. package/dist/prosemirror/commands/resolveNodePropertyChangeAttrs.js +46 -0
  208. package/dist/prosemirror/commands/resolveParagraphProperties.d.ts +16 -0
  209. package/dist/prosemirror/commands/resolveParagraphProperties.js +59 -0
  210. package/dist/prosemirror/commands/sectionBreak.js +2 -1
  211. package/dist/prosemirror/commands/tableCellMergeResolution.d.ts +8 -2
  212. package/dist/prosemirror/commands/tableCellMergeResolution.js +1 -1
  213. package/dist/prosemirror/contentControlRevisions.d.ts +1 -1
  214. package/dist/prosemirror/conversion/fromProseDoc.js +181 -31
  215. package/dist/prosemirror/conversion/toProseDoc.js +39 -4
  216. package/dist/prosemirror/emptyFieldResultRuns.d.ts +18 -0
  217. package/dist/prosemirror/emptyFieldResultRuns.js +33 -0
  218. package/dist/prosemirror/extensions/ExtensionManager.d.ts +1 -1
  219. package/dist/prosemirror/extensions/ExtensionManager.js +3 -1
  220. package/dist/prosemirror/extensions/StarterKit.js +3 -1
  221. package/dist/prosemirror/extensions/core/DocExtension.js +1 -1
  222. package/dist/prosemirror/extensions/core/ParagraphExtension.js +12 -0
  223. package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +3 -0
  224. package/dist/prosemirror/extensions/features/ListExtension.js +161 -123
  225. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +19 -2
  226. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +33 -20
  227. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +31 -2
  228. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +270 -99
  229. package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +3 -2
  230. package/dist/prosemirror/extensions/features/pasteCleanup.js +2 -1
  231. package/dist/prosemirror/extensions/features/pastedHtmlLists.d.ts +12 -0
  232. package/dist/prosemirror/extensions/features/pastedHtmlLists.js +126 -0
  233. package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +21 -5
  234. package/dist/prosemirror/extensions/marks/RunIdentityExtension.d.ts +21 -18
  235. package/dist/prosemirror/extensions/marks/RunIdentityExtension.js +37 -17
  236. package/dist/prosemirror/extensions/marks/markUtils.d.ts +7 -2
  237. package/dist/prosemirror/extensions/marks/markUtils.js +8 -2
  238. package/dist/prosemirror/extensions/marks/noteReferenceDeletion.d.ts +10 -0
  239. package/dist/prosemirror/extensions/marks/noteReferenceDeletion.js +35 -0
  240. package/dist/prosemirror/extensions/nodes/BlockCustomXmlExtension.d.ts +6 -0
  241. package/dist/prosemirror/extensions/nodes/BlockCustomXmlExtension.js +52 -0
  242. package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +3 -3
  243. package/dist/prosemirror/extensions/nodes/FieldExtension.js +50 -15
  244. package/dist/prosemirror/extensions/nodes/PreservedBlockExtension.js +4 -1
  245. package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +1 -1
  246. package/dist/prosemirror/extensions/nodes/TableExtension.js +19 -18
  247. package/dist/prosemirror/extensions/types.d.ts +4 -1
  248. package/dist/prosemirror/findReplaceSelection.js +1 -1
  249. package/dist/prosemirror/index.d.ts +3 -2
  250. package/dist/prosemirror/index.js +3 -2
  251. package/dist/prosemirror/indexedNodeLookup.d.ts +17 -0
  252. package/dist/prosemirror/indexedNodeLookup.js +103 -0
  253. package/dist/prosemirror/listAutoformatMarkers.d.ts +19 -0
  254. package/dist/prosemirror/listAutoformatMarkers.js +98 -0
  255. package/dist/prosemirror/listInstanceReferences.d.ts +12 -0
  256. package/dist/prosemirror/listInstanceReferences.js +72 -0
  257. package/dist/prosemirror/listLabels.d.ts +24 -0
  258. package/dist/prosemirror/listLabels.js +111 -0
  259. package/dist/prosemirror/listNumbering.d.ts +110 -0
  260. package/dist/prosemirror/listNumbering.js +345 -0
  261. package/dist/prosemirror/listRenderingAttrs.d.ts +11 -2
  262. package/dist/prosemirror/listRenderingAttrs.js +8 -1
  263. package/dist/prosemirror/markupViewProjection.d.ts +95 -0
  264. package/dist/prosemirror/markupViewProjection.js +83 -0
  265. package/dist/prosemirror/numberingAttr.d.ts +9 -1
  266. package/dist/prosemirror/numberingAttr.js +9 -1
  267. package/dist/prosemirror/outlineLevelAttr.js +1 -1
  268. package/dist/prosemirror/paragraphIndentation.d.ts +10 -1
  269. package/dist/prosemirror/paragraphIndentation.js +29 -7
  270. package/dist/prosemirror/paragraphMarkJoin.d.ts +19 -0
  271. package/dist/prosemirror/paragraphMarkJoin.js +24 -0
  272. package/dist/prosemirror/plugins/createDocScanPlugin.d.ts +1 -1
  273. package/dist/prosemirror/plugins/documentNumbering.d.ts +27 -1
  274. package/dist/prosemirror/plugins/documentNumbering.js +97 -11
  275. package/dist/prosemirror/plugins/documentStyles.d.ts +10 -1
  276. package/dist/prosemirror/plugins/documentStyles.js +14 -1
  277. package/dist/prosemirror/plugins/suggestionMode.d.ts +16 -2
  278. package/dist/prosemirror/plugins/suggestionMode.js +116 -52
  279. package/dist/prosemirror/plugins/templateDirectives.d.ts +1 -1
  280. package/dist/prosemirror/plugins/transactionInvariants.d.ts +32 -0
  281. package/dist/prosemirror/plugins/transactionInvariants.js +86 -0
  282. package/dist/prosemirror/positionSweep.d.ts +24 -0
  283. package/dist/prosemirror/positionSweep.js +222 -0
  284. package/dist/prosemirror/rebaseParagraphRunFormatting.d.ts +1 -1
  285. package/dist/prosemirror/rejoinRunCarriers.d.ts +1 -1
  286. package/dist/prosemirror/replacedAnnotations.d.ts +33 -1
  287. package/dist/prosemirror/replacedAnnotations.js +170 -1
  288. package/dist/prosemirror/runFormattingInlineCarriers.d.ts +1 -1
  289. package/dist/prosemirror/runStyleFormatting.d.ts +7 -1
  290. package/dist/prosemirror/runStyleFormatting.js +13 -7
  291. package/dist/prosemirror/schema/index.d.ts +2 -2
  292. package/dist/prosemirror/schema/index.js +3 -0
  293. package/dist/prosemirror/schema/nodes.d.ts +42 -11
  294. package/dist/prosemirror/sectionMarkEdits.d.ts +20 -0
  295. package/dist/prosemirror/sectionMarkEdits.js +59 -0
  296. package/dist/prosemirror/storyListNumbering.d.ts +17 -0
  297. package/dist/prosemirror/storyListNumbering.js +102 -0
  298. package/dist/prosemirror/tableGridMutation.d.ts +48 -2
  299. package/dist/prosemirror/tableGridMutation.js +106 -1
  300. package/dist/prosemirror/validation.js +5 -1
  301. package/dist/redline.js +93 -9
  302. package/dist/render-dom/BodySelectionOverlay.d.ts +4 -1
  303. package/dist/render-dom/BodySelectionOverlay.js +3 -2
  304. package/dist/shaping/shaper.d.ts +47 -4
  305. package/dist/shaping/shaper.js +46 -15
  306. package/dist/text-shaping.d.ts +4 -0
  307. package/dist/text-shaping.js +4 -0
  308. package/dist/utils/findReplace.js +2 -2
  309. package/dist/utils/mergeDocumentContent.js +1 -1
  310. package/dist/utils/noteReferenceLabels.d.ts +36 -0
  311. package/dist/utils/noteReferenceLabels.js +32 -0
  312. package/dist/utils/replaceText.js +1 -1
  313. package/dist/version-comparison.d.ts +1 -0
  314. package/dist/version-comparison.js +1 -0
  315. package/package.json +8 -2
  316. package/dist/internal/headlessRevisionResolution.d.ts +0 -23
@@ -1,6 +1,11 @@
1
1
  import { cloneParagraphWithPropertySource } from "./paragraphPropertySource.js";
2
2
  //#region src/docx/commentRangeIntegrity.ts
3
- const COMMENT_RANGE_MARKER_PATTERN = /<w:commentRange(Start|End)\s[^>]*w:id="(\d+)"/gu;
3
+ /**
4
+ * A range marker under any prefix, or none: this is the guard a splice is
5
+ * refused by, and a guard that only knows `w:` passes every patch of a part
6
+ * that spells WordprocessingML another way.
7
+ */
8
+ const COMMENT_RANGE_MARKER_PATTERN = /<(?:[\w.-]+:)?commentRange(Start|End)(?:\s[^>]*?)?\s(?:[\w.-]+:)?id=["'](\d+)["']/gu;
4
9
  /**
5
10
  * Comment ids whose range is not a start followed by an end in this story's
6
11
  * XML. Either half alone is invalid OOXML and anchors nothing: Word shows no
@@ -147,7 +152,7 @@ const withoutOrphanBlockMarkers = (blocks, validCommentIds) => {
147
152
  const withoutOrphanBlockMarker = (block, validCommentIds) => {
148
153
  if (block.type === "paragraph") return withoutOrphanParagraphMarkers(block, validCommentIds);
149
154
  if (block.type === "table") return withoutOrphanTableMarkers(block, validCommentIds);
150
- if (block.type !== "blockSdt") return block;
155
+ if (block.type !== "blockSdt" && block.type !== "blockCustomXml") return block;
151
156
  const content = withoutOrphanBlockMarkers(block.content, validCommentIds);
152
157
  if (!content) return block;
153
158
  return {
@@ -204,7 +209,7 @@ const withoutOrphanTableCellBlockMarkers = (blocks, validCommentIds) => {
204
209
  const withoutOrphanTableCellBlockMarker = (block, validCommentIds) => {
205
210
  if (block.type === "paragraph") return withoutOrphanParagraphMarkers(block, validCommentIds);
206
211
  if (block.type === "table") return withoutOrphanTableMarkers(block, validCommentIds);
207
- if (block.type === "blockSdt") {
212
+ if (block.type === "blockSdt" || block.type === "blockCustomXml") {
208
213
  const content = withoutOrphanTableCellBlockMarkers(block.content, validCommentIds);
209
214
  return content ? {
210
215
  ...block,
@@ -40,7 +40,7 @@ const normalizeCommentReferences = ({ documentBody, comments, headers, footers,
40
40
  normalizeTable(block);
41
41
  return;
42
42
  }
43
- if (block.type !== "blockSdt") return;
43
+ if (block.type !== "blockSdt" && block.type !== "blockCustomXml") return;
44
44
  normalizeBlocks(block.content);
45
45
  };
46
46
  const normalizeBlocks = (blocks) => {
@@ -25,7 +25,7 @@ const eachParagraph = (blocks, visit) => {
25
25
  for (const row of block.rows ?? []) for (const cell of row.cells ?? []) eachParagraph(cell.content ?? [], visit);
26
26
  continue;
27
27
  }
28
- if (block.type !== "blockSdt") continue;
28
+ if (block.type !== "blockSdt" && block.type !== "blockCustomXml") continue;
29
29
  eachParagraph(block.content ?? [], visit);
30
30
  }
31
31
  };
@@ -42,6 +42,24 @@ const commentParentedReplies = (comments) => {
42
42
  const commentIds = new Set(comments.map((comment) => comment.id));
43
43
  return comments.filter((comment) => comment.parentId !== void 0 && commentIds.has(comment.parentId));
44
44
  };
45
+ /** Match the order fromProseDoc uses when several ranges share a boundary. */
46
+ const orderCoLocatedRanges = (content) => {
47
+ for (let start = 0; start < content.length;) {
48
+ const type = content[start]?.type;
49
+ if (type !== "commentRangeStart" && type !== "commentRangeEnd") {
50
+ start += 1;
51
+ continue;
52
+ }
53
+ let end = start + 1;
54
+ while (content[end]?.type === type) end += 1;
55
+ const ordered = content.slice(start, end).toSorted((left, right) => {
56
+ if ((left.type === "commentRangeStart" || left.type === "commentRangeEnd") && (right.type === "commentRangeStart" || right.type === "commentRangeEnd")) return left.id - right.id;
57
+ return 0;
58
+ });
59
+ content.splice(start, end - start, ...ordered);
60
+ start = end;
61
+ }
62
+ };
45
63
  const injectIntoParagraph = (paragraph, replyIdsByParent) => {
46
64
  const content = paragraph.content ?? [];
47
65
  if (!content.some((item) => (item.type === "commentRangeStart" || item.type === "commentRangeEnd" || item.type === "commentReference") && replyIdsByParent.has(item.id))) return 0;
@@ -68,6 +86,7 @@ const injectIntoParagraph = (paragraph, replyIdsByParent) => {
68
86
  injected += 1;
69
87
  }
70
88
  }
89
+ orderCoLocatedRanges(next);
71
90
  paragraph.content = next;
72
91
  return injected;
73
92
  };
@@ -1,7 +1,7 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
2
  import { DrawingSafetyClass } from "./imageRawXml.js";
3
3
  //#region src/docx/compatibility.d.ts
4
- type DocxCompatibilityReason = "opaqueDrawing";
4
+ type DocxCompatibilityReason = "opaqueDrawing" | "unsupportedAltChunk";
5
5
  type FolioDocxCompatibilityHost = "browser" | "server" | "unknown";
6
6
  type FolioDocxCompatibilityProfile = document_d_exports.DocxConformanceClass;
7
7
  type DocxCompatibilityContext = {
@@ -1,3 +1,4 @@
1
+ import { isAltChunkMarkup } from "./altChunk.js";
1
2
  import { DRAWING_SAFETY_CLASSES, classifyDrawingSafety } from "./imageRawXml.js";
2
3
  import { panic } from "better-result";
3
4
  import { DOCX_CONFORMANCE_CLASSES } from "@stll/docx-core/model";
@@ -24,17 +25,20 @@ const inspectDocxCompatibility = (doc, options = {}) => {
24
25
  const record = (drawing) => {
25
26
  drawings.push(drawing);
26
27
  if (drawing.class !== DRAWING_SAFETY_CLASSES.OPAQUE) return;
27
- const code = "opaqueDrawing";
28
- reasons.add(code);
29
- issues.push({
30
- code,
28
+ recordIssue({
29
+ code: "opaqueDrawing",
31
30
  location: drawing.location
32
31
  });
33
32
  };
33
+ const recordIssue = (issue) => {
34
+ reasons.add(issue.code);
35
+ issues.push(issue);
36
+ };
34
37
  inspectBlocks(doc.package.document.content, {
35
38
  part: { type: "document" },
36
39
  path: "package.document.content",
37
- record
40
+ record,
41
+ recordIssue
38
42
  });
39
43
  for (const [relationshipId, header] of doc.package.headers?.entries() ?? []) inspectHeaderFooter(header, {
40
44
  part: {
@@ -42,7 +46,8 @@ const inspectDocxCompatibility = (doc, options = {}) => {
42
46
  relationshipId
43
47
  },
44
48
  path: `package.headers.get(${JSON.stringify(relationshipId)}).content`,
45
- record
49
+ record,
50
+ recordIssue
46
51
  });
47
52
  for (const [relationshipId, footer] of doc.package.footers?.entries() ?? []) inspectHeaderFooter(footer, {
48
53
  part: {
@@ -50,7 +55,8 @@ const inspectDocxCompatibility = (doc, options = {}) => {
50
55
  relationshipId
51
56
  },
52
57
  path: `package.footers.get(${JSON.stringify(relationshipId)}).content`,
53
- record
58
+ record,
59
+ recordIssue
54
60
  });
55
61
  for (const footnote of doc.package.footnotes ?? []) inspectBlocks(footnote.content, {
56
62
  part: {
@@ -58,7 +64,8 @@ const inspectDocxCompatibility = (doc, options = {}) => {
58
64
  id: footnote.id
59
65
  },
60
66
  path: `package.footnotes[id=${footnote.id}].content`,
61
- record
67
+ record,
68
+ recordIssue
62
69
  });
63
70
  for (const endnote of doc.package.endnotes ?? []) inspectBlocks(endnote.content, {
64
71
  part: {
@@ -66,7 +73,8 @@ const inspectDocxCompatibility = (doc, options = {}) => {
66
73
  id: endnote.id
67
74
  },
68
75
  path: `package.endnotes[id=${endnote.id}].content`,
69
- record
76
+ record,
77
+ recordIssue
70
78
  });
71
79
  return {
72
80
  schemaVersion: 2,
@@ -86,7 +94,8 @@ function inspectBlocks(blocks, context) {
86
94
  ...block.paraId === void 0 ? {} : { blockId: block.paraId },
87
95
  part: context.part,
88
96
  path: `${blockPath}.content`,
89
- record: context.record
97
+ record: context.record,
98
+ recordIssue: context.recordIssue
90
99
  });
91
100
  continue;
92
101
  }
@@ -94,15 +103,27 @@ function inspectBlocks(blocks, context) {
94
103
  for (const [rowIndex, row] of block.rows.entries()) for (const [cellIndex, cell] of row.cells.entries()) inspectBlocks(cell.content, {
95
104
  part: context.part,
96
105
  path: `${blockPath}.rows[${rowIndex}].cells[${cellIndex}].content`,
97
- record: context.record
106
+ record: context.record,
107
+ recordIssue: context.recordIssue
108
+ });
109
+ continue;
110
+ }
111
+ if (block.type === "preservedBlock" && isAltChunkMarkup(block.xml)) {
112
+ context.recordIssue({
113
+ code: "unsupportedAltChunk",
114
+ location: {
115
+ part: context.part,
116
+ path: blockPath
117
+ }
98
118
  });
99
119
  continue;
100
120
  }
101
- if (block.type !== "blockSdt") continue;
121
+ if (block.type !== "blockSdt" && block.type !== "blockCustomXml") continue;
102
122
  inspectBlocks(block.content, {
103
123
  part: context.part,
104
124
  path: `${blockPath}.content`,
105
- record: context.record
125
+ record: context.record,
126
+ recordIssue: context.recordIssue
106
127
  });
107
128
  }
108
129
  }
@@ -28,7 +28,7 @@ declare const CONTAINER_CHILDREN: {
28
28
  readonly "w:comment": readonly ["altChunk", "bookmarkEnd", "bookmarkStart", "commentRangeEnd", "commentRangeStart", "customXml", "customXmlDelRangeEnd", "customXmlDelRangeStart", "customXmlInsRangeEnd", "customXmlInsRangeStart", "customXmlMoveFromRangeEnd", "customXmlMoveFromRangeStart", "customXmlMoveToRangeEnd", "customXmlMoveToRangeStart", "del", "ins", "moveFrom", "moveFromRangeEnd", "moveFromRangeStart", "moveTo", "moveToRangeEnd", "moveToRangeStart", "p", "permEnd", "permStart", "proofErr", "sdt", "tbl"];
29
29
  readonly "run-level-content": readonly ["bdo", "bookmarkEnd", "bookmarkStart", "commentRangeEnd", "commentRangeStart", "customXml", "customXmlDelRangeEnd", "customXmlDelRangeStart", "customXmlInsRangeEnd", "customXmlInsRangeStart", "customXmlMoveFromRangeEnd", "customXmlMoveFromRangeStart", "customXmlMoveToRangeEnd", "customXmlMoveToRangeStart", "customXmlPr", "del", "dir", "fldSimple", "hyperlink", "ins", "moveFrom", "moveFromRangeEnd", "moveFromRangeStart", "moveTo", "moveToRangeEnd", "moveToRangeStart", "pPr", "permEnd", "permStart", "proofErr", "r", "sdt", "smartTag", "smartTagPr", "subDoc"];
30
30
  readonly "table-content": readonly ["bookmarkEnd", "bookmarkStart", "commentRangeEnd", "commentRangeStart", "customXml", "customXmlDelRangeEnd", "customXmlDelRangeStart", "customXmlInsRangeEnd", "customXmlInsRangeStart", "customXmlMoveFromRangeEnd", "customXmlMoveFromRangeStart", "customXmlMoveToRangeEnd", "customXmlMoveToRangeStart", "customXmlPr", "del", "ins", "moveFrom", "moveFromRangeEnd", "moveFromRangeStart", "moveTo", "moveToRangeEnd", "moveToRangeStart", "permEnd", "permStart", "proofErr", "sdt", "tblGrid", "tblPr", "tr"];
31
- readonly "row-content": readonly ["bookmarkEnd", "bookmarkStart", "commentRangeEnd", "commentRangeStart", "customXml", "customXmlDelRangeEnd", "customXmlDelRangeStart", "customXmlInsRangeEnd", "customXmlInsRangeStart", "customXmlMoveFromRangeEnd", "customXmlMoveFromRangeStart", "customXmlMoveToRangeEnd", "customXmlMoveToRangeStart", "del", "ins", "moveFrom", "moveFromRangeEnd", "moveFromRangeStart", "moveTo", "moveToRangeEnd", "moveToRangeStart", "permEnd", "permStart", "proofErr", "sdt", "tblPrEx", "tc", "tr", "trPr"];
31
+ readonly "row-content": readonly ["bookmarkEnd", "bookmarkStart", "commentRangeEnd", "commentRangeStart", "customXml", "customXmlDelRangeEnd", "customXmlDelRangeStart", "customXmlInsRangeEnd", "customXmlInsRangeStart", "customXmlMoveFromRangeEnd", "customXmlMoveFromRangeStart", "customXmlMoveToRangeEnd", "customXmlMoveToRangeStart", "customXmlPr", "del", "ins", "moveFrom", "moveFromRangeEnd", "moveFromRangeStart", "moveTo", "moveToRangeEnd", "moveToRangeStart", "permEnd", "permStart", "proofErr", "sdt", "tblPrEx", "tc", "tr", "trPr"];
32
32
  readonly "w:fonts": readonly ["font"];
33
33
  readonly "w:font": readonly ["altName", "charset", "embedBold", "embedBoldItalic", "embedItalic", "embedRegular", "family", "notTrueType", "panose1", "pitch", "sig"];
34
34
  readonly "w:hyperlink": readonly ["bdo", "bookmarkEnd", "bookmarkStart", "commentRangeEnd", "commentRangeStart", "customXml", "customXmlDelRangeEnd", "customXmlDelRangeStart", "customXmlInsRangeEnd", "customXmlInsRangeStart", "customXmlMoveFromRangeEnd", "customXmlMoveFromRangeStart", "customXmlMoveToRangeEnd", "customXmlMoveToRangeStart", "del", "dir", "fldSimple", "hyperlink", "ins", "moveFrom", "moveFromRangeEnd", "moveFromRangeStart", "moveTo", "moveToRangeEnd", "moveToRangeStart", "permEnd", "permStart", "proofErr", "r", "sdt", "smartTag", "subDoc"];
@@ -125,6 +125,7 @@ const CONTAINER_CHILDREN = {
125
125
  "customXmlMoveFromRangeStart",
126
126
  "customXmlMoveToRangeEnd",
127
127
  "customXmlMoveToRangeStart",
128
+ "customXmlPr",
128
129
  "del",
129
130
  "ins",
130
131
  "moveFrom",
@@ -40,7 +40,7 @@ function extractAllTemplateVariables(content) {
40
40
  } else if (block.type === "table") {
41
41
  const tableVars = extractTableVariables(block);
42
42
  for (const v of tableVars) if (!variables.includes(v)) variables.push(v);
43
- } else if (block.type === "blockSdt") {
43
+ } else if (block.type === "blockSdt" || block.type === "blockCustomXml") {
44
44
  for (const v of extractAllTemplateVariables(block.content)) if (!variables.includes(v)) variables.push(v);
45
45
  }
46
46
  return variables;
@@ -56,7 +56,7 @@ function extractTableVariables(table) {
56
56
  } else if (cellContent.type === "table") {
57
57
  const nestedVars = extractTableVariables(cellContent);
58
58
  for (const v of nestedVars) if (!variables.includes(v)) variables.push(v);
59
- } else if (cellContent.type === "blockSdt") {
59
+ } else if (cellContent.type === "blockSdt" || cellContent.type === "blockCustomXml") {
60
60
  for (const v of extractAllTemplateVariables(cellContent.content)) if (!variables.includes(v)) variables.push(v);
61
61
  }
62
62
  return variables;
@@ -153,7 +153,7 @@ function parseDocumentBackground(documentEl, context) {
153
153
  function parseDocumentBody(xml, styles = null, theme = null, numbering = null, rels = null, media = null, context, previews = standalonePreviewLedger()) {
154
154
  const result = { content: [] };
155
155
  if (!xml) return result;
156
- const documentEl = (parseXml(xml).elements ?? []).find((el) => el.type === "element" && (el.name === "w:document" || el.name?.endsWith(":document")));
156
+ const documentEl = (parseXml(xml).elements ?? []).find((el) => el.type === "element" && getLocalName(el.name ?? "") === "document");
157
157
  if (!documentEl) return result;
158
158
  const background = parseDocumentBackground(documentEl, context);
159
159
  if (background !== void 0) result.background = background;
@@ -177,14 +177,14 @@ function getAllParagraphs(body) {
177
177
  const paragraphs = [];
178
178
  for (const block of body.content) if (block.type === "paragraph") paragraphs.push(block);
179
179
  else if (block.type === "table") paragraphs.push(...getTableParagraphs(block));
180
- else if (block.type === "blockSdt") paragraphs.push(...getParagraphsFromBlocks(block.content));
180
+ else if (block.type === "blockSdt" || block.type === "blockCustomXml") paragraphs.push(...getParagraphsFromBlocks(block.content));
181
181
  return paragraphs;
182
182
  }
183
183
  const getParagraphsFromBlocks = (blocks) => {
184
184
  const paragraphs = [];
185
185
  for (const block of blocks) if (block.type === "paragraph") paragraphs.push(block);
186
186
  else if (block.type === "table") paragraphs.push(...getTableParagraphs(block));
187
- else if (block.type === "blockSdt") paragraphs.push(...getParagraphsFromBlocks(block.content));
187
+ else if (block.type === "blockSdt" || block.type === "blockCustomXml") paragraphs.push(...getParagraphsFromBlocks(block.content));
188
188
  return paragraphs;
189
189
  };
190
190
  /**
@@ -194,7 +194,7 @@ function getTableParagraphs(table) {
194
194
  const paragraphs = [];
195
195
  for (const row of table.rows) for (const cell of row.cells) for (const content of cell.content) if (content.type === "paragraph") paragraphs.push(content);
196
196
  else if (content.type === "table") paragraphs.push(...getTableParagraphs(content));
197
- else if (content.type === "blockSdt") paragraphs.push(...getParagraphsFromBlocks(content.content));
197
+ else if (content.type === "blockSdt" || content.type === "blockCustomXml") paragraphs.push(...getParagraphsFromBlocks(content.content));
198
198
  return paragraphs;
199
199
  }
200
200
  /**
@@ -205,13 +205,13 @@ function getAllTables(body) {
205
205
  for (const block of body.content) if (block.type === "table") {
206
206
  tables.push(block);
207
207
  tables.push(...getNestedTables(block));
208
- } else if (block.type === "blockSdt") tables.push(...getTablesFromBlocks(block.content));
208
+ } else if (block.type === "blockSdt" || block.type === "blockCustomXml") tables.push(...getTablesFromBlocks(block.content));
209
209
  return tables;
210
210
  }
211
211
  const getTablesFromBlocks = (blocks) => {
212
212
  const tables = [];
213
213
  for (const block of blocks) if (block.type === "table") tables.push(block, ...getNestedTables(block));
214
- else if (block.type === "blockSdt") tables.push(...getTablesFromBlocks(block.content));
214
+ else if (block.type === "blockSdt" || block.type === "blockCustomXml") tables.push(...getTablesFromBlocks(block.content));
215
215
  return tables;
216
216
  };
217
217
  /**
@@ -222,7 +222,7 @@ function getNestedTables(table) {
222
222
  for (const row of table.rows) for (const cell of row.cells) for (const content of cell.content) if (content.type === "table") {
223
223
  tables.push(content);
224
224
  tables.push(...getNestedTables(content));
225
- } else if (content.type === "blockSdt") tables.push(...getTablesFromBlocks(content.content));
225
+ } else if (content.type === "blockSdt" || content.type === "blockCustomXml") tables.push(...getTablesFromBlocks(content.content));
226
226
  return tables;
227
227
  }
228
228
  /**
@@ -232,13 +232,13 @@ function getDocumentText(body) {
232
232
  const lines = [];
233
233
  for (const block of body.content) if (block.type === "paragraph") lines.push(getParagraphText(block));
234
234
  else if (block.type === "table") lines.push(getTableText(block));
235
- else if (block.type === "blockSdt") lines.push(getTextFromBlocks(block.content));
235
+ else if (block.type === "blockSdt" || block.type === "blockCustomXml") lines.push(getTextFromBlocks(block.content));
236
236
  return lines.join("\n");
237
237
  }
238
238
  const getTextFromBlocks = (blocks) => blocks.flatMap((block) => {
239
239
  if (block.type === "paragraph") return [getParagraphText(block)];
240
240
  if (block.type === "table") return [getTableText(block)];
241
- return block.type === "blockSdt" ? [getTextFromBlocks(block.content)] : [];
241
+ return block.type === "blockSdt" || block.type === "blockCustomXml" ? [getTextFromBlocks(block.content)] : [];
242
242
  }).join("\n");
243
243
  /**
244
244
  * Get plain text from a table
@@ -251,7 +251,7 @@ function getTableText(table) {
251
251
  const cellTexts = [];
252
252
  for (const content of cell.content) if (content.type === "paragraph") cellTexts.push(getParagraphText(content));
253
253
  else if (content.type === "table") cellTexts.push(getTableText(content));
254
- else if (content.type === "blockSdt") cellTexts.push(getTextFromBlocks(content.content));
254
+ else if (content.type === "blockSdt" || content.type === "blockCustomXml") cellTexts.push(getTextFromBlocks(content.content));
255
255
  rowTexts.push(cellTexts.join("\n"));
256
256
  }
257
257
  lines.push(rowTexts.join(" "));
@@ -1,5 +1,7 @@
1
1
  import { DocxParagraphSurfaces } from "./paragraphTraversal.js";
2
2
  //#region src/docx/drawingIdNormalization.d.ts
3
+ /** Drawing IDs are package-local identifiers, not image content. */
4
+ declare const drawingXmlWithoutIdentity: (xml: string) => string;
3
5
  declare const normalizeDrawingIds: (surfaces: DocxParagraphSurfaces) => void;
4
6
  //#endregion
5
- export { normalizeDrawingIds };
7
+ export { drawingXmlWithoutIdentity, normalizeDrawingIds };
@@ -22,6 +22,11 @@ const reassignRawDrawingId = ({ xml, id }) => {
22
22
  visit(root);
23
23
  return foundDocPr ? (root.elements ?? []).map(captureVerbatimXml).join("") : null;
24
24
  };
25
+ /** Drawing IDs are package-local identifiers, not image content. */
26
+ const drawingXmlWithoutIdentity = (xml) => reassignRawDrawingId({
27
+ xml,
28
+ id: "0"
29
+ }) ?? xml;
25
30
  const needsGeneratedId = ({ id }) => id === void 0 || id === "" || id === "0";
26
31
  const normalizeDrawingIds = (surfaces) => {
27
32
  const entries = [];
@@ -73,4 +78,4 @@ const normalizeDrawingIds = (surfaces) => {
73
78
  }
74
79
  };
75
80
  //#endregion
76
- export { normalizeDrawingIds };
81
+ export { drawingXmlWithoutIdentity, normalizeDrawingIds };