@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.
- package/README.md +191 -92
- package/dist/api/commands.d.ts +8 -1
- package/dist/api/commands.d.ts.map +1 -1
- package/dist/api/commands.js +3 -0
- package/dist/api/commands.js.map +1 -1
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/layout.d.ts +181 -0
- package/dist/api/layout.d.ts.map +1 -0
- package/dist/api/layout.js +28 -0
- package/dist/api/layout.js.map +1 -0
- package/dist/api/options.d.ts +6 -0
- package/dist/api/options.d.ts.map +1 -1
- package/dist/commands/layout.d.ts +40 -0
- package/dist/commands/layout.d.ts.map +1 -0
- package/dist/commands/layout.js +262 -0
- package/dist/commands/layout.js.map +1 -0
- package/dist/commands/standard.d.ts +4 -3
- package/dist/commands/standard.d.ts.map +1 -1
- package/dist/commands/standard.js +7 -3
- package/dist/commands/standard.js.map +1 -1
- package/dist/editor/aster-editor.d.ts +16 -1
- package/dist/editor/aster-editor.d.ts.map +1 -1
- package/dist/editor/aster-editor.js +41 -1
- package/dist/editor/aster-editor.js.map +1 -1
- package/dist/extensions/aster-extensions.d.ts +3 -0
- package/dist/extensions/aster-extensions.d.ts.map +1 -1
- package/dist/extensions/aster-extensions.js +24 -5
- package/dist/extensions/aster-extensions.js.map +1 -1
- package/dist/extensions/header-footer-sanitize.d.ts +22 -0
- package/dist/extensions/header-footer-sanitize.d.ts.map +1 -0
- package/dist/extensions/header-footer-sanitize.js +226 -0
- package/dist/extensions/header-footer-sanitize.js.map +1 -0
- package/dist/extensions/layout-css.d.ts +88 -0
- package/dist/extensions/layout-css.d.ts.map +1 -0
- package/dist/extensions/layout-css.js +297 -0
- package/dist/extensions/layout-css.js.map +1 -0
- package/dist/extensions/list-layout.d.ts +23 -0
- package/dist/extensions/list-layout.d.ts.map +1 -0
- package/dist/extensions/list-layout.js +65 -0
- package/dist/extensions/list-layout.js.map +1 -0
- package/dist/extensions/page-break.d.ts +8 -0
- package/dist/extensions/page-break.d.ts.map +1 -0
- package/dist/extensions/page-break.js +20 -0
- package/dist/extensions/page-break.js.map +1 -0
- package/dist/extensions/page-view.d.ts +68 -0
- package/dist/extensions/page-view.d.ts.map +1 -0
- package/dist/extensions/page-view.js +189 -0
- package/dist/extensions/page-view.js.map +1 -0
- package/dist/extensions/pagination-controller.d.ts +110 -0
- package/dist/extensions/pagination-controller.d.ts.map +1 -0
- package/dist/extensions/pagination-controller.js +295 -0
- package/dist/extensions/pagination-controller.js.map +1 -0
- package/dist/extensions/pagination-layout.d.ts +54 -0
- package/dist/extensions/pagination-layout.d.ts.map +1 -0
- package/dist/extensions/pagination-layout.js +109 -0
- package/dist/extensions/pagination-layout.js.map +1 -0
- package/dist/extensions/pagination-measure.d.ts +42 -0
- package/dist/extensions/pagination-measure.d.ts.map +1 -0
- package/dist/extensions/pagination-measure.js +108 -0
- package/dist/extensions/pagination-measure.js.map +1 -0
- package/dist/extensions/pagination.d.ts +36 -0
- package/dist/extensions/pagination.d.ts.map +1 -0
- package/dist/extensions/pagination.js +69 -0
- package/dist/extensions/pagination.js.map +1 -0
- package/dist/extensions/paragraph-layout.d.ts +62 -0
- package/dist/extensions/paragraph-layout.d.ts.map +1 -0
- package/dist/extensions/paragraph-layout.js +227 -0
- package/dist/extensions/paragraph-layout.js.map +1 -0
- package/dist/extensions/run-layout.d.ts +79 -0
- package/dist/extensions/run-layout.d.ts.map +1 -0
- package/dist/extensions/run-layout.js +302 -0
- package/dist/extensions/run-layout.js.map +1 -0
- package/dist/extensions/table-layout.d.ts +85 -0
- package/dist/extensions/table-layout.d.ts.map +1 -0
- package/dist/extensions/table-layout.js +314 -0
- package/dist/extensions/table-layout.js.map +1 -0
- package/dist/html/serialize-html.d.ts +42 -0
- package/dist/html/serialize-html.d.ts.map +1 -0
- package/dist/html/serialize-html.js +159 -0
- package/dist/html/serialize-html.js.map +1 -0
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +8 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/fr.d.ts.map +1 -1
- package/dist/i18n/fr.js +8 -0
- package/dist/i18n/fr.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { Extension } from '@tiptap/core';
|
|
2
|
+
import { PARAGRAPH_LAYOUT_ATTR_NAMES, } from '../api';
|
|
3
|
+
import { betweenBorder, borderDeclarations, formatBorderValue, formatNumber, formatPt, isLayoutNumber, joinDeclarations, normalizeColor, parseBorderValue, parsePt, parseSideBorders, parseStyleDeclarations, roundLayoutNumber, sanitizeBorders, } from './layout-css';
|
|
4
|
+
/** Nom de l'extension, clé dans `editor.extensionManager`. */
|
|
5
|
+
export const PARAGRAPH_LAYOUT_EXTENSION_NAME = 'paragraphLayout';
|
|
6
|
+
/** Types de bloc qui portent les attributs de mise en page, alignés sur `TextAlign`. */
|
|
7
|
+
export const PARAGRAPH_LAYOUT_TYPES = ['paragraph', 'heading'];
|
|
8
|
+
/** Attribut HTML du nom de style Word d'un bloc. */
|
|
9
|
+
export const DOCX_STYLE_ATTRIBUTE = 'data-docx-style';
|
|
10
|
+
/** Attribut HTML booléen « paragraphe solidaire du suivant ». */
|
|
11
|
+
export const KEEP_NEXT_ATTRIBUTE = 'data-keep-next';
|
|
12
|
+
/** Attribut HTML booléen « saut de page avant ». */
|
|
13
|
+
export const PAGE_BREAK_BEFORE_ATTRIBUTE = 'data-page-break-before';
|
|
14
|
+
/** Attribut HTML de la bordure `between` (pas d'équivalent CSS). */
|
|
15
|
+
export const BORDER_BETWEEN_ATTRIBUTE = 'data-border-between';
|
|
16
|
+
/** Attributs numériques (en points) et la propriété CSS qui les porte. */
|
|
17
|
+
const PT_PROPERTIES = [
|
|
18
|
+
['spacingBeforePt', 'margin-top'],
|
|
19
|
+
['spacingAfterPt', 'margin-bottom'],
|
|
20
|
+
['indentLeftPt', 'margin-left'],
|
|
21
|
+
['indentRightPt', 'margin-right'],
|
|
22
|
+
['indentFirstLinePt', 'text-indent'],
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Nombre de mise en page (fini, borné) ou `null` : tout le reste (chaîne, `NaN`, `1e307`)
|
|
26
|
+
* est traité comme absent, pour ne jamais sérialiser `Infinitypt`.
|
|
27
|
+
*/
|
|
28
|
+
function numberOrNull(value) {
|
|
29
|
+
return isLayoutNumber(value) ? roundLayoutNumber(value) : null;
|
|
30
|
+
}
|
|
31
|
+
/** Nombre lu dans un `style` : `null` si hors bornes ou illisible. */
|
|
32
|
+
function parsedNumber(text) {
|
|
33
|
+
const number = Number.parseFloat(text);
|
|
34
|
+
return isLayoutNumber(number) ? roundLayoutNumber(number) : null;
|
|
35
|
+
}
|
|
36
|
+
/** Chaîne non vide ou `null`. */
|
|
37
|
+
function stringOrNull(value) {
|
|
38
|
+
return typeof value === 'string' && value !== '' ? value : null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Lit un `line-height` : nombre sans unité ou pourcentage → multiple, longueur → points.
|
|
42
|
+
* `normal` et les valeurs inconnues donnent deux `null`.
|
|
43
|
+
*/
|
|
44
|
+
export function parseLineHeight(value) {
|
|
45
|
+
if (!value) {
|
|
46
|
+
return { lineHeight: null, lineHeightPt: null };
|
|
47
|
+
}
|
|
48
|
+
const trimmed = value.trim();
|
|
49
|
+
const multiple = /^(\d+(?:\.\d+)?)$/.exec(trimmed);
|
|
50
|
+
if (multiple?.[1] !== undefined) {
|
|
51
|
+
return { lineHeight: parsedNumber(multiple[1]), lineHeightPt: null };
|
|
52
|
+
}
|
|
53
|
+
const percent = /^(\d+(?:\.\d+)?)%$/.exec(trimmed);
|
|
54
|
+
if (percent?.[1] !== undefined) {
|
|
55
|
+
const ratio = parsedNumber(percent[1]);
|
|
56
|
+
return {
|
|
57
|
+
lineHeight: ratio === null ? null : roundLayoutNumber(ratio / 100),
|
|
58
|
+
lineHeightPt: null,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const pt = parsePt(trimmed);
|
|
62
|
+
return { lineHeight: null, lineHeightPt: pt !== null && pt > 0 ? pt : null };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Lit tous les attributs de mise en page d'un élément de bloc : `style` inline et
|
|
66
|
+
* attributs `data-*`. Un attribut absent vaut `null`.
|
|
67
|
+
*/
|
|
68
|
+
export function parseParagraphLayout(element) {
|
|
69
|
+
const declarations = parseStyleDeclarations(element.getAttribute('style'));
|
|
70
|
+
const { lineHeight, lineHeightPt } = parseLineHeight(declarations.get('line-height') ?? null);
|
|
71
|
+
const borders = parseSideBorders(declarations);
|
|
72
|
+
const between = parseBorderValue('between', element.getAttribute(BORDER_BETWEEN_ATTRIBUTE));
|
|
73
|
+
if (between) {
|
|
74
|
+
borders.push(between);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
lineHeight,
|
|
78
|
+
lineHeightPt,
|
|
79
|
+
spacingBeforePt: parsePt(declarations.get('margin-top')),
|
|
80
|
+
spacingAfterPt: parsePt(declarations.get('margin-bottom')),
|
|
81
|
+
indentLeftPt: parsePt(declarations.get('margin-left')),
|
|
82
|
+
indentRightPt: parsePt(declarations.get('margin-right')),
|
|
83
|
+
indentFirstLinePt: parsePt(declarations.get('text-indent')),
|
|
84
|
+
borders: borders.length > 0 ? borders : null,
|
|
85
|
+
shading: normalizeColor(declarations.get('background-color')),
|
|
86
|
+
keepWithNext: element.hasAttribute(KEEP_NEXT_ATTRIBUTE) ? true : null,
|
|
87
|
+
pageBreakBefore: element.hasAttribute(PAGE_BREAK_BEFORE_ATTRIBUTE) ? true : null,
|
|
88
|
+
docxStyle: stringOrNull(element.getAttribute(DOCX_STYLE_ATTRIBUTE)),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Déclarations CSS d'un jeu d'attributs, dans l'ordre figé du contrat : `line-height`,
|
|
93
|
+
* `margin-top`, `margin-bottom`, `margin-left`, `margin-right`, `text-indent`,
|
|
94
|
+
* `border-*`, `background-color`. `lineHeightPt` l'emporte sur `lineHeight`.
|
|
95
|
+
*/
|
|
96
|
+
export function paragraphLayoutDeclarations(attributes) {
|
|
97
|
+
const declarations = [];
|
|
98
|
+
const lineHeightPt = numberOrNull(attributes['lineHeightPt']);
|
|
99
|
+
const lineHeight = numberOrNull(attributes['lineHeight']);
|
|
100
|
+
if (lineHeightPt !== null) {
|
|
101
|
+
declarations.push(`line-height: ${formatPt(lineHeightPt)}`);
|
|
102
|
+
}
|
|
103
|
+
else if (lineHeight !== null) {
|
|
104
|
+
declarations.push(`line-height: ${formatNumber(lineHeight)}`);
|
|
105
|
+
}
|
|
106
|
+
for (const [name, property] of PT_PROPERTIES) {
|
|
107
|
+
const value = numberOrNull(attributes[name]);
|
|
108
|
+
if (value !== null) {
|
|
109
|
+
declarations.push(`${property}: ${formatPt(value)}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const borders = sanitizeBorders(attributes['borders']);
|
|
113
|
+
if (borders) {
|
|
114
|
+
declarations.push(...borderDeclarations(borders));
|
|
115
|
+
}
|
|
116
|
+
const shading = normalizeColor(stringOrNull(attributes['shading']));
|
|
117
|
+
if (shading) {
|
|
118
|
+
declarations.push(`background-color: ${shading}`);
|
|
119
|
+
}
|
|
120
|
+
return declarations;
|
|
121
|
+
}
|
|
122
|
+
/** Valeur `data-border-between` d'un jeu d'attributs, `null` sans bordure `between`. */
|
|
123
|
+
export function paragraphBorderBetween(attributes) {
|
|
124
|
+
const borders = sanitizeBorders(attributes['borders']);
|
|
125
|
+
const between = borders ? betweenBorder(borders) : null;
|
|
126
|
+
return between ? formatBorderValue(between) : null;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Attributs HTML complets d'un jeu d'attributs de mise en page, dans l'ordre : `style`,
|
|
130
|
+
* `data-border-between`, `data-docx-style`, `data-keep-next`, `data-page-break-before`.
|
|
131
|
+
* C'est ce que `renderHTML` émet et ce que les tests d'idempotence comparent.
|
|
132
|
+
*/
|
|
133
|
+
export function renderParagraphLayout(attributes) {
|
|
134
|
+
const rendered = {};
|
|
135
|
+
const style = joinDeclarations(paragraphLayoutDeclarations(attributes));
|
|
136
|
+
if (style) {
|
|
137
|
+
rendered['style'] = style;
|
|
138
|
+
}
|
|
139
|
+
const between = paragraphBorderBetween(attributes);
|
|
140
|
+
if (between) {
|
|
141
|
+
rendered[BORDER_BETWEEN_ATTRIBUTE] = between;
|
|
142
|
+
}
|
|
143
|
+
const docxStyle = stringOrNull(attributes['docxStyle']);
|
|
144
|
+
if (docxStyle) {
|
|
145
|
+
rendered[DOCX_STYLE_ATTRIBUTE] = docxStyle;
|
|
146
|
+
}
|
|
147
|
+
if (attributes['keepWithNext'] === true) {
|
|
148
|
+
rendered[KEEP_NEXT_ATTRIBUTE] = '';
|
|
149
|
+
}
|
|
150
|
+
if (attributes['pageBreakBefore'] === true) {
|
|
151
|
+
rendered[PAGE_BREAK_BEFORE_ATTRIBUTE] = '';
|
|
152
|
+
}
|
|
153
|
+
return rendered;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Normalise une valeur d'attribut telle que `setLayout` la reçoit : nombres arrondis,
|
|
157
|
+
* bordures filtrées, couleurs normalisées, booléens stricts.
|
|
158
|
+
*
|
|
159
|
+
* Trois issues, à ne pas confondre : `null` efface l'attribut (demande explicite : `null`,
|
|
160
|
+
* `false`, chaîne vide, tableau vide) ; `undefined` signifie « ignorer » (attribut absent,
|
|
161
|
+
* ou valeur **invalide** : `'abc'` pour un nombre, `NaN`, `1e307`, un mot qui n'est pas une
|
|
162
|
+
* couleur, des bordures toutes mal formées). Une valeur invalide ne doit jamais effacer ce
|
|
163
|
+
* que le bloc portait.
|
|
164
|
+
*/
|
|
165
|
+
export function normalizeParagraphLayoutValue(name, value) {
|
|
166
|
+
if (value === undefined) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
if (value === null) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
switch (name) {
|
|
173
|
+
case 'borders':
|
|
174
|
+
if (!Array.isArray(value)) {
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
return value.length === 0 ? null : (sanitizeBorders(value) ?? undefined);
|
|
178
|
+
case 'shading':
|
|
179
|
+
if (typeof value !== 'string') {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
return value === '' ? null : (normalizeColor(value) ?? undefined);
|
|
183
|
+
case 'docxStyle':
|
|
184
|
+
return typeof value === 'string' ? stringOrNull(value) : undefined;
|
|
185
|
+
case 'keepWithNext':
|
|
186
|
+
case 'pageBreakBefore':
|
|
187
|
+
if (typeof value !== 'boolean') {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
return value ? true : null;
|
|
191
|
+
default:
|
|
192
|
+
return numberOrNull(value) ?? undefined;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Définition d'un attribut de mise en page. Tous sont `default: null`. Le premier
|
|
197
|
+
* (`lineHeight`) émet **tout** le rendu (`style` puis `data-*`, voir
|
|
198
|
+
* `renderParagraphLayout`) en lisant le jeu complet ; les autres n'émettent rien. C'est le
|
|
199
|
+
* seul moyen de garantir l'ordre des déclarations et des attributs, puisque Tiptap
|
|
200
|
+
* fusionne les rendus attribut par attribut dans l'ordre d'enregistrement.
|
|
201
|
+
*/
|
|
202
|
+
function layoutAttribute(name) {
|
|
203
|
+
const parseHTML = (element) => parseParagraphLayout(element)[name];
|
|
204
|
+
if (name === 'lineHeight') {
|
|
205
|
+
return { default: null, parseHTML, renderHTML: renderParagraphLayout };
|
|
206
|
+
}
|
|
207
|
+
return { default: null, parseHTML, renderHTML: () => ({}) };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Extension `ParagraphLayout` : ajoute à `paragraph` et `heading` les attributs de
|
|
211
|
+
* `ParagraphLayoutAttrs`, lus dans le `style` inline et les `data-*`, et sérialisés
|
|
212
|
+
* exactement comme le contrat le fige. Déclarée après `TextAlign` dans le jeu d'Aster :
|
|
213
|
+
* son `text-align` vient en premier dans le `style`, les déclarations de mise en page
|
|
214
|
+
* ensuite. Aucune commande Tiptap : les commandes Aster `paragraph.setLayout` /
|
|
215
|
+
* `paragraph.unsetLayout` manipulent les attributs directement.
|
|
216
|
+
*/
|
|
217
|
+
export const ParagraphLayout = Extension.create({
|
|
218
|
+
name: PARAGRAPH_LAYOUT_EXTENSION_NAME,
|
|
219
|
+
addGlobalAttributes() {
|
|
220
|
+
const attributes = {};
|
|
221
|
+
for (const name of PARAGRAPH_LAYOUT_ATTR_NAMES) {
|
|
222
|
+
attributes[name] = layoutAttribute(name);
|
|
223
|
+
}
|
|
224
|
+
return [{ types: [...PARAGRAPH_LAYOUT_TYPES], attributes }];
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
//# sourceMappingURL=paragraph-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paragraph-layout.js","sourceRoot":"","sources":["../../src/extensions/paragraph-layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Extension, Mark } from '@tiptap/core';
|
|
2
|
+
import type { DecorationStyle } from '../api';
|
|
3
|
+
/** Nom de l'extension qui porte les attributs de run de mise en page. */
|
|
4
|
+
export declare const RUN_LAYOUT_EXTENSION_NAME = "runLayout";
|
|
5
|
+
/** Attribut HTML du nom de style de caractère Word d'un `<span>`. */
|
|
6
|
+
export declare const DOCX_RUN_STYLE_ATTRIBUTE = "data-docx-run-style";
|
|
7
|
+
/** Casses forcées reconnues : `all` = majuscules, `small` = petites capitales. */
|
|
8
|
+
export declare const RUN_CAPS: readonly ["all", "small"];
|
|
9
|
+
export type RunCaps = (typeof RUN_CAPS)[number];
|
|
10
|
+
/** Styles de trait des marques `underline` et `strike`. */
|
|
11
|
+
export declare const DECORATION_STYLES: readonly DecorationStyle[];
|
|
12
|
+
/** Types de marque qui portent `decorationStyle`. */
|
|
13
|
+
export declare const DECORATED_MARK_TYPES: readonly ["underline", "strike"];
|
|
14
|
+
/** Vrai pour `all` ou `small`. */
|
|
15
|
+
export declare function isCaps(value: unknown): value is RunCaps;
|
|
16
|
+
/** Vrai pour un style de trait du contrat. */
|
|
17
|
+
export declare function isDecorationStyle(value: unknown): value is DecorationStyle;
|
|
18
|
+
/**
|
|
19
|
+
* Casse d'un élément depuis son `style` : `text-transform: uppercase` → `all`,
|
|
20
|
+
* `font-variant: small-caps` ou `font-variant-caps: small-caps` → `small`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseCaps(element: HTMLElement): RunCaps | null;
|
|
23
|
+
/** Style de trait contenu dans une valeur `text-decoration` (raccourci), `null` sans. */
|
|
24
|
+
export declare function decorationStyleFromShorthand(value: string | null | undefined): DecorationStyle | null;
|
|
25
|
+
/**
|
|
26
|
+
* Style de trait d'un élément : `text-decoration-style` d'abord, sinon le raccourci
|
|
27
|
+
* `text-decoration: underline double`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseDecorationStyle(element: HTMLElement): DecorationStyle | null;
|
|
30
|
+
/**
|
|
31
|
+
* Extension `RunLayout` : attributs de `RunLayoutAttrs` sur la marque `textStyle`
|
|
32
|
+
* (`letterSpacingPt`, `caps`, `docxRunStyle`) et `decorationStyle` sur `underline` et
|
|
33
|
+
* `strike`. Déclarée après `TextStyleKit` : ses déclarations viennent après `color`,
|
|
34
|
+
* `font-family`… dans le `style` du `<span>`. Les commandes Aster `text.*` sont dans
|
|
35
|
+
* `commands/layout.ts`.
|
|
36
|
+
*/
|
|
37
|
+
export declare const RunLayout: Extension<any, any>;
|
|
38
|
+
/**
|
|
39
|
+
* Réécrit les couleurs d'un `style` rendu en `#rrggbb` minuscules (`#FF0000`,
|
|
40
|
+
* `rgb(255, 0, 0)` → `#ff0000`) ; une valeur que `normalizeColor` ne comprend pas
|
|
41
|
+
* (`var(--x)`) reste telle quelle, l'ordre des déclarations est conservé.
|
|
42
|
+
*/
|
|
43
|
+
export declare function normalizeStyleColors(style: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* `TextStyle` d'Aster : celui de Tiptap, qui ne reconnaît qu'un `<span style>`, avec
|
|
46
|
+
* deux différences :
|
|
47
|
+
*
|
|
48
|
+
* - un `<span data-docx-run-style>` sans `style` (style de caractère Word sans propriété
|
|
49
|
+
* directe) est accepté ;
|
|
50
|
+
* - un `<span style>` dont **aucun** attribut de `textStyle` ne se résout (`text-decoration:
|
|
51
|
+
* underline`, `mso-*` d'un collage Word) est refusé : Tiptap créait une marque vide, qui
|
|
52
|
+
* ressortait en `<span>` nu autour du `<u>` et disparaissait à la relecture.
|
|
53
|
+
*
|
|
54
|
+
* Au rendu, `color` et `background-color` sont normalisés en `#rrggbb` minuscules comme
|
|
55
|
+
* les couleurs du contrat (`api/layout.ts`) : `setColor('#FF0000')` sort `color: #ff0000`.
|
|
56
|
+
* Le reste (fusion des `span` imbriqués) est délégué à la règle d'origine.
|
|
57
|
+
*/
|
|
58
|
+
export declare const AsterTextStyle: Mark<import("@tiptap/extension-text-style").TextStyleOptions, any>;
|
|
59
|
+
/**
|
|
60
|
+
* `Highlight` d'Aster : celui de Tiptap (multicolore), dont la couleur est rendue en
|
|
61
|
+
* `#rrggbb` minuscules (`data-color` et `background-color`), comme `AsterTextStyle`. Une
|
|
62
|
+
* valeur non reconnue reste verbatim. À câbler dans `aster-extensions.ts` à la place de
|
|
63
|
+
* `Highlight.configure({ multicolor: true })`.
|
|
64
|
+
*/
|
|
65
|
+
export declare const AsterHighlight: Mark<import("@tiptap/extension-highlight").HighlightOptions, any>;
|
|
66
|
+
/**
|
|
67
|
+
* `Underline` d'Aster : celui de Tiptap, dont la règle `text-decoration` lit en plus le
|
|
68
|
+
* style de trait du raccourci (`text-decoration: underline double`). Pour `<u>`, c'est
|
|
69
|
+
* l'attribut `decorationStyle` de `RunLayout` qui lit l'élément.
|
|
70
|
+
*/
|
|
71
|
+
export declare const AsterUnderline: Mark<import("@tiptap/extension-underline").UnderlineOptions, any>;
|
|
72
|
+
/**
|
|
73
|
+
* `Strike` d'Aster : celui de `StarterKit`, dont la règle `text-decoration` lit en plus le
|
|
74
|
+
* style de trait du raccourci (`text-decoration: line-through double`), comme
|
|
75
|
+
* `AsterUnderline`. Les règles `<s>`, `<del>`, `<strike>` sont celles d'origine. À câbler
|
|
76
|
+
* dans `aster-extensions.ts` avec `StarterKit.configure({ strike: false })`.
|
|
77
|
+
*/
|
|
78
|
+
export declare const AsterStrike: Mark<any, any>;
|
|
79
|
+
//# sourceMappingURL=run-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-layout.d.ts","sourceRoot":"","sources":["../../src/extensions/run-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,IAAI,EAOL,MAAM,cAAc,CAAC;AAMtB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAU9C,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,cAAc,CAAC;AAErD,qEAAqE;AACrE,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAE9D,kFAAkF;AAClF,eAAO,MAAM,QAAQ,2BAA4B,CAAC;AAElD,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,2DAA2D;AAC3D,eAAO,MAAM,iBAAiB,EAAE,SAAS,eAAe,EAMvD,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,oBAAoB,kCAAmC,CAAC;AAErE,kCAAkC;AAClC,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAEvD;AAED,8CAA8C;AAC9C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,GAAG,IAAI,CAO9D;AAED,yFAAyF;AACzF,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,eAAe,GAAG,IAAI,CAUxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,CAMjF;AA6CD;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,qBAmBpB,CAAC;AA2CH;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,oEAiCzB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,cAAc,mEAoBzB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,cAAc,mEAczB,CAAC;AAgBH;;;;;GAKG;AACH,eAAO,MAAM,WAAW,gBAetB,CAAC"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { Extension, Mark, flattenExtensions, fromString, } from '@tiptap/core';
|
|
2
|
+
import { Highlight } from '@tiptap/extension-highlight';
|
|
3
|
+
import { TextStyle } from '@tiptap/extension-text-style';
|
|
4
|
+
import { Underline } from '@tiptap/extension-underline';
|
|
5
|
+
import { StarterKit } from '@tiptap/starter-kit';
|
|
6
|
+
import { formatPt, isLayoutNumber, normalizeColor, parsePt, parseStyleDeclarations, readStyleProperty, } from './layout-css';
|
|
7
|
+
/** Nom de l'extension qui porte les attributs de run de mise en page. */
|
|
8
|
+
export const RUN_LAYOUT_EXTENSION_NAME = 'runLayout';
|
|
9
|
+
/** Attribut HTML du nom de style de caractère Word d'un `<span>`. */
|
|
10
|
+
export const DOCX_RUN_STYLE_ATTRIBUTE = 'data-docx-run-style';
|
|
11
|
+
/** Casses forcées reconnues : `all` = majuscules, `small` = petites capitales. */
|
|
12
|
+
export const RUN_CAPS = ['all', 'small'];
|
|
13
|
+
/** Styles de trait des marques `underline` et `strike`. */
|
|
14
|
+
export const DECORATION_STYLES = [
|
|
15
|
+
'solid',
|
|
16
|
+
'double',
|
|
17
|
+
'dotted',
|
|
18
|
+
'dashed',
|
|
19
|
+
'wavy',
|
|
20
|
+
];
|
|
21
|
+
/** Types de marque qui portent `decorationStyle`. */
|
|
22
|
+
export const DECORATED_MARK_TYPES = ['underline', 'strike'];
|
|
23
|
+
/** Vrai pour `all` ou `small`. */
|
|
24
|
+
export function isCaps(value) {
|
|
25
|
+
return typeof value === 'string' && RUN_CAPS.includes(value);
|
|
26
|
+
}
|
|
27
|
+
/** Vrai pour un style de trait du contrat. */
|
|
28
|
+
export function isDecorationStyle(value) {
|
|
29
|
+
return typeof value === 'string' && DECORATION_STYLES.includes(value);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Casse d'un élément depuis son `style` : `text-transform: uppercase` → `all`,
|
|
33
|
+
* `font-variant: small-caps` ou `font-variant-caps: small-caps` → `small`.
|
|
34
|
+
*/
|
|
35
|
+
export function parseCaps(element) {
|
|
36
|
+
if (readStyleProperty(element, 'text-transform')?.toLowerCase() === 'uppercase') {
|
|
37
|
+
return 'all';
|
|
38
|
+
}
|
|
39
|
+
const variant = readStyleProperty(element, 'font-variant-caps') ?? readStyleProperty(element, 'font-variant');
|
|
40
|
+
return variant?.toLowerCase().includes('small-caps') ? 'small' : null;
|
|
41
|
+
}
|
|
42
|
+
/** Style de trait contenu dans une valeur `text-decoration` (raccourci), `null` sans. */
|
|
43
|
+
export function decorationStyleFromShorthand(value) {
|
|
44
|
+
if (!value) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
for (const token of value.trim().toLowerCase().split(/\s+/)) {
|
|
48
|
+
if (isDecorationStyle(token)) {
|
|
49
|
+
return token;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Style de trait d'un élément : `text-decoration-style` d'abord, sinon le raccourci
|
|
56
|
+
* `text-decoration: underline double`.
|
|
57
|
+
*/
|
|
58
|
+
export function parseDecorationStyle(element) {
|
|
59
|
+
const explicit = readStyleProperty(element, 'text-decoration-style')?.toLowerCase();
|
|
60
|
+
if (isDecorationStyle(explicit)) {
|
|
61
|
+
return explicit;
|
|
62
|
+
}
|
|
63
|
+
return decorationStyleFromShorthand(readStyleProperty(element, 'text-decoration'));
|
|
64
|
+
}
|
|
65
|
+
/** Attribut `letterSpacingPt` : `letter-spacing: 1pt`. Hors bornes (`1e307`) : rien d'émis. */
|
|
66
|
+
const LETTER_SPACING_ATTRIBUTE = {
|
|
67
|
+
default: null,
|
|
68
|
+
parseHTML: (element) => parsePt(readStyleProperty(element, 'letter-spacing')),
|
|
69
|
+
renderHTML: (attributes) => {
|
|
70
|
+
const value = attributes['letterSpacingPt'];
|
|
71
|
+
return isLayoutNumber(value) ? { style: `letter-spacing: ${formatPt(value)}` } : {};
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
/** Attribut `caps` : `text-transform: uppercase` ou `font-variant: small-caps`. */
|
|
75
|
+
const CAPS_ATTRIBUTE = {
|
|
76
|
+
default: null,
|
|
77
|
+
parseHTML: parseCaps,
|
|
78
|
+
renderHTML: (attributes) => {
|
|
79
|
+
const caps = attributes['caps'];
|
|
80
|
+
if (caps === 'all') {
|
|
81
|
+
return { style: 'text-transform: uppercase' };
|
|
82
|
+
}
|
|
83
|
+
return caps === 'small' ? { style: 'font-variant: small-caps' } : {};
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
/** Attribut `docxRunStyle` : `data-docx-run-style`. */
|
|
87
|
+
const DOCX_RUN_STYLE = {
|
|
88
|
+
default: null,
|
|
89
|
+
parseHTML: (element) => element.getAttribute(DOCX_RUN_STYLE_ATTRIBUTE) || null,
|
|
90
|
+
renderHTML: (attributes) => {
|
|
91
|
+
const value = attributes['docxRunStyle'];
|
|
92
|
+
return typeof value === 'string' && value !== '' ? { [DOCX_RUN_STYLE_ATTRIBUTE]: value } : {};
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
/** Attribut `decorationStyle` : `text-decoration-style: double`. */
|
|
96
|
+
const DECORATION_STYLE_ATTRIBUTE = {
|
|
97
|
+
default: null,
|
|
98
|
+
parseHTML: parseDecorationStyle,
|
|
99
|
+
renderHTML: (attributes) => {
|
|
100
|
+
const value = attributes['decorationStyle'];
|
|
101
|
+
return isDecorationStyle(value) ? { style: `text-decoration-style: ${value}` } : {};
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Extension `RunLayout` : attributs de `RunLayoutAttrs` sur la marque `textStyle`
|
|
106
|
+
* (`letterSpacingPt`, `caps`, `docxRunStyle`) et `decorationStyle` sur `underline` et
|
|
107
|
+
* `strike`. Déclarée après `TextStyleKit` : ses déclarations viennent après `color`,
|
|
108
|
+
* `font-family`… dans le `style` du `<span>`. Les commandes Aster `text.*` sont dans
|
|
109
|
+
* `commands/layout.ts`.
|
|
110
|
+
*/
|
|
111
|
+
export const RunLayout = Extension.create({
|
|
112
|
+
name: RUN_LAYOUT_EXTENSION_NAME,
|
|
113
|
+
addGlobalAttributes() {
|
|
114
|
+
return [
|
|
115
|
+
{
|
|
116
|
+
types: ['textStyle'],
|
|
117
|
+
attributes: {
|
|
118
|
+
letterSpacingPt: LETTER_SPACING_ATTRIBUTE,
|
|
119
|
+
caps: CAPS_ATTRIBUTE,
|
|
120
|
+
docxRunStyle: DOCX_RUN_STYLE,
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
types: [...DECORATED_MARK_TYPES],
|
|
125
|
+
attributes: { decorationStyle: DECORATION_STYLE_ATTRIBUTE },
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
/** Nom de la marque de style de texte de Tiptap. */
|
|
131
|
+
const TEXT_STYLE_MARK_NAME = 'textStyle';
|
|
132
|
+
/**
|
|
133
|
+
* Attributs portés par `textStyle` dans un éditeur donné (ceux de `TextStyleKit`, de
|
|
134
|
+
* `RunLayout` et de l'intégrateur). `extensionManager.attributes` les recalcule à chaque
|
|
135
|
+
* lecture en appelant tous les `addAttributes` : on les fige par éditeur, le jeu
|
|
136
|
+
* d'extensions ne changeant pas après la construction.
|
|
137
|
+
*/
|
|
138
|
+
const textStyleAttributesCache = new WeakMap();
|
|
139
|
+
function textStyleAttributes(editor) {
|
|
140
|
+
const cached = textStyleAttributesCache.get(editor);
|
|
141
|
+
if (cached) {
|
|
142
|
+
return cached;
|
|
143
|
+
}
|
|
144
|
+
const attributes = editor.extensionManager.attributes.filter((attribute) => attribute.type === TEXT_STYLE_MARK_NAME);
|
|
145
|
+
textStyleAttributesCache.set(editor, attributes);
|
|
146
|
+
return attributes;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Vrai si au moins un attribut de `textStyle` se résout sur l'élément, en rejouant ce que
|
|
150
|
+
* Tiptap fera juste après (`parseHTML` de l'attribut, sinon l'attribut HTML du même nom).
|
|
151
|
+
* Une chaîne vide compte pour « absent » : c'est ce que `color` de Tiptap rend quand le
|
|
152
|
+
* `style` ne porte pas de couleur, et ce que `removeEmptyTextStyle` tient pour vide.
|
|
153
|
+
*/
|
|
154
|
+
function resolvesTextStyleAttribute(editor, element) {
|
|
155
|
+
return textStyleAttributes(editor).some(({ name, attribute }) => {
|
|
156
|
+
const value = attribute.parseHTML
|
|
157
|
+
? attribute.parseHTML(element)
|
|
158
|
+
: fromString(element.getAttribute(name));
|
|
159
|
+
return value !== null && value !== undefined && value !== '';
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/** Propriétés CSS de `textStyle` dont la valeur est une couleur du contrat. */
|
|
163
|
+
const COLOR_PROPERTIES = ['color', 'background-color'];
|
|
164
|
+
/**
|
|
165
|
+
* Réécrit les couleurs d'un `style` rendu en `#rrggbb` minuscules (`#FF0000`,
|
|
166
|
+
* `rgb(255, 0, 0)` → `#ff0000`) ; une valeur que `normalizeColor` ne comprend pas
|
|
167
|
+
* (`var(--x)`) reste telle quelle, l'ordre des déclarations est conservé.
|
|
168
|
+
*/
|
|
169
|
+
export function normalizeStyleColors(style) {
|
|
170
|
+
const declarations = [];
|
|
171
|
+
for (const [property, value] of parseStyleDeclarations(style)) {
|
|
172
|
+
const normalized = COLOR_PROPERTIES.includes(property) ? normalizeColor(value) : null;
|
|
173
|
+
declarations.push(`${property}: ${normalized ?? value}`);
|
|
174
|
+
}
|
|
175
|
+
return declarations.join('; ');
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* `TextStyle` d'Aster : celui de Tiptap, qui ne reconnaît qu'un `<span style>`, avec
|
|
179
|
+
* deux différences :
|
|
180
|
+
*
|
|
181
|
+
* - un `<span data-docx-run-style>` sans `style` (style de caractère Word sans propriété
|
|
182
|
+
* directe) est accepté ;
|
|
183
|
+
* - un `<span style>` dont **aucun** attribut de `textStyle` ne se résout (`text-decoration:
|
|
184
|
+
* underline`, `mso-*` d'un collage Word) est refusé : Tiptap créait une marque vide, qui
|
|
185
|
+
* ressortait en `<span>` nu autour du `<u>` et disparaissait à la relecture.
|
|
186
|
+
*
|
|
187
|
+
* Au rendu, `color` et `background-color` sont normalisés en `#rrggbb` minuscules comme
|
|
188
|
+
* les couleurs du contrat (`api/layout.ts`) : `setColor('#FF0000')` sort `color: #ff0000`.
|
|
189
|
+
* Le reste (fusion des `span` imbriqués) est délégué à la règle d'origine.
|
|
190
|
+
*/
|
|
191
|
+
export const AsterTextStyle = TextStyle.extend({
|
|
192
|
+
parseHTML() {
|
|
193
|
+
const [spanRule] = this.parent?.() ?? [];
|
|
194
|
+
const parentGetAttrs = spanRule && 'tag' in spanRule ? spanRule.getAttrs : undefined;
|
|
195
|
+
const { editor } = this;
|
|
196
|
+
return [
|
|
197
|
+
{
|
|
198
|
+
tag: 'span',
|
|
199
|
+
consuming: false,
|
|
200
|
+
getAttrs: (element) => {
|
|
201
|
+
if (element.hasAttribute('style')) {
|
|
202
|
+
const attrs = parentGetAttrs ? parentGetAttrs(element) : {};
|
|
203
|
+
if (attrs === false) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
// Sans éditeur (schéma construit à vide), on garde le comportement de Tiptap.
|
|
207
|
+
return !editor || resolvesTextStyleAttribute(editor, element) ? attrs : false;
|
|
208
|
+
}
|
|
209
|
+
return element.hasAttribute(DOCX_RUN_STYLE_ATTRIBUTE) ? {} : false;
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
];
|
|
213
|
+
},
|
|
214
|
+
renderHTML({ mark, HTMLAttributes }) {
|
|
215
|
+
const style = HTMLAttributes['style'];
|
|
216
|
+
const attributes = typeof style === 'string'
|
|
217
|
+
? { ...HTMLAttributes, style: normalizeStyleColors(style) }
|
|
218
|
+
: HTMLAttributes;
|
|
219
|
+
return this.parent?.({ mark, HTMLAttributes: attributes }) ?? ['span', attributes, 0];
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
/**
|
|
223
|
+
* `Highlight` d'Aster : celui de Tiptap (multicolore), dont la couleur est rendue en
|
|
224
|
+
* `#rrggbb` minuscules (`data-color` et `background-color`), comme `AsterTextStyle`. Une
|
|
225
|
+
* valeur non reconnue reste verbatim. À câbler dans `aster-extensions.ts` à la place de
|
|
226
|
+
* `Highlight.configure({ multicolor: true })`.
|
|
227
|
+
*/
|
|
228
|
+
export const AsterHighlight = Highlight.extend({
|
|
229
|
+
addAttributes() {
|
|
230
|
+
const parent = this.parent?.() ?? {};
|
|
231
|
+
const color = parent['color'];
|
|
232
|
+
if (!color?.renderHTML) {
|
|
233
|
+
return parent;
|
|
234
|
+
}
|
|
235
|
+
const parentRenderHTML = color.renderHTML;
|
|
236
|
+
return {
|
|
237
|
+
...parent,
|
|
238
|
+
color: {
|
|
239
|
+
...color,
|
|
240
|
+
renderHTML: (attributes) => {
|
|
241
|
+
const value = attributes['color'];
|
|
242
|
+
const normalized = typeof value === 'string' ? normalizeColor(value) : null;
|
|
243
|
+
return parentRenderHTML({ ...attributes, color: normalized ?? value });
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
/**
|
|
250
|
+
* `Underline` d'Aster : celui de Tiptap, dont la règle `text-decoration` lit en plus le
|
|
251
|
+
* style de trait du raccourci (`text-decoration: underline double`). Pour `<u>`, c'est
|
|
252
|
+
* l'attribut `decorationStyle` de `RunLayout` qui lit l'élément.
|
|
253
|
+
*/
|
|
254
|
+
export const AsterUnderline = Underline.extend({
|
|
255
|
+
parseHTML() {
|
|
256
|
+
return [
|
|
257
|
+
{ tag: 'u' },
|
|
258
|
+
{
|
|
259
|
+
style: 'text-decoration',
|
|
260
|
+
consuming: false,
|
|
261
|
+
getAttrs: (style) => style.includes('underline')
|
|
262
|
+
? { decorationStyle: decorationStyleFromShorthand(style) }
|
|
263
|
+
: false,
|
|
264
|
+
},
|
|
265
|
+
];
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
/**
|
|
269
|
+
* `Strike` de Tiptap, récupéré dans le jeu de `StarterKit` : `@tiptap/extension-strike`
|
|
270
|
+
* n'est pas une dépendance directe du core et on n'en ajoute pas. `flattenExtensions`
|
|
271
|
+
* instancie les extensions du kit (objets de configuration, sans éditeur), on y prend la
|
|
272
|
+
* marque `strike`.
|
|
273
|
+
*/
|
|
274
|
+
function strikeFromStarterKit() {
|
|
275
|
+
const strike = flattenExtensions([StarterKit]).find((extension) => extension.name === 'strike');
|
|
276
|
+
if (!(strike instanceof Mark)) {
|
|
277
|
+
throw new Error('StarterKit ne fournit plus la marque strike');
|
|
278
|
+
}
|
|
279
|
+
return strike;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* `Strike` d'Aster : celui de `StarterKit`, dont la règle `text-decoration` lit en plus le
|
|
283
|
+
* style de trait du raccourci (`text-decoration: line-through double`), comme
|
|
284
|
+
* `AsterUnderline`. Les règles `<s>`, `<del>`, `<strike>` sont celles d'origine. À câbler
|
|
285
|
+
* dans `aster-extensions.ts` avec `StarterKit.configure({ strike: false })`.
|
|
286
|
+
*/
|
|
287
|
+
export const AsterStrike = strikeFromStarterKit().extend({
|
|
288
|
+
parseHTML() {
|
|
289
|
+
const tagRules = (this.parent?.() ?? []).filter((rule) => 'tag' in rule);
|
|
290
|
+
return [
|
|
291
|
+
...tagRules,
|
|
292
|
+
{
|
|
293
|
+
style: 'text-decoration',
|
|
294
|
+
consuming: false,
|
|
295
|
+
getAttrs: (style) => style.includes('line-through')
|
|
296
|
+
? { decorationStyle: decorationStyleFromShorthand(style) }
|
|
297
|
+
: false,
|
|
298
|
+
},
|
|
299
|
+
];
|
|
300
|
+
},
|
|
301
|
+
});
|
|
302
|
+
//# sourceMappingURL=run-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-layout.js","sourceRoot":"","sources":["../../src/extensions/run-layout.ts"],"names":[],"mappings":"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"}
|