@usejunior/docx-core 0.19.1 → 0.21.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 (180) hide show
  1. package/README.md +12 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli/conformance-adapter.d.ts.map +1 -1
  4. package/dist/cli/conformance-adapter.js +0 -27
  5. package/dist/cli/conformance-adapter.js.map +1 -1
  6. package/dist/core-types.d.ts +1 -139
  7. package/dist/core-types.d.ts.map +1 -1
  8. package/dist/core-types.js +1 -3
  9. package/dist/core-types.js.map +1 -1
  10. package/dist/generation/compile.d.ts.map +1 -1
  11. package/dist/generation/compile.js +1 -3
  12. package/dist/generation/compile.js.map +1 -1
  13. package/dist/index.d.ts +5 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +13 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/integration/generation-probes.d.ts +36 -2
  18. package/dist/integration/generation-probes.d.ts.map +1 -1
  19. package/dist/integration/generation-probes.js +137 -15
  20. package/dist/integration/generation-probes.js.map +1 -1
  21. package/dist/integration/libreoffice-oracle.d.ts +3 -1
  22. package/dist/integration/libreoffice-oracle.d.ts.map +1 -1
  23. package/dist/integration/libreoffice-oracle.js +10 -4
  24. package/dist/integration/libreoffice-oracle.js.map +1 -1
  25. package/dist/integration/synthetic-docx-fixture.d.ts.map +1 -1
  26. package/dist/integration/synthetic-docx-fixture.js +8 -0
  27. package/dist/integration/synthetic-docx-fixture.js.map +1 -1
  28. package/dist/primitives/accept_ai_edits.js +14 -2
  29. package/dist/primitives/accept_ai_edits.js.map +1 -1
  30. package/dist/primitives/accept_changes.d.ts +6 -0
  31. package/dist/primitives/accept_changes.d.ts.map +1 -1
  32. package/dist/primitives/accept_changes.js +236 -62
  33. package/dist/primitives/accept_changes.js.map +1 -1
  34. package/dist/primitives/bookmarks.d.ts +8 -2
  35. package/dist/primitives/bookmarks.d.ts.map +1 -1
  36. package/dist/primitives/bookmarks.js +31 -7
  37. package/dist/primitives/bookmarks.js.map +1 -1
  38. package/dist/primitives/comments.d.ts +101 -5
  39. package/dist/primitives/comments.d.ts.map +1 -1
  40. package/dist/primitives/comments.js +356 -156
  41. package/dist/primitives/comments.js.map +1 -1
  42. package/dist/primitives/conformance.d.ts +42 -0
  43. package/dist/primitives/conformance.d.ts.map +1 -0
  44. package/dist/primitives/conformance.js +61 -0
  45. package/dist/primitives/conformance.js.map +1 -0
  46. package/dist/primitives/document.d.ts +145 -2
  47. package/dist/primitives/document.d.ts.map +1 -1
  48. package/dist/primitives/document.js +505 -27
  49. package/dist/primitives/document.js.map +1 -1
  50. package/dist/primitives/document_view-headings.d.ts +3 -1
  51. package/dist/primitives/document_view-headings.d.ts.map +1 -1
  52. package/dist/primitives/document_view-headings.js +5 -5
  53. package/dist/primitives/document_view-headings.js.map +1 -1
  54. package/dist/primitives/document_view.d.ts +2 -0
  55. package/dist/primitives/document_view.d.ts.map +1 -1
  56. package/dist/primitives/document_view.js +18 -4
  57. package/dist/primitives/document_view.js.map +1 -1
  58. package/dist/primitives/errors.d.ts +3 -2
  59. package/dist/primitives/errors.d.ts.map +1 -1
  60. package/dist/primitives/errors.js +3 -1
  61. package/dist/primitives/errors.js.map +1 -1
  62. package/dist/primitives/extract_revisions.d.ts +23 -6
  63. package/dist/primitives/extract_revisions.d.ts.map +1 -1
  64. package/dist/primitives/extract_revisions.js +208 -38
  65. package/dist/primitives/extract_revisions.js.map +1 -1
  66. package/dist/primitives/field_evaluation.d.ts +70 -0
  67. package/dist/primitives/field_evaluation.d.ts.map +1 -0
  68. package/dist/primitives/field_evaluation.js +462 -0
  69. package/dist/primitives/field_evaluation.js.map +1 -0
  70. package/dist/primitives/footnotes.d.ts +53 -3
  71. package/dist/primitives/footnotes.d.ts.map +1 -1
  72. package/dist/primitives/footnotes.js +228 -83
  73. package/dist/primitives/footnotes.js.map +1 -1
  74. package/dist/primitives/index.d.ts +12 -1
  75. package/dist/primitives/index.d.ts.map +1 -1
  76. package/dist/primitives/index.js +12 -1
  77. package/dist/primitives/index.js.map +1 -1
  78. package/dist/primitives/merge_runs.d.ts +3 -1
  79. package/dist/primitives/merge_runs.d.ts.map +1 -1
  80. package/dist/primitives/merge_runs.js +12 -2
  81. package/dist/primitives/merge_runs.js.map +1 -1
  82. package/dist/primitives/namespaces.d.ts +10 -2
  83. package/dist/primitives/namespaces.d.ts.map +1 -1
  84. package/dist/primitives/namespaces.js +11 -2
  85. package/dist/primitives/namespaces.js.map +1 -1
  86. package/dist/primitives/note_conversion.d.ts +11 -0
  87. package/dist/primitives/note_conversion.d.ts.map +1 -0
  88. package/dist/primitives/note_conversion.js +12 -0
  89. package/dist/primitives/note_conversion.js.map +1 -0
  90. package/dist/primitives/paragraph-index.d.ts +31 -0
  91. package/dist/primitives/paragraph-index.d.ts.map +1 -0
  92. package/dist/primitives/paragraph-index.js +140 -0
  93. package/dist/primitives/paragraph-index.js.map +1 -0
  94. package/dist/primitives/paragraph_merge_formatting.d.ts +24 -0
  95. package/dist/primitives/paragraph_merge_formatting.d.ts.map +1 -0
  96. package/dist/primitives/paragraph_merge_formatting.js +86 -0
  97. package/dist/primitives/paragraph_merge_formatting.js.map +1 -0
  98. package/dist/primitives/paragraph_numbering.d.ts +40 -0
  99. package/dist/primitives/paragraph_numbering.d.ts.map +1 -0
  100. package/dist/primitives/paragraph_numbering.js +198 -0
  101. package/dist/primitives/paragraph_numbering.js.map +1 -0
  102. package/dist/primitives/paragraph_structure.d.ts +19 -0
  103. package/dist/primitives/paragraph_structure.d.ts.map +1 -0
  104. package/dist/primitives/paragraph_structure.js +66 -0
  105. package/dist/primitives/paragraph_structure.js.map +1 -0
  106. package/dist/primitives/reject_changes.d.ts +6 -0
  107. package/dist/primitives/reject_changes.d.ts.map +1 -1
  108. package/dist/primitives/reject_changes.js +278 -68
  109. package/dist/primitives/reject_changes.js.map +1 -1
  110. package/dist/primitives/relationships.d.ts +22 -0
  111. package/dist/primitives/relationships.d.ts.map +1 -1
  112. package/dist/primitives/relationships.js +87 -0
  113. package/dist/primitives/relationships.js.map +1 -1
  114. package/dist/primitives/revision-parts.d.ts +15 -0
  115. package/dist/primitives/revision-parts.d.ts.map +1 -1
  116. package/dist/primitives/revision-parts.js +33 -1
  117. package/dist/primitives/revision-parts.js.map +1 -1
  118. package/dist/primitives/sectPrAudit.d.ts.map +1 -1
  119. package/dist/primitives/sectPrAudit.js +10 -1
  120. package/dist/primitives/sectPrAudit.js.map +1 -1
  121. package/dist/primitives/sections.d.ts +135 -0
  122. package/dist/primitives/sections.d.ts.map +1 -0
  123. package/dist/primitives/sections.js +644 -0
  124. package/dist/primitives/sections.js.map +1 -0
  125. package/dist/primitives/styles.d.ts +61 -0
  126. package/dist/primitives/styles.d.ts.map +1 -1
  127. package/dist/primitives/styles.js +207 -25
  128. package/dist/primitives/styles.js.map +1 -1
  129. package/dist/primitives/symbol_run_content.d.ts +42 -0
  130. package/dist/primitives/symbol_run_content.d.ts.map +1 -0
  131. package/dist/primitives/symbol_run_content.js +79 -0
  132. package/dist/primitives/symbol_run_content.js.map +1 -0
  133. package/dist/primitives/table_cells.d.ts +49 -0
  134. package/dist/primitives/table_cells.d.ts.map +1 -0
  135. package/dist/primitives/table_cells.js +149 -0
  136. package/dist/primitives/table_cells.js.map +1 -0
  137. package/dist/primitives/table_columns.d.ts +50 -0
  138. package/dist/primitives/table_columns.d.ts.map +1 -0
  139. package/dist/primitives/table_columns.js +138 -0
  140. package/dist/primitives/table_columns.js.map +1 -0
  141. package/dist/primitives/table_edit_common.d.ts +39 -0
  142. package/dist/primitives/table_edit_common.d.ts.map +1 -0
  143. package/dist/primitives/table_edit_common.js +163 -0
  144. package/dist/primitives/table_edit_common.js.map +1 -0
  145. package/dist/primitives/table_occupancy.d.ts +39 -0
  146. package/dist/primitives/table_occupancy.d.ts.map +1 -0
  147. package/dist/primitives/table_occupancy.js +145 -0
  148. package/dist/primitives/table_occupancy.js.map +1 -0
  149. package/dist/primitives/table_rows.d.ts +56 -0
  150. package/dist/primitives/table_rows.d.ts.map +1 -0
  151. package/dist/primitives/table_rows.js +390 -0
  152. package/dist/primitives/table_rows.js.map +1 -0
  153. package/dist/primitives/text.d.ts +69 -1
  154. package/dist/primitives/text.d.ts.map +1 -1
  155. package/dist/primitives/text.js +592 -102
  156. package/dist/primitives/text.js.map +1 -1
  157. package/dist/primitives/track-changes-emitter.d.ts +23 -0
  158. package/dist/primitives/track-changes-emitter.d.ts.map +1 -1
  159. package/dist/primitives/track-changes-emitter.js +64 -1
  160. package/dist/primitives/track-changes-emitter.js.map +1 -1
  161. package/dist/primitives/validate_document.d.ts.map +1 -1
  162. package/dist/primitives/validate_document.js +22 -1
  163. package/dist/primitives/validate_document.js.map +1 -1
  164. package/dist/primitives/zip.d.ts +22 -1
  165. package/dist/primitives/zip.d.ts.map +1 -1
  166. package/dist/primitives/zip.js +47 -8
  167. package/dist/primitives/zip.js.map +1 -1
  168. package/dist/shared/docx/DocxArchive.d.ts +6 -2
  169. package/dist/shared/docx/DocxArchive.d.ts.map +1 -1
  170. package/dist/shared/docx/DocxArchive.js +17 -4
  171. package/dist/shared/docx/DocxArchive.js.map +1 -1
  172. package/dist/shared/field-semantics.d.ts +26 -0
  173. package/dist/shared/field-semantics.d.ts.map +1 -0
  174. package/dist/shared/field-semantics.js +232 -0
  175. package/dist/shared/field-semantics.js.map +1 -0
  176. package/dist/shared/field-structure.d.ts +10 -1
  177. package/dist/shared/field-structure.d.ts.map +1 -1
  178. package/dist/shared/field-structure.js +31 -12
  179. package/dist/shared/field-structure.js.map +1 -1
  180. package/package.json +4 -5
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Text projection of `<w:sym>` run content.
3
+ *
4
+ * A symbol glyph has two legal spellings in WordprocessingML and Word renders
5
+ * them identically:
6
+ *
7
+ * 1. `<w:sym w:font="Wingdings" w:char="F0A8"/>`, and
8
+ * 2. the same codepoint written literally inside a `<w:t>`, with the symbol
9
+ * font carried on the run's `<w:rFonts>`.
10
+ *
11
+ * Any text projection that walks `w:t`/`w:delText` alone therefore sees a
12
+ * document that *lost* a symbol and a document that *kept* it as the same
13
+ * string, and sees the two spellings of one glyph as different strings. This
14
+ * module is the single place the projection resolves spelling (1) into the
15
+ * characters spelling (2) would have contributed.
16
+ *
17
+ * The font is deliberately **not** part of the projected value. The projections
18
+ * that consume this are text projections: they already exclude `w:rFonts`, so
19
+ * folding `w:sym/@w:font` in would make the same font signal visible for one
20
+ * spelling of a glyph and invisible for the other, and would make the two
21
+ * spellings compare unequal by construction — the exact false difference this
22
+ * resolution exists to remove. A font-only change is a formatting change and
23
+ * belongs to the formatting-fidelity surface, not the round-trip text gate;
24
+ * that residual is tracked separately.
25
+ *
26
+ * @conformance ECMA-376 edition 5, Part 1 § 17.3.3.30
27
+ * @see https://github.com/UseJunior/safe-docx/issues/793
28
+ * @see https://github.com/UseJunior/safe-docx/issues/799
29
+ */
30
+ import { OOXML } from './namespaces.js';
31
+ /** Local name of the symbol-character run-content element. */
32
+ export const SYM_LOCAL_NAME = 'sym';
33
+ /**
34
+ * `w:sym/@w:char` is `ST_ShortHexNumber` — `xsd:hexBinary` restricted to
35
+ * `length="2"`, i.e. exactly two bytes, four hexadecimal digits. Every legal
36
+ * value is therefore a BMP codepoint and `String.fromCharCode` is total over
37
+ * the domain. Four digits exactly: `A` and `ABC` are outside the lexical space
38
+ * and must not be read as characters.
39
+ */
40
+ const SHORT_HEX_NUMBER = /^[0-9A-Fa-f]{4}$/u;
41
+ /**
42
+ * Projection identity for a `w:sym` whose `@w:char` is absent or outside
43
+ * `ST_ShortHexNumber`. Both `CT_Sym` attributes are optional in the vendored
44
+ * schema, so such an element is not schema-invalid — it is semantically
45
+ * unresolvable, and it is still *content*. Projecting nothing would reopen the
46
+ * blindness this module closes.
47
+ *
48
+ * It is a framed token rather than a character (U+FFFD was the obvious choice
49
+ * and is wrong: a document may author U+FFFD literally, and an unresolvable
50
+ * symbol would then compare equal to that text). The framing follows the
51
+ * `__safe_docx_pageref__|` convention already used for stable comparison
52
+ * identities in `docx-compare`.
53
+ */
54
+ const UNRESOLVED_SYMBOL_IDENTITY = '__safe_docx_sym__|unresolved';
55
+ function isSymElement(element) {
56
+ // The namespace check alone is sufficient, and a qualified-name fallback
57
+ // would be dead code: `parseXml` rejects an undeclared prefix outright
58
+ // (`NamespaceError: prefix is non-null and namespace is null`), so nothing
59
+ // reaching this function can be named `w:sym` with a null namespace.
60
+ return element.namespaceURI === OOXML.W_NS && element.localName === SYM_LOCAL_NAME;
61
+ }
62
+ /**
63
+ * Project a `<w:sym>` element to the text it contributes, or `undefined` when
64
+ * `element` is not a `w:sym`.
65
+ *
66
+ * For a resolvable `@w:char` the result is exactly the character the glyph
67
+ * stands for — what it would have contributed had it been spelled as literal
68
+ * `w:t` content. Otherwise it is a framed, projection-only identity that keeps
69
+ * the element's presence visible without colliding with authored text.
70
+ */
71
+ export function projectSymbolRun(element) {
72
+ if (!isSymElement(element))
73
+ return undefined;
74
+ const raw = element.getAttributeNS(OOXML.W_NS, 'char') ?? element.getAttribute('w:char');
75
+ if (raw === null || !SHORT_HEX_NUMBER.test(raw))
76
+ return UNRESOLVED_SYMBOL_IDENTITY;
77
+ return String.fromCharCode(Number.parseInt(raw, 16));
78
+ }
79
+ //# sourceMappingURL=symbol_run_content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol_run_content.js","sourceRoot":"","sources":["../../src/primitives/symbol_run_content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAE7C;;;;;;;;;;;;GAYG;AACH,MAAM,0BAA0B,GAAG,8BAA8B,CAAC;AAElE,SAAS,YAAY,CAAC,OAAgB;IACpC,yEAAyE;IACzE,uEAAuE;IACvE,2EAA2E;IAC3E,qEAAqE;IACrE,OAAO,OAAO,CAAC,YAAY,KAAK,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,SAAS,KAAK,cAAc,CAAC;AACrF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,GAAG,GACP,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/E,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,0BAA0B,CAAC;IACnF,OAAO,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type BookmarkReservation } from './bookmarks.js';
2
+ import type { RevisionContext } from './track-changes-emitter.js';
3
+ export type SplitTableCellParams = {
4
+ anchorParagraphId: string;
5
+ /** Boundary before this zero-based logical grid column. */
6
+ splitColumnIndex: number;
7
+ existingSide: 'left' | 'right';
8
+ newCellText: string;
9
+ };
10
+ export type AbsorbTableCellParams = {
11
+ anchorParagraphId: string;
12
+ /** Existing adjacent physical cell that retains its content and absorbs the target. */
13
+ absorbSide: 'left' | 'right';
14
+ };
15
+ export type TableCellInterval = {
16
+ start: number;
17
+ end: number;
18
+ };
19
+ export type SplitTableCellResult = {
20
+ tableIndex: number;
21
+ rowIndex: number;
22
+ retained: TableCellInterval;
23
+ created: TableCellInterval;
24
+ newParagraphId: string;
25
+ };
26
+ export type AbsorbTableCellResult = {
27
+ tableIndex: number;
28
+ rowIndex: number;
29
+ absorbedInto: TableCellInterval;
30
+ };
31
+ /**
32
+ * Split a horizontal cell at an interior grid boundary without changing the table grid.
33
+ *
34
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.48
35
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.17
36
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.71
37
+ * @see #1042
38
+ */
39
+ export declare function splitTableCell(doc: Document, params: SplitTableCellParams, ctx?: RevisionContext, reservation?: BookmarkReservation): SplitTableCellResult;
40
+ /**
41
+ * Absorb and discard a physical cell into an adjacent same-row sibling. The target content is lost.
42
+ *
43
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.48
44
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.17
45
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.71
46
+ * @see #1042
47
+ */
48
+ export declare function absorbTableCell(doc: Document, params: AbsorbTableCellParams, ctx?: RevisionContext): AbsorbTableCellResult;
49
+ //# sourceMappingURL=table_cells.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table_cells.d.ts","sourceRoot":"","sources":["../../src/primitives/table_cells.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AASzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,MAAM,MAAM,oBAAoB,GAAG;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uFAAuF;IACvF,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B,CAAC;AACF,MAAM,MAAM,iBAAiB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/D,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACrC,QAAQ,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAC;IACxD,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,iBAAiB,CAAC;CACvE,CAAC;AAkDF;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,GAAG,CAAC,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,CAsC1J;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,qBAAqB,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,qBAAqB,CAmC1H"}
@@ -0,0 +1,149 @@
1
+ import { insertSingleParagraphBookmark } from './bookmarks.js';
2
+ import { getDirectChildrenByName } from './dom-helpers.js';
3
+ import { applyWidthUpdates, createTableCell, failTableEdit, hasPendingRevision, plannedCellWidthChange, plannedWidthChange, setCellSpan, setTableAttr, tableAttr, tableEditTarget, } from './table_edit_common.js';
4
+ import { inventoryTableOccupancy } from './table_occupancy.js';
5
+ import { removeOrphanedRangeEndpointsForSubtree } from './table_rows.js';
6
+ function detail(anchorId, tableIndex, row, cell, columnIndex) {
7
+ return { anchorId, tableIndex, rowIndex: row.rowIndex, cellIndex: cell.cellIndex, columnIndex, feature: 'argument' };
8
+ }
9
+ function rejectPendingRow(row, info) {
10
+ const trPr = getDirectChildrenByName(row.element, 'trPr')[0];
11
+ if (trPr && (getDirectChildrenByName(trPr, 'ins').length || getDirectChildrenByName(trPr, 'del').length)) {
12
+ failTableEdit('UNSUPPORTED_EDIT', 'Pending row insertion or deletion is unsupported for cell edits', { ...info, feature: 'topologyRevision' });
13
+ }
14
+ }
15
+ function gridWidth(columns, start, end, info) {
16
+ let width = 0;
17
+ for (let index = start; index < end; index++) {
18
+ const raw = columns[index] ? tableAttr(columns[index], 'w') : null;
19
+ if (raw === null || !/^\d+$/.test(raw)) {
20
+ failTableEdit('UNSUPPORTED_EDIT', 'Affected grid columns need integer twip widths', { ...info, feature: 'width' });
21
+ }
22
+ const next = Number(raw);
23
+ if (!Number.isSafeInteger(next) || next <= 0 || !Number.isSafeInteger(width + next)) {
24
+ failTableEdit('UNSUPPORTED_EDIT', 'Affected grid width is outside the supported range', { ...info, feature: 'width' });
25
+ }
26
+ width += next;
27
+ }
28
+ return width;
29
+ }
30
+ function cellPreferredWidth(cell, info) {
31
+ const tcPr = getDirectChildrenByName(cell, 'tcPr')[0];
32
+ const widths = tcPr ? getDirectChildrenByName(tcPr, 'tcW') : [];
33
+ if (widths.length > 1) {
34
+ failTableEdit('UNSUPPORTED_EDIT', 'Duplicate cell preferred widths are unsupported', { ...info, feature: 'width' });
35
+ }
36
+ return widths[0];
37
+ }
38
+ function checkedSplitWidth(cell, expected, info) {
39
+ const preferred = cellPreferredWidth(cell.element, info);
40
+ if (!preferred)
41
+ return undefined;
42
+ const type = tableAttr(preferred, 'type');
43
+ if (type === 'pct')
44
+ failTableEdit('UNSUPPORTED_EDIT', 'Percentage cell width cannot be split without an allocation rule', { ...info, feature: 'width' });
45
+ const update = plannedWidthChange(preferred, 0, info);
46
+ if (update && update.next !== expected) {
47
+ failTableEdit('UNSUPPORTED_EDIT', 'Preferred cell width does not match its grid interval', { ...info, feature: 'width' });
48
+ }
49
+ return update?.element;
50
+ }
51
+ /**
52
+ * Split a horizontal cell at an interior grid boundary without changing the table grid.
53
+ *
54
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.48
55
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.17
56
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.71
57
+ * @see #1042
58
+ */
59
+ export function splitTableCell(doc, params, ctx, reservation) {
60
+ const { anchorParagraphId: anchorId, splitColumnIndex: boundary, existingSide, newCellText } = params;
61
+ const initial = { anchorId, tableIndex: -1, rowIndex: -1, columnIndex: boundary, feature: 'argument' };
62
+ if (ctx)
63
+ failTableEdit('UNSUPPORTED_EDIT', 'Tracked cell edits are not supported', { ...initial, feature: 'revisionContext' });
64
+ const shape = tableEditTarget(doc, anchorId, boundary, 'cell');
65
+ const { anchorRow: row, anchorCell: cell } = shape;
66
+ const info = detail(anchorId, shape.tableIndex, row, cell, boundary);
67
+ rejectPendingRow(row, info);
68
+ if (!Number.isSafeInteger(boundary) || boundary <= cell.start || boundary >= cell.end) {
69
+ failTableEdit('INVALID_ARGUMENT', 'Split boundary must be strictly inside the target cell interval', { ...info, feature: 'splitColumnIndex' });
70
+ }
71
+ if (existingSide !== 'left' && existingSide !== 'right') {
72
+ failTableEdit('INVALID_ARGUMENT', 'existingSide must be left or right', { ...info, feature: 'existingSide' });
73
+ }
74
+ if (typeof newCellText !== 'string') {
75
+ failTableEdit('INVALID_ARGUMENT', 'newCellText must be a string', { ...info, feature: 'newCellText' });
76
+ }
77
+ if (/[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD\u{10000}-\u{10FFFF}]/u.test(newCellText)) {
78
+ failTableEdit('INVALID_ARGUMENT', 'newCellText contains a character forbidden by XML 1.0', { ...info, feature: 'newCellText' });
79
+ }
80
+ const leftWidth = gridWidth(shape.columns, cell.start, boundary, info);
81
+ const rightWidth = gridWidth(shape.columns, boundary, cell.end, info);
82
+ const originalWidth = checkedSplitWidth(cell, leftWidth + rightWidth, info);
83
+ const retained = existingSide === 'left'
84
+ ? { start: cell.start, end: boundary } : { start: boundary, end: cell.end };
85
+ const created = existingSide === 'left'
86
+ ? { start: boundary, end: cell.end } : { start: cell.start, end: boundary };
87
+ const retainedWidth = existingSide === 'left' ? leftWidth : rightWidth;
88
+ const createdWidth = existingSide === 'left' ? rightWidth : leftWidth;
89
+ const newCell = createTableCell(doc, cell.element, newCellText, createdWidth);
90
+ if (existingSide === 'left')
91
+ row.element.insertBefore(newCell.cell, cell.element.nextSibling);
92
+ else
93
+ row.element.insertBefore(newCell.cell, cell.element);
94
+ setCellSpan(cell, retained.end - retained.start);
95
+ setCellSpan({ element: newCell.cell }, created.end - created.start);
96
+ if (originalWidth)
97
+ setTableAttr(originalWidth, 'w', retainedWidth);
98
+ inventoryTableOccupancy(shape.table);
99
+ const newParagraphId = insertSingleParagraphBookmark(doc, newCell.paragraph, reservation);
100
+ return { tableIndex: shape.tableIndex, rowIndex: row.rowIndex, retained, created, newParagraphId };
101
+ }
102
+ /**
103
+ * Absorb and discard a physical cell into an adjacent same-row sibling. The target content is lost.
104
+ *
105
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.48
106
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.17
107
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.71
108
+ * @see #1042
109
+ */
110
+ export function absorbTableCell(doc, params, ctx) {
111
+ const { anchorParagraphId: anchorId, absorbSide } = params;
112
+ const initial = { anchorId, tableIndex: -1, rowIndex: -1, columnIndex: -1, feature: 'argument' };
113
+ if (ctx)
114
+ failTableEdit('UNSUPPORTED_EDIT', 'Tracked cell edits are not supported', { ...initial, feature: 'revisionContext' });
115
+ const shape = tableEditTarget(doc, anchorId, -1, 'cell');
116
+ const { anchorRow: row, anchorCell: cell } = shape;
117
+ const info = detail(anchorId, shape.tableIndex, row, cell, cell.start);
118
+ rejectPendingRow(row, info);
119
+ if (absorbSide !== 'left' && absorbSide !== 'right') {
120
+ failTableEdit('INVALID_ARGUMENT', 'absorbSide must be left or right', { ...info, feature: 'absorbSide' });
121
+ }
122
+ if (row.cells.length === 1)
123
+ failTableEdit('INVALID_ARGUMENT', 'Cannot remove the final physical cell', { ...info, feature: 'lastCell' });
124
+ const sibling = row.cells[cell.cellIndex + (absorbSide === 'left' ? -1 : 1)];
125
+ if (!sibling || (absorbSide === 'left' ? sibling.end !== cell.start : sibling.start !== cell.end)) {
126
+ failTableEdit('INVALID_ARGUMENT', 'No adjacent physical cell on the requested side', { ...info, feature: 'absorbSide' });
127
+ }
128
+ if (hasPendingRevision(cell.element)) {
129
+ failTableEdit('UNSUPPORTED_EDIT', 'Cannot discard pending revisions inside the removed cell', { ...info, feature: 'contentRevision' });
130
+ }
131
+ const removedWidth = gridWidth(shape.columns, cell.start, cell.end, info);
132
+ gridWidth(shape.columns, sibling.start, sibling.end, info);
133
+ const removedPreferred = cellPreferredWidth(cell.element, info);
134
+ if (removedPreferred)
135
+ plannedWidthChange(removedPreferred, 0, info);
136
+ const siblingPreferred = cellPreferredWidth(sibling.element, info);
137
+ if (siblingPreferred && tableAttr(siblingPreferred, 'type') === 'pct') {
138
+ failTableEdit('UNSUPPORTED_EDIT', 'Percentage width on the absorbing cell is ambiguous', { ...info, feature: 'width' });
139
+ }
140
+ const widthUpdate = plannedCellWidthChange(sibling.element, removedWidth, info);
141
+ const absorbedInto = { start: Math.min(cell.start, sibling.start), end: Math.max(cell.end, sibling.end) };
142
+ removeOrphanedRangeEndpointsForSubtree(doc.documentElement, cell.element);
143
+ row.element.removeChild(cell.element);
144
+ applyWidthUpdates([widthUpdate]);
145
+ setCellSpan(sibling, absorbedInto.end - absorbedInto.start);
146
+ inventoryTableOccupancy(shape.table);
147
+ return { tableIndex: shape.tableIndex, rowIndex: row.rowIndex, absorbedInto };
148
+ }
149
+ //# sourceMappingURL=table_cells.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table_cells.js","sourceRoot":"","sources":["../../src/primitives/table_cells.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type BookmarkReservation } from './bookmarks.js';
2
+ import { type TableEditDetail } from './table_edit_common.js';
3
+ import type { RevisionContext } from './track-changes-emitter.js';
4
+ export type ColumnInsertRowAction = {
5
+ kind: 'cell';
6
+ text: string;
7
+ } | {
8
+ kind: 'growCell';
9
+ side: 'left' | 'right';
10
+ };
11
+ export type InsertTableColumnParams = {
12
+ anchorParagraphId: string;
13
+ columnIndex: number;
14
+ widthTwips: number;
15
+ rowActions: ColumnInsertRowAction[];
16
+ };
17
+ export type DeleteTableColumnParams = {
18
+ anchorParagraphId: string;
19
+ columnIndex: number;
20
+ };
21
+ export type InsertTableColumnResult = {
22
+ gridColumns: number;
23
+ cellParagraphIds: string[];
24
+ };
25
+ export type DeleteTableColumnResult = {
26
+ gridColumns: number;
27
+ deleted: true;
28
+ };
29
+ export type TableColumnEditDetail = TableEditDetail;
30
+ /**
31
+ * Insert a clean logical table-grid column, leaving source XML untouched on failure.
32
+ *
33
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.48
34
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.16
35
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.17
36
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.71
37
+ * @see #1041
38
+ */
39
+ export declare function insertTableColumn(doc: Document, params: InsertTableColumnParams, ctx?: RevisionContext, reservation?: BookmarkReservation): InsertTableColumnResult;
40
+ /**
41
+ * Delete a clean logical table-grid column, removing width-one physical cells.
42
+ *
43
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.48
44
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.16
45
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.17
46
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.71
47
+ * @see #1041
48
+ */
49
+ export declare function deleteTableColumn(doc: Document, params: DeleteTableColumnParams, ctx?: RevisionContext): DeleteTableColumnResult;
50
+ //# sourceMappingURL=table_columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table_columns.d.ts","sourceRoot":"","sources":["../../src/primitives/table_columns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGzF,OAAO,EAWL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAClH,MAAM,MAAM,uBAAuB,GAAG;IACpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,qBAAqB,EAAE,CAAC;CACrC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AACzF,MAAM,MAAM,uBAAuB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAC1F,MAAM,MAAM,uBAAuB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC;AAC7E,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAEpD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAuB,EAAE,GAAG,CAAC,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,mBAAmB,GAAG,uBAAuB,CAuDnK;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAuB,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,uBAAuB,CAgDhI"}
@@ -0,0 +1,138 @@
1
+ import { insertSingleParagraphBookmark } from './bookmarks.js';
2
+ import { createWmlElement } from './dom-helpers.js';
3
+ import { inventoryTableOccupancy } from './table_occupancy.js';
4
+ import { applyWidthUpdates, createTableCell, failTableEdit as fail, hasPendingRevision, plannedCellWidthChange, plannedTableWidthChange, setCellSpan, setTableAttr as setAttr, tableAttr as attr, tableEditTarget as target, } from './table_edit_common.js';
5
+ import { removeOrphanedRangeEndpointsForSubtree } from './table_rows.js';
6
+ /**
7
+ * Insert a clean logical table-grid column, leaving source XML untouched on failure.
8
+ *
9
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.48
10
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.16
11
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.17
12
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.71
13
+ * @see #1041
14
+ */
15
+ export function insertTableColumn(doc, params, ctx, reservation) {
16
+ const { anchorParagraphId: anchorId, columnIndex, widthTwips: width, rowActions } = params;
17
+ const initial = { anchorId, tableIndex: -1, rowIndex: -1, columnIndex, feature: 'argument' };
18
+ if (ctx)
19
+ fail('UNSUPPORTED_EDIT', 'Tracked column edits are not supported', { ...initial, feature: 'revisionContext' });
20
+ const shape = target(doc, anchorId, columnIndex);
21
+ if (!Number.isSafeInteger(columnIndex) || columnIndex < 0 || columnIndex > shape.columns.length) {
22
+ fail('INVALID_ARGUMENT', 'Column boundary is outside the table grid', initial);
23
+ }
24
+ if (!Number.isSafeInteger(width) || width <= 0)
25
+ fail('INVALID_ARGUMENT', 'widthTwips must be a positive integer', { ...initial, feature: 'width' });
26
+ if (!Array.isArray(rowActions) || rowActions.length !== shape.rows.length) {
27
+ fail('INVALID_ARGUMENT', 'One row action is required per physical row', { ...initial, feature: 'rowActions' });
28
+ }
29
+ const plans = [];
30
+ for (const row of shape.rows) {
31
+ const action = rowActions[row.rowIndex];
32
+ const info = { ...initial, tableIndex: shape.tableIndex, rowIndex: row.rowIndex, feature: 'rowAction' };
33
+ if (!action || !['cell', 'growCell'].includes(action.kind))
34
+ fail('INVALID_ARGUMENT', 'Unsupported row action', info);
35
+ if (action.kind === 'growCell') {
36
+ if (!['left', 'right'].includes(action.side))
37
+ fail('INVALID_ARGUMENT', 'Invalid growCell side', info);
38
+ const owner = action.side === 'left'
39
+ ? row.cells.find((cell) => cell.start < columnIndex && cell.end >= columnIndex)
40
+ : row.cells.find((cell) => cell.start <= columnIndex && cell.end > columnIndex);
41
+ if (!owner)
42
+ fail('INVALID_ARGUMENT', 'No cell on requested side of column boundary', info);
43
+ const widthUpdate = plannedCellWidthChange(owner.element, width, { ...info, cellIndex: owner.cellIndex });
44
+ plans.push({ kind: 'growCell', owner, widthUpdate });
45
+ }
46
+ else {
47
+ if (typeof action.text !== 'string')
48
+ fail('INVALID_ARGUMENT', 'Cell text must be a string', info);
49
+ const next = row.cells.find((cell) => cell.start === columnIndex);
50
+ if (!next && columnIndex !== shape.columns.length)
51
+ fail('INVALID_ARGUMENT', 'Cannot insert a cell inside a horizontal span', info);
52
+ const source = next?.element ?? row.cells.at(-1).element;
53
+ plans.push({ kind: 'cell', row, next, source, text: action.text });
54
+ }
55
+ }
56
+ const tableWidthUpdate = plannedTableWidthChange(shape.table, width, { ...initial, tableIndex: shape.tableIndex });
57
+ const newParagraphs = [];
58
+ for (const plan of plans) {
59
+ if (plan.kind === 'growCell') {
60
+ applyWidthUpdates([plan.widthUpdate]);
61
+ setCellSpan(plan.owner, plan.owner.end - plan.owner.start + 1);
62
+ }
63
+ else {
64
+ const created = createTableCell(doc, plan.source, plan.text, width);
65
+ plan.row.element.insertBefore(created.cell, plan.next?.element ?? null);
66
+ newParagraphs.push(created.paragraph);
67
+ }
68
+ }
69
+ applyWidthUpdates([tableWidthUpdate]);
70
+ const gridCol = createWmlElement(doc, 'gridCol');
71
+ setAttr(gridCol, 'w', width);
72
+ shape.grid.insertBefore(gridCol, shape.columns[columnIndex] ?? null);
73
+ inventoryTableOccupancy(shape.table);
74
+ const cellParagraphIds = newParagraphs.map((paragraph) => insertSingleParagraphBookmark(doc, paragraph, reservation));
75
+ return { gridColumns: shape.columns.length + 1, cellParagraphIds };
76
+ }
77
+ /**
78
+ * Delete a clean logical table-grid column, removing width-one physical cells.
79
+ *
80
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.48
81
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.16
82
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.17
83
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.71
84
+ * @see #1041
85
+ */
86
+ export function deleteTableColumn(doc, params, ctx) {
87
+ const { anchorParagraphId: anchorId, columnIndex } = params;
88
+ const initial = { anchorId, tableIndex: -1, rowIndex: -1, columnIndex, feature: 'argument' };
89
+ if (ctx)
90
+ fail('UNSUPPORTED_EDIT', 'Tracked column edits are not supported', { ...initial, feature: 'revisionContext' });
91
+ const shape = target(doc, anchorId, columnIndex);
92
+ if (!Number.isSafeInteger(columnIndex) || columnIndex < 0 || columnIndex >= shape.columns.length) {
93
+ fail('INVALID_ARGUMENT', 'Column is outside the table grid', initial);
94
+ }
95
+ if (shape.columns.length === 1)
96
+ fail('INVALID_ARGUMENT', 'Cannot remove the final table column', { ...initial, feature: 'lastColumn' });
97
+ const rawWidth = attr(shape.columns[columnIndex], 'w');
98
+ if (rawWidth === null || !/^\d+$/.test(rawWidth) || !Number.isSafeInteger(Number(rawWidth))) {
99
+ fail('UNSUPPORTED_EDIT', 'Deleted grid column needs an integer twip width', { ...initial, feature: 'width' });
100
+ }
101
+ const width = Number(rawWidth);
102
+ const plans = [];
103
+ for (const row of shape.rows) {
104
+ const owner = row.slots[columnIndex];
105
+ if (!owner)
106
+ fail('UNSUPPORTED_EDIT', 'Missing physical cell at column', { ...initial, rowIndex: row.rowIndex, feature: 'occupancy' });
107
+ const info = { ...initial, tableIndex: shape.tableIndex, rowIndex: row.rowIndex, cellIndex: owner.cellIndex };
108
+ const span = owner.end - owner.start;
109
+ if (span === 1) {
110
+ if (row.cells.length === 1)
111
+ fail('INVALID_ARGUMENT', 'Deleting this column would leave a row empty', { ...info, feature: 'lastCell' });
112
+ if (hasPendingRevision(owner.element)) {
113
+ fail('UNSUPPORTED_EDIT', 'Cannot discard pending revisions inside a removed cell', { ...info, feature: 'contentRevision' });
114
+ }
115
+ plans.push({ kind: 'remove', row, owner });
116
+ }
117
+ else {
118
+ const widthUpdate = plannedCellWidthChange(owner.element, -width, { ...info, feature: 'width' });
119
+ plans.push({ kind: 'shrink', owner, nextSpan: span - 1, widthUpdate });
120
+ }
121
+ }
122
+ const tableWidthUpdate = plannedTableWidthChange(shape.table, -width, { ...initial, tableIndex: shape.tableIndex });
123
+ for (const plan of plans) {
124
+ if (plan.kind === 'remove') {
125
+ removeOrphanedRangeEndpointsForSubtree(doc.documentElement, plan.owner.element);
126
+ plan.row.element.removeChild(plan.owner.element);
127
+ }
128
+ else {
129
+ applyWidthUpdates([plan.widthUpdate]);
130
+ setCellSpan(plan.owner, plan.nextSpan);
131
+ }
132
+ }
133
+ applyWidthUpdates([tableWidthUpdate]);
134
+ shape.grid.removeChild(shape.columns[columnIndex]);
135
+ inventoryTableOccupancy(shape.table);
136
+ return { gridColumns: shape.columns.length - 1, deleted: true };
137
+ }
138
+ //# sourceMappingURL=table_columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table_columns.js","sourceRoot":"","sources":["../../src/primitives/table_columns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type OccupiedCell, type OccupiedRow } from './table_occupancy.js';
2
+ export type TableEditDetail = {
3
+ anchorId: string;
4
+ tableIndex: number;
5
+ rowIndex: number;
6
+ columnIndex: number;
7
+ cellIndex?: number;
8
+ feature: string;
9
+ };
10
+ export declare function failTableEdit(code: 'INVALID_ARGUMENT' | 'UNSUPPORTED_EDIT', message: string, detail: TableEditDetail): never;
11
+ export declare function tableAncestor(node: Node | null, name: string): Element | null;
12
+ export declare function tableAttr(element: Element, name: string): string | null;
13
+ export declare function setTableAttr(element: Element, name: string, value: number | string): void;
14
+ export type TableEditTarget = {
15
+ table: Element;
16
+ tableIndex: number;
17
+ rows: OccupiedRow[];
18
+ grid: Element;
19
+ columns: Element[];
20
+ anchorCell: OccupiedCell;
21
+ anchorRow: OccupiedRow;
22
+ };
23
+ /** Resolve a body-level table and reject geometry unsupported by the clean edit phase. */
24
+ export declare function tableEditTarget(doc: Document, anchorId: string, columnIndex: number, operation?: string): TableEditTarget;
25
+ export type WidthUpdate = {
26
+ element: Element;
27
+ next: number;
28
+ };
29
+ export declare function plannedWidthChange(element: Element | undefined, delta: number, detail: TableEditDetail): WidthUpdate | null;
30
+ export declare function plannedCellWidthChange(cell: Element, delta: number, detail: TableEditDetail): WidthUpdate | null;
31
+ export declare function plannedTableWidthChange(table: Element, delta: number, detail: TableEditDetail): WidthUpdate | null;
32
+ export declare function applyWidthUpdates(updates: Array<WidthUpdate | null>): void;
33
+ export declare function setCellSpan(cell: Pick<OccupiedCell, 'element'>, next: number): void;
34
+ export declare function createTableCell(doc: Document, source: Element, text: string, width: number): {
35
+ cell: Element;
36
+ paragraph: Element;
37
+ };
38
+ export declare function hasPendingRevision(element: Element): boolean;
39
+ //# sourceMappingURL=table_edit_common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table_edit_common.d.ts","sourceRoot":"","sources":["../../src/primitives/table_edit_common.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgD,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEzH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,KAAK,CAE5H;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAK7E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,EAAE,CAAC;IAC3F,UAAU,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,WAAW,CAAC;CAClD,CAAC;AAEF,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,SAAW,GAAG,eAAe,CA4C3H;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI,CAc3H;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI,CAGhH;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI,CAGlH;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI,CAE1E;AAmBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKnF;AAOD,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAuBlI;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAG5D"}