@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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Editor } from '@tiptap/core';
|
|
2
|
-
import type { AsterCounts, AsterDocument, AsterEditor, AsterEventName, AsterEvents, AsterOptions, CommandRegistry, GetHtmlOptions, VariableStore, I18n, Unsubscribe } from '../api';
|
|
2
|
+
import type { AsterCounts, AsterDocument, AsterEditor, AsterEventName, AsterEvents, AsterOptions, CommandRegistry, DocumentLayout, GetHtmlOptions, PageViewOptions, VariableStore, I18n, Unsubscribe } from '../api';
|
|
3
3
|
/** Classe CSS du conteneur créé dans `options.element`. */
|
|
4
4
|
export declare const CONTENT_CLASS = "aster-content";
|
|
5
5
|
/** Message de l'erreur levée par les méthodes de contenu appelées après `destroy()`. */
|
|
@@ -25,7 +25,18 @@ export declare class AsterEditorImpl implements AsterEditor {
|
|
|
25
25
|
/** Document pour lequel `cachedHtml` a été calculé : identité, pas égalité. */
|
|
26
26
|
private cachedDoc;
|
|
27
27
|
private cachedHtml;
|
|
28
|
+
/** Vue page montée, `null` quand elle est inactive. */
|
|
29
|
+
private pageView;
|
|
28
30
|
constructor(options: AsterOptions);
|
|
31
|
+
/**
|
|
32
|
+
* Active, remplace ou désactive la vue page : classe `aster--page-view` et variables
|
|
33
|
+
* `--aster-page-*` sur l'hôte, conteneurs d'en-tête et de pied autour du corps. `true`
|
|
34
|
+
* vaut `{}` (A4 portrait, marges 25,4 mm), `false` retire tout. Indépendante de la
|
|
35
|
+
* lecture seule. Hors contrat : à proposer dans `api/editor.ts`.
|
|
36
|
+
*/
|
|
37
|
+
setPageView(options: boolean | PageViewOptions): void;
|
|
38
|
+
/** Mise en page de la vue page active, `null` si elle est inactive. Hors contrat. */
|
|
39
|
+
getLayout(): DocumentLayout | null;
|
|
29
40
|
/**
|
|
30
41
|
* Mode `placeholders` (défaut) : les puces restent des `span[data-aster-variable]`,
|
|
31
42
|
* résultat mis en cache. Mode `resolve` : les puces sont substituées par leurs valeurs
|
|
@@ -38,6 +49,10 @@ export declare class AsterEditorImpl implements AsterEditor {
|
|
|
38
49
|
* `getHTML()` à chaque `change`, et `normalizeOutputHtml` reparse tout le document
|
|
39
50
|
* dès qu'il contient une table. Le document est immuable, toute transaction en
|
|
40
51
|
* produit un nouveau : le cache s'invalide tout seul, sans compteur ni événement.
|
|
52
|
+
*
|
|
53
|
+
* La sérialisation n'est pas `tiptap.getHTML()` mais `serializeDocumentHtml` : les
|
|
54
|
+
* attributs `style` sortent tels que les extensions les écrivent (`#rrggbb`, ordre du
|
|
55
|
+
* contrat), pas réécrits par le moteur CSS.
|
|
41
56
|
*/
|
|
42
57
|
private placeholdersHtml;
|
|
43
58
|
setHTML(html: string, emit?: boolean): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aster-editor.d.ts","sourceRoot":"","sources":["../../src/editor/aster-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAI1D,OAAO,KAAK,EAEV,WAAW,EACX,aAAa,EACb,WAAW,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,IAAI,EACJ,WAAW,EACZ,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"aster-editor.d.ts","sourceRoot":"","sources":["../../src/editor/aster-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAI1D,OAAO,KAAK,EAEV,WAAW,EACX,aAAa,EACb,WAAW,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACb,IAAI,EACJ,WAAW,EACZ,MAAM,QAAQ,CAAC;AAgBhB,2DAA2D;AAC3D,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,wFAAwF;AACxF,eAAO,MAAM,uBAAuB,6BAAwB,CAAC;AAe7D;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IAErC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,+EAA+E;IAC/E,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,UAAU,CAAM;IACxB,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAA+B;gBAEnC,OAAO,EAAE,YAAY;IA8EjC;;;;;OAKG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI;IAUrD,qFAAqF;IACrF,SAAS,IAAI,cAAc,GAAG,IAAI;IAMlC;;;;;OAKG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM;IAQzC;;;;;;;;;OASG;IACH,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,UAAO,GAAG,IAAI;IAIxC,OAAO,IAAI,aAAa;IAKxB,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,UAAO,GAAG,IAAI;IAI9C;;;;;;;;;;OAUG;IACH,OAAO,CAAC,cAAc;IAiBtB,gFAAgF;IAChF,OAAO,CAAC,YAAY;IAKpB;;;;;OAKG;IACH,OAAO,IAAI,MAAM;IAqBjB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK9B,OAAO,IAAI,OAAO;IAIlB,SAAS,IAAI,WAAW;IAOxB;;;;;;;;;OASG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;IAQ/C,IAAI,IAAI,IAAI;IAIZ,SAAS,IAAI,OAAO;IAIpB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAUjC,UAAU,IAAI,OAAO;IAIrB,WAAW,IAAI,OAAO;IAMtB,uGAAuG;IACvG,EAAE,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW;IAO5E,GAAG,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAItE,IAAI,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAOtF;;;OAGG;IACH,OAAO,IAAI,IAAI;IAef;;;;OAIG;IACH,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -5,10 +5,12 @@ import { createStandardCommands } from '../commands/standard';
|
|
|
5
5
|
import { createAsterExtensions } from '../extensions/aster-extensions';
|
|
6
6
|
import { createImageUploadProps } from '../extensions/image-upload';
|
|
7
7
|
import { resolveLinkPolicy } from '../extensions/link-safety';
|
|
8
|
+
import { applyPageView } from '../extensions/page-view';
|
|
8
9
|
import { createPastePipelineProps } from '../extensions/paste-pipeline';
|
|
9
10
|
import { collectShortcutBindings } from '../extensions/shortcuts';
|
|
10
11
|
import { normalizeOutputHtml } from '../html/normalize-output';
|
|
11
12
|
import { resolveVariablesHtml } from '../html/resolve-variables';
|
|
13
|
+
import { serializeDocumentHtml } from '../html/serialize-html';
|
|
12
14
|
import { createI18n } from '../i18n/create-i18n';
|
|
13
15
|
import { createEventEmitter } from './event-emitter';
|
|
14
16
|
import { VARIABLE_NODE_NAME, createVariableStore, variableText } from './variable-store';
|
|
@@ -47,6 +49,8 @@ export class AsterEditorImpl {
|
|
|
47
49
|
/** Document pour lequel `cachedHtml` a été calculé : identité, pas égalité. */
|
|
48
50
|
cachedDoc = null;
|
|
49
51
|
cachedHtml = '';
|
|
52
|
+
/** Vue page montée, `null` quand elle est inactive. */
|
|
53
|
+
pageView = null;
|
|
50
54
|
constructor(options) {
|
|
51
55
|
this.element = options.element;
|
|
52
56
|
this.emitter = createEventEmitter();
|
|
@@ -106,9 +110,39 @@ export class AsterEditorImpl {
|
|
|
106
110
|
onBlur: ({ event }) => this.emit('blur', { editor: this, event }),
|
|
107
111
|
});
|
|
108
112
|
this.contentElement = this.tiptap.view.dom;
|
|
113
|
+
if (options.pageView) {
|
|
114
|
+
// Une mise en page hostile (en-tête importé d'un .docx) ne doit jamais laisser un
|
|
115
|
+
// éditeur à moitié construit : la vue page est ignorée, l'éditeur reste utilisable.
|
|
116
|
+
try {
|
|
117
|
+
this.setPageView(options.pageView);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.warn('[aster] vue page ignorée : mise en page invalide', error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
109
123
|
// Microtâche : laisse l'appelant s'abonner à `ready` juste après `createEditor`.
|
|
110
124
|
queueMicrotask(() => this.emit('ready', { editor: this }));
|
|
111
125
|
}
|
|
126
|
+
// --- Vue page (hors contrat `AsterEditor`, proposée en session 3) -------
|
|
127
|
+
/**
|
|
128
|
+
* Active, remplace ou désactive la vue page : classe `aster--page-view` et variables
|
|
129
|
+
* `--aster-page-*` sur l'hôte, conteneurs d'en-tête et de pied autour du corps. `true`
|
|
130
|
+
* vaut `{}` (A4 portrait, marges 25,4 mm), `false` retire tout. Indépendante de la
|
|
131
|
+
* lecture seule. Hors contrat : à proposer dans `api/editor.ts`.
|
|
132
|
+
*/
|
|
133
|
+
setPageView(options) {
|
|
134
|
+
this.pageView?.remove();
|
|
135
|
+
this.pageView = null;
|
|
136
|
+
if (options === false || this.destroyed) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const resolved = options === true ? {} : options;
|
|
140
|
+
this.pageView = applyPageView(this.element, this.contentElement, resolved);
|
|
141
|
+
}
|
|
142
|
+
/** Mise en page de la vue page active, `null` si elle est inactive. Hors contrat. */
|
|
143
|
+
getLayout() {
|
|
144
|
+
return this.pageView?.layout ?? null;
|
|
145
|
+
}
|
|
112
146
|
// --- Contenu -------------------------------------------------------------
|
|
113
147
|
/**
|
|
114
148
|
* Mode `placeholders` (défaut) : les puces restent des `span[data-aster-variable]`,
|
|
@@ -128,13 +162,17 @@ export class AsterEditorImpl {
|
|
|
128
162
|
* `getHTML()` à chaque `change`, et `normalizeOutputHtml` reparse tout le document
|
|
129
163
|
* dès qu'il contient une table. Le document est immuable, toute transaction en
|
|
130
164
|
* produit un nouveau : le cache s'invalide tout seul, sans compteur ni événement.
|
|
165
|
+
*
|
|
166
|
+
* La sérialisation n'est pas `tiptap.getHTML()` mais `serializeDocumentHtml` : les
|
|
167
|
+
* attributs `style` sortent tels que les extensions les écrivent (`#rrggbb`, ordre du
|
|
168
|
+
* contrat), pas réécrits par le moteur CSS.
|
|
131
169
|
*/
|
|
132
170
|
placeholdersHtml() {
|
|
133
171
|
const { doc } = this.tiptap.state;
|
|
134
172
|
if (doc === this.cachedDoc) {
|
|
135
173
|
return this.cachedHtml;
|
|
136
174
|
}
|
|
137
|
-
const html = normalizeOutputHtml(
|
|
175
|
+
const html = normalizeOutputHtml(serializeDocumentHtml(doc));
|
|
138
176
|
this.cachedDoc = doc;
|
|
139
177
|
this.cachedHtml = html;
|
|
140
178
|
return html;
|
|
@@ -283,6 +321,8 @@ export class AsterEditorImpl {
|
|
|
283
321
|
this.emit('destroy', { editor: this });
|
|
284
322
|
this.destroyed = true;
|
|
285
323
|
this.emitter.clear();
|
|
324
|
+
this.pageView?.remove();
|
|
325
|
+
this.pageView = null;
|
|
286
326
|
this.tiptap.destroy();
|
|
287
327
|
this.container.remove();
|
|
288
328
|
this.cachedDoc = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aster-editor.js","sourceRoot":"","sources":["../../src/editor/aster-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"aster-editor.js","sourceRoot":"","sources":["../../src/editor/aster-editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,9 @@ export interface AsterExtensionsContext {
|
|
|
16
16
|
* citation, règle, historique, curseurs et nœud de fin. On en retire `link` pour
|
|
17
17
|
* le remplacer par la version sécurisée, et on ajoute tables, alignement, images,
|
|
18
18
|
* indice/exposant, surlignage, styles de texte, tâches, placeholder et compteurs.
|
|
19
|
+
* La mise en page (session 3) s'ajoute par-dessus : attributs de paragraphe après
|
|
20
|
+
* `TextAlign` (son `text-align` reste en tête du `style`), marques de run après
|
|
21
|
+
* `TextStyleKit`, tables et souligné remplacés par leurs versions étendues.
|
|
19
22
|
* Les extensions de l'intégrateur viennent en dernier pour pouvoir surcharger.
|
|
20
23
|
*/
|
|
21
24
|
export declare function createAsterExtensions(context: AsterExtensionsContext): AnyExtension[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aster-extensions.d.ts","sourceRoot":"","sources":["../../src/extensions/aster-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"aster-extensions.d.ts","sourceRoot":"","sources":["../../src/extensions/aster-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQjD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAExD,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAc7E,OAAO,EAA4B,KAAK,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAIvF,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;CAC/C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,YAAY,EAAE,CA8CrF"}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
import { Highlight } from '@tiptap/extension-highlight';
|
|
2
1
|
import { TaskItem, TaskList } from '@tiptap/extension-list';
|
|
3
2
|
import { Subscript } from '@tiptap/extension-subscript';
|
|
4
3
|
import { Superscript } from '@tiptap/extension-superscript';
|
|
5
|
-
import { TableKit } from '@tiptap/extension-table';
|
|
6
4
|
import { TextAlign } from '@tiptap/extension-text-align';
|
|
7
5
|
import { TextStyleKit } from '@tiptap/extension-text-style';
|
|
8
6
|
import { CharacterCount, Placeholder } from '@tiptap/extensions';
|
|
9
7
|
import { StarterKit } from '@tiptap/starter-kit';
|
|
10
8
|
import { createImageExtension } from './image';
|
|
11
9
|
import { createLinkExtension } from './link-safety';
|
|
10
|
+
import { ListLayout } from './list-layout';
|
|
12
11
|
import { Outline } from './outline';
|
|
12
|
+
import { ParagraphLayout } from './paragraph-layout';
|
|
13
|
+
import { AsterHighlight, AsterStrike, AsterTextStyle, AsterUnderline, RunLayout, } from './run-layout';
|
|
14
|
+
import { AsterHorizontalRule } from './page-break';
|
|
15
|
+
import { Pagination } from './pagination';
|
|
13
16
|
import { Search } from './search';
|
|
14
17
|
import { createShortcutsExtension } from './shortcuts';
|
|
18
|
+
import { createTableExtensions } from './table-layout';
|
|
15
19
|
import { Variable } from './variable';
|
|
16
20
|
/**
|
|
17
21
|
* Jeu d'extensions Tiptap d'Aster.
|
|
@@ -20,6 +24,9 @@ import { Variable } from './variable';
|
|
|
20
24
|
* citation, règle, historique, curseurs et nœud de fin. On en retire `link` pour
|
|
21
25
|
* le remplacer par la version sécurisée, et on ajoute tables, alignement, images,
|
|
22
26
|
* indice/exposant, surlignage, styles de texte, tâches, placeholder et compteurs.
|
|
27
|
+
* La mise en page (session 3) s'ajoute par-dessus : attributs de paragraphe après
|
|
28
|
+
* `TextAlign` (son `text-align` reste en tête du `style`), marques de run après
|
|
29
|
+
* `TextStyleKit`, tables et souligné remplacés par leurs versions étendues.
|
|
23
30
|
* Les extensions de l'intégrateur viennent en dernier pour pouvoir surcharger.
|
|
24
31
|
*/
|
|
25
32
|
export function createAsterExtensions(context) {
|
|
@@ -27,22 +34,32 @@ export function createAsterExtensions(context) {
|
|
|
27
34
|
return [
|
|
28
35
|
StarterKit.configure({
|
|
29
36
|
link: false,
|
|
37
|
+
underline: false,
|
|
38
|
+
strike: false,
|
|
39
|
+
horizontalRule: false,
|
|
30
40
|
heading: { levels: [1, 2, 3, 4, 5, 6] },
|
|
31
41
|
dropcursor: { width: 2 },
|
|
32
42
|
}),
|
|
43
|
+
AsterStrike,
|
|
44
|
+
AsterUnderline,
|
|
45
|
+
AsterHorizontalRule,
|
|
33
46
|
createLinkExtension(context.linkPolicy),
|
|
34
47
|
TaskList,
|
|
35
48
|
TaskItem.configure({ nested: true }),
|
|
36
|
-
|
|
49
|
+
...createTableExtensions(),
|
|
37
50
|
// Pas de `defaultAlignment` : en v3 c'est un défaut d'attribut, donc chaque bloc
|
|
38
51
|
// le porterait et sérialiserait `text-align: left` partout. On garde `null` pour
|
|
39
52
|
// un HTML propre ; c'est la commande `alignLeft` qui traite « absent » comme gauche.
|
|
40
53
|
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
|
54
|
+
ParagraphLayout,
|
|
55
|
+
ListLayout,
|
|
41
56
|
createImageExtension(context.linkPolicy),
|
|
42
57
|
Subscript,
|
|
43
58
|
Superscript,
|
|
44
|
-
|
|
45
|
-
TextStyleKit,
|
|
59
|
+
AsterHighlight.configure({ multicolor: true }),
|
|
60
|
+
TextStyleKit.configure({ textStyle: false }),
|
|
61
|
+
AsterTextStyle,
|
|
62
|
+
RunLayout,
|
|
46
63
|
// Lié à l'éditeur Aster : les puces lisent le magasin de valeurs et l'i18n.
|
|
47
64
|
Variable.configure({ aster: editor }),
|
|
48
65
|
Placeholder.configure({
|
|
@@ -53,6 +70,8 @@ export function createAsterExtensions(context) {
|
|
|
53
70
|
Search,
|
|
54
71
|
// Attribut `id` des titres (ancres, sommaire) ; aucun `id` posé sans `getOutline`.
|
|
55
72
|
Outline,
|
|
73
|
+
// Pagination approximative de la vue page (L30) : inactive tant que la vue page l'est.
|
|
74
|
+
Pagination.configure({ aster: editor }),
|
|
56
75
|
createShortcutsExtension(context.shortcuts),
|
|
57
76
|
...(options.extensions ?? []),
|
|
58
77
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aster-extensions.js","sourceRoot":"","sources":["../../src/extensions/aster-extensions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"aster-extensions.js","sourceRoot":"","sources":["../../src/extensions/aster-extensions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAA2B,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,WAAW,EACX,cAAc,EACd,cAAc,EACd,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAkC,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAUtC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACnE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpC,OAAO;QACL,UAAU,CAAC,SAAS,CAAC;YACnB,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,KAAK;YACb,cAAc,EAAE,KAAK;YACrB,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;YACvC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;SACzB,CAAC;QACF,WAAW;QACX,cAAc;QACd,mBAAmB;QACnB,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC;QACvC,QAAQ;QACR,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACpC,GAAG,qBAAqB,EAAE;QAC1B,iFAAiF;QACjF,iFAAiF;QACjF,qFAAqF;QACrF,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;QACxD,eAAe;QACf,UAAU;QACV,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC;QACxC,SAAS;QACT,WAAW;QACX,cAAc,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC9C,YAAY,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC5C,cAAc;QACd,SAAS;QACT,4EAA4E;QAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACrC,WAAW,CAAC,SAAS,CAAC;YACpB,6EAA6E;YAC7E,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC;SAC9E,CAAC;QACF,cAAc;QACd,MAAM;QACN,mFAAmF;QACnF,OAAO;QACP,uFAAuF;QACvF,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACvC,wBAAwB,CAAC,OAAO,CAAC,SAAS,CAAC;QAC3C,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assainissement du HTML des en-têtes et pieds de la vue page (session 3, L26 ; extrait de
|
|
3
|
+
* `page-view.ts` en F30, R30-13, API inchangée : `page-view.ts` réexporte tout). Le core
|
|
4
|
+
* n'avait pas de sanitiseur : celui-ci est volontairement minimal, allowlist stricte de
|
|
5
|
+
* balises et d'attributs, URL et `style` filtrés, profondeur plafonnée.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Profondeur d'imbrication conservée par l'assainissement. Au-delà, un élément est réduit
|
|
9
|
+
* à son texte : un fragment de 8 000 `<div>` imbriqués, possible depuis un `.docx`
|
|
10
|
+
* hostile, ne produit plus qu'un arbre borné.
|
|
11
|
+
*/
|
|
12
|
+
export declare const MAX_SANITIZE_DEPTH = 64;
|
|
13
|
+
/**
|
|
14
|
+
* Assainit un fragment HTML d'en-tête ou de pied avant de l'injecter en `innerHTML` :
|
|
15
|
+
* texte et balises inline/bloc simples uniquement (`p`, titres, `span`, marques, listes,
|
|
16
|
+
* tables, `img`, `a`), attributs `style`, `class`, `data-*`, `href`/`src` sûrs. Jamais de
|
|
17
|
+
* `<script>`, `<style>`, `<iframe>`, ni d'attribut `on*`. Les balises inconnues sont
|
|
18
|
+
* déballées, leur texte conservé, et l'imbrication est plafonnée à `MAX_SANITIZE_DEPTH`.
|
|
19
|
+
* Le core n'avait pas de sanitiseur : celui-ci est volontairement minimal, allowlist stricte.
|
|
20
|
+
*/
|
|
21
|
+
export declare function sanitizeHeaderFooterHtml(html: string): string;
|
|
22
|
+
//# sourceMappingURL=header-footer-sanitize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-footer-sanitize.d.ts","sourceRoot":"","sources":["../../src/extensions/header-footer-sanitize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+IH;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,KAAK,CAAC;AA+ErC;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7D"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assainissement du HTML des en-têtes et pieds de la vue page (session 3, L26 ; extrait de
|
|
3
|
+
* `page-view.ts` en F30, R30-13, API inchangée : `page-view.ts` réexporte tout). Le core
|
|
4
|
+
* n'avait pas de sanitiseur : celui-ci est volontairement minimal, allowlist stricte de
|
|
5
|
+
* balises et d'attributs, URL et `style` filtrés, profondeur plafonnée.
|
|
6
|
+
*/
|
|
7
|
+
/** Balises conservées par l'assainissement des en-têtes et pieds. */
|
|
8
|
+
const ALLOWED_TAGS = new Set([
|
|
9
|
+
'p',
|
|
10
|
+
'h1',
|
|
11
|
+
'h2',
|
|
12
|
+
'h3',
|
|
13
|
+
'h4',
|
|
14
|
+
'h5',
|
|
15
|
+
'h6',
|
|
16
|
+
'div',
|
|
17
|
+
'span',
|
|
18
|
+
'strong',
|
|
19
|
+
'b',
|
|
20
|
+
'em',
|
|
21
|
+
'i',
|
|
22
|
+
'u',
|
|
23
|
+
's',
|
|
24
|
+
'sub',
|
|
25
|
+
'sup',
|
|
26
|
+
'code',
|
|
27
|
+
'br',
|
|
28
|
+
'a',
|
|
29
|
+
'img',
|
|
30
|
+
'ul',
|
|
31
|
+
'ol',
|
|
32
|
+
'li',
|
|
33
|
+
'table',
|
|
34
|
+
'thead',
|
|
35
|
+
'tbody',
|
|
36
|
+
'tr',
|
|
37
|
+
'td',
|
|
38
|
+
'th',
|
|
39
|
+
'hr',
|
|
40
|
+
]);
|
|
41
|
+
/** Balises supprimées avec leur contenu (tout le reste est « déballé »). */
|
|
42
|
+
const DROPPED_TAGS = new Set([
|
|
43
|
+
'script',
|
|
44
|
+
'style',
|
|
45
|
+
'iframe',
|
|
46
|
+
'object',
|
|
47
|
+
'embed',
|
|
48
|
+
'template',
|
|
49
|
+
'noscript',
|
|
50
|
+
'svg',
|
|
51
|
+
'math',
|
|
52
|
+
'form',
|
|
53
|
+
'input',
|
|
54
|
+
'button',
|
|
55
|
+
'textarea',
|
|
56
|
+
'select',
|
|
57
|
+
'link',
|
|
58
|
+
'meta',
|
|
59
|
+
'base',
|
|
60
|
+
]);
|
|
61
|
+
/** Attributs conservés (plus tout `data-*`). */
|
|
62
|
+
const ALLOWED_ATTRIBUTES = new Set([
|
|
63
|
+
'style',
|
|
64
|
+
'class',
|
|
65
|
+
'href',
|
|
66
|
+
'src',
|
|
67
|
+
'alt',
|
|
68
|
+
'title',
|
|
69
|
+
'width',
|
|
70
|
+
'height',
|
|
71
|
+
'colspan',
|
|
72
|
+
'rowspan',
|
|
73
|
+
'type',
|
|
74
|
+
'start',
|
|
75
|
+
'target',
|
|
76
|
+
'rel',
|
|
77
|
+
]);
|
|
78
|
+
/** Schémas d'URL acceptés dans `href` / `src` (plus `data:image/` pour `src` seulement). */
|
|
79
|
+
const ALLOWED_URL_SCHEMES = new Set(['http', 'https', 'mailto', 'tel']);
|
|
80
|
+
/** Caractères de contrôle et blancs ASCII (U+0000 à U+0020), ignorés par les parseurs d'URL. */
|
|
81
|
+
// eslint-disable-next-line no-control-regex -- c'est précisément la plage à retirer.
|
|
82
|
+
const URL_NOISE_PATTERN = /[\u0000- ]/g;
|
|
83
|
+
/**
|
|
84
|
+
* Vrai si une URL d'attribut `href`/`src` est acceptable : ancre, chemin relatif, ou schéma
|
|
85
|
+
* de l'allowlist. Les parseurs d'URL ignorent les caractères de contrôle et les blancs
|
|
86
|
+
* ASCII (`java\tscript:` est lu `javascript:`), pas une regex : ils sont retirés **avant**
|
|
87
|
+
* le test, comme le fait DOMPurify (R23-01). Un `\` vaut `/` pour les schémas spéciaux
|
|
88
|
+
* (`\\evil` → `//evil`) et les URL relatives au protocole (`//evil`) sont refusées.
|
|
89
|
+
*/
|
|
90
|
+
function isSafeUrl(name, value) {
|
|
91
|
+
const stripped = value.replace(URL_NOISE_PATTERN, '').replace(/\\/g, '/').toLowerCase();
|
|
92
|
+
if (stripped === '' || stripped.startsWith('#')) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
if (stripped.startsWith('//')) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
if (stripped.startsWith('/')) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
const scheme = /^([a-z][a-z0-9+.-]*):/.exec(stripped)?.[1];
|
|
102
|
+
if (scheme === undefined) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
if (ALLOWED_URL_SCHEMES.has(scheme)) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return name === 'src' && stripped.startsWith('data:image/');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Vrai si une valeur de `style` ne charge ni n'exécute rien. Le CSS décode les échappements
|
|
112
|
+
* (`\75rl(` est lu `url(`, CSS Syntax L3 §4.3.7) et ignore les commentaires : tout `\` est
|
|
113
|
+
* refusé (Word n'en produit jamais) et les commentaires sont retirés avant de chercher les
|
|
114
|
+
* fonctions qui chargent une ressource (`url(`, `image-set(`, `image(`, `src(`, `element(`)
|
|
115
|
+
* ou exécutent du code (`expression(`, `-moz-binding`, `behavior`) (R23-08).
|
|
116
|
+
*/
|
|
117
|
+
function isSafeStyle(value) {
|
|
118
|
+
if (value.includes('\\')) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const stripped = value.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
122
|
+
return !/(?:url|image-set|image|src|element|expression)\s*\(|javascript:|-moz-binding|behavior\s*:/i.test(stripped);
|
|
123
|
+
}
|
|
124
|
+
/** Filtre les attributs d'un élément en place : allowlist, jamais `on*`, URL et style sûrs. */
|
|
125
|
+
function sanitizeAttributes(element) {
|
|
126
|
+
for (const attribute of [...element.attributes]) {
|
|
127
|
+
const name = attribute.name.toLowerCase();
|
|
128
|
+
const allowed = (ALLOWED_ATTRIBUTES.has(name) || name.startsWith('data-')) &&
|
|
129
|
+
!name.startsWith('on') &&
|
|
130
|
+
(name !== 'href' && name !== 'src' ? true : isSafeUrl(name, attribute.value)) &&
|
|
131
|
+
(name !== 'style' || isSafeStyle(attribute.value));
|
|
132
|
+
if (!allowed) {
|
|
133
|
+
element.removeAttribute(attribute.name);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Profondeur d'imbrication conservée par l'assainissement. Au-delà, un élément est réduit
|
|
139
|
+
* à son texte : un fragment de 8 000 `<div>` imbriqués, possible depuis un `.docx`
|
|
140
|
+
* hostile, ne produit plus qu'un arbre borné.
|
|
141
|
+
*/
|
|
142
|
+
export const MAX_SANITIZE_DEPTH = 64;
|
|
143
|
+
/** Sélecteur des balises supprimées avec leur contenu. */
|
|
144
|
+
const DROPPED_SELECTOR = [...DROPPED_TAGS].join(',');
|
|
145
|
+
/**
|
|
146
|
+
* Remplace un élément trop profond par son seul texte, balises interdites retirées
|
|
147
|
+
* d'abord (leur contenu ne doit pas réapparaître en texte). Une seule passe sur le
|
|
148
|
+
* sous-arbre, quelle que soit sa taille : le déballer niveau par niveau déplacerait le
|
|
149
|
+
* sous-arbre à chaque niveau, ce qui est quadratique dans le DOM.
|
|
150
|
+
*/
|
|
151
|
+
function flattenToText(element) {
|
|
152
|
+
for (const dropped of element.querySelectorAll(DROPPED_SELECTOR)) {
|
|
153
|
+
dropped.remove();
|
|
154
|
+
}
|
|
155
|
+
const text = element.textContent;
|
|
156
|
+
if (text === '') {
|
|
157
|
+
element.remove();
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
element.replaceWith(document.createTextNode(text));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Parcourt les enfants d'un parent : commentaire et balise interdite supprimés, élément
|
|
165
|
+
* trop profond réduit à son texte, balise inconnue déballée (ses enfants remontent et sont
|
|
166
|
+
* examinés à leur tour), balise connue assainie puis empilée. Pile explicite plutôt que
|
|
167
|
+
* récursion : la version récursive faisait déborder la pile d'appels sur un HTML
|
|
168
|
+
* profondément imbriqué (R23-03). Le déballage ne se produit qu'au-dessus du plafond, le
|
|
169
|
+
* coût total reste borné par `MAX_SANITIZE_DEPTH` fois la taille du fragment.
|
|
170
|
+
*/
|
|
171
|
+
function sanitizeTree(root) {
|
|
172
|
+
const stack = [{ parent: root, depth: 0 }];
|
|
173
|
+
for (let frame = stack.pop(); frame !== undefined; frame = stack.pop()) {
|
|
174
|
+
const { parent, depth } = frame;
|
|
175
|
+
let child = parent.firstChild;
|
|
176
|
+
while (child !== null) {
|
|
177
|
+
const following = child.nextSibling;
|
|
178
|
+
if (child.nodeType === Node.COMMENT_NODE) {
|
|
179
|
+
child.remove();
|
|
180
|
+
child = following;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
if (child.nodeType !== Node.ELEMENT_NODE) {
|
|
184
|
+
child = following;
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
const element = child;
|
|
188
|
+
const tag = element.tagName.toLowerCase();
|
|
189
|
+
if (DROPPED_TAGS.has(tag)) {
|
|
190
|
+
element.remove();
|
|
191
|
+
child = following;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (depth >= MAX_SANITIZE_DEPTH) {
|
|
195
|
+
flattenToText(element);
|
|
196
|
+
child = following;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (!ALLOWED_TAGS.has(tag)) {
|
|
200
|
+
// Déballé en place : ses enfants prennent sa position et sont examinés ensuite.
|
|
201
|
+
const first = element.firstChild;
|
|
202
|
+
element.replaceWith(...element.childNodes);
|
|
203
|
+
child = first ?? following;
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
sanitizeAttributes(element);
|
|
207
|
+
stack.push({ parent: element, depth: depth + 1 });
|
|
208
|
+
child = following;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Assainit un fragment HTML d'en-tête ou de pied avant de l'injecter en `innerHTML` :
|
|
214
|
+
* texte et balises inline/bloc simples uniquement (`p`, titres, `span`, marques, listes,
|
|
215
|
+
* tables, `img`, `a`), attributs `style`, `class`, `data-*`, `href`/`src` sûrs. Jamais de
|
|
216
|
+
* `<script>`, `<style>`, `<iframe>`, ni d'attribut `on*`. Les balises inconnues sont
|
|
217
|
+
* déballées, leur texte conservé, et l'imbrication est plafonnée à `MAX_SANITIZE_DEPTH`.
|
|
218
|
+
* Le core n'avait pas de sanitiseur : celui-ci est volontairement minimal, allowlist stricte.
|
|
219
|
+
*/
|
|
220
|
+
export function sanitizeHeaderFooterHtml(html) {
|
|
221
|
+
const template = document.createElement('template');
|
|
222
|
+
template.innerHTML = html;
|
|
223
|
+
sanitizeTree(template.content);
|
|
224
|
+
return template.innerHTML;
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=header-footer-sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-footer-sanitize.js","sourceRoot":"","sources":["../../src/extensions/header-footer-sanitize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { BlockBorder, BorderSide, BorderStyle } from '../api';
|
|
2
|
+
/**
|
|
3
|
+
* Helpers de sérialisation CSS partagés par les extensions de mise en page (paragraphe,
|
|
4
|
+
* run, tableau). Le contrat (`api/layout.ts`) fige la forme des valeurs : points avec au
|
|
5
|
+
* plus deux décimales, couleurs en `#rrggbb` minuscules, bordures `1pt solid #000000`.
|
|
6
|
+
* Tout passe par ici pour que `setHTML(getHTML())` relise exactement ce qu'il a écrit.
|
|
7
|
+
*/
|
|
8
|
+
/** Côtés de bordure portés par un `style` inline, dans l'ordre de sérialisation. */
|
|
9
|
+
export declare const CSS_BORDER_SIDES: readonly ["top", "right", "bottom", "left"];
|
|
10
|
+
export type CssBorderSide = (typeof CSS_BORDER_SIDES)[number];
|
|
11
|
+
/**
|
|
12
|
+
* Borne absolue des nombres de mise en page (points, multiples d'interligne) : ±100 000.
|
|
13
|
+
* Word plafonne bien plus bas (retraits ≤ 1 584 pt, espacements ≤ 1 584 pt), une valeur
|
|
14
|
+
* au-delà vient d'une erreur ou d'une attaque ; surtout, `value * 100` déborde vers
|
|
15
|
+
* `Infinity` dès 1e307 et finirait sérialisé en `Infinitypt` que personne ne relit.
|
|
16
|
+
*/
|
|
17
|
+
export declare const LAYOUT_NUMBER_LIMIT = 100000;
|
|
18
|
+
/**
|
|
19
|
+
* Arrondit à deux décimales au plus, sans zéro superflu (`6` → `6`, `6.5` → `6.5`), en
|
|
20
|
+
* bornant d'abord à ±`LAYOUT_NUMBER_LIMIT` : jamais `Infinity` en sortie. Un `NaN` ressort
|
|
21
|
+
* `NaN` — c'est aux appelants de garder `isLayoutNumber` en amont.
|
|
22
|
+
*/
|
|
23
|
+
export declare function roundLayoutNumber(value: number): number;
|
|
24
|
+
/** Formate une longueur en points : `6pt`, `6.5pt`, jamais plus de deux décimales. */
|
|
25
|
+
export declare function formatPt(value: number): string;
|
|
26
|
+
/** Formate un nombre sans unité (interligne multiple) avec au plus deux décimales. */
|
|
27
|
+
export declare function formatNumber(value: number): string;
|
|
28
|
+
/** Vrai pour un nombre fini, seule valeur acceptée dans les attributs numériques. */
|
|
29
|
+
export declare function isFiniteNumber(value: unknown): value is number;
|
|
30
|
+
/**
|
|
31
|
+
* Vrai pour un nombre de mise en page acceptable : fini et dans ±`LAYOUT_NUMBER_LIMIT`.
|
|
32
|
+
* C'est la garde à poser avant tout `roundLayoutNumber` / `formatPt` sur une valeur qui
|
|
33
|
+
* vient de l'extérieur (arguments de commande, attributs posés par `setJSON`, HTML).
|
|
34
|
+
*/
|
|
35
|
+
export declare function isLayoutNumber(value: unknown): value is number;
|
|
36
|
+
/**
|
|
37
|
+
* Lit une longueur CSS en points. Accepte `pt`, `px` (converti), `0` sans unité ; refuse
|
|
38
|
+
* tout le reste (`em`, `%`, `auto`) : on ne sait pas les convertir sans contexte. Une
|
|
39
|
+
* longueur hors de ±`LAYOUT_NUMBER_LIMIT` est refusée comme une valeur illisible.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parsePt(value: string | null | undefined): number | null;
|
|
42
|
+
/**
|
|
43
|
+
* Découpe un attribut `style` en déclarations ordonnées, propriété en minuscules. Une
|
|
44
|
+
* propriété répétée garde sa dernière valeur. Les `;` dans une valeur ne sont pas gérés
|
|
45
|
+
* (jamais produits par le core, hors `url()`, que la mise en page n'utilise pas).
|
|
46
|
+
*/
|
|
47
|
+
export declare function parseStyleDeclarations(style: string | null | undefined): Map<string, string>;
|
|
48
|
+
/** Lit une propriété du `style` inline d'un élément, `null` si absente. */
|
|
49
|
+
export declare function readStyleProperty(element: HTMLElement, property: string): string | null;
|
|
50
|
+
/**
|
|
51
|
+
* Normalise une couleur CSS en `#rrggbb` minuscules : `#RGB`, `#RRGGBB`, `rgb()` et
|
|
52
|
+
* `rgba()` (alpha ignoré). Un mot-clé connu (`red`, `transparent`) est gardé tel quel en
|
|
53
|
+
* minuscules ; une valeur vide, `none` ou un mot inconnu donne `null`.
|
|
54
|
+
*/
|
|
55
|
+
export declare function normalizeColor(value: string | null | undefined): string | null;
|
|
56
|
+
/** Vrai si la valeur est un style de bordure du contrat. */
|
|
57
|
+
export declare function isBorderStyle(value: unknown): value is BorderStyle;
|
|
58
|
+
/** Vrai si la valeur est un côté de bordure du contrat (`between` compris). */
|
|
59
|
+
export declare function isBorderSide(value: unknown): value is BorderSide;
|
|
60
|
+
/** Vrai si l'objet est une `BlockBorder` complète et valide. */
|
|
61
|
+
export declare function isBlockBorder(value: unknown): value is BlockBorder;
|
|
62
|
+
/** Ne garde que les bordures valides d'une valeur d'attribut, `null` s'il n'en reste aucune. */
|
|
63
|
+
export declare function sanitizeBorders(value: unknown): BlockBorder[] | null;
|
|
64
|
+
/** Valeur CSS d'une bordure : `1pt solid #000000`. */
|
|
65
|
+
export declare function formatBorderValue(border: BlockBorder): string;
|
|
66
|
+
/**
|
|
67
|
+
* Lit une valeur de bordure CSS (`1pt solid #000000`, `solid 1px red`, ordre libre).
|
|
68
|
+
* `none` ou `hidden` donnent `null`. Épaisseur par défaut 1pt, style `solid`, couleur noire,
|
|
69
|
+
* pour accepter un `border-bottom: solid` minimaliste.
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseBorderValue(side: BorderSide, value: string | null | undefined): BlockBorder | null;
|
|
72
|
+
/**
|
|
73
|
+
* Lit les bordures d'un élément depuis son `style` : `border` (raccourci, quatre côtés)
|
|
74
|
+
* puis `border-<côté>` qui l'emporte côté par côté. Ordre de sortie : top, right, bottom,
|
|
75
|
+
* left. `null` sans bordure.
|
|
76
|
+
*/
|
|
77
|
+
export declare function parseSideBorders(declarations: Map<string, string>): BlockBorder[];
|
|
78
|
+
/**
|
|
79
|
+
* Déclarations `border-<côté>` d'une liste de bordures, dans l'ordre top, right, bottom,
|
|
80
|
+
* left ; la dernière bordure d'un même côté l'emporte. `between` est ignoré ici (il n'a
|
|
81
|
+
* pas d'équivalent CSS, le paragraphe le porte en `data-border-between`).
|
|
82
|
+
*/
|
|
83
|
+
export declare function borderDeclarations(borders: readonly BlockBorder[]): string[];
|
|
84
|
+
/** Bordure `between` d'une liste, la dernière s'il y en a plusieurs, sinon `null`. */
|
|
85
|
+
export declare function betweenBorder(borders: readonly BlockBorder[]): BlockBorder | null;
|
|
86
|
+
/** Assemble des déclarations en un attribut `style` (`a: 1; b: 2`), `null` si aucune. */
|
|
87
|
+
export declare function joinDeclarations(declarations: readonly string[]): string | null;
|
|
88
|
+
//# sourceMappingURL=layout-css.d.ts.map
|