@aster-editor/core 0.4.3 → 0.5.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 (94) hide show
  1. package/README.md +191 -92
  2. package/dist/api/commands.d.ts +8 -1
  3. package/dist/api/commands.d.ts.map +1 -1
  4. package/dist/api/commands.js +3 -0
  5. package/dist/api/commands.js.map +1 -1
  6. package/dist/api/index.d.ts +2 -0
  7. package/dist/api/index.d.ts.map +1 -1
  8. package/dist/api/index.js +1 -0
  9. package/dist/api/index.js.map +1 -1
  10. package/dist/api/layout.d.ts +181 -0
  11. package/dist/api/layout.d.ts.map +1 -0
  12. package/dist/api/layout.js +28 -0
  13. package/dist/api/layout.js.map +1 -0
  14. package/dist/api/options.d.ts +6 -0
  15. package/dist/api/options.d.ts.map +1 -1
  16. package/dist/commands/layout.d.ts +40 -0
  17. package/dist/commands/layout.d.ts.map +1 -0
  18. package/dist/commands/layout.js +262 -0
  19. package/dist/commands/layout.js.map +1 -0
  20. package/dist/commands/standard.d.ts +4 -3
  21. package/dist/commands/standard.d.ts.map +1 -1
  22. package/dist/commands/standard.js +7 -3
  23. package/dist/commands/standard.js.map +1 -1
  24. package/dist/editor/aster-editor.d.ts +16 -1
  25. package/dist/editor/aster-editor.d.ts.map +1 -1
  26. package/dist/editor/aster-editor.js +41 -1
  27. package/dist/editor/aster-editor.js.map +1 -1
  28. package/dist/extensions/aster-extensions.d.ts +3 -0
  29. package/dist/extensions/aster-extensions.d.ts.map +1 -1
  30. package/dist/extensions/aster-extensions.js +24 -5
  31. package/dist/extensions/aster-extensions.js.map +1 -1
  32. package/dist/extensions/header-footer-sanitize.d.ts +22 -0
  33. package/dist/extensions/header-footer-sanitize.d.ts.map +1 -0
  34. package/dist/extensions/header-footer-sanitize.js +226 -0
  35. package/dist/extensions/header-footer-sanitize.js.map +1 -0
  36. package/dist/extensions/layout-css.d.ts +88 -0
  37. package/dist/extensions/layout-css.d.ts.map +1 -0
  38. package/dist/extensions/layout-css.js +297 -0
  39. package/dist/extensions/layout-css.js.map +1 -0
  40. package/dist/extensions/list-layout.d.ts +23 -0
  41. package/dist/extensions/list-layout.d.ts.map +1 -0
  42. package/dist/extensions/list-layout.js +65 -0
  43. package/dist/extensions/list-layout.js.map +1 -0
  44. package/dist/extensions/page-break.d.ts +8 -0
  45. package/dist/extensions/page-break.d.ts.map +1 -0
  46. package/dist/extensions/page-break.js +20 -0
  47. package/dist/extensions/page-break.js.map +1 -0
  48. package/dist/extensions/page-view.d.ts +68 -0
  49. package/dist/extensions/page-view.d.ts.map +1 -0
  50. package/dist/extensions/page-view.js +189 -0
  51. package/dist/extensions/page-view.js.map +1 -0
  52. package/dist/extensions/pagination-controller.d.ts +110 -0
  53. package/dist/extensions/pagination-controller.d.ts.map +1 -0
  54. package/dist/extensions/pagination-controller.js +295 -0
  55. package/dist/extensions/pagination-controller.js.map +1 -0
  56. package/dist/extensions/pagination-layout.d.ts +54 -0
  57. package/dist/extensions/pagination-layout.d.ts.map +1 -0
  58. package/dist/extensions/pagination-layout.js +109 -0
  59. package/dist/extensions/pagination-layout.js.map +1 -0
  60. package/dist/extensions/pagination-measure.d.ts +42 -0
  61. package/dist/extensions/pagination-measure.d.ts.map +1 -0
  62. package/dist/extensions/pagination-measure.js +108 -0
  63. package/dist/extensions/pagination-measure.js.map +1 -0
  64. package/dist/extensions/pagination.d.ts +36 -0
  65. package/dist/extensions/pagination.d.ts.map +1 -0
  66. package/dist/extensions/pagination.js +69 -0
  67. package/dist/extensions/pagination.js.map +1 -0
  68. package/dist/extensions/paragraph-layout.d.ts +62 -0
  69. package/dist/extensions/paragraph-layout.d.ts.map +1 -0
  70. package/dist/extensions/paragraph-layout.js +227 -0
  71. package/dist/extensions/paragraph-layout.js.map +1 -0
  72. package/dist/extensions/run-layout.d.ts +79 -0
  73. package/dist/extensions/run-layout.d.ts.map +1 -0
  74. package/dist/extensions/run-layout.js +302 -0
  75. package/dist/extensions/run-layout.js.map +1 -0
  76. package/dist/extensions/table-layout.d.ts +85 -0
  77. package/dist/extensions/table-layout.d.ts.map +1 -0
  78. package/dist/extensions/table-layout.js +314 -0
  79. package/dist/extensions/table-layout.js.map +1 -0
  80. package/dist/html/serialize-html.d.ts +42 -0
  81. package/dist/html/serialize-html.d.ts.map +1 -0
  82. package/dist/html/serialize-html.js +159 -0
  83. package/dist/html/serialize-html.js.map +1 -0
  84. package/dist/i18n/en.d.ts.map +1 -1
  85. package/dist/i18n/en.js +8 -0
  86. package/dist/i18n/en.js.map +1 -1
  87. package/dist/i18n/fr.d.ts.map +1 -1
  88. package/dist/i18n/fr.js +8 -0
  89. package/dist/i18n/fr.js.map +1 -1
  90. package/dist/index.d.ts +11 -0
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +13 -0
  93. package/dist/index.js.map +1 -1
  94. package/package.json +2 -1
