@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.
- package/README.md +12 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/conformance-adapter.d.ts.map +1 -1
- package/dist/cli/conformance-adapter.js +0 -27
- package/dist/cli/conformance-adapter.js.map +1 -1
- package/dist/core-types.d.ts +1 -139
- package/dist/core-types.d.ts.map +1 -1
- package/dist/core-types.js +1 -3
- package/dist/core-types.js.map +1 -1
- package/dist/generation/compile.d.ts.map +1 -1
- package/dist/generation/compile.js +1 -3
- package/dist/generation/compile.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/integration/generation-probes.d.ts +36 -2
- package/dist/integration/generation-probes.d.ts.map +1 -1
- package/dist/integration/generation-probes.js +137 -15
- package/dist/integration/generation-probes.js.map +1 -1
- package/dist/integration/libreoffice-oracle.d.ts +3 -1
- package/dist/integration/libreoffice-oracle.d.ts.map +1 -1
- package/dist/integration/libreoffice-oracle.js +10 -4
- package/dist/integration/libreoffice-oracle.js.map +1 -1
- package/dist/integration/synthetic-docx-fixture.d.ts.map +1 -1
- package/dist/integration/synthetic-docx-fixture.js +8 -0
- package/dist/integration/synthetic-docx-fixture.js.map +1 -1
- package/dist/primitives/accept_ai_edits.js +14 -2
- package/dist/primitives/accept_ai_edits.js.map +1 -1
- package/dist/primitives/accept_changes.d.ts +6 -0
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +236 -62
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/bookmarks.d.ts +8 -2
- package/dist/primitives/bookmarks.d.ts.map +1 -1
- package/dist/primitives/bookmarks.js +31 -7
- package/dist/primitives/bookmarks.js.map +1 -1
- package/dist/primitives/comments.d.ts +101 -5
- package/dist/primitives/comments.d.ts.map +1 -1
- package/dist/primitives/comments.js +356 -156
- package/dist/primitives/comments.js.map +1 -1
- package/dist/primitives/conformance.d.ts +42 -0
- package/dist/primitives/conformance.d.ts.map +1 -0
- package/dist/primitives/conformance.js +61 -0
- package/dist/primitives/conformance.js.map +1 -0
- package/dist/primitives/document.d.ts +145 -2
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +505 -27
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/document_view-headings.d.ts +3 -1
- package/dist/primitives/document_view-headings.d.ts.map +1 -1
- package/dist/primitives/document_view-headings.js +5 -5
- package/dist/primitives/document_view-headings.js.map +1 -1
- package/dist/primitives/document_view.d.ts +2 -0
- package/dist/primitives/document_view.d.ts.map +1 -1
- package/dist/primitives/document_view.js +18 -4
- package/dist/primitives/document_view.js.map +1 -1
- package/dist/primitives/errors.d.ts +3 -2
- package/dist/primitives/errors.d.ts.map +1 -1
- package/dist/primitives/errors.js +3 -1
- package/dist/primitives/errors.js.map +1 -1
- package/dist/primitives/extract_revisions.d.ts +23 -6
- package/dist/primitives/extract_revisions.d.ts.map +1 -1
- package/dist/primitives/extract_revisions.js +208 -38
- package/dist/primitives/extract_revisions.js.map +1 -1
- package/dist/primitives/field_evaluation.d.ts +70 -0
- package/dist/primitives/field_evaluation.d.ts.map +1 -0
- package/dist/primitives/field_evaluation.js +462 -0
- package/dist/primitives/field_evaluation.js.map +1 -0
- package/dist/primitives/footnotes.d.ts +53 -3
- package/dist/primitives/footnotes.d.ts.map +1 -1
- package/dist/primitives/footnotes.js +228 -83
- package/dist/primitives/footnotes.js.map +1 -1
- package/dist/primitives/index.d.ts +12 -1
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +12 -1
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/merge_runs.d.ts +3 -1
- package/dist/primitives/merge_runs.d.ts.map +1 -1
- package/dist/primitives/merge_runs.js +12 -2
- package/dist/primitives/merge_runs.js.map +1 -1
- package/dist/primitives/namespaces.d.ts +10 -2
- package/dist/primitives/namespaces.d.ts.map +1 -1
- package/dist/primitives/namespaces.js +11 -2
- package/dist/primitives/namespaces.js.map +1 -1
- package/dist/primitives/note_conversion.d.ts +11 -0
- package/dist/primitives/note_conversion.d.ts.map +1 -0
- package/dist/primitives/note_conversion.js +12 -0
- package/dist/primitives/note_conversion.js.map +1 -0
- package/dist/primitives/paragraph-index.d.ts +31 -0
- package/dist/primitives/paragraph-index.d.ts.map +1 -0
- package/dist/primitives/paragraph-index.js +140 -0
- package/dist/primitives/paragraph-index.js.map +1 -0
- package/dist/primitives/paragraph_merge_formatting.d.ts +24 -0
- package/dist/primitives/paragraph_merge_formatting.d.ts.map +1 -0
- package/dist/primitives/paragraph_merge_formatting.js +86 -0
- package/dist/primitives/paragraph_merge_formatting.js.map +1 -0
- package/dist/primitives/paragraph_numbering.d.ts +40 -0
- package/dist/primitives/paragraph_numbering.d.ts.map +1 -0
- package/dist/primitives/paragraph_numbering.js +198 -0
- package/dist/primitives/paragraph_numbering.js.map +1 -0
- package/dist/primitives/paragraph_structure.d.ts +19 -0
- package/dist/primitives/paragraph_structure.d.ts.map +1 -0
- package/dist/primitives/paragraph_structure.js +66 -0
- package/dist/primitives/paragraph_structure.js.map +1 -0
- package/dist/primitives/reject_changes.d.ts +6 -0
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +278 -68
- package/dist/primitives/reject_changes.js.map +1 -1
- package/dist/primitives/relationships.d.ts +22 -0
- package/dist/primitives/relationships.d.ts.map +1 -1
- package/dist/primitives/relationships.js +87 -0
- package/dist/primitives/relationships.js.map +1 -1
- package/dist/primitives/revision-parts.d.ts +15 -0
- package/dist/primitives/revision-parts.d.ts.map +1 -1
- package/dist/primitives/revision-parts.js +33 -1
- package/dist/primitives/revision-parts.js.map +1 -1
- package/dist/primitives/sectPrAudit.d.ts.map +1 -1
- package/dist/primitives/sectPrAudit.js +10 -1
- package/dist/primitives/sectPrAudit.js.map +1 -1
- package/dist/primitives/sections.d.ts +135 -0
- package/dist/primitives/sections.d.ts.map +1 -0
- package/dist/primitives/sections.js +644 -0
- package/dist/primitives/sections.js.map +1 -0
- package/dist/primitives/styles.d.ts +61 -0
- package/dist/primitives/styles.d.ts.map +1 -1
- package/dist/primitives/styles.js +207 -25
- package/dist/primitives/styles.js.map +1 -1
- package/dist/primitives/symbol_run_content.d.ts +42 -0
- package/dist/primitives/symbol_run_content.d.ts.map +1 -0
- package/dist/primitives/symbol_run_content.js +79 -0
- package/dist/primitives/symbol_run_content.js.map +1 -0
- package/dist/primitives/table_cells.d.ts +49 -0
- package/dist/primitives/table_cells.d.ts.map +1 -0
- package/dist/primitives/table_cells.js +149 -0
- package/dist/primitives/table_cells.js.map +1 -0
- package/dist/primitives/table_columns.d.ts +50 -0
- package/dist/primitives/table_columns.d.ts.map +1 -0
- package/dist/primitives/table_columns.js +138 -0
- package/dist/primitives/table_columns.js.map +1 -0
- package/dist/primitives/table_edit_common.d.ts +39 -0
- package/dist/primitives/table_edit_common.d.ts.map +1 -0
- package/dist/primitives/table_edit_common.js +163 -0
- package/dist/primitives/table_edit_common.js.map +1 -0
- package/dist/primitives/table_occupancy.d.ts +39 -0
- package/dist/primitives/table_occupancy.d.ts.map +1 -0
- package/dist/primitives/table_occupancy.js +145 -0
- package/dist/primitives/table_occupancy.js.map +1 -0
- package/dist/primitives/table_rows.d.ts +56 -0
- package/dist/primitives/table_rows.d.ts.map +1 -0
- package/dist/primitives/table_rows.js +390 -0
- package/dist/primitives/table_rows.js.map +1 -0
- package/dist/primitives/text.d.ts +69 -1
- package/dist/primitives/text.d.ts.map +1 -1
- package/dist/primitives/text.js +592 -102
- package/dist/primitives/text.js.map +1 -1
- package/dist/primitives/track-changes-emitter.d.ts +23 -0
- package/dist/primitives/track-changes-emitter.d.ts.map +1 -1
- package/dist/primitives/track-changes-emitter.js +64 -1
- package/dist/primitives/track-changes-emitter.js.map +1 -1
- package/dist/primitives/validate_document.d.ts.map +1 -1
- package/dist/primitives/validate_document.js +22 -1
- package/dist/primitives/validate_document.js.map +1 -1
- package/dist/primitives/zip.d.ts +22 -1
- package/dist/primitives/zip.d.ts.map +1 -1
- package/dist/primitives/zip.js +47 -8
- package/dist/primitives/zip.js.map +1 -1
- package/dist/shared/docx/DocxArchive.d.ts +6 -2
- package/dist/shared/docx/DocxArchive.d.ts.map +1 -1
- package/dist/shared/docx/DocxArchive.js +17 -4
- package/dist/shared/docx/DocxArchive.js.map +1 -1
- package/dist/shared/field-semantics.d.ts +26 -0
- package/dist/shared/field-semantics.d.ts.map +1 -0
- package/dist/shared/field-semantics.js +232 -0
- package/dist/shared/field-semantics.js.map +1 -0
- package/dist/shared/field-structure.d.ts +10 -1
- package/dist/shared/field-structure.d.ts.map +1 -1
- package/dist/shared/field-structure.js +31 -12
- package/dist/shared/field-structure.js.map +1 -1
- 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"}
|