@kodaeditor/core 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docx-import.d.ts +11 -11
- package/dist/editor.d.ts +109 -159
- package/dist/fallback.d.ts +7 -8
- package/dist/i18n.d.ts +15 -26
- package/dist/import-formats.d.ts +19 -17
- package/dist/index.d.ts +4 -4
- package/dist/kodaeditor-core.umd.cjs +1 -1
- package/dist/kodaeditor.js +1 -1
- package/dist/kodaeditor.umd.cjs +1 -1
- package/dist/license.d.ts +46 -50
- package/dist/schema.d.ts +7 -7
- package/dist/serialize.d.ts +11 -11
- package/dist/web-component.d.ts +80 -189
- package/package.json +4 -6
- package/dist/commands.d.ts +0 -15
- package/dist/docx-alignment.d.ts +0 -14
- package/dist/docx-breaks.d.ts +0 -31
- package/dist/docx-forms.d.ts +0 -28
- package/dist/docx-headers.d.ts +0 -22
- package/dist/docx-images.d.ts +0 -41
- package/dist/docx-math.d.ts +0 -18
- package/dist/docx-styles.d.ts +0 -53
- package/dist/docx-symbols.d.ts +0 -19
- package/dist/docx-text-styles.d.ts +0 -27
- package/dist/floatingToolbar.d.ts +0 -7
- package/dist/group-icons.d.ts +0 -17
- package/dist/icons.d.ts +0 -1
- package/dist/image-view.d.ts +0 -27
- package/dist/markdown.d.ts +0 -4
- package/dist/menubar.d.ts +0 -60
- package/dist/offline-license.d.ts +0 -36
- package/dist/pagination.d.ts +0 -11
- package/dist/paste.d.ts +0 -54
- package/dist/pdf-import-cdn.d.ts +0 -2
- package/dist/pdf-import.d.ts +0 -8
- package/dist/print.d.ts +0 -18
- package/dist/rtf-images.d.ts +0 -24
- package/dist/search.d.ts +0 -17
- package/dist/slashMenu.d.ts +0 -8
- package/dist/styles.d.ts +0 -8
- package/dist/table-split.d.ts +0 -26
- package/dist/table-view.d.ts +0 -34
- package/dist/tableColumnTrade.d.ts +0 -15
- package/dist/tableToolbar.d.ts +0 -14
- package/dist/toc-view.d.ts +0 -23
- package/dist/toolbar-editor.d.ts +0 -89
- package/dist/validate-signature.d.ts +0 -64
- package/dist/xlsx-import-cdn.d.ts +0 -1
- package/dist/xlsx-import.d.ts +0 -2
package/dist/web-component.d.ts
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import type { DocxImportResult } from './docx-import';
|
|
2
2
|
import { type Strings } from './i18n';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Class base: HTMLElement in a browser, an empty class where there is no DOM.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `import '@kodaeditor/core'`
|
|
9
|
-
*
|
|
10
|
-
* Node).
|
|
11
|
-
*
|
|
12
|
-
* используется.
|
|
6
|
+
* `class X extends HTMLElement` runs when the MODULE LOADS, not when an
|
|
7
|
+
* element is created, so without this substitution the mere act of
|
|
8
|
+
* `import '@kodaeditor/core'` threw "HTMLElement is not defined" during
|
|
9
|
+
* server-side rendering (Next.js, Nuxt and SvelteKit import host modules in
|
|
10
|
+
* Node). Registration of <koda-editor> already happens only when a window
|
|
11
|
+
* exists, so on the server this class is simply never used.
|
|
13
12
|
*/
|
|
14
13
|
declare const ElementBase: typeof HTMLElement;
|
|
15
14
|
export declare class KodaEditorElement extends ElementBase {
|
|
@@ -18,30 +17,14 @@ export declare class KodaEditorElement extends ElementBase {
|
|
|
18
17
|
private buttons;
|
|
19
18
|
private contentEl?;
|
|
20
19
|
private stringsValue;
|
|
20
|
+
private localeValue;
|
|
21
|
+
private localeExplicit;
|
|
21
22
|
private internals?;
|
|
22
23
|
private pendingValue?;
|
|
23
|
-
/** Словарь клиента, заданный свойством до монтирования. */
|
|
24
24
|
private pendingStrings?;
|
|
25
25
|
private suppressChange;
|
|
26
26
|
private fsKeyHandler?;
|
|
27
|
-
/**
|
|
28
|
-
* Номер цикла монтирования. Нужен, чтобы асинхронная проверка лицензии
|
|
29
|
-
* знала, тот ли редактор она застала: при реконсиляции во фреймворках
|
|
30
|
-
* элемент отключают и тут же подключают снова, и результаты проверок
|
|
31
|
-
* прошлых циклов приходили в уже новый редактор - водяные знаки копились
|
|
32
|
-
* (проверено: три знака после трёх циклов remove/append).
|
|
33
|
-
*/
|
|
34
27
|
private mountGeneration;
|
|
35
|
-
/**
|
|
36
|
-
* Запасное поле формы для браузеров без ElementInternals.
|
|
37
|
-
*
|
|
38
|
-
* attachInternals появился в Safari только в 16.4 (март 2023), а корпоративные
|
|
39
|
-
* маки застревают на старых версиях macOS надолго. Там Shadow DOM есть, то
|
|
40
|
-
* есть редактор поднимается полноценно и откат на textarea НЕ срабатывает -
|
|
41
|
-
* а значение в форму не попадает, потому что некому его туда положить.
|
|
42
|
-
* Пользователь печатает, жмёт «Отправить», на сервер не уходит ничего. Тот же
|
|
43
|
-
* молчаливый класс, что и потерянный name в откате (исправлено 11.09.2026).
|
|
44
|
-
*/
|
|
45
28
|
private shadowFormInput?;
|
|
46
29
|
private searchBar?;
|
|
47
30
|
private searchFindInput?;
|
|
@@ -54,14 +37,14 @@ export declare class KodaEditorElement extends ElementBase {
|
|
|
54
37
|
private readonly onPasteRich;
|
|
55
38
|
static get observedAttributes(): string[];
|
|
56
39
|
/**
|
|
57
|
-
*
|
|
40
|
+
* Reacts to attribute changes after the element is mounted.
|
|
58
41
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
42
|
+
* Before mounting, values are picked up in connectedCallback, so early
|
|
43
|
+
* calls are ignored - the browser also fires this callback while parsing
|
|
44
|
+
* the markup.
|
|
62
45
|
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
46
|
+
* Note that `locale` and `lang` are read once, when the element connects.
|
|
47
|
+
* Changing them later logs a warning instead of silently doing nothing.
|
|
65
48
|
*/
|
|
66
49
|
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
67
50
|
connectedCallback(): void;
|
|
@@ -72,142 +55,105 @@ export declare class KodaEditorElement extends ElementBase {
|
|
|
72
55
|
private getSavedLayout;
|
|
73
56
|
private saveLayout;
|
|
74
57
|
private clearLayout;
|
|
75
|
-
/** Токены текущей раскладки (для редактора). Дефолт - из TOOLBAR + выпадашки.
|
|
76
|
-
* Без 'style' (выпадашка «Абзац») - её заменяет галерея «Стили» в TOOLBAR;
|
|
77
|
-
* 'style' остаётся доступной в палитре карандаша. */
|
|
78
58
|
private defaultTokens;
|
|
79
|
-
/** Человекочитаемая подпись токена для диалога настройки. */
|
|
80
59
|
private tokenLabel;
|
|
81
|
-
/** Иконка токена (HTML svg) - для палитры/превью карандаша. '' если без иконки. */
|
|
82
60
|
private tokenIcon;
|
|
83
|
-
/** Все токены, доступные для добавления в палитре карандаша (без разделителя). */
|
|
84
61
|
private allTokens;
|
|
85
|
-
/**
|
|
86
|
-
* Разбор сохранённой раскладки. Поддерживает два формата (обратносовместимо):
|
|
87
|
-
* - строка токенов: "style | bold italic | export" (старый, конфиг интегратора)
|
|
88
|
-
* - JSON-массив LayoutEntry с группами (новый, карандаш) - начинается с '['
|
|
89
|
-
*/
|
|
90
62
|
private parseLayout;
|
|
91
|
-
/** Нормализация одной записи раскладки из недоверенного JSON. */
|
|
92
63
|
private normalizeEntry;
|
|
93
|
-
/** Текущая раскладка как записи (для карандаша). Дефолт - плоский список токенов. */
|
|
94
64
|
private currentEntries;
|
|
95
|
-
/** Сериализовать раскладку: JSON если есть группы, иначе компактная строка токенов. */
|
|
96
65
|
private serializeEntries;
|
|
97
|
-
/** Сохранить раскладку (из карандаша) и пересобрать панель. */
|
|
98
66
|
private saveEntries;
|
|
99
67
|
private appendCustomizeButton;
|
|
100
|
-
/** Запуск редактора панели «карандаш» (drag-and-drop прямо на тулбаре). */
|
|
101
68
|
private openToolbarEditor;
|
|
102
|
-
/**
|
|
103
|
-
* Кнопка-группа: обложка + название + ▾, по клику раскрывает меню с вложенными
|
|
104
|
-
* кнопками. Сами кнопки внутри выполняют свои команды (как на панели).
|
|
105
|
-
*/
|
|
106
69
|
private appendGroupButton;
|
|
107
|
-
/** Выпадающее меню кнопки-группы со вложенными кнопками. */
|
|
108
70
|
private openGroupMenu;
|
|
109
|
-
/** Выполнить действие редактора и обновить состояние тулбара. */
|
|
110
71
|
private menuRun;
|
|
111
|
-
/** Пункты меню «Таблица» - переиспользуются и в верхнем меню, и в контекстном. */
|
|
112
72
|
private tableMenuItems;
|
|
113
|
-
/** Декларативная структура верхнего меню. Действия переиспуют методы редактора. */
|
|
114
73
|
private buildMenus;
|
|
115
|
-
/** Контекстное меню по элементу под курсором (правый клик). */
|
|
116
74
|
private buildContextMenu;
|
|
117
75
|
private onContextMenu;
|
|
118
|
-
/** Вырезать/копировать через нативную команду (выделение редактора). */
|
|
119
76
|
private execEdit;
|
|
120
|
-
/** Запомнить формат текущей позиции и включить «кисть» (следующее выделение - применит). */
|
|
121
77
|
private armFormatPainter;
|
|
122
78
|
private disarmFormatPainter;
|
|
123
|
-
/**
|
|
79
|
+
/** Checks the document for common accessibility problems (WCAG-oriented). */
|
|
124
80
|
checkAccessibility(): {
|
|
125
81
|
issue: string;
|
|
126
82
|
count: number;
|
|
127
83
|
}[];
|
|
128
|
-
/** Диалог результатов проверки доступности. */
|
|
129
84
|
private openAccessibilityCheck;
|
|
130
85
|
private spellcheckOn;
|
|
131
|
-
/**
|
|
86
|
+
/**
|
|
87
|
+
* Turns the browser spell checker on or off.
|
|
88
|
+
*
|
|
89
|
+
* The browser picks the dictionary from the lang attribute, so the language
|
|
90
|
+
* of the editing area is not cosmetic: under the wrong dictionary every
|
|
91
|
+
* word is underlined.
|
|
92
|
+
*
|
|
93
|
+
* If you set a language (the locale or lang attribute on the element), that
|
|
94
|
+
* is what is used. If you do not, the language of the page is copied
|
|
95
|
+
* instead - imposing a default here would put, say, a Japanese page on an
|
|
96
|
+
* English dictionary.
|
|
97
|
+
*
|
|
98
|
+
* The page language is copied EXPLICITLY rather than left to inheritance,
|
|
99
|
+
* because Firefox does not pass lang across the shadow boundary while
|
|
100
|
+
* Chromium and WebKit do. If the page has no language either, no attribute
|
|
101
|
+
* is set and the browser decides.
|
|
102
|
+
*/
|
|
132
103
|
setSpellcheck(on: boolean): void;
|
|
133
104
|
isSpellcheckOn(): boolean;
|
|
134
105
|
setPagination(on: boolean): void;
|
|
135
106
|
isPaginated(): boolean;
|
|
136
|
-
/** Строка диалога свойств: подпись + поле. */
|
|
137
107
|
private propRow;
|
|
138
108
|
private propSelect;
|
|
139
109
|
private propInput;
|
|
140
|
-
/**
|
|
141
|
-
* Word-подобная вставка таблицы: сетка с наведением (динамически расширяется
|
|
142
|
-
* до 20×20) + ручной ввод числа строк/столбцов для больших таблиц.
|
|
143
|
-
*/
|
|
144
110
|
private openTableGridPicker;
|
|
145
111
|
/**
|
|
146
|
-
*
|
|
112
|
+
* Your own interface dictionary: any language, without waiting for us.
|
|
147
113
|
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
* кнопок.
|
|
114
|
+
* Seven locales ship with the editor, but it gets embedded in systems whose
|
|
115
|
+
* users work with documents all day and may not read any of them. Shipping
|
|
116
|
+
* a dictionary for every market would mean maintaining them forever and
|
|
117
|
+
* still missing one, so you can supply your own: a full translation or just
|
|
118
|
+
* a few renamed buttons.
|
|
154
119
|
*
|
|
155
|
-
*
|
|
156
|
-
* -
|
|
157
|
-
* -
|
|
158
|
-
*
|
|
120
|
+
* Two ways, both read when the element mounts (like the locale attribute):
|
|
121
|
+
* - property: el.strings = { bold: 'Negrita', ... } BEFORE it enters the DOM;
|
|
122
|
+
* - attribute strings-ref="id" pointing at a
|
|
123
|
+
* <script type="application/json"> holding the same object, which suits
|
|
124
|
+
* server-side rendering and markup without JavaScript.
|
|
159
125
|
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
126
|
+
* Overrides are applied ON TOP of the chosen locale, so you need not
|
|
127
|
+
* translate everything: keys you leave out keep their original text. The
|
|
128
|
+
* Strings type is exported by the package, so TypeScript checks the names.
|
|
163
129
|
*/
|
|
164
130
|
set strings(overrides: Partial<Strings>);
|
|
165
131
|
get strings(): Strings;
|
|
166
|
-
/** Собрать переопределения из свойства и из strings-ref. Только строки. */
|
|
167
132
|
private collectStringOverrides;
|
|
168
|
-
/**
|
|
169
|
-
* Кладёт значение в форму там, где ElementInternals недоступен: скрытым
|
|
170
|
-
* полем с тем же именем. Ничего не делает, если internals есть (современные
|
|
171
|
-
* браузеры) или если имя не задано - без имени поле всё равно не отправится.
|
|
172
|
-
*/
|
|
173
133
|
private syncFallbackFormValue;
|
|
174
|
-
/** Транзиентная подсказка внизу редактора (автоисчезает). */
|
|
175
134
|
private flashNotice;
|
|
176
|
-
/**
|
|
177
|
-
* Разделить ячейку как в Word. Объединённую - сразу разъединяем (понятное
|
|
178
|
-
* действие). Обычную - диалог «Столбцов × Строк».
|
|
179
|
-
*/
|
|
180
135
|
private openSplitCellDialog;
|
|
181
|
-
/** Объединить ячейки; при одиночном выделении - понятная подсказка. */
|
|
182
136
|
private mergeCellsWithHint;
|
|
183
|
-
/** Каркас диалога свойств: backdrop + заголовок + строки + Отмена/Применить. */
|
|
184
137
|
private buildPropsDialog;
|
|
185
138
|
private openTablePropsDialog;
|
|
186
139
|
private openCellPropsDialog;
|
|
187
|
-
/** Доступные поля: из атрибута merge-fields (JSON) или дефолтный набор реквизитов. */
|
|
188
140
|
private getMergeFields;
|
|
189
|
-
/** Диалог вставки поля шаблона. */
|
|
190
141
|
private openMergeFieldPicker;
|
|
191
|
-
/**
|
|
142
|
+
/** Inserts a merge field programmatically. */
|
|
192
143
|
insertMergeField(key: string, label?: string): void;
|
|
193
|
-
/**
|
|
144
|
+
/** Returns the HTML with merge fields expanded to {{key}}, ready for mail merge. */
|
|
194
145
|
getMergeText(): string;
|
|
195
|
-
/** Диалог ввода текста сноски, затем вставка маркера. */
|
|
196
146
|
private openFootnotePrompt;
|
|
197
|
-
/**
|
|
147
|
+
/** Inserts a footnote, reads footnote texts, or inserts a table of contents. */
|
|
198
148
|
insertFootnote(text: string): void;
|
|
199
149
|
getFootnotes(): string[];
|
|
200
150
|
insertTableOfContents(): void;
|
|
201
|
-
/** Набор быстрых стилей: тип блока + интервалы + превью для галереи. */
|
|
202
151
|
private styleGallery;
|
|
203
|
-
/** Галерея стилей - выпадающая панель с превью каждого стиля. */
|
|
204
152
|
private openStyleGallery;
|
|
205
|
-
/** Диалог ввода комментария к выделению. */
|
|
206
153
|
private openCommentPrompt;
|
|
207
154
|
private onCommentClick;
|
|
208
|
-
/** Попап комментария: текст + кнопка «Разрешить». */
|
|
209
155
|
private openCommentPopup;
|
|
210
|
-
/**
|
|
156
|
+
/** Comment API. */
|
|
211
157
|
addComment(text: string, author?: string): string | null;
|
|
212
158
|
getComments(): {
|
|
213
159
|
id: string;
|
|
@@ -228,7 +174,7 @@ export declare class KodaEditorElement extends ElementBase {
|
|
|
228
174
|
private versionsKey;
|
|
229
175
|
private readVersions;
|
|
230
176
|
private writeVersions;
|
|
231
|
-
/**
|
|
177
|
+
/** Saves a snapshot of the current document as a named version. */
|
|
232
178
|
saveVersion(name?: string): void;
|
|
233
179
|
getVersions(): {
|
|
234
180
|
id: string;
|
|
@@ -238,146 +184,91 @@ export declare class KodaEditorElement extends ElementBase {
|
|
|
238
184
|
}[];
|
|
239
185
|
restoreVersion(id: string): void;
|
|
240
186
|
deleteVersion(id: string): void;
|
|
241
|
-
/** Диалог истории версий: сохранить текущую, восстановить/удалить прошлые. */
|
|
242
187
|
private openVersionHistory;
|
|
243
|
-
/** Пересобирает панель из текущей раскладки (после сохранения/сброса). */
|
|
244
188
|
private rebuildToolbar;
|
|
245
|
-
/** Один токен спецификации `toolbar="..."` -> элемент панели. Неизвестный - пропуск. */
|
|
246
189
|
private appendToolbarToken;
|
|
247
|
-
/** Рендер одной записи панели (разделитель / контрол цвета / кнопка). */
|
|
248
190
|
private appendEntry;
|
|
249
191
|
private onToolbarKeydown;
|
|
250
192
|
private refreshToolbar;
|
|
251
|
-
/** Общий конструктор выпадашки панели. */
|
|
252
193
|
private makeSelect;
|
|
253
194
|
private buildStyleSelect;
|
|
254
195
|
private buildFontSelect;
|
|
255
196
|
private buildSizeSelect;
|
|
256
|
-
/** Кнопка выбора цвета (текст/выделение): иконка + скрытый input[type=color]. */
|
|
257
197
|
private buildColorControl;
|
|
258
|
-
|
|
198
|
+
private pendingColorInputs;
|
|
199
|
+
private placeColorInput;
|
|
259
200
|
private openLinkPrompt;
|
|
260
|
-
/**
|
|
261
|
-
* Диалог выбора режима импорта PDF: текст (редактируемо) / картинки (точный
|
|
262
|
-
* растр) / как PDF (встроить файл). Возвращает выбор или null (отмена).
|
|
263
|
-
*/
|
|
264
201
|
private pickPdfMode;
|
|
265
|
-
/**
|
|
266
|
-
* Меню экспорта: PDF / Word / HTML / Markdown / TXT / CSV. Всё client-side -
|
|
267
|
-
* содержимое не уходит на сервер. Выбор формата вызывает нужный метод Editor.
|
|
268
|
-
*/
|
|
269
202
|
private openExportPicker;
|
|
270
|
-
/**
|
|
271
|
-
* Чекер импорта: «Файл с компьютера» или «По ссылке (URL)». Оба пути -
|
|
272
|
-
* client-side: файл читается в браузере, URL загружается fetch-ом самого
|
|
273
|
-
* браузера (наш сервер не участвует).
|
|
274
|
-
*/
|
|
275
203
|
private openImportPicker;
|
|
276
204
|
/**
|
|
277
|
-
*
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
* PDF
|
|
281
|
-
*
|
|
205
|
+
* Imports a file from a URL, fetched by the browser. Images are inserted by
|
|
206
|
+
* link without downloading, which avoids CORS restrictions on display.
|
|
207
|
+
* Documents are fetched into a Blob and follow the same path as a file from
|
|
208
|
+
* disk; for a PDF the editor asks how to insert it (text, images or
|
|
209
|
+
* embedded). CORS and network failures surface as an importerror event.
|
|
282
210
|
*/
|
|
283
211
|
importFromUrl(url: string): Promise<void>;
|
|
284
|
-
/** Единое событие об ошибке импорта. */
|
|
285
212
|
private emitImportError;
|
|
286
|
-
/**
|
|
287
|
-
* Показывает оверлей «Обработка…» поверх редактора на время долгой операции
|
|
288
|
-
* (парсинг PDF/конвертация). Возвращает функцию-скрывалку. Без него медленные
|
|
289
|
-
* импорты выглядят как «клик не сработал».
|
|
290
|
-
*/
|
|
291
213
|
private showLoading;
|
|
292
214
|
private static readonly IMPORT_ACCEPT_ALL;
|
|
293
|
-
/**
|
|
294
|
-
* Открыть системный диалог выбора файла с заданным accept и импортировать
|
|
295
|
-
* выбранный файл. Используется и атомарными кнопками (Word/PDF/Excel/Текст),
|
|
296
|
-
* и общей кнопкой (полный accept).
|
|
297
|
-
*/
|
|
298
215
|
private openFilePicker;
|
|
299
|
-
/**
|
|
300
|
-
* Общая обработка импортируемого файла: PDF - с выбором режима (текст/картинки/
|
|
301
|
-
* встроить), остальное - автодетект. Индикатор загрузки + события change/importerror.
|
|
302
|
-
*/
|
|
303
216
|
private handleImportedFile;
|
|
304
|
-
/** Общая кнопка импорта «Файл с компьютера» (legacy): полный accept. */
|
|
305
217
|
private pickImportFile;
|
|
306
218
|
/**
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
310
|
-
* их уже собирал; хост может их показать пользователю или проигнорировать.
|
|
219
|
+
* Imports a .docx programmatically (File or ArrayBuffer) and returns the
|
|
220
|
+
* converter's warnings - unsupported styles, text inside shapes and the
|
|
221
|
+
* like. Show them to the user or ignore them, as suits your application.
|
|
311
222
|
*/
|
|
312
223
|
importDocx(source: File | ArrayBuffer): Promise<DocxImportResult | undefined>;
|
|
313
|
-
/**
|
|
224
|
+
/** Imports a file (.docx, .csv, .txt, .md or an image), detecting the type. */
|
|
314
225
|
importFile(file: File): Promise<void>;
|
|
315
|
-
/**
|
|
226
|
+
/** Exports to Markdown and downloads the .md file. */
|
|
316
227
|
exportMarkdown(): void;
|
|
317
|
-
/**
|
|
228
|
+
/** Exports to HTML, TXT, CSV or Word (.doc). Runs entirely in the browser. */
|
|
318
229
|
exportHtml(): void;
|
|
319
230
|
exportText(): void;
|
|
320
231
|
exportCsv(): void;
|
|
321
232
|
exportWord(): void;
|
|
322
|
-
/**
|
|
233
|
+
/** Imports a PDF as images, one image per page. */
|
|
323
234
|
importPdfAsImages(file: File): Promise<void>;
|
|
324
|
-
/**
|
|
235
|
+
/** Embeds a PDF as it is, in an iframe, without converting it. */
|
|
325
236
|
importPdfAsEmbed(file: File): Promise<void>;
|
|
326
|
-
/**
|
|
237
|
+
/** Makes the next paste plain text only. */
|
|
327
238
|
armPlainPaste(): void;
|
|
328
239
|
/**
|
|
329
|
-
*
|
|
330
|
-
* (
|
|
331
|
-
*
|
|
240
|
+
* Pastes rich clipboard content supplied by the companion browser
|
|
241
|
+
* extension (full HTML plus RTF, which the page sandbox cannot read on its
|
|
242
|
+
* own). The extension calls this method directly or dispatches the
|
|
243
|
+
* `koda-paste-rich` DOM event.
|
|
332
244
|
*/
|
|
333
245
|
pasteRich(html: string, rtf?: string): void;
|
|
334
|
-
/** Диалог вставки картинки: по ссылке/пути или загрузкой файла. */
|
|
335
246
|
private openImageDialog;
|
|
336
|
-
/**
|
|
337
|
-
* Загрузка картинки: на сервер клиента (upload-url) или встраивание base64.
|
|
338
|
-
*
|
|
339
|
-
* Две вещи, которых здесь раньше не было:
|
|
340
|
-
* - проверка типа и размера ДО отправки. Атрибут accept у поля выбора -
|
|
341
|
-
* только подсказка, перетаскивание его не спрашивает;
|
|
342
|
-
* - отказ сервера больше не подменяется тихо на data-URI. Раньше клиент,
|
|
343
|
-
* отклонивший файл на 20 МБ, получал ровно тот же файл, но внутри
|
|
344
|
-
* документа в base64: пользователь видел успех, а в базу уезжал
|
|
345
|
-
* многомегабайтный кусок. Если upload-url задан, встраивание base64 -
|
|
346
|
-
* это не «запасной путь», а тихая подмена договорённости.
|
|
347
|
-
*/
|
|
348
247
|
private handleImageFile;
|
|
349
|
-
/** Вставка картинки в редактор (ProseMirror). */
|
|
350
248
|
private insertImageSmart;
|
|
351
249
|
private checkLicense;
|
|
352
|
-
/**
|
|
353
|
-
* Агрессивный демо-знак: диагональное замощение по всей канве (фон листа,
|
|
354
|
-
* растёт с документом и покрывает все страницы) + sticky-пилюля сверху для
|
|
355
|
-
* доступности. Не блокирует ввод (pointer-events:none / фон).
|
|
356
|
-
*/
|
|
357
250
|
private applyDemoWatermark;
|
|
358
|
-
/** SVG-тайл с диагональным текстом знака → data-URI для background-image. */
|
|
359
251
|
private demoWatermarkUri;
|
|
360
252
|
getContent(): string;
|
|
361
253
|
setContent(html: string): void;
|
|
362
254
|
getJSON(): unknown;
|
|
363
|
-
/**
|
|
255
|
+
/** Exports to PDF through the browser print dialog, with no server involved. */
|
|
364
256
|
exportPdf(): void;
|
|
365
|
-
/** value
|
|
257
|
+
/** value behaves like a native form field: reads and writes HTML. Works with v-model. */
|
|
366
258
|
get value(): string;
|
|
367
259
|
set value(html: string);
|
|
368
|
-
/**
|
|
260
|
+
/** Form reset (<form>.reset() or a type=reset button) clears the editor. */
|
|
369
261
|
formResetCallback(): void;
|
|
370
|
-
/**
|
|
262
|
+
/** Toggles full-screen mode. */
|
|
371
263
|
toggleFullscreen(): void;
|
|
372
|
-
/** Панель найти/заменить (скрыта по умолчанию). */
|
|
373
264
|
private buildSearchBar;
|
|
374
|
-
/**
|
|
265
|
+
/** Shows or hides the search bar. */
|
|
375
266
|
toggleSearch(show?: boolean): void;
|
|
376
267
|
}
|
|
377
268
|
/**
|
|
378
|
-
*
|
|
379
|
-
*
|
|
380
|
-
*
|
|
269
|
+
* Registers <koda-editor>. Calling it twice for the same tag is harmless.
|
|
270
|
+
* A custom tag gets an anonymous subclass, because one class cannot be
|
|
271
|
+
* registered under two names - customElements.define would throw.
|
|
381
272
|
*/
|
|
382
273
|
export declare function defineKodaEditor(tag?: string): void;
|
|
383
274
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kodaeditor/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "WYSIWYG rich-text editor as a web component. Pastes Word, Excel and Google Docs content without losing tables, lists or formatting. Self-hosted, framework-agnostic.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"wysiwyg",
|
|
@@ -19,17 +19,17 @@
|
|
|
19
19
|
"homepage": "https://kodaeditor.com",
|
|
20
20
|
"repository": {
|
|
21
21
|
"type": "git",
|
|
22
|
-
"url": "git+https://github.com/
|
|
22
|
+
"url": "git+https://github.com/silkhorizonstudios/kodaeditor-issues.git",
|
|
23
23
|
"directory": "packages/core"
|
|
24
24
|
},
|
|
25
25
|
"bugs": {
|
|
26
|
+
"url": "https://github.com/silkhorizonstudios/kodaeditor-issues/issues",
|
|
26
27
|
"email": "support@kodaeditor.com"
|
|
27
28
|
},
|
|
28
29
|
"type": "module",
|
|
29
30
|
"main": "./dist/kodaeditor.umd.cjs",
|
|
30
31
|
"module": "./dist/kodaeditor.js",
|
|
31
32
|
"types": "./dist/index.d.ts",
|
|
32
|
-
"//exports": "Два варианта поставки в ОДНОМ пакете, выбор за покупателем и без переписки с нами. По умолчанию (\".\") - полная сборка: всё внутри, ни одного обращения в сеть, это важнее веса для закрытых контуров. \"./light\" - сборка без pdf.js и xlsx (1,1 МБ вместо 3,1): их файлы лежат в \"./vendor\" и грузятся только когда пользователь реально открывает PDF или Excel. Оба варианта обфусцируются при публикации.",
|
|
33
33
|
"exports": {
|
|
34
34
|
".": {
|
|
35
35
|
"types": "./dist/index.d.ts",
|
|
@@ -49,17 +49,15 @@
|
|
|
49
49
|
],
|
|
50
50
|
"scripts": {
|
|
51
51
|
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
52
|
-
"build": "npm run clean && tsc -p tsconfig.json && vite build",
|
|
52
|
+
"build": "npm run clean && tsc -p tsconfig.json && node ../../scripts/strip-private-docs.mjs dist && node ../../scripts/prune-internal-types.mjs dist && vite build",
|
|
53
53
|
"build:split": "vite build --config vite.config.split.ts && node ../../scripts/copy-vendor.mjs",
|
|
54
54
|
"build:protected": "npm run build:split && node ../../scripts/obfuscate.mjs dist/kodaeditor-core.umd.cjs dist/kodaeditor-core.obf.umd.cjs",
|
|
55
55
|
"build:standalone-protected": "npm run build && node ../../scripts/obfuscate.mjs dist/kodaeditor.js dist/kodaeditor.js && node ../../scripts/obfuscate.mjs dist/kodaeditor.umd.cjs dist/kodaeditor.umd.cjs",
|
|
56
56
|
"typecheck": "tsc --noEmit",
|
|
57
57
|
"test": "vitest run",
|
|
58
58
|
"prepack": "npm run build:standalone-protected && npm run build:split && node ../../scripts/obfuscate.mjs dist/kodaeditor-core.umd.cjs dist/kodaeditor-core.umd.cjs && node -e \"require('fs').copyFileSync('../../LICENSE.md','LICENSE.md')\" && node ../../scripts/check-ssr-import.mjs",
|
|
59
|
-
"//postpack": "Возвращает ОБА варианта сборки читаемыми. Оба - потому что npm run build начинается с clean и стирает лёгкую сборку вместе с vendor: после упаковки в рабочем каталоге не оставалось того, что уехало в пакет, и \"./light\" переставал резолвиться локально. prepack обфусцирует dist ПРЯМО В РАБОЧЕМ КАТАЛОГЕ. Тарбол уже собран, на его содержимое это не влияет, но разработчик остаётся с нечитаемой сборкой и теряет время, не понимая почему. Возвращаем обычную сборку сразу, а не помним об этом.",
|
|
60
59
|
"postpack": "npm run build && npm run build:split"
|
|
61
60
|
},
|
|
62
|
-
"comment": "ВСЕ библиотеки ВСТРОЕНЫ в dist (один файл, inlineDynamicImports). Поэтому у пакета НЕТ runtime-зависимостей: npm i тарболла НЕ тянет ничего из npm/CDN. Сборочные либы - в devDependencies. build:protected/build:split - отдельный, сейчас НЕ используемый нигде путь поставки (лёгкий CDN-вариант без pdf.js/xlsx, грузит их с внешнего CDN vendor-хостинга) - ссылается на chayxonajon.uz, который больше не наш домен; не трогаем, не часть текущей npm-поставки. Для npm publish защищённость обеспечивает НОВЫЙ build:standalone-protected - обфусцирует именно те файлы (dist/kodaeditor.js, dist/kodaeditor.umd.cjs), на которые ссылаются main/module/exports; запускается автоматически через prepack перед npm pack/publish, поэтому руками вызывать не обязательно.",
|
|
63
61
|
"devDependencies": {
|
|
64
62
|
"@types/turndown": "^5.0.6",
|
|
65
63
|
"dompurify": "^3.4.15",
|
package/dist/commands.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Command } from 'prosemirror-state';
|
|
2
|
-
import type { Node as PMNode } from 'prosemirror-model';
|
|
3
|
-
import type { Strings } from './i18n';
|
|
4
|
-
/** Создаёт узел таблицы rows×cols с шапкой в первой строке. */
|
|
5
|
-
export declare function createTable(rows: number, cols: number): PMNode;
|
|
6
|
-
export interface SlashItem {
|
|
7
|
-
titleKey: keyof Strings;
|
|
8
|
-
icon: string;
|
|
9
|
-
keywords: string[];
|
|
10
|
-
command: Command;
|
|
11
|
-
}
|
|
12
|
-
/** Пункты slash-меню (порядок = порядок показа). */
|
|
13
|
-
export declare const SLASH_ITEMS: SlashItem[];
|
|
14
|
-
/** Фильтр пунктов по запросу (название + ключевые слова). */
|
|
15
|
-
export declare function filterSlashItems(query: string, strings: Strings): SlashItem[];
|
package/dist/docx-alignment.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Восстановление выравнивания абзацев при импорте .docx (w:jc).
|
|
3
|
-
*
|
|
4
|
-
* mammoth не переносит прямое форматирование абзаца, включая text-align —
|
|
5
|
-
* из-за этого правое выравнивание сумм/дат в ячейках таблиц (частый паттерн
|
|
6
|
-
* реальных инвойсов) и центрированные заголовки терялись. Схема редактора
|
|
7
|
-
* это выравнивание УЖЕ поддерживает (paragraph.attrs.align, см. schema.ts) —
|
|
8
|
-
* не хватало только источника данных на стороне docx-импорта. Тот же
|
|
9
|
-
* text-match паттерн, что docx-text-styles.ts использует для цвета/размера.
|
|
10
|
-
*/
|
|
11
|
-
/** Читает .docx и возвращает text-align по тексту абзацев. Безопасно к ошибкам. */
|
|
12
|
-
export declare function extractDocxAlignment(arrayBuffer: ArrayBuffer): Promise<Map<string, string>>;
|
|
13
|
-
/** Накладывает text-align на блоки mammoth-вывода по тексту абзаца. */
|
|
14
|
-
export declare function applyDocxAlignment(root: HTMLElement, alignment: Map<string, string>): void;
|
package/dist/docx-breaks.d.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Разрывы страниц/секций при импорте .docx.
|
|
3
|
-
*
|
|
4
|
-
* mammoth теряет ручной разрыв страницы (Ctrl+Enter -> <w:br w:type="page"/>) и
|
|
5
|
-
* разрыв секции «с новой страницы» (<w:sectPr> внутри w:pPr). В многостраничных
|
|
6
|
-
* ЭДО это смысловая граница: «приложение — с новой страницы», «акт / протокол».
|
|
7
|
-
* Без неё две страницы сливаются в сплошной поток.
|
|
8
|
-
*
|
|
9
|
-
* В потоковом HTML-редакторе постраничности нет, поэтому НАМЕРЕННЫЙ разрыв
|
|
10
|
-
* показываем горизонтальной линией <hr class="koda-pagebreak"> (схема её знает —
|
|
11
|
-
* это кнопка «Горизонтальная линия»). Автопагинацию (w:lastRenderedPageBreak —
|
|
12
|
-
* лишь подсказка рендера) и continuous-секции НЕ трогаем: это не границы.
|
|
13
|
-
*
|
|
14
|
-
* Делается в два шага: (1) в document.xml на месте разрыва ставим текстовый
|
|
15
|
-
* сентинел ДО mammoth; (2) в готовом HTML сентинел -> <hr>, разрезая абзац
|
|
16
|
-
* через Range (корректно делит вложенное форматирование).
|
|
17
|
-
*/
|
|
18
|
-
/** Невидимый маркер (private-use) на месте разрыва — переживает mammoth как текст. */
|
|
19
|
-
export declare const PB_SENTINEL = "\uE000EUZPAGEBREAK\uE000";
|
|
20
|
-
/**
|
|
21
|
-
* Мутирует parsed document.xml: ручной page-break и параграф-уровневый sectPr
|
|
22
|
-
* «с новой страницы» -> текстовый сентинел. Возвращает true при изменении.
|
|
23
|
-
* Часть общего препроцессинга (один repack zip).
|
|
24
|
-
*/
|
|
25
|
-
export declare function replaceBreaksInDoc(doc: Document): boolean;
|
|
26
|
-
/**
|
|
27
|
-
* В готовом HTML: сентинел -> <hr class="koda-pagebreak">. Абзац, содержащий
|
|
28
|
-
* сентинел, разрезается через Range (хвост с сохранением вложенного
|
|
29
|
-
* форматирования выносится в новый блок). Возвращает true при изменении.
|
|
30
|
-
*/
|
|
31
|
-
export declare function splitPageBreaks(root: HTMLElement): boolean;
|
package/dist/docx-forms.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Чекбоксы форм при импорте .docx (анкеты ЭДО: ☒ Согласен / ☐ ...).
|
|
3
|
-
*
|
|
4
|
-
* mammoth теряет состояние чекбоксов: и современных content-control
|
|
5
|
-
* (w14:checkbox), и legacy form-field (w:checkBox в w:ffData). Остаётся только
|
|
6
|
-
* текст метки — не видно, отмечено или нет. Здесь чекбоксы заменяются в
|
|
7
|
-
* document.xml на символ ☒ (отмечен) / ☐ (пустой) ДО mammoth, так состояние
|
|
8
|
-
* сохраняется как читаемый символ.
|
|
9
|
-
*/
|
|
10
|
-
/**
|
|
11
|
-
* Мутирует parsed document.xml: чекбоксы -> ☒/☐. Возвращает true, если что-то
|
|
12
|
-
* заменено. Чистая DOM-операция (общий repack с формулами).
|
|
13
|
-
*/
|
|
14
|
-
export declare function replaceCheckboxesInDoc(doc: Document): boolean;
|
|
15
|
-
/**
|
|
16
|
-
* Разворачивает w:fldSimple: mammoth ИГНОРИРУЕТ содержимое простых полей (DATE,
|
|
17
|
-
* NUMPAGES, REF и т.п.), теряя кэшированное значение. Здесь дети fldSimple
|
|
18
|
-
* (последний вычисленный результат) выносятся наружу как обычные прогоны, и
|
|
19
|
-
* значение поля сохраняется как текст. Возвращает true, если что-то развёрнуто.
|
|
20
|
-
*/
|
|
21
|
-
export declare function unwrapSimpleFields(doc: Document): boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Tab-лидеры (точечные/подчёркнутые линии заполнения — «Подпись.........» в
|
|
24
|
-
* формах ЭДО) mammoth теряет вместе с табом. Здесь tab-символ в абзаце с
|
|
25
|
-
* tab-стопом, у которого есть w:leader, заменяется на строку лид-символов —
|
|
26
|
-
* чтобы линия для подписи/заполнения осталась видимой. Возвращает true при замене.
|
|
27
|
-
*/
|
|
28
|
-
export declare function replaceTabLeadersInDoc(doc: Document): boolean;
|
package/dist/docx-headers.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Извлечение колонтитулов (шапка/футер) из .docx при импорте.
|
|
3
|
-
*
|
|
4
|
-
* mammoth берёт только тело документа и ИГНОРИРУЕТ колонтитулы. Для ЭДО это
|
|
5
|
-
* потеря: фирменный бланк, реквизиты организации, «УТВЕРЖДАЮ», номера страниц
|
|
6
|
-
* часто лежат именно в шапке/футере (word/header*.xml, word/footer*.xml).
|
|
7
|
-
*
|
|
8
|
-
* Здесь шапка/футер читаются прямо из zip и конвертируются в простой HTML
|
|
9
|
-
* (абзацы с выравниванием/жирным + таблицы), чтобы летерхед не пропал.
|
|
10
|
-
* Шапка ставится в НАЧАЛО документа, футер — в КОНЕЦ (один раз, т.к. в
|
|
11
|
-
* потоковом редакторе нет постраничного повтора).
|
|
12
|
-
*/
|
|
13
|
-
export interface DocxHeaderFooter {
|
|
14
|
-
header: string;
|
|
15
|
-
footer: string;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Читает .docx и возвращает HTML шапки и футера (самые «насыщенные» из
|
|
19
|
-
* нескольких, т.к. часто есть default/first/even — летерхед обычно в одном).
|
|
20
|
-
* Безопасно к ошибкам — при сбое отдаёт пустые строки.
|
|
21
|
-
*/
|
|
22
|
-
export declare function extractDocxHeaderFooter(arrayBuffer: ArrayBuffer): Promise<DocxHeaderFooter>;
|