@@ -0,0 +1,85 @@
1
+ import { type AnyExtension, type Node } from '@tiptap/core';
2
+ import { TableView } from '@tiptap/extension-table';
3
+ import type { Node as ProseMirrorNode } from '@tiptap/pm/model';
4
+ import type { EditorView } from '@tiptap/pm/view';
5
+ import type { CellVerticalAlign } from '../api';
6
+ /** Options de table partagées par le jeu d'Aster. */
7
+ export declare const TABLE_OPTIONS: {
8
+ readonly resizable: true;
9
+ readonly cellMinWidth: 48;
10
+ };
11
+ /**
12
+ * Bornes de `colspan` et `rowspan` à l'analyse HTML : Word plafonne une table à 63
13
+ * colonnes, et 1 000 lignes fusionnées couvrent tout usage réel. Au-delà, prosemirror-tables
14
+ * alloue une grille proportionnelle au produit des fusions : un `colspan="1000000"` dans
15
+ * un `.docx` (revue R25) tuait l'onglet à 4 Go de tas.
16
+ */
17
+ export declare const MAX_COLSPAN = 63;
18
+ export declare const MAX_ROWSPAN = 1000;
19
+ /**
20
+ * Lit un `colspan` / `rowspan` HTML : entier dans `[1, max]`, tout le reste (vide, texte,
21
+ * zéro, négatif, trop grand) ramené à 1 ou à la borne.
22
+ */
23
+ export declare function parseSpan(value: string | null, max: number): number;
24
+ /** Alignements verticaux de cellule reconnus. */
25
+ export declare const CELL_VERTICAL_ALIGNS: readonly CellVerticalAlign[];
26
+ /** Marges internes d'une cellule : `top right bottom left`, en points. */
27
+ export type CellPadding = readonly [number, number, number, number];
28
+ /** Vrai pour `top`, `middle` ou `bottom`. */
29
+ export declare function isCellVerticalAlign(value: unknown): value is CellVerticalAlign;
30
+ /** Vrai pour un quadruplet de nombres de mise en page (finis, bornés). */
31
+ export declare function isCellPadding(value: unknown): value is CellPadding;
32
+ /**
33
+ * Lit une largeur de table : `100%` ou `450pt` (deux décimales au plus). Les pixels sont
34
+ * volontairement ignorés : `width: 200px` est la largeur que Tiptap calcule lui-même
35
+ * depuis les `colwidth`, la relire comme largeur de mise en page figerait les colonnes.
36
+ * Tout le reste (`auto`) donne `null`.
37
+ */
38
+ export declare function parseTableWidth(value: string | null | undefined): string | null;
39
+ /**
40
+ * Lit un `padding` CSS (1 à 4 valeurs, règles CSS d'expansion) en quadruplet de points ;
41
+ * `null` si une valeur n'est pas convertible.
42
+ */
43
+ export declare function parseCellPadding(value: string | null | undefined): CellPadding | null;
44
+ /** Déclarations `style` d'une table : `width` puis `border-*`. */
45
+ export declare function tableLayoutDeclarations(attributes: Record<string, unknown>): string[];
46
+ /** Déclarations `style` d'une cellule : `border-*`, `background-color`, `vertical-align`, `padding`. */
47
+ export declare function cellLayoutDeclarations(attributes: Record<string, unknown>): string[];
48
+ /** Attributs HTML de mise en page d'une table : `style` (largeur puis bordures), `data-docx-style`. */
49
+ export declare function tableLayoutHtmlAttributes(attributes: Record<string, unknown>): Record<string, string>;
50
+ /**
51
+ * Vue de table en édition (mode redimensionnable) : celle de Tiptap, qui ne reçoit aucun
52
+ * attribut rendu de `columnResizing`, complétée par le `style` et le `data-docx-style`
53
+ * de mise en page, resynchronisés à la construction et à chaque mise à jour du nœud.
54
+ *
55
+ * Largeur : tant qu'aucune colonne n'est redimensionnée, la largeur du contrat
56
+ * (`width: 100%`, `width: 450pt`) est celle affichée, comme dans `getHTML()` ; dès qu'une
57
+ * colonne porte un `colwidth`, c'est la largeur que Tiptap calcule depuis les colonnes
58
+ * (`updateColumns`) qui prime, sinon le redimensionnement ne se verrait pas. Le
59
+ * `min-width` de Tiptap est conservé dans les deux cas.
60
+ */
61
+ export declare class AsterTableView extends TableView {
62
+ constructor(node: ProseMirrorNode, cellMinWidth: number, view?: EditorView);
63
+ update(node: ProseMirrorNode): boolean;
64
+ /** Réapplique `style` et `data-docx-style` de mise en page après `updateColumns`. */
65
+ private syncLayout;
66
+ }
67
+ /**
68
+ * `Table` d'Aster : celle de Tiptap plus `width`, `borders` et `docxStyle`. Le `renderHTML`
69
+ * est réécrit pour combiner la largeur calculée par Tiptap depuis les `colwidth` (ou son
70
+ * `min-width`) avec le `style` de mise en page : Tiptap abandonne la première dès qu'un
71
+ * `style` utilisateur existe, ce qui aurait cassé le redimensionnement des colonnes sur
72
+ * une table bordée. Une `width` explicite l'emporte sur la largeur calculée.
73
+ */
74
+ export declare const AsterTable: Node;
75
+ /** `TableCell` d'Aster : celle de Tiptap plus les attributs de `CellLayoutAttrs`. */
76
+ export declare const AsterTableCell: Node;
77
+ /** `TableHeader` d'Aster : celle de Tiptap plus les attributs de `CellLayoutAttrs`. */
78
+ export declare const AsterTableHeader: Node;
79
+ /**
80
+ * Jeu de tables d'Aster : `TableKit` pour la ligne (`tableRow`), les nœuds `table`,
81
+ * `tableCell` et `tableHeader` remplacés par leurs versions étendues, mêmes options de
82
+ * redimensionnement qu'avant.
83
+ */
84
+ export declare function createTableExtensions(): AnyExtension[];
85
+ //# sourceMappingURL=table-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-layout.d.ts","sourceRoot":"","sources":["../../src/extensions/table-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,YAAY,EAAkB,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,EAKL,SAAS,EAEV,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,IAAI,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAehD,qDAAqD;AACrD,eAAO,MAAM,aAAa;;;CAAiD,CAAC;AAE5E;;;;;GAKG;AACH,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,WAAW,OAAO,CAAC;AAEhC;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAAgC,CAAC;AAE9F,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpE,6CAA6C;AAC7C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAe/E;AAUD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,IAAI,CAwBrF;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAarF;AAED,wGAAwG;AACxG,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAqBpF;AAOD,uGAAuG;AACvG,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWxB;AAoCD;;;;;;;;;;GAUG;AACH,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,IAAI,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU;IAKjE,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO;IAQ/C,qFAAqF;IACrF,OAAO,CAAC,UAAU;CAqBnB;AA6CD;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,IA8BvB,CAAC;AAEH,qFAAqF;AACrF,eAAO,MAAM,cAAc,EAAE,IAI3B,CAAC;AAEH,uFAAuF;AACvF,eAAO,MAAM,gBAAgB,EAAE,IAI7B,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CAOtD"}
@@ -0,0 +1,314 @@
1
+ import { mergeAttributes } from '@tiptap/core';
2
+ import { Table, TableCell, TableHeader, TableKit, TableView, createColGroup, } from '@tiptap/extension-table';
3
+ import { DOCX_STYLE_ATTRIBUTE } from './paragraph-layout';
4
+ import { borderDeclarations, formatPt, isLayoutNumber, joinDeclarations, normalizeColor, parsePt, parseSideBorders, parseStyleDeclarations, roundLayoutNumber, sanitizeBorders, } from './layout-css';
5
+ /** Options de table partagées par le jeu d'Aster. */
6
+ export const TABLE_OPTIONS = { resizable: true, cellMinWidth: 48 };
7
+ /**
8
+ * Bornes de `colspan` et `rowspan` à l'analyse HTML : Word plafonne une table à 63
9
+ * colonnes, et 1 000 lignes fusionnées couvrent tout usage réel. Au-delà, prosemirror-tables
10
+ * alloue une grille proportionnelle au produit des fusions : un `colspan="1000000"` dans
11
+ * un `.docx` (revue R25) tuait l'onglet à 4 Go de tas.
12
+ */
13
+ export const MAX_COLSPAN = 63;
14
+ export const MAX_ROWSPAN = 1000;
15
+ /**
16
+ * Lit un `colspan` / `rowspan` HTML : entier dans `[1, max]`, tout le reste (vide, texte,
17
+ * zéro, négatif, trop grand) ramené à 1 ou à la borne.
18
+ */
19
+ export function parseSpan(value, max) {
20
+ const span = Number.parseInt(value ?? '', 10);
21
+ if (!Number.isFinite(span) || span < 1) {
22
+ return 1;
23
+ }
24
+ return Math.min(span, max);
25
+ }
26
+ /** Alignements verticaux de cellule reconnus. */
27
+ export const CELL_VERTICAL_ALIGNS = ['top', 'middle', 'bottom'];
28
+ /** Vrai pour `top`, `middle` ou `bottom`. */
29
+ export function isCellVerticalAlign(value) {
30
+ return typeof value === 'string' && CELL_VERTICAL_ALIGNS.includes(value);
31
+ }
32
+ /** Vrai pour un quadruplet de nombres de mise en page (finis, bornés). */
33
+ export function isCellPadding(value) {
34
+ return Array.isArray(value) && value.length === 4 && value.every(isLayoutNumber);
35
+ }
36
+ /**
37
+ * Lit une largeur de table : `100%` ou `450pt` (deux décimales au plus). Les pixels sont
38
+ * volontairement ignorés : `width: 200px` est la largeur que Tiptap calcule lui-même
39
+ * depuis les `colwidth`, la relire comme largeur de mise en page figerait les colonnes.
40
+ * Tout le reste (`auto`) donne `null`.
41
+ */
42
+ export function parseTableWidth(value) {
43
+ if (!value) {
44
+ return null;
45
+ }
46
+ const trimmed = value.trim();
47
+ const percent = /^(\d+(?:\.\d+)?)%$/.exec(trimmed);
48
+ if (percent?.[1] !== undefined) {
49
+ const number = Number.parseFloat(percent[1]);
50
+ return number > 0 ? `${roundLayoutNumber(number)}%` : null;
51
+ }
52
+ if (!/pt$/i.test(trimmed)) {
53
+ return null;
54
+ }
55
+ const pt = parsePt(trimmed);
56
+ return pt !== null && pt > 0 ? formatPt(pt) : null;
57
+ }
58
+ /** Largeur d'une table depuis son `style` (`width`), sinon son attribut `width="100%"`. */
59
+ function parseTableWidthFromElement(element) {
60
+ return (parseTableWidth(parseStyleDeclarations(element.getAttribute('style')).get('width')) ??
61
+ parseTableWidth(element.getAttribute('width')));
62
+ }
63
+ /**
64
+ * Lit un `padding` CSS (1 à 4 valeurs, règles CSS d'expansion) en quadruplet de points ;
65
+ * `null` si une valeur n'est pas convertible.
66
+ */
67
+ export function parseCellPadding(value) {
68
+ if (!value) {
69
+ return null;
70
+ }
71
+ const parts = value.trim().split(/\s+/).map(parsePt);
72
+ if (parts.some((part) => part === null)) {
73
+ return null;
74
+ }
75
+ const [a, b, c, d] = parts;
76
+ if (a === undefined) {
77
+ return null;
78
+ }
79
+ switch (parts.length) {
80
+ case 1:
81
+ return [a, a, a, a];
82
+ case 2:
83
+ return b === undefined ? null : [a, b, a, b];
84
+ case 3:
85
+ return b === undefined || c === undefined ? null : [a, b, c, b];
86
+ case 4:
87
+ return b === undefined || c === undefined || d === undefined ? null : [a, b, c, d];
88
+ default:
89
+ return null;
90
+ }
91
+ }
92
+ /** Déclarations `style` d'une table : `width` puis `border-*`. */
93
+ export function tableLayoutDeclarations(attributes) {
94
+ const declarations = [];
95
+ const width = parseTableWidth(typeof attributes['width'] === 'string' ? attributes['width'] : null);
96
+ if (width) {
97
+ declarations.push(`width: ${width}`);
98
+ }
99
+ const borders = sanitizeBorders(attributes['borders']);
100
+ if (borders) {
101
+ declarations.push(...borderDeclarations(borders));
102
+ }
103
+ return declarations;
104
+ }
105
+ /** Déclarations `style` d'une cellule : `border-*`, `background-color`, `vertical-align`, `padding`. */
106
+ export function cellLayoutDeclarations(attributes) {
107
+ const declarations = [];
108
+ const borders = sanitizeBorders(attributes['borders']);
109
+ if (borders) {
110
+ declarations.push(...borderDeclarations(borders));
111
+ }
112
+ const shading = normalizeColor(typeof attributes['shading'] === 'string' ? attributes['shading'] : null);
113
+ if (shading) {
114
+ declarations.push(`background-color: ${shading}`);
115
+ }
116
+ const verticalAlign = attributes['verticalAlign'];
117
+ if (isCellVerticalAlign(verticalAlign)) {
118
+ declarations.push(`vertical-align: ${verticalAlign}`);
119
+ }
120
+ const padding = attributes['paddingPt'];
121
+ if (isCellPadding(padding)) {
122
+ declarations.push(`padding: ${padding.map(formatPt).join(' ')}`);
123
+ }
124
+ return declarations;
125
+ }
126
+ /** Attribut sans rendu propre : le `style` complet est émis par le premier attribut. */
127
+ function silentAttribute(parseHTML) {
128
+ return { default: null, parseHTML, renderHTML: () => ({}) };
129
+ }
130
+ /** Attributs HTML de mise en page d'une table : `style` (largeur puis bordures), `data-docx-style`. */
131
+ export function tableLayoutHtmlAttributes(attributes) {
132
+ const rendered = {};
133
+ const style = joinDeclarations(tableLayoutDeclarations(attributes));
134
+ if (style) {
135
+ rendered['style'] = style;
136
+ }
137
+ const docxStyle = attributes['docxStyle'];
138
+ if (typeof docxStyle === 'string' && docxStyle !== '') {
139
+ rendered[DOCX_STYLE_ATTRIBUTE] = docxStyle;
140
+ }
141
+ return rendered;
142
+ }
143
+ /**
144
+ * Attributs de `TableLayoutAttrs`. `width` émet tout le rendu (`style` puis
145
+ * `data-docx-style`) ; les autres n'émettent rien, comme pour `ParagraphLayout`.
146
+ */
147
+ function tableLayoutAttributes() {
148
+ return {
149
+ width: {
150
+ default: null,
151
+ parseHTML: parseTableWidthFromElement,
152
+ renderHTML: tableLayoutHtmlAttributes,
153
+ },
154
+ borders: silentAttribute((element) => {
155
+ const borders = parseSideBorders(parseStyleDeclarations(element.getAttribute('style')));
156
+ return borders.length > 0 ? borders : null;
157
+ }),
158
+ docxStyle: silentAttribute((element) => element.getAttribute(DOCX_STYLE_ATTRIBUTE) || null),
159
+ };
160
+ }
161
+ /** Vrai si au moins une cellule de la première ligne porte un `colwidth` (colonne redimensionnée). */
162
+ function hasResizedColumn(node) {
163
+ const row = node.firstChild;
164
+ if (!row) {
165
+ return false;
166
+ }
167
+ for (let index = 0; index < row.childCount; index += 1) {
168
+ const colwidth = row.child(index).attrs['colwidth'];
169
+ if (Array.isArray(colwidth) && colwidth.some((width) => width !== null)) {
170
+ return true;
171
+ }
172
+ }
173
+ return false;
174
+ }
175
+ /**
176
+ * Vue de table en édition (mode redimensionnable) : celle de Tiptap, qui ne reçoit aucun
177
+ * attribut rendu de `columnResizing`, complétée par le `style` et le `data-docx-style`
178
+ * de mise en page, resynchronisés à la construction et à chaque mise à jour du nœud.
179
+ *
180
+ * Largeur : tant qu'aucune colonne n'est redimensionnée, la largeur du contrat
181
+ * (`width: 100%`, `width: 450pt`) est celle affichée, comme dans `getHTML()` ; dès qu'une
182
+ * colonne porte un `colwidth`, c'est la largeur que Tiptap calcule depuis les colonnes
183
+ * (`updateColumns`) qui prime, sinon le redimensionnement ne se verrait pas. Le
184
+ * `min-width` de Tiptap est conservé dans les deux cas.
185
+ */
186
+ export class AsterTableView extends TableView {
187
+ constructor(node, cellMinWidth, view) {
188
+ super(node, cellMinWidth, view, tableLayoutHtmlAttributes(node.attrs));
189
+ this.syncLayout(node);
190
+ }
191
+ update(node) {
192
+ if (!super.update(node)) {
193
+ return false;
194
+ }
195
+ this.syncLayout(node);
196
+ return true;
197
+ }
198
+ /** Réapplique `style` et `data-docx-style` de mise en page après `updateColumns`. */
199
+ syncLayout(node) {
200
+ const rendered = tableLayoutHtmlAttributes(node.attrs);
201
+ const style = rendered['style'];
202
+ const computedWidth = this.table.style.width;
203
+ const minWidth = this.table.style.minWidth;
204
+ const layoutWidth = parseTableWidth(typeof node.attrs['width'] === 'string' ? node.attrs['width'] : null);
205
+ this.table.style.cssText = style ?? '';
206
+ if (!layoutWidth || hasResizedColumn(node)) {
207
+ // `updateColumns` vient de poser la largeur calculée : on la garde.
208
+ this.table.style.width = computedWidth;
209
+ }
210
+ this.table.style.minWidth = minWidth;
211
+ const docxStyle = rendered[DOCX_STYLE_ATTRIBUTE];
212
+ if (docxStyle === undefined) {
213
+ this.table.removeAttribute(DOCX_STYLE_ATTRIBUTE);
214
+ }
215
+ else {
216
+ this.table.setAttribute(DOCX_STYLE_ATTRIBUTE, docxStyle);
217
+ }
218
+ }
219
+ }
220
+ /**
221
+ * Attributs de `CellLayoutAttrs`, ajoutés après ceux de Tiptap (`colspan`, `rowspan`,
222
+ * `colwidth`, `align`) : le `text-align` de Tiptap vient donc en premier dans le `style`.
223
+ * `borders` émet tout le `style` de mise en page. `colspan` et `rowspan` remplacent ceux de
224
+ * Tiptap (qui lisait l'attribut tel quel) pour les borner à l'analyse ; leur rendu reste
225
+ * celui de Tiptap, qui omet la valeur par défaut `1`.
226
+ */
227
+ function cellLayoutAttributes() {
228
+ return {
229
+ colspan: {
230
+ default: 1,
231
+ parseHTML: (element) => parseSpan(element.getAttribute('colspan'), MAX_COLSPAN),
232
+ },
233
+ rowspan: {
234
+ default: 1,
235
+ parseHTML: (element) => parseSpan(element.getAttribute('rowspan'), MAX_ROWSPAN),
236
+ },
237
+ borders: {
238
+ default: null,
239
+ parseHTML: (element) => {
240
+ const borders = parseSideBorders(parseStyleDeclarations(element.getAttribute('style')));
241
+ return borders.length > 0 ? borders : null;
242
+ },
243
+ renderHTML: (attributes) => {
244
+ const style = joinDeclarations(cellLayoutDeclarations(attributes));
245
+ return style ? { style } : {};
246
+ },
247
+ },
248
+ shading: silentAttribute((element) => normalizeColor(parseStyleDeclarations(element.getAttribute('style')).get('background-color'))),
249
+ verticalAlign: silentAttribute((element) => {
250
+ const value = parseStyleDeclarations(element.getAttribute('style'))
251
+ .get('vertical-align')
252
+ ?.toLowerCase();
253
+ return isCellVerticalAlign(value) ? value : null;
254
+ }),
255
+ paddingPt: silentAttribute((element) => parseCellPadding(parseStyleDeclarations(element.getAttribute('style')).get('padding'))),
256
+ };
257
+ }
258
+ /**
259
+ * `Table` d'Aster : celle de Tiptap plus `width`, `borders` et `docxStyle`. Le `renderHTML`
260
+ * est réécrit pour combiner la largeur calculée par Tiptap depuis les `colwidth` (ou son
261
+ * `min-width`) avec le `style` de mise en page : Tiptap abandonne la première dès qu'un
262
+ * `style` utilisateur existe, ce qui aurait cassé le redimensionnement des colonnes sur
263
+ * une table bordée. Une `width` explicite l'emporte sur la largeur calculée.
264
+ */
265
+ export const AsterTable = Table.extend({
266
+ addAttributes() {
267
+ return { ...this.parent?.(), ...tableLayoutAttributes() };
268
+ },
269
+ renderHTML({ node, HTMLAttributes }) {
270
+ const { colgroup, tableWidth, tableMinWidth } = createColGroup(node, this.options.cellMinWidth);
271
+ const { style: layoutStyle, ...rest } = HTMLAttributes;
272
+ const hasLayoutWidth = parseTableWidth(typeof node.attrs['width'] === 'string' ? node.attrs['width'] : null);
273
+ const computed = hasLayoutWidth
274
+ ? ''
275
+ : tableWidth
276
+ ? `width: ${tableWidth}`
277
+ : tableMinWidth
278
+ ? `min-width: ${tableMinWidth}`
279
+ : '';
280
+ const style = [computed, typeof layoutStyle === 'string' ? layoutStyle : '']
281
+ .filter((part) => part !== '')
282
+ .join('; ');
283
+ // `style` d'abord, puis `data-docx-style` : même ordre que sur les paragraphes.
284
+ const attributes = mergeAttributes(this.options.HTMLAttributes, style === '' ? {} : { style }, rest);
285
+ const children = colgroup ? [colgroup, ['tbody', 0]] : [['tbody', 0]];
286
+ return ['table', attributes, ...children];
287
+ },
288
+ });
289
+ /** `TableCell` d'Aster : celle de Tiptap plus les attributs de `CellLayoutAttrs`. */
290
+ export const AsterTableCell = TableCell.extend({
291
+ addAttributes() {
292
+ return { ...this.parent?.(), ...cellLayoutAttributes() };
293
+ },
294
+ });
295
+ /** `TableHeader` d'Aster : celle de Tiptap plus les attributs de `CellLayoutAttrs`. */
296
+ export const AsterTableHeader = TableHeader.extend({
297
+ addAttributes() {
298
+ return { ...this.parent?.(), ...cellLayoutAttributes() };
299
+ },
300
+ });
301
+ /**
302
+ * Jeu de tables d'Aster : `TableKit` pour la ligne (`tableRow`), les nœuds `table`,
303
+ * `tableCell` et `tableHeader` remplacés par leurs versions étendues, mêmes options de
304
+ * redimensionnement qu'avant.
305
+ */
306
+ export function createTableExtensions() {
307
+ return [
308
+ TableKit.configure({ table: false, tableCell: false, tableHeader: false }),
309
+ AsterTable.configure({ ...TABLE_OPTIONS, View: AsterTableView }),
310
+ AsterTableCell,
311
+ AsterTableHeader,
312
+ ];
313
+ }
314
+ //# sourceMappingURL=table-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-layout.js","sourceRoot":"","sources":["../../src/extensions/table-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { DOMSerializer, type DOMOutputSpec, type Node as ProseMirrorNode, type Schema } from '@tiptap/pm/model';
2
+ /**
3
+ * Sérialisation HTML d'un document avec les attributs `style` **tels que les extensions
4
+ * les émettent**.
5
+ *
6
+ * Le `DOMSerializer` de ProseMirror pose `style` via `element.style.cssText`, et le moteur
7
+ * CSS (navigateur ou jsdom) réécrit alors la valeur : couleurs en `rgb()`, `;` final,
8
+ * longhands repliés en raccourcis (`margin: 6pt 6pt 36pt 0pt`, dans un ordre faux sous
9
+ * jsdom). Le contrat de mise en page (`api/layout.ts`) fige une sérialisation exacte
10
+ * (`#rrggbb`, ordre des déclarations) que le paquet `word` relit : on rend donc les
11
+ * `DOMOutputSpec` nous-mêmes, avec `setAttribute('style', …)` verbatim. Tout le reste
12
+ * (structure, trous de contenu, marques) suit la sémantique de `renderSpec`.
13
+ */
14
+ interface Rendered {
15
+ readonly dom: globalThis.Node;
16
+ readonly contentDOM?: HTMLElement;
17
+ }
18
+ /** Message levé quand un spec est un tableau sorti tel quel des attributs (même texte que ProseMirror). */
19
+ export declare const SUSPICIOUS_SPEC_MESSAGE = "Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack";
20
+ /**
21
+ * Rend un `DOMOutputSpec` en DOM, comme `DOMSerializer.renderSpec`, mais en posant chaque
22
+ * attribut avec `setAttribute` (le `style` reste verbatim). Le trou `0` désigne le
23
+ * `contentDOM`, un espace dans le nom de balise introduit un espace de noms XML.
24
+ *
25
+ * `blockArraysIn` : attributs du nœud ou de la marque rendu ; tout tableau de spec qui en
26
+ * provient (identité) est refusé, comme le fait ProseMirror. Les deux autres gardes de
27
+ * `renderSpec` sont portées aussi : un trou de contenu doit être seul dans son parent, et
28
+ * il ne peut y en avoir qu'un par spec.
29
+ */
30
+ export declare function renderRawSpec(doc: Document, spec: DOMOutputSpec, xmlNS?: string | null, blockArraysIn?: Readonly<Record<string, unknown>> | null): Rendered;
31
+ /**
32
+ * Sérialiseur dérivé de celui du schéma : chaque `toDOM` de nœud et de marque est rendu
33
+ * par `renderRawSpec` avant d'être confié à ProseMirror, qui n'a plus qu'à assembler.
34
+ */
35
+ export declare function createRawStyleSerializer(schema: Schema): DOMSerializer;
36
+ /**
37
+ * HTML d'un document ProseMirror, équivalent de `editor.getHTML()` de Tiptap, avec les
38
+ * `style` verbatim. C'est l'entrée de `normalizeOutputHtml` dans `AsterEditor.getHTML`.
39
+ */
40
+ export declare function serializeDocumentHtml(doc: ProseMirrorNode): string;
41
+ export {};
42
+ //# sourceMappingURL=serialize-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize-html.d.ts","sourceRoot":"","sources":["../../src/html/serialize-html.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,aAAa,EAElB,KAAK,IAAI,IAAI,eAAe,EAC5B,KAAK,MAAM,EACZ,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;GAWG;AAEH,UAAU,QAAQ;IAChB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC;CACnC;AAkDD,2GAA2G;AAC3G,eAAO,MAAM,uBAAuB,gHAC2E,CAAC;AAEhH;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,aAAa,EACnB,KAAK,GAAE,MAAM,GAAG,IAAW,EAC3B,aAAa,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAW,GAC7D,QAAQ,CA8DV;AAWD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAkBtE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAKlE"}
@@ -0,0 +1,159 @@
1
+ import { DOMSerializer, } from '@tiptap/pm/model';
2
+ /** Vrai si la valeur est un nœud DOM (élément ou texte). */
3
+ function isDomNode(value) {
4
+ return typeof value === 'object' && value !== null && 'nodeType' in value;
5
+ }
6
+ /** Vrai si la valeur est un spec `{ dom, contentDOM? }` déjà rendu. */
7
+ function isRenderedSpec(value) {
8
+ return typeof value === 'object' && value !== null && 'dom' in value && isDomNode(value.dom);
9
+ }
10
+ /** Vrai si le deuxième élément d'un spec tableau est un objet d'attributs. */
11
+ function isAttributes(value) {
12
+ return typeof value === 'object' && value !== null && !Array.isArray(value) && !isDomNode(value);
13
+ }
14
+ /**
15
+ * Tableaux `[string, …]` trouvés dans un objet d'attributs, à n'importe quelle profondeur :
16
+ * même parcours que `suspiciousAttributes` de prosemirror-model. Un `toDOM` d'intégrateur
17
+ * qui renvoie `node.attrs.payload` tel quel laisserait un document (JSON stocké, `.docx`)
18
+ * décrire librement un `<img onerror>` : ProseMirror lève dans ce cas, nous aussi.
19
+ */
20
+ const suspiciousArraysCache = new WeakMap();
21
+ function suspiciousArrays(attrs) {
22
+ const cached = suspiciousArraysCache.get(attrs);
23
+ if (cached) {
24
+ return cached;
25
+ }
26
+ const found = [];
27
+ const scan = (value) => {
28
+ if (typeof value !== 'object' || value === null) {
29
+ return;
30
+ }
31
+ if (Array.isArray(value)) {
32
+ if (typeof value[0] === 'string') {
33
+ found.push(value);
34
+ }
35
+ else {
36
+ value.forEach(scan);
37
+ }
38
+ return;
39
+ }
40
+ Object.values(value).forEach(scan);
41
+ };
42
+ scan(attrs);
43
+ suspiciousArraysCache.set(attrs, found);
44
+ return found;
45
+ }
46
+ /** Message levé quand un spec est un tableau sorti tel quel des attributs (même texte que ProseMirror). */
47
+ export const SUSPICIOUS_SPEC_MESSAGE = 'Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack';
48
+ /**
49
+ * Rend un `DOMOutputSpec` en DOM, comme `DOMSerializer.renderSpec`, mais en posant chaque
50
+ * attribut avec `setAttribute` (le `style` reste verbatim). Le trou `0` désigne le
51
+ * `contentDOM`, un espace dans le nom de balise introduit un espace de noms XML.
52
+ *
53
+ * `blockArraysIn` : attributs du nœud ou de la marque rendu ; tout tableau de spec qui en
54
+ * provient (identité) est refusé, comme le fait ProseMirror. Les deux autres gardes de
55
+ * `renderSpec` sont portées aussi : un trou de contenu doit être seul dans son parent, et
56
+ * il ne peut y en avoir qu'un par spec.
57
+ */
58
+ export function renderRawSpec(doc, spec, xmlNS = null, blockArraysIn = null) {
59
+ if (typeof spec === 'string') {
60
+ return { dom: doc.createTextNode(spec) };
61
+ }
62
+ if (isDomNode(spec)) {
63
+ return { dom: spec };
64
+ }
65
+ if (isRenderedSpec(spec)) {
66
+ return spec;
67
+ }
68
+ if (!Array.isArray(spec) || typeof spec[0] !== 'string') {
69
+ throw new RangeError('Invalid array passed to renderRawSpec');
70
+ }
71
+ if (blockArraysIn && suspiciousArrays(blockArraysIn).includes(spec)) {
72
+ throw new RangeError(SUSPICIOUS_SPEC_MESSAGE);
73
+ }
74
+ const [rawTag, ...rest] = spec;
75
+ let tagName = rawTag;
76
+ let namespace = xmlNS;
77
+ const space = tagName.indexOf(' ');
78
+ if (space > 0) {
79
+ namespace = tagName.slice(0, space);
80
+ tagName = tagName.slice(space + 1);
81
+ }
82
+ const dom = (namespace ? doc.createElementNS(namespace, tagName) : doc.createElement(tagName));
83
+ let children = rest;
84
+ const [attrs] = rest;
85
+ if (isAttributes(attrs)) {
86
+ children = rest.slice(1);
87
+ for (const [name, value] of Object.entries(attrs)) {
88
+ if (value === null || value === undefined) {
89
+ continue;
90
+ }
91
+ const nameSpace = name.indexOf(' ');
92
+ if (nameSpace > 0) {
93
+ dom.setAttributeNS(name.slice(0, nameSpace), name.slice(nameSpace + 1), String(value));
94
+ }
95
+ else {
96
+ dom.setAttribute(name, String(value));
97
+ }
98
+ }
99
+ }
100
+ let contentDOM;
101
+ children.forEach((child) => {
102
+ if (child === 0) {
103
+ if (children.length > 1) {
104
+ throw new RangeError('Content hole must be the only child of its parent node');
105
+ }
106
+ contentDOM = dom;
107
+ return;
108
+ }
109
+ const rendered = renderRawSpec(doc, child, namespace, blockArraysIn);
110
+ dom.appendChild(rendered.dom);
111
+ if (rendered.contentDOM) {
112
+ if (contentDOM) {
113
+ throw new RangeError('Multiple content holes');
114
+ }
115
+ contentDOM = rendered.contentDOM;
116
+ }
117
+ });
118
+ return contentDOM ? { dom, contentDOM } : { dom };
119
+ }
120
+ /** Un sérialiseur par schéma : le schéma est immuable, le sérialiseur aussi. */
121
+ const serializers = new WeakMap();
122
+ /** Convertit un `Rendered` en `DOMOutputSpec` accepté par ProseMirror. */
123
+ function toSpec(rendered) {
124
+ const dom = rendered.dom;
125
+ return rendered.contentDOM ? { dom, contentDOM: rendered.contentDOM } : dom;
126
+ }
127
+ /**
128
+ * Sérialiseur dérivé de celui du schéma : chaque `toDOM` de nœud et de marque est rendu
129
+ * par `renderRawSpec` avant d'être confié à ProseMirror, qui n'a plus qu'à assembler.
130
+ */
131
+ export function createRawStyleSerializer(schema) {
132
+ const cached = serializers.get(schema);
133
+ if (cached) {
134
+ return cached;
135
+ }
136
+ const base = DOMSerializer.fromSchema(schema);
137
+ const nodes = {};
138
+ for (const [name, toDOM] of Object.entries(base.nodes)) {
139
+ nodes[name] = (node) => toSpec(renderRawSpec(document, toDOM(node), null, node.attrs));
140
+ }
141
+ const marks = {};
142
+ for (const [name, toDOM] of Object.entries(base.marks)) {
143
+ marks[name] = (mark, inline) => toSpec(renderRawSpec(document, toDOM(mark, inline), null, mark.attrs));
144
+ }
145
+ const serializer = new DOMSerializer(nodes, marks);
146
+ serializers.set(schema, serializer);
147
+ return serializer;
148
+ }
149
+ /**
150
+ * HTML d'un document ProseMirror, équivalent de `editor.getHTML()` de Tiptap, avec les
151
+ * `style` verbatim. C'est l'entrée de `normalizeOutputHtml` dans `AsterEditor.getHTML`.
152
+ */
153
+ export function serializeDocumentHtml(doc) {
154
+ const fragment = createRawStyleSerializer(doc.type.schema).serializeFragment(doc.content);
155
+ const container = document.implementation.createHTMLDocument().createElement('div');
156
+ container.appendChild(fragment);
157
+ return container.innerHTML;
158
+ }
159
+ //# sourceMappingURL=serialize-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize-html.js","sourceRoot":"","sources":["../../src/html/serialize-html.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C,2FAA2F;AAC3F,eAAO,MAAM,EAAE,EAAE,eAgEhB,CAAC"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C,2FAA2F;AAC3F,eAAO,MAAM,EAAE,EAAE,eAwEhB,CAAC"}