@kodaeditor/core 1.0.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/LICENSE.md +83 -0
- package/README.md +94 -0
- package/THIRD-PARTY-LICENSES.txt +1811 -0
- package/dist/commands.d.ts +15 -0
- package/dist/docx-alignment.d.ts +14 -0
- package/dist/docx-breaks.d.ts +31 -0
- package/dist/docx-forms.d.ts +28 -0
- package/dist/docx-headers.d.ts +22 -0
- package/dist/docx-images.d.ts +41 -0
- package/dist/docx-import.d.ts +36 -0
- package/dist/docx-math.d.ts +18 -0
- package/dist/docx-styles.d.ts +53 -0
- package/dist/docx-symbols.d.ts +19 -0
- package/dist/docx-text-styles.d.ts +27 -0
- package/dist/editor.d.ts +372 -0
- package/dist/fallback.d.ts +13 -0
- package/dist/floatingToolbar.d.ts +7 -0
- package/dist/group-icons.d.ts +17 -0
- package/dist/i18n.d.ts +214 -0
- package/dist/icons.d.ts +1 -0
- package/dist/image-view.d.ts +27 -0
- package/dist/import-formats.d.ts +41 -0
- package/dist/index.d.ts +15 -0
- package/dist/kodaeditor-core.umd.cjs +1 -0
- package/dist/kodaeditor.js +1 -0
- package/dist/kodaeditor.umd.cjs +1 -0
- package/dist/license.d.ts +90 -0
- package/dist/markdown.d.ts +4 -0
- package/dist/menubar.d.ts +60 -0
- package/dist/offline-license.d.ts +36 -0
- package/dist/pagination.d.ts +11 -0
- package/dist/paste.d.ts +54 -0
- package/dist/pdf-import-cdn.d.ts +2 -0
- package/dist/pdf-import.d.ts +8 -0
- package/dist/print.d.ts +18 -0
- package/dist/rtf-images.d.ts +24 -0
- package/dist/schema.d.ts +14 -0
- package/dist/search.d.ts +17 -0
- package/dist/serialize.d.ts +20 -0
- package/dist/slashMenu.d.ts +8 -0
- package/dist/styles.d.ts +8 -0
- package/dist/table-split.d.ts +26 -0
- package/dist/table-view.d.ts +34 -0
- package/dist/tableColumnTrade.d.ts +15 -0
- package/dist/tableToolbar.d.ts +14 -0
- package/dist/toc-view.d.ts +23 -0
- package/dist/toolbar-editor.d.ts +89 -0
- package/dist/validate-signature.d.ts +64 -0
- package/dist/vendor/pdf.min.mjs +29 -0
- package/dist/vendor/pdf.worker.min.mjs +29 -0
- package/dist/vendor/xlsx.full.min.js +24 -0
- package/dist/web-component.d.ts +383 -0
- package/dist/xlsx-import-cdn.d.ts +1 -0
- package/dist/xlsx-import.d.ts +2 -0
- package/package.json +88 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeView оглавления: наполняется динамически из заголовков документа.
|
|
3
|
+
* Сам toc-узел — atom (без редактируемого содержимого); список строится по
|
|
4
|
+
* h1–h6. Перерисовывается при изменении документа (Editor зовёт refresh() из
|
|
5
|
+
* dispatchTransaction). Клик по пункту прокручивает к заголовку.
|
|
6
|
+
*/
|
|
7
|
+
import type { NodeView } from 'prosemirror-view';
|
|
8
|
+
import type { EditorView } from 'prosemirror-view';
|
|
9
|
+
import type { Node as PMNode } from 'prosemirror-model';
|
|
10
|
+
export declare class TocView implements NodeView {
|
|
11
|
+
readonly dom: HTMLElement;
|
|
12
|
+
private node;
|
|
13
|
+
private view;
|
|
14
|
+
private title;
|
|
15
|
+
private registry;
|
|
16
|
+
constructor(node: PMNode, view: EditorView, title: string, registry: Set<TocView>);
|
|
17
|
+
refresh(): void;
|
|
18
|
+
private render;
|
|
19
|
+
private scrollTo;
|
|
20
|
+
update(node: PMNode): boolean;
|
|
21
|
+
ignoreMutation(): boolean;
|
|
22
|
+
destroy(): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Редактор панели «карандаш» - настройка тулбара прямо на месте, без диалога:
|
|
3
|
+
* - drag-and-drop: кнопки перетаскиваются по панели и из палитры снизу;
|
|
4
|
+
* - × убирает кнопку (она возвращается в палитру доступных);
|
|
5
|
+
* - группы: кнопка-группа с обложкой+названием и вложенными кнопками, можно
|
|
6
|
+
* группировать/разгруппировать, перетаскивать кнопки в группу и из неё;
|
|
7
|
+
* - обложка группы: иконка из пакета панели / emoji / загруженное изображение.
|
|
8
|
+
*
|
|
9
|
+
* Во время редактирования источник правды - DOM (chips в контейнерах). При
|
|
10
|
+
* «Готово» раскладка считывается из DOM и сохраняется хостом.
|
|
11
|
+
*/
|
|
12
|
+
import type { Strings } from './i18n';
|
|
13
|
+
import { type GroupIconKind } from './group-icons';
|
|
14
|
+
/** Группа панели: обложка + название + вложенные кнопки (один уровень). */
|
|
15
|
+
export interface GroupSpec {
|
|
16
|
+
type: 'group';
|
|
17
|
+
icon: string;
|
|
18
|
+
iconKind: GroupIconKind;
|
|
19
|
+
label: string;
|
|
20
|
+
items: string[];
|
|
21
|
+
}
|
|
22
|
+
/** Запись раскладки: токен кнопки/разделителя ('|') или группа. */
|
|
23
|
+
export type LayoutEntry = string | GroupSpec;
|
|
24
|
+
export declare function isGroupSpec(e: unknown): e is GroupSpec;
|
|
25
|
+
/** Что редактору нужно от хоста (web-component), чтобы не зависеть от него напрямую. */
|
|
26
|
+
export interface ToolbarEditorHost {
|
|
27
|
+
shell: HTMLElement;
|
|
28
|
+
toolbar: HTMLElement;
|
|
29
|
+
strings: Strings;
|
|
30
|
+
currentEntries(): LayoutEntry[];
|
|
31
|
+
allTokens(): string[];
|
|
32
|
+
tokenLabel(token: string): string;
|
|
33
|
+
tokenIcon(token: string): string;
|
|
34
|
+
save(entries: LayoutEntry[]): void;
|
|
35
|
+
reset(): void;
|
|
36
|
+
}
|
|
37
|
+
export declare class ToolbarEditor {
|
|
38
|
+
private host;
|
|
39
|
+
private active;
|
|
40
|
+
private overlay?;
|
|
41
|
+
private editRow?;
|
|
42
|
+
private palette?;
|
|
43
|
+
private drag?;
|
|
44
|
+
private onMove;
|
|
45
|
+
private onUp;
|
|
46
|
+
private onKey;
|
|
47
|
+
constructor(host: ToolbarEditorHost);
|
|
48
|
+
isActive(): boolean;
|
|
49
|
+
open(): void;
|
|
50
|
+
/** Сброс к дефолтной раскладке: чистим сохранённую + перерисовываем чипы. */
|
|
51
|
+
private resetLayout;
|
|
52
|
+
private done;
|
|
53
|
+
/**
|
|
54
|
+
* Принудительно закрыть снаружи: вызывается при отключении редактора от
|
|
55
|
+
* DOM. Без этого открытая палитра оставляла на document слушатель keydown,
|
|
56
|
+
* который держал в памяти весь отсоединённый редактор.
|
|
57
|
+
*/
|
|
58
|
+
destroy(): void;
|
|
59
|
+
private close;
|
|
60
|
+
private readback;
|
|
61
|
+
private readGroupChip;
|
|
62
|
+
private buildEntryChip;
|
|
63
|
+
/** Перетаскиваемая «фишка» обычной кнопки/разделителя. */
|
|
64
|
+
private buildTokenChip;
|
|
65
|
+
/** Капсула группы в режиме редактирования: обложка, название, вложенные chips, controls. */
|
|
66
|
+
private buildGroupChip;
|
|
67
|
+
private addRemoveBtn;
|
|
68
|
+
private createGroup;
|
|
69
|
+
private ungroup;
|
|
70
|
+
private editGroup;
|
|
71
|
+
private refreshPalette;
|
|
72
|
+
private buildPaletteChip;
|
|
73
|
+
private addToken;
|
|
74
|
+
private makeDraggable;
|
|
75
|
+
private startDrag;
|
|
76
|
+
private positionGhost;
|
|
77
|
+
private handleMove;
|
|
78
|
+
/** Ближайшая фишка-сосед в зоне, перед которой вставлять (по X-середине). */
|
|
79
|
+
private nearestChip;
|
|
80
|
+
private handleUp;
|
|
81
|
+
private endDrag;
|
|
82
|
+
private cancelDrag;
|
|
83
|
+
private openIconPicker;
|
|
84
|
+
private iconCell;
|
|
85
|
+
/** Файл → нормализованный data-URL (контейн 64×64 PNG), чтобы не раздувать localStorage. */
|
|
86
|
+
private fileToIcon;
|
|
87
|
+
private actionBtn;
|
|
88
|
+
private esc;
|
|
89
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Проверка подписи ответа license-сервера.
|
|
3
|
+
*
|
|
4
|
+
* Зачем. Ветка «лицензия подтверждена по кэшу» опирается на localStorage, то
|
|
5
|
+
* есть на данные, которые клиент пишет сам. Без подписи обход выглядит так:
|
|
6
|
+
* закрыть наш домен в hosts, положить одну запись в localStorage - и выгрузки
|
|
7
|
+
* чистые навсегда. Существенно, что это ЛЕГЧЕ, чем снять пометку из кода:
|
|
8
|
+
* патчить бандл умеет разработчик, подделать localStorage - любой по
|
|
9
|
+
* инструкции. Подписанный ответ поднимает цену подделки до обладания нашим
|
|
10
|
+
* приватным ключом.
|
|
11
|
+
*
|
|
12
|
+
* Пара для этих подписей ОТДЕЛЬНАЯ, не та, которой подписываются офлайн-
|
|
13
|
+
* лицензии. Причина несимметричности ущерба: приватный ключ офлайн-пары
|
|
14
|
+
* сознательно не лежит на боевом сервере (см. .env.example license-сервера),
|
|
15
|
+
* потому что его кража позволяет печатать бессрочные лицензии на любой домен,
|
|
16
|
+
* а отозвать их нечем - офлайн-лицензии к нам не обращаются никогда. Ключ для
|
|
17
|
+
* подписи ответов, наоборот, обязан лежать на сервере, смотрящем в интернет;
|
|
18
|
+
* его компрометация стоит ровно перевыпуска пары и обновления константы.
|
|
19
|
+
*
|
|
20
|
+
* Формат: ECDSA P-256 / SHA-256, подпись raw IEEE-P1363 (r||s, 64 байта) в
|
|
21
|
+
* base64url - то, что принимает Web Crypto. Node подписывает в DER по
|
|
22
|
+
* умолчанию, поэтому серверу нужен { dsaEncoding: 'ieee-p1363' }.
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Публичная половина пары, которой license-сервер подписывает ответы /validate.
|
|
26
|
+
* Не секрет по своей природе: нужна только для проверки подписи, не для её
|
|
27
|
+
* создания. Приватная лежит на сервере лицензий в отдельном каталоге, НЕ рядом
|
|
28
|
+
* с keys.json - скрипт бэкапа архивирует весь каталог данных и отправляет в
|
|
29
|
+
* Telegram, так что ключ по соседству уехал бы в мессенджер первым же ночным
|
|
30
|
+
* бэкапом.
|
|
31
|
+
*/
|
|
32
|
+
export declare const VALIDATE_PUBLIC_KEY_SPKI_B64: string;
|
|
33
|
+
/** Ответ /validate в подписанном виде. */
|
|
34
|
+
export interface SignedAnswer {
|
|
35
|
+
valid: boolean;
|
|
36
|
+
plugins: string[];
|
|
37
|
+
/** Момент подписи на сервере, unix-секунды. Подделать нельзя - он под подписью. */
|
|
38
|
+
at: number;
|
|
39
|
+
/** base64url, raw IEEE-P1363. */
|
|
40
|
+
sig: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Каноническая строка, над которой считается подпись.
|
|
44
|
+
*
|
|
45
|
+
* Плагины сортируются: порядок приходит из хранилища сервера и может
|
|
46
|
+
* измениться при любой его правке, а несовпадение порядка ломало бы подпись
|
|
47
|
+
* только у клиентов с двумя и более плагинами - дефект плавающий и
|
|
48
|
+
* мучительный в отладке.
|
|
49
|
+
*
|
|
50
|
+
* Разделитель `|` безопасен: его нет ни в ключе (там A-Z, 0-9 и дефис), ни в
|
|
51
|
+
* домене, ни в именах плагинов. Иначе подпись можно было бы переклеить между
|
|
52
|
+
* полями, сдвинув границу.
|
|
53
|
+
*/
|
|
54
|
+
export declare function canonicalAnswer(key: string, domain: string, valid: boolean, plugins: string[], at: number): string;
|
|
55
|
+
/**
|
|
56
|
+
* Проверяет подпись ответа сервера. Никогда не бросает: любая проблема -
|
|
57
|
+
* битая base64, чужая подпись, отсутствующее поле - это `false`.
|
|
58
|
+
*
|
|
59
|
+
* Мягкого режима нет намеренно: если принимать ответы без подписи, обход
|
|
60
|
+
* сводится к тому, чтобы отдать ответ без неё, и вся защита исчезает. Из
|
|
61
|
+
* этого следует порядок выката - сервер начинает подписывать РАНЬШЕ, чем
|
|
62
|
+
* выходит ядро с этой проверкой.
|
|
63
|
+
*/
|
|
64
|
+
export declare function verifyAnswerSignature(publicKeySpkiB64: string, answer: SignedAnswer, key: string, domain: string): Promise<boolean>;
|