@makhmudov.kay/az-editor 0.0.0-stage → 0.1.0-beta.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.
Files changed (120) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +69 -2
  3. package/THIRD_PARTY_NOTICES.md +30 -0
  4. package/dist/THIRD_PARTY_NOTICES.md +30 -0
  5. package/dist/az-editor.css +2 -0
  6. package/dist/az-editor.js +1569 -0
  7. package/dist/library/AzDocumentEditor.d.ts +69 -0
  8. package/dist/library/AzHtmlEditor.d.ts +35 -0
  9. package/dist/library/document-io.d.ts +20 -0
  10. package/dist/library/hujjat/api.d.ts +28 -0
  11. package/dist/library/hujjat/contract.d.ts +53 -0
  12. package/dist/library/hujjat/docx-to-html.d.ts +5 -0
  13. package/dist/library/hujjat/docx.d.ts +10 -0
  14. package/dist/library/hujjat/html-to-docx.d.ts +3 -0
  15. package/dist/library/hujjat/xml.d.ts +17 -0
  16. package/dist/library/index.d.ts +15 -0
  17. package/dist/library/pdf-export.d.ts +14 -0
  18. package/dist/library/pdf-profile.d.ts +3 -0
  19. package/dist/library/print-document.d.ts +7 -0
  20. package/dist/library/print-pages/index.d.ts +33 -0
  21. package/dist/library/ru.d.ts +2 -0
  22. package/dist/licenses/@docx-editor.dev__core-2.27.0/LICENSE +201 -0
  23. package/dist/licenses/@docx-editor.dev__core-2.27.0/THIRD_PARTY_NOTICES.md +56 -0
  24. package/dist/licenses/@docx-editor.dev__core-2.27.0/licenses/HarfBuzz-COPYING.txt +42 -0
  25. package/dist/licenses/@docx-editor.dev__fonts-2.27.0/LICENSE +212 -0
  26. package/dist/licenses/@docx-editor.dev__fonts-2.27.0/THIRD_PARTY_NOTICES.md +28 -0
  27. package/dist/licenses/@docx-editor.dev__fonts-2.27.0/licenses/GUST-FONT-LICENSE.txt +29 -0
  28. package/dist/licenses/@docx-editor.dev__fonts-2.27.0/licenses/LICENSE-Liberation.txt +102 -0
  29. package/dist/licenses/@docx-editor.dev__fonts-2.27.0/licenses/LPPL-1.3c.txt +416 -0
  30. package/dist/licenses/@docx-editor.dev__fonts-2.27.0/licenses/OFL-Caladea.txt +93 -0
  31. package/dist/licenses/@docx-editor.dev__fonts-2.27.0/licenses/OFL-Carlito.txt +94 -0
  32. package/dist/licenses/@docx-editor.dev__i18n-2.27.0/LICENSE +201 -0
  33. package/dist/licenses/@docx-editor.dev__i18n-2.27.0/THIRD_PARTY_NOTICES.md +18 -0
  34. package/dist/licenses/@docx-editor.dev__react-2.27.0/LICENSE +201 -0
  35. package/dist/licenses/@docx-editor.dev__react-2.27.0/THIRD_PARTY_NOTICES.md +18 -0
  36. package/dist/licenses/@floating-ui__core-1.8.0/LICENSE +20 -0
  37. package/dist/licenses/@floating-ui__dom-1.8.0/LICENSE +20 -0
  38. package/dist/licenses/@floating-ui__react-dom-2.1.9/LICENSE +20 -0
  39. package/dist/licenses/@floating-ui__utils-0.2.12/LICENSE +20 -0
  40. package/dist/licenses/@radix-ui__number-1.1.3/LICENSE +21 -0
  41. package/dist/licenses/@radix-ui__primitive-1.1.7/LICENSE +21 -0
  42. package/dist/licenses/@radix-ui__react-arrow-1.1.16/LICENSE +21 -0
  43. package/dist/licenses/@radix-ui__react-collection-1.1.16/LICENSE +21 -0
  44. package/dist/licenses/@radix-ui__react-compose-refs-1.1.5/LICENSE +21 -0
  45. package/dist/licenses/@radix-ui__react-context-1.2.2/LICENSE +21 -0
  46. package/dist/licenses/@radix-ui__react-direction-1.1.5/LICENSE +21 -0
  47. package/dist/licenses/@radix-ui__react-dismissable-layer-1.1.20/LICENSE +21 -0
  48. package/dist/licenses/@radix-ui__react-focus-guards-1.1.6/LICENSE +21 -0
  49. package/dist/licenses/@radix-ui__react-focus-scope-1.2.0/LICENSE +21 -0
  50. package/dist/licenses/@radix-ui__react-id-1.1.4/LICENSE +21 -0
  51. package/dist/licenses/@radix-ui__react-popper-1.3.8/LICENSE +21 -0
  52. package/dist/licenses/@radix-ui__react-portal-1.1.18/LICENSE +21 -0
  53. package/dist/licenses/@radix-ui__react-presence-1.1.11/LICENSE +21 -0
  54. package/dist/licenses/@radix-ui__react-primitive-2.1.11/LICENSE +21 -0
  55. package/dist/licenses/@radix-ui__react-select-2.3.8/LICENSE +21 -0
  56. package/dist/licenses/@radix-ui__react-slot-1.4.0/LICENSE +21 -0
  57. package/dist/licenses/@radix-ui__react-use-callback-ref-1.1.4/LICENSE +21 -0
  58. package/dist/licenses/@radix-ui__react-use-controllable-state-1.2.6/LICENSE +21 -0
  59. package/dist/licenses/@radix-ui__react-use-effect-event-0.0.5/LICENSE +21 -0
  60. package/dist/licenses/@radix-ui__react-use-layout-effect-1.1.4/LICENSE +21 -0
  61. package/dist/licenses/@radix-ui__react-use-previous-1.1.4/LICENSE +21 -0
  62. package/dist/licenses/@radix-ui__react-use-rect-1.1.4/LICENSE +21 -0
  63. package/dist/licenses/@radix-ui__react-use-size-1.1.5/LICENSE +21 -0
  64. package/dist/licenses/@radix-ui__react-visually-hidden-1.2.12/LICENSE +21 -0
  65. package/dist/licenses/@radix-ui__rect-1.1.3/LICENSE +21 -0
  66. package/dist/licenses/anynum-1.0.1/LICENSE +21 -0
  67. package/dist/licenses/aria-hidden-1.2.6/LICENSE +21 -0
  68. package/dist/licenses/bidi-js-1.1.0/LICENSE.txt +22 -0
  69. package/dist/licenses/class-variance-authority-0.7.1/LICENSE +190 -0
  70. package/dist/licenses/clsx-2.1.1/license +9 -0
  71. package/dist/licenses/core-util-is-1.0.3/LICENSE +19 -0
  72. package/dist/licenses/detect-node-es-1.1.0/LICENSE +21 -0
  73. package/dist/licenses/emf-converter-2.0.2/LICENSE +202 -0
  74. package/dist/licenses/fast-xml-builder-1.3.1/LICENSE +21 -0
  75. package/dist/licenses/fast-xml-parser-5.11.2/LICENSE +21 -0
  76. package/dist/licenses/fflate-0.8.3/LICENSE +21 -0
  77. package/dist/licenses/get-nonce-1.0.1/LICENSE +21 -0
  78. package/dist/licenses/harfbuzzjs-1.6.1/LICENSE +19 -0
  79. package/dist/licenses/immediate-3.0.6/LICENSE.txt +20 -0
  80. package/dist/licenses/inherits-2.0.4/LICENSE +16 -0
  81. package/dist/licenses/inventory.json +750 -0
  82. package/dist/licenses/is-unsafe-2.0.2/LICENSE +21 -0
  83. package/dist/licenses/jszip-3.10.2/LICENSE.markdown +651 -0
  84. package/dist/licenses/lie-3.3.0/license.md +7 -0
  85. package/dist/licenses/orderedmap-2.1.1/LICENSE +19 -0
  86. package/dist/licenses/pako-1.0.11/LICENSE +21 -0
  87. package/dist/licenses/path-expression-matcher-1.6.2/LICENSE +21 -0
  88. package/dist/licenses/process-nextick-args-2.0.1/license.md +19 -0
  89. package/dist/licenses/prosemirror-commands-1.7.2/LICENSE +19 -0
  90. package/dist/licenses/prosemirror-keymap-1.2.3/LICENSE +19 -0
  91. package/dist/licenses/prosemirror-model-1.25.12/LICENSE +19 -0
  92. package/dist/licenses/prosemirror-state-1.4.4/LICENSE +19 -0
  93. package/dist/licenses/prosemirror-transform-1.12.2/LICENSE +19 -0
  94. package/dist/licenses/prosemirror-view-1.42.6/LICENSE +19 -0
  95. package/dist/licenses/react-19.3.0/LICENSE +21 -0
  96. package/dist/licenses/react-dom-19.3.0/LICENSE +21 -0
  97. package/dist/licenses/react-remove-scroll-2.7.2/LICENSE +21 -0
  98. package/dist/licenses/react-style-singleton-2.2.3/LICENSE +21 -0
  99. package/dist/licenses/readable-stream-2.3.8/LICENSE +47 -0
  100. package/dist/licenses/require-from-string-2.0.2/license +21 -0
  101. package/dist/licenses/safe-buffer-5.1.2/LICENSE +21 -0
  102. package/dist/licenses/scheduler-0.28.0/LICENSE +21 -0
  103. package/dist/licenses/setimmediate-1.0.5/LICENSE.txt +20 -0
  104. package/dist/licenses/string_decoder-1.1.1/LICENSE +48 -0
  105. package/dist/licenses/strnum-2.4.2/LICENSE +21 -0
  106. package/dist/licenses/tslib-2.8.1/LICENSE.txt +12 -0
  107. package/dist/licenses/use-callback-ref-1.3.3/LICENSE +21 -0
  108. package/dist/licenses/use-sidecar-1.1.3/LICENSE +21 -0
  109. package/dist/licenses/utif2-4.1.0/LICENSE +21 -0
  110. package/dist/licenses/util-deprecate-1.0.2/LICENSE +24 -0
  111. package/dist/licenses/w3c-keyname-2.2.8/LICENSE +19 -0
  112. package/dist/licenses/xml-naming-0.3.0/LICENSE +21 -0
  113. package/docs/integration.ru.md +875 -0
  114. package/examples/integration/DocxEditorExample.tsx +92 -0
  115. package/examples/integration/HtmlDraft.tsx +76 -0
  116. package/examples/integration/HtmlFormExample.tsx +25 -0
  117. package/examples/integration/README.md +21 -0
  118. package/examples/integration/loadFonts.ts +26 -0
  119. package/examples/integration/server-api.ts +28 -0
  120. package/package.json +75 -4
@@ -0,0 +1,1569 @@
1
+ import { forwardRef as e, useCallback as t, useEffect as n, useImperativeHandle as r, useLayoutEffect as i, useRef as a, useState as o } from "react";
2
+ import { DocxEditor as s, useEditorState as c, useFonts as l } from "@docx-editor.dev/react";
3
+ import { packagedFonts as u } from "@docx-editor.dev/fonts";
4
+ import d from "jszip";
5
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
6
+ //#region src/library/ru.ts
7
+ var m = {
8
+ common: {
9
+ cancel: "Отмена",
10
+ apply: "Применить",
11
+ close: "Закрыть",
12
+ comment: "Комментарий",
13
+ dismiss: "Скрыть"
14
+ },
15
+ toolbar: {
16
+ ariaLabel: "Панель форматирования",
17
+ file: "Файл",
18
+ format: "Формат",
19
+ insert: "Вставка",
20
+ review: "Рецензирование",
21
+ open: "Открыть",
22
+ save: "Сохранить",
23
+ print: "Печать",
24
+ pageSetup: "Параметры страницы",
25
+ image: "Изображение",
26
+ table: "Таблица",
27
+ insertTable: "Вставить таблицу",
28
+ break: "Разрыв",
29
+ pageBreak: "Разрыв страницы",
30
+ sectionBreakNextPage: "Разрыв раздела со следующей страницы",
31
+ sectionBreakContinuous: "Разрыв раздела на текущей странице",
32
+ tableOfContents: "Оглавление",
33
+ insertFootnote: "Сноска",
34
+ insertEndnote: "Концевая сноска",
35
+ watermark: "Подложка",
36
+ help: "Справка",
37
+ insertTextBox: "Текстовое поле",
38
+ leftToRight: "Текст слева направо",
39
+ rightToLeft: "Текст справа налево"
40
+ },
41
+ formattingBar: {
42
+ label: "Форматирование текста",
43
+ undo: "Отменить",
44
+ undoShortcut: "Отменить (Ctrl+Z)",
45
+ redo: "Повторить",
46
+ redoShortcut: "Повторить (Ctrl+Y)",
47
+ bold: "Полужирный",
48
+ boldShortcut: "Полужирный (Ctrl+B)",
49
+ italic: "Курсив",
50
+ italicShortcut: "Курсив (Ctrl+I)",
51
+ underline: "Подчёркнутый",
52
+ underlineShortcut: "Подчёркнутый (Ctrl+U)",
53
+ strikethrough: "Зачёркнутый",
54
+ fontColor: "Цвет текста",
55
+ highlightColor: "Выделение цветом",
56
+ insertLink: "Ссылка",
57
+ insertLinkShortcut: "Вставить ссылку (Ctrl+K)",
58
+ superscript: "Надстрочный",
59
+ subscript: "Подстрочный",
60
+ clearFormatting: "Очистить форматирование",
61
+ formatPainter: "Формат по образцу",
62
+ more: "Ещё",
63
+ paragraphMarks: "Показать знаки абзацев",
64
+ commentsAndChanges: "Комментарии и исправления",
65
+ imageProperties: "Параметры изображения",
66
+ imageWrap: "Обтекание текстом",
67
+ altText: "Описание изображения",
68
+ groups: {
69
+ history: "История",
70
+ zoom: "Масштаб",
71
+ styles: "Стили",
72
+ font: "Шрифт",
73
+ textFormatting: "Текст",
74
+ script: "Индексы",
75
+ alignment: "Выравнивание",
76
+ direction: "Направление",
77
+ listFormatting: "Списки",
78
+ format: "Формат",
79
+ image: "Изображение",
80
+ table: "Таблица"
81
+ }
82
+ },
83
+ alignment: {
84
+ alignLeft: "По левому краю",
85
+ center: "По центру",
86
+ alignRight: "По правому краю",
87
+ justify: "По ширине"
88
+ },
89
+ lists: {
90
+ ariaLabel: "Списки",
91
+ bulletList: "Маркированный список",
92
+ numberedList: "Нумерованный список",
93
+ decreaseIndent: "Уменьшить отступ",
94
+ increaseIndent: "Увеличить отступ"
95
+ },
96
+ styles: {
97
+ selectAriaLabel: "Стиль абзаца",
98
+ normalText: "Обычный",
99
+ title: "Название",
100
+ subtitle: "Подзаголовок",
101
+ heading1: "Заголовок 1",
102
+ heading2: "Заголовок 2",
103
+ heading3: "Заголовок 3"
104
+ },
105
+ font: {
106
+ selectAriaLabel: "Шрифт",
107
+ search: "Найти шрифт",
108
+ documentFonts: "Шрифты документа"
109
+ },
110
+ fontSize: {
111
+ label: "Размер шрифта",
112
+ decrease: "Уменьшить шрифт",
113
+ increase: "Увеличить шрифт",
114
+ listLabel: "Размеры шрифта"
115
+ },
116
+ zoom: {
117
+ ariaLabel: "Масштаб: {label}",
118
+ zoomOut: "Уменьшить",
119
+ zoomIn: "Увеличить",
120
+ zoomLevel: "Масштаб",
121
+ automatic: "Автоматически",
122
+ fitWidth: "По ширине"
123
+ },
124
+ lineSpacing: {
125
+ label: "Межстрочный интервал",
126
+ single: "Одинарный",
127
+ double: "Двойной",
128
+ blockSpacingRules: "Интервалы абзаца",
129
+ options: "Параметры интервалов…"
130
+ }
131
+ }, h = class extends Error {
132
+ code;
133
+ constructor(e) {
134
+ super(e), this.code = e;
135
+ }
136
+ };
137
+ function g(e) {
138
+ return e.throwIfAborted(), new Promise((t, n) => {
139
+ let r = () => {
140
+ cancelAnimationFrame(i), n(e.reason);
141
+ }, i = requestAnimationFrame(() => {
142
+ e.removeEventListener("abort", r), t();
143
+ });
144
+ e.addEventListener("abort", r, { once: !0 });
145
+ });
146
+ }
147
+ async function _(e, t, n, r, i, a = Infinity) {
148
+ let o = t.ownerDocument, s = e.getZoom(), c = e.getZoomMode(), l = e.getCurrentPage("viewport"), u = Array.from(t.querySelectorAll("*")).filter((e) => e.scrollHeight > e.clientHeight || e.scrollWidth > e.clientWidth).map((e) => ({
149
+ el: e,
150
+ top: e.scrollTop,
151
+ left: e.scrollLeft
152
+ })), d = 0, f = new MutationObserver(() => {
153
+ d++;
154
+ });
155
+ f.observe(t, {
156
+ childList: !0,
157
+ subtree: !0,
158
+ attributes: !0,
159
+ characterData: !0
160
+ });
161
+ let p = () => `${e.getDocumentHandle?.().revision ?? 0}:${e.snapshot().page.total}:${d}`;
162
+ async function m() {
163
+ let t = p(), n = 0;
164
+ for (; n < 2;) {
165
+ await g(i);
166
+ let r = e.snapshot();
167
+ if (r.parseError) throw new h("INVALID_DOCX");
168
+ let a = p();
169
+ n = !r.isLoading && !r.isOpening && a === t ? n + 1 : 0, t = a;
170
+ }
171
+ }
172
+ try {
173
+ i.throwIfAborted(), await e.save(), await o.fonts.ready, i.throwIfAborted(), e.setZoom(1), await m();
174
+ let s = e.snapshot().page.total;
175
+ if (s > a) throw new h("PAGE_LIMIT_EXCEEDED");
176
+ if (!s) throw new h("RENDER_FAILED");
177
+ let c = e.getDocumentHandle?.().revision, l = [], u = [];
178
+ n.replaceChildren();
179
+ for (let r = 0; r < s; r++) {
180
+ i.throwIfAborted(), e.scrollToPage(r + 1), await m();
181
+ let a = t.querySelector(`.docx-page[data-page-index="${r}"]`);
182
+ if (!a || a.dataset.materialized !== "true") throw new h("RENDER_FAILED");
183
+ await Promise.all(Array.from(a.querySelectorAll("img")).map((e) => e.decode())), await o.fonts.ready, await m();
184
+ let s = Number.parseFloat(a.style.width), c = Number.parseFloat(a.style.height);
185
+ if (!Number.isFinite(s) || !Number.isFinite(c) || s <= 0 || c <= 0) throw new h("RENDER_FAILED");
186
+ let d = a.cloneNode(!0);
187
+ d.classList.add("az-print-sheet"), d.removeAttribute("contenteditable"), d.removeAttribute("aria-hidden"), d.querySelectorAll("[contenteditable]").forEach((e) => e.removeAttribute("contenteditable")), d.querySelectorAll("[data-docx-hf-label]").forEach((e) => e.remove()), d.style.setProperty("page", `az-sheet-${r}`), l.push({
188
+ widthPt: s * 72 / 96,
189
+ heightPt: c * 72 / 96
190
+ }), u.push(`@page az-sheet-${r} { size: ${(s * .75).toFixed(3)}pt ${(c * .75).toFixed(3)}pt; margin: 0; }`), n.append(d);
191
+ }
192
+ if (r.textContent = u.join("\n"), await Promise.all(Array.from(n.querySelectorAll("img")).map((e) => e.decode())), await o.fonts.ready, await m(), e.snapshot().page.total !== s || e.getDocumentHandle?.().revision !== c || n.children.length !== s) throw new h("RENDER_FAILED");
193
+ return l;
194
+ } catch (e) {
195
+ throw n.replaceChildren(), r.textContent = "", e;
196
+ } finally {
197
+ f.disconnect(), t.isConnected && (e.setZoom(s), e.setZoomMode(c), e.scrollToPage(l), u.forEach(({ el: e, top: t, left: n }) => {
198
+ e.scrollTop = t, e.scrollLeft = n;
199
+ }));
200
+ }
201
+ }
202
+ //#endregion
203
+ //#region src/library/print-document.ts
204
+ function v(e, t) {
205
+ let n = e.ownerDocument;
206
+ return ((t instanceof Element ? t.closest(".az-document-editor") : null) ?? n.activeElement?.closest(".az-document-editor")) === e;
207
+ }
208
+ async function y(e, t, n, r) {
209
+ let i = t.ownerDocument, a = i.defaultView, o = i.title, s = i.activeElement instanceof HTMLElement ? i.activeElement : null, c = e.getZoom(), l = e.getZoomMode(), u = e.getCurrentPage("viewport"), d = Array.from(t.querySelectorAll("*")).filter((e) => e.scrollHeight > e.clientHeight || e.scrollWidth > e.clientWidth).map((e) => ({
210
+ el: e,
211
+ top: e.scrollTop,
212
+ left: e.scrollLeft
213
+ })), f = i.createElement("div");
214
+ f.className = "az-print-preview docx-editor", f.dataset.azPrintRoot = "", f.setAttribute("role", "dialog"), f.setAttribute("aria-label", "PDF и печать"), f.setAttribute("aria-modal", "true");
215
+ let p = i.createElement("div");
216
+ p.className = "az-print-bar";
217
+ let m = i.createElement("p");
218
+ m.textContent = "Готовим страницы…", m.setAttribute("role", "status");
219
+ let h = i.createElement("button");
220
+ h.textContent = "Сохранить PDF / печать", h.disabled = !0, h.onclick = () => {
221
+ i.title = n.replace(/\.docx$/i, ""), a.print();
222
+ };
223
+ let g = i.createElement("button");
224
+ g.textContent = "Вернуться к редактированию";
225
+ let v = i.createElement("div");
226
+ v.className = "az-print-pages";
227
+ let y = i.createElement("style"), b = Array.from(i.body.children).filter((e) => e instanceof HTMLElement).map((e) => ({
228
+ el: e,
229
+ inert: e.inert
230
+ })), x = new AbortController(), S = AbortSignal.any([r, x.signal]), C = !1, w = !1, T = () => {
231
+ w && (w = !1, t.isConnected && (e.setZoom(c), e.setZoomMode(l), e.scrollToPage(u), d.forEach(({ el: e, top: t, left: n }) => {
232
+ e.scrollTop = t, e.scrollLeft = n;
233
+ })));
234
+ }, E = () => {
235
+ C || (C = !0, x.abort(), T(), f.remove(), i.title = o, b.forEach(({ el: e, inert: t }) => {
236
+ e.inert = t;
237
+ }), r.removeEventListener("abort", E), s?.focus({ preventScroll: !0 }));
238
+ };
239
+ g.onclick = E, f.onkeydown = (e) => {
240
+ e.key === "Escape" && (e.preventDefault(), E()), (e.ctrlKey || e.metaKey) && e.code === "KeyP" && (e.preventDefault(), e.stopPropagation(), h.disabled || h.click()), e.key === "Tab" && (e.preventDefault(), i.activeElement === h || h.disabled ? g.focus() : h.focus());
241
+ }, p.append(m, h, g), f.append(p, v, y), i.body.append(f), b.forEach(({ el: e }) => {
242
+ e.inert = !0;
243
+ }), g.focus(), r.addEventListener("abort", E, { once: !0 });
244
+ let D = () => {
245
+ if (r.aborted || C) throw new DOMException("Print cancelled", "AbortError");
246
+ };
247
+ try {
248
+ D(), w = !0;
249
+ let n = (await _(e, t, v, y, S)).length;
250
+ return D(), m.textContent = `Страниц: ${n}. В диалоге печати выберите «Сохранить как PDF». Масштаб — 100%, поля — нет, колонтитулы браузера — выключены.`, h.disabled = !1, h.focus(), E;
251
+ } catch (e) {
252
+ throw E(), e;
253
+ } finally {
254
+ T();
255
+ }
256
+ }
257
+ //#endregion
258
+ //#region src/library/hujjat/contract.ts
259
+ var b = [
260
+ "uz",
261
+ "ru",
262
+ "uz_cyrl",
263
+ "en"
264
+ ], x = 1048576, S = {
265
+ widthMm: 210,
266
+ heightMm: 297,
267
+ topMm: 15,
268
+ rightMm: 20,
269
+ bottomMm: 35,
270
+ leftMm: 20
271
+ }, C = class extends Error {
272
+ warnings;
273
+ constructor(e, t = []) {
274
+ super(e), this.name = "HujjatCompatibilityError", this.warnings = t;
275
+ }
276
+ };
277
+ function w(e, t, n, r = "warning") {
278
+ e.some((e) => e.code === t && e.message === n) || e.push({
279
+ code: t,
280
+ message: n,
281
+ severity: r
282
+ });
283
+ }
284
+ function T(e, t = !1) {
285
+ if (!t && e.some((e) => e.severity === "loss")) throw new C("Hujjat не сохраняет часть содержимого. Проверьте warnings; allowLossy разрешает экспорт с указанными потерями.", e);
286
+ }
287
+ function E(e) {
288
+ return e.length <= 100 && /^[A-Za-z0-9_]+(?:\.[A-Za-z0-9_]+)*$/.test(e) && !e.split(".").some((e) => [
289
+ "__proto__",
290
+ "prototype",
291
+ "constructor"
292
+ ].includes(e));
293
+ }
294
+ function D(e) {
295
+ return /courier|mono/i.test(e) ? "freemono" : /arial|helvetica|calibri|sans/i.test(e) ? "freesans" : "freeserif";
296
+ }
297
+ var O = new Set("div p span br hr b strong i em u s sub sup h1 h2 h3 h4 h5 h6 ul ol li table thead tbody tfoot tr td th".split(" ")), k = new Set("script style iframe object embed svg math img picture video audio canvas link meta form input textarea select button template noscript base frame frameset".split(" ")), A = new Set("div p h1 h2 h3 h4 h5 h6 ul ol li table thead tbody tfoot tr td th br hr".split(" ")), ee = new Set(("color font-family font-size font-weight font-style text-decoration text-align text-transform text-indent letter-spacing line-height white-space vertical-align background background-color width height margin padding border border-color border-width border-style border-collapse table-layout page-break-before page-break-after page-break-inside " + [
298
+ "top",
299
+ "right",
300
+ "bottom",
301
+ "left"
302
+ ].flatMap((e) => [
303
+ `margin-${e}`,
304
+ `padding-${e}`,
305
+ `border-${e}`,
306
+ `border-${e}-style`,
307
+ `border-${e}-width`,
308
+ `border-${e}-color`
309
+ ]).join(" ")).split(" "));
310
+ function te(e, t) {
311
+ let n = /* @__PURE__ */ new Map();
312
+ for (let r of e.split(";")) {
313
+ if (!r.trim()) continue;
314
+ let e = r.indexOf(":"), i = r.slice(0, e).trim().toLowerCase(), a = r.slice(e + 1).trim(), o = /[<>{}\\@]|url\s*\(|expression|javascript|vbscript|behavior|binding|import|\/\*|!important/i.test(a) || a.length > 200 || /[()]/.test(a.replace(/(?:rgb|hsl)a?\([\d\s.,%/+-]+\)/gi, "")), s = [...a.matchAll(/(-?\d*\.?\d+)\s*(pt|px|in|cm|mm|pc)\b/gi)].some((e) => Math.abs(Number(e[1])) * {
315
+ pt: 1,
316
+ px: .75,
317
+ in: 72,
318
+ cm: 72 / 2.54,
319
+ mm: 72 / 25.4,
320
+ pc: 12
321
+ }[e[2].toLowerCase()] > 600);
322
+ if (e < 1 || !ee.has(i) || !a || o || s || i === "color" && a.toLowerCase() === "auto") w(t, "css-removed", `Стиль ${i || r} не поддерживается контрактом Hujjat.`);
323
+ else {
324
+ if (i === "font-family") {
325
+ let e = D(a);
326
+ a.replace(/['"]/g, "").toLowerCase() !== e && w(t, "font-substitution", `Шрифт ${a} заменён на ${e}.`), a = e;
327
+ }
328
+ n.set(i, a);
329
+ }
330
+ }
331
+ return [...n].map(([e, t]) => `${e}:${t}`).join(";");
332
+ }
333
+ function j(e) {
334
+ let t = document.createElement("template");
335
+ return t.innerHTML = e, t.content;
336
+ }
337
+ function ne(e) {
338
+ let t = [], n = [], r = () => {
339
+ n.length && t.push(n), n = [];
340
+ };
341
+ function i(e) {
342
+ if (e.nodeType === 3) {
343
+ n.push(e);
344
+ return;
345
+ }
346
+ let t = e instanceof Element && A.has(e.localName);
347
+ t && r();
348
+ for (let t of e.childNodes) i(t);
349
+ t && r();
350
+ }
351
+ for (let t of e.childNodes) i(t);
352
+ r();
353
+ for (let e of t) {
354
+ let t = e.map((e) => e.data).join("");
355
+ for (let n of [...t.matchAll(/\{[A-Za-z0-9_.]+\}/g)].reverse()) {
356
+ let t = 0, r, i, a = 0, o = 0;
357
+ for (let s of e) {
358
+ if (!r && n.index < t + s.length && (r = s, a = n.index - t), n.index + n[0].length <= t + s.length) {
359
+ i = s, o = n.index + n[0].length - t;
360
+ break;
361
+ }
362
+ t += s.length;
363
+ }
364
+ if (r && i && r !== i) {
365
+ let e = document.createRange();
366
+ e.setStart(r, a), e.setEnd(i, o), e.deleteContents(), r.insertData(a, n[0]);
367
+ }
368
+ }
369
+ }
370
+ }
371
+ function M(e) {
372
+ if (typeof e != "string" || !e.trim()) throw new C("HTML шаблона пуст.");
373
+ if (new TextEncoder().encode(e).length > 1048576) throw new C("HTML превышает 1 МБ (1048576 байт).");
374
+ let t = j(e), n = document.createElement("div"), r = [], i = 0;
375
+ function a(e, t, n) {
376
+ if (++i > 5e4 || n > 100) throw new C("HTML слишком сложный.");
377
+ if (e.nodeType === 3) {
378
+ t.appendChild(document.createTextNode(e.textContent ?? ""));
379
+ return;
380
+ }
381
+ if (!(e instanceof Element)) return;
382
+ let o = e.localName.toLowerCase();
383
+ if (k.has(o)) {
384
+ w(r, "html-element-removed", `Элемент ${o} удалён: он не поддерживается HTML-блоком Hujjat.`, "loss");
385
+ return;
386
+ }
387
+ if (!O.has(o)) {
388
+ w(r, "html-tag-unwrapped", `Тег ${o} удалён с сохранением текста.`);
389
+ for (let r of e.childNodes) a(r, t, n + 1);
390
+ return;
391
+ }
392
+ let s = document.createElement(o), c = e.getAttribute("style") ?? "";
393
+ e.hasAttribute("bgcolor") && (c += `;background-color:${e.getAttribute("bgcolor")}`);
394
+ let l = te(c, r);
395
+ if (l && s.setAttribute("style", l), o === "td" || o === "th") for (let t of ["colspan", "rowspan"]) {
396
+ let n = e.getAttribute(t);
397
+ n && /^\d+$/.test(n) && Number(n) >= 1 && Number(n) <= 100 && s.setAttribute(t, String(Number(n)));
398
+ }
399
+ for (let t of e.childNodes) a(t, s, n + 1);
400
+ t.appendChild(s);
401
+ }
402
+ for (let e of t.childNodes) a(e, n, 0);
403
+ ne(n);
404
+ let o = /* @__PURE__ */ new Set(), s = document.createTreeWalker(n, NodeFilter.SHOW_TEXT);
405
+ for (; s.nextNode();) for (let e of s.currentNode.textContent.matchAll(/\{([^{}]+)\}/g)) {
406
+ let t = e[1];
407
+ /^[A-Za-z0-9_.]+$/.test(t) && o.add(t), E(t) || w(r, "invalid-variable", `Проверьте переменную {${t}}: используйте ASCII-путь без пустых сегментов, до 100 символов.`);
408
+ }
409
+ let c = n.innerHTML || "<p></p>";
410
+ if (new TextEncoder().encode(c).length > 1048576) throw new C("HTML превышает 1 МБ (1048576 байт).");
411
+ return {
412
+ html: c,
413
+ variables: [...o],
414
+ warnings: r
415
+ };
416
+ }
417
+ function N(e) {
418
+ if (!b.includes(e)) throw new C(`Неподдерживаемая локаль: ${e}.`);
419
+ }
420
+ function re(e, t) {
421
+ N(t);
422
+ let n = e[t];
423
+ if (!n || !Array.isArray(n.blocks) || !n.blocks.length) throw new C(`Нет HTML-шаблона для локали ${t}.`);
424
+ return n.blocks.map((e) => {
425
+ if (e.type !== "html" || typeof e.props?.html != "string" || e.style && Object.keys(e.style).length) throw new C(`Блок ${e.type} или его внешние стили не поддерживаются редактором HTML; содержимое не изменено.`);
426
+ return e.props.html;
427
+ }).join("");
428
+ }
429
+ function ie(e, t, n) {
430
+ N(t);
431
+ for (let t of Object.keys(e)) N(t);
432
+ let r = M(n);
433
+ return {
434
+ ...r,
435
+ locales: {
436
+ ...structuredClone(e),
437
+ [t]: { blocks: [{
438
+ type: "html",
439
+ props: { html: r.html }
440
+ }] }
441
+ }
442
+ };
443
+ }
444
+ //#endregion
445
+ //#region src/library/hujjat/xml.ts
446
+ var ae = "http://schemas.openxmlformats.org/wordprocessingml/2006/main", P = (e) => e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;"), F = (e, t) => Array.from(e?.children ?? []).filter((e) => e.namespaceURI === "http://schemas.openxmlformats.org/wordprocessingml/2006/main" && (!t || e.localName === t)), I = (e, t) => F(e, t)[0] ?? null, L = (e, t = "val") => e?.getAttributeNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", t) ?? "", R = (e, t) => L(I(e, t)), z = (e) => e !== null && ![
447
+ "0",
448
+ "false",
449
+ "off",
450
+ "none"
451
+ ].includes(L(e)), B = (e) => `${Number(e) / 20}pt`, V = (e) => Object.keys(e).length ? ` style="${P(Object.entries(e).map(([e, t]) => `${e}:${t}`).join(";"))}"` : "";
452
+ function oe(e) {
453
+ if (/<!DOCTYPE|<!ENTITY/i.test(e)) throw new C("XML с DTD/ENTITY не поддерживается.");
454
+ let t = new DOMParser().parseFromString(e, "application/xml");
455
+ if (t.querySelector("parsererror")) throw new C("Повреждённый XML в DOCX.");
456
+ if (t.getElementsByTagName("*").length > 5e4) throw new C("Слишком сложный XML в DOCX.");
457
+ return t;
458
+ }
459
+ async function H(e, t) {
460
+ let n = e.file(t);
461
+ return n ? oe(await new Promise((e, t) => {
462
+ let r = n.internalStream("uint8array"), i = 0, a = [];
463
+ r.on("data", (e) => {
464
+ i += e.length, i > 8388608 ? (r.pause(), t(new C("XML-часть DOCX превышает 8 МиБ."))) : a.push(e);
465
+ }), r.on("error", t), r.on("end", () => {
466
+ let t = new Uint8Array(i), n = 0;
467
+ for (let e of a) t.set(e, n), n += e.length;
468
+ e(new TextDecoder().decode(t));
469
+ }), r.resume();
470
+ })) : null;
471
+ }
472
+ function U(e) {
473
+ let t = {};
474
+ I(e, "vanish") && (t["--az-hidden"] = z(I(e, "vanish")) ? "1" : "0");
475
+ let n = I(e, "rFonts"), r = L(n, "ascii") || L(n, "hAnsi") || L(n, "cs");
476
+ r && (t["font-family"] = r), R(e, "sz") && (t["font-size"] = `${Number(R(e, "sz")) / 2}pt`);
477
+ for (let [n, r, i, a] of [[
478
+ "b",
479
+ "font-weight",
480
+ "bold",
481
+ "normal"
482
+ ], [
483
+ "i",
484
+ "font-style",
485
+ "italic",
486
+ "normal"
487
+ ]]) I(e, n) && (t[r] = z(I(e, n)) ? i : a);
488
+ let i = [];
489
+ I(e, "u") && (z(I(e, "u")) ? i.push("underline") : t["text-decoration"] = "none"), (z(I(e, "strike")) || z(I(e, "dstrike"))) && i.push("line-through"), i.length && (t["text-decoration"] = i.join(" "));
490
+ let a = R(e, "color");
491
+ /^[\da-f]{6}$/i.test(a) && (t.color = `#${a}`);
492
+ let o = L(I(e, "shd"), "fill");
493
+ return /^[\da-f]{6}$/i.test(o) ? t["background-color"] = `#${o}` : R(e, "highlight") && R(e, "highlight") !== "none" && (t["background-color"] = R(e, "highlight")), ["superscript", "subscript"].includes(R(e, "vertAlign")) && (t["vertical-align"] = R(e, "vertAlign") === "superscript" ? "super" : "sub"), z(I(e, "caps")) && (t["text-transform"] = "uppercase"), R(e, "spacing") && (t["letter-spacing"] = B(R(e, "spacing"))), t;
494
+ }
495
+ function se(e) {
496
+ let t = {}, n = R(e, "jc");
497
+ n && (t["text-align"] = {
498
+ both: "justify",
499
+ distribute: "justify",
500
+ start: "left",
501
+ end: "right"
502
+ }[n] ?? n);
503
+ let r = I(e, "spacing");
504
+ for (let [e, n] of [["before", "margin-top"], ["after", "margin-bottom"]]) L(r, e) && (t[n] = B(L(r, e)));
505
+ L(r, "line") && (t["line-height"] = L(r, "lineRule") === "auto" || !L(r, "lineRule") ? String(Number(L(r, "line")) / 240) : B(L(r, "line")));
506
+ let i = I(e, "ind");
507
+ for (let [e, n] of [
508
+ ["left", "margin-left"],
509
+ ["right", "margin-right"],
510
+ ["firstLine", "text-indent"]
511
+ ]) L(i, e) && (t[n] = B(L(i, e)));
512
+ return L(i, "hanging") && (t["text-indent"] = B(-Number(L(i, "hanging")))), z(I(e, "pageBreakBefore")) && (t["page-break-before"] = "always"), z(I(e, "keepNext")) && (t["page-break-after"] = "avoid"), z(I(e, "keepLines")) && (t["page-break-inside"] = "avoid"), t;
513
+ }
514
+ function ce(e) {
515
+ if (!e) return;
516
+ if (["nil", "none"].includes(L(e))) return "none";
517
+ let t = {
518
+ double: "double",
519
+ dotted: "dotted",
520
+ dashed: "dashed"
521
+ }[L(e)] ?? "solid", n = L(e, "color");
522
+ return `${Number(L(e, "sz") || 4) / 8}pt ${t} ${/^[\da-f]{6}$/i.test(n) ? "#" + n : "#000000"}`;
523
+ }
524
+ //#endregion
525
+ //#region src/library/hujjat/docx-to-html.ts
526
+ async function le(e) {
527
+ if (e.byteLength > 31457280) throw new C("DOCX превышает 30 МиБ.");
528
+ let t;
529
+ try {
530
+ t = await d.loadAsync(e);
531
+ } catch {
532
+ throw new C("Повреждённый файл DOCX.");
533
+ }
534
+ let n = Object.keys(t.files);
535
+ if (n.length > 2e3) throw new C("В DOCX более 2000 частей.");
536
+ if (n.some((e) => /vbaProject\.bin$/i.test(e))) throw new C("DOCX с макросами не поддерживается.");
537
+ let r = await H(t, "[Content_Types].xml");
538
+ if (!Array.from(r?.getElementsByTagNameNS("*", "Override") ?? []).some((e) => e.getAttribute("PartName") === "/word/document.xml" && e.getAttribute("ContentType") === "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml")) throw new C("Файл не является обычным DOCX.");
539
+ let i = await H(t, "word/document.xml"), a = await H(t, "word/styles.xml"), o = await H(t, "word/numbering.xml"), s = I(i?.documentElement, "body");
540
+ if (!s) throw new C("В DOCX нет поддерживаемой структуры документа.");
541
+ let c = [], l = (e, t) => w(c, e, t, "loss");
542
+ n.some((e) => /^word\/(header|footer)[^/]*\.xml$/.test(e)) && l("header-footer-removed", "Колонтитулы Word не входят в HTML-блок; футер формирует Hujjat."), n.some((e) => /^word\/comments/.test(e)) && l("review-removed", "Комментарии Word не сохраняются в HTML.");
543
+ let u = I(a?.documentElement, "docDefaults"), f = {
544
+ "margin-top": "0pt",
545
+ "margin-bottom": "8px",
546
+ ...se(I(I(u, "pPrDefault"), "pPr"))
547
+ }, p = {
548
+ "font-family": "freeserif",
549
+ "font-size": "12pt",
550
+ color: "#111111",
551
+ ...U(I(I(u, "rPrDefault"), "rPr"))
552
+ }, m = new Map(F(a?.documentElement, "style").map((e) => [L(e, "styleId"), e]));
553
+ function h(e, t = /* @__PURE__ */ new Set()) {
554
+ if (!e || t.has(e) || t.size > 30) return [];
555
+ t.add(e);
556
+ let n = m.get(e);
557
+ return n ? [...h(R(n, "basedOn"), t), n] : [];
558
+ }
559
+ let g = F(a?.documentElement, "style").find((e) => L(e, "type") === "paragraph" && L(e, "default") === "1"), _ = new Map(F(o?.documentElement, "num").map((e) => [L(e, "numId"), e])), v = new Map(F(o?.documentElement, "abstractNum").map((e) => [L(e, "abstractNumId"), e])), y = /* @__PURE__ */ new Set(), b = !1, x = 0, S = (e) => {
560
+ if (++x > 5e4 || e > 80) throw new C("DOCX слишком сложный для HTML-адаптера.");
561
+ };
562
+ function T(e, t, n) {
563
+ if (S(n), e.namespaceURI !== "http://schemas.openxmlformats.org/wordprocessingml/2006/main") return l("unsupported-content", "Нестандартный объект Word не сохраняется в HTML."), "";
564
+ switch (e.localName) {
565
+ case "t": return P(Array.from(e.textContent ?? "").map((e) => {
566
+ let t = e === " " && b ? "\xA0" : e;
567
+ return b = e === " ", t;
568
+ }).join(""));
569
+ case "tab": return w(c, "tab-normalized", "Табуляция заменена пробелом; для выравнивания используйте таблицу."), " ";
570
+ case "br": return L(e, "type") === "page" ? "<div style=\"page-break-before:always\"></div>" : "<br>";
571
+ case "cr": return "<br>";
572
+ case "noBreakHyphen": return "‑";
573
+ case "softHyphen": return "­";
574
+ case "r": {
575
+ let r = I(e, "rPr"), i = Object.assign({}, t, ...h(R(r, "rStyle")).map((e) => U(I(e, "rPr"))), U(r));
576
+ if (i["--az-hidden"] === "1") return l("hidden-text-removed", "Скрытый текст Word исключён из HTML."), "";
577
+ let a = Object.fromEntries(Object.entries(i).filter(([e]) => e !== "--az-hidden"));
578
+ return F(e).filter((e) => e.localName !== "rPr").map((e) => T(e, i, n + 1)).join("").split(/(<div style="page-break-before:always"><\/div>)/).map((e) => e.startsWith("<div ") ? e : e ? `<span${V(a)}>${e}</span>` : "").join("");
579
+ }
580
+ case "hyperlink":
581
+ w(c, "hyperlink-removed", "Ссылки сохраняются как текст без перехода.");
582
+ break;
583
+ case "del":
584
+ case "moveFrom": return l("review-removed", "Исправления Word преобразуются в итоговый текст; история теряется."), "";
585
+ case "ins":
586
+ case "moveTo":
587
+ l("review-removed", "Исправления Word преобразуются в итоговый текст; история теряется.");
588
+ break;
589
+ case "drawing":
590
+ case "pict":
591
+ case "object": return l("drawing-removed", "Изображения, фигуры и текстовые блоки Word не поддерживаются HTML-блоком Hujjat."), "";
592
+ case "footnoteReference":
593
+ case "endnoteReference": return l("notes-removed", "Сноски Word не поддерживаются HTML-блоком."), "";
594
+ case "instrText":
595
+ case "fldChar": return l("field-flattened", "Поля Word сохраняют только имеющийся текстовый результат."), "";
596
+ case "fldSimple":
597
+ l("field-flattened", "Поля Word сохраняют только имеющийся текстовый результат.");
598
+ break;
599
+ case "sdt": return l("content-control-flattened", "Элементы управления Word преобразуются в обычный текст."), I(e, "sdtContent") ? T(I(e, "sdtContent"), t, n + 1) : "";
600
+ case "sdtContent":
601
+ case "smartTag":
602
+ case "customXml": break;
603
+ case "bookmarkStart":
604
+ case "bookmarkEnd":
605
+ case "proofErr":
606
+ case "lastRenderedPageBreak":
607
+ case "commentRangeStart":
608
+ case "commentRangeEnd":
609
+ case "commentReference": return "";
610
+ default: l("unsupported-inline", `Элемент Word ${e.localName} не поддерживается HTML-адаптером.`);
611
+ }
612
+ return Array.from(e.children).map((e) => T(e, t, n + 1)).join("");
613
+ }
614
+ function E(e, t) {
615
+ let n = I(e, "pPr"), r = h(R(n, "pStyle") || L(g, "styleId")), i = [...r.map((e) => I(e, "pPr")), n], a = Object.assign({}, f, ...i.map(se)), o = Object.assign({}, p, ...r.map((e) => U(I(e, "rPr"))));
616
+ I(n, "tabs") && w(c, "tab-stops-removed", "Позиции табуляции не поддерживаются HTML-блоком."), I(n, "sectPr") && w(c, "section-normalized", "Разделы Word приводятся к странице A4 Hujjat."), b = !0;
617
+ let s = Array.from(e.children).filter((e) => e !== n).map((e) => T(e, o, t + 1)).join("").split("<div style=\"page-break-before:always\"></div>").map((e, t) => `${t ? "<div style=\"page-break-before:always\"></div>" : ""}<p${V(a)}>${e || "<br>"}</p>`).join(""), l = i.map((e) => I(e, "numPr")).filter(Boolean).at(-1), u = R(l, "numId"), d = Number(R(l, "ilvl") || 0);
618
+ if (u && u !== "0") {
619
+ let e = _.get(u), t = F(v.get(R(e, "abstractNumId")), "lvl").find((e) => L(e, "ilvl") === String(d));
620
+ if (!t) return w(c, "numbering-unsupported", "Не найдена нумерация списка.", "loss"), { html: s };
621
+ let n = R(t, "numFmt");
622
+ return (!["decimal", "bullet"].includes(n) || d || R(t, "start") && R(t, "start") !== "1" || I(e, "lvlOverride")) && w(c, "numbering-normalized", "Сложная нумерация/начальное число списка заменены обычным HTML-списком.", "loss"), {
623
+ html: s,
624
+ list: {
625
+ id: u,
626
+ level: Math.min(d, 8),
627
+ tag: n === "bullet" ? "ul" : "ol"
628
+ }
629
+ };
630
+ }
631
+ return {
632
+ html: s,
633
+ continuation: R(n, "pStyle") === "AzHujjatListContinuation"
634
+ };
635
+ }
636
+ function D(e, t) {
637
+ S(t);
638
+ let n = I(e, "tblPr");
639
+ R(n, "tblStyle") && w(c, "table-style-normalized", "Условные стили таблиц Word могут отличаться; проверьте границы и заливку.");
640
+ let r = I(n, "tblBorders"), i = F(e, "tr"), a = /* @__PURE__ */ new Map(), o = Math.max(1, ...i.map((e) => F(e, "tc").reduce((e, t) => e + Number(R(I(t, "tcPr"), "gridSpan") || 1), 0))), s = [];
641
+ i.forEach((e, c) => {
642
+ let u = 0, d = [];
643
+ Number(R(I(e, "trPr"), "gridBefore") || 0) && l("table-grid-unsupported", "Таблица с пропущенными начальными ячейками требует проверки.");
644
+ for (let s of F(e, "tc")) {
645
+ let e = I(s, "tcPr"), f = Number(R(e, "gridSpan") || 1), p = I(e, "vMerge");
646
+ if (I(e, "hMerge") && l("legacy-table-merge", "Старый формат горизонтального объединения hMerge требует преобразования в gridSpan."), !Number.isInteger(f) || f < 1 || f > 100) throw new C("Объединение таблицы превышает предел 100 ячеек.");
647
+ if (p && L(p) !== "restart" && a.has(u) && a.get(u).span === f) {
648
+ let e = a.get(u);
649
+ if (e.rowSpan++, e.rowSpan > 100) throw new C("Объединение таблицы превышает 100 строк.");
650
+ s.getElementsByTagNameNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "t").length && s.textContent?.trim() && l("table-merge-content", "Текст в продолжении объединённой ячейки требует ручной проверки."), u += f;
651
+ continue;
652
+ }
653
+ let m = {}, h = I(e, "tcW");
654
+ L(h, "type") === "dxa" ? m.width = B(L(h, "w")) : L(h, "type") === "pct" && (m.width = `${Number(L(h, "w")) / 50}%`);
655
+ let g = L(I(e, "shd"), "fill");
656
+ /^[\da-f]{6}$/i.test(g) && (m["background-color"] = "#" + g), R(e, "vAlign") && (m["vertical-align"] = R(e, "vAlign") === "center" ? "middle" : R(e, "vAlign"));
657
+ for (let t of [
658
+ "top",
659
+ "right",
660
+ "bottom",
661
+ "left"
662
+ ]) {
663
+ let a = I(I(e, "tcBorders"), t), s = t === "top" && c > 0 || t === "bottom" && c < i.length - 1 ? "insideH" : t === "left" && u > 0 || t === "right" && u + f < o ? "insideV" : t, l = I(r, s), d = ce(a ?? l);
664
+ d && (m[`border-${t}`] = d);
665
+ let p = I(I(e, "tcMar"), t) ?? I(I(n, "tblCellMar"), t);
666
+ p && L(p, "w") && (m[`padding-${t}`] = B(L(p, "w")));
667
+ }
668
+ let _ = {
669
+ element: s,
670
+ rowSpan: 1,
671
+ span: f,
672
+ html: O(s, t + 1),
673
+ css: m
674
+ };
675
+ for (let e = u; e < u + f; e++) a.delete(e);
676
+ p && L(p) === "restart" && a.set(u, _), d.push(_), u += f;
677
+ }
678
+ for (let e of a.keys()) e >= u && a.delete(e);
679
+ s.push(d);
680
+ });
681
+ let u = I(n, "tblW");
682
+ return `<table${V({
683
+ width: L(u, "type") === "dxa" ? B(L(u, "w")) : L(u, "type") === "pct" ? `${Number(L(u, "w")) / 50}%` : "100%",
684
+ "border-collapse": "collapse"
685
+ })}>${s.map((e) => `<tr>${e.map((e) => `<td${e.span > 1 ? ` colspan="${e.span}"` : ""}${e.rowSpan > 1 ? ` rowspan="${e.rowSpan}"` : ""}${V(e.css)}>${e.html || "<p><br></p>"}</td>`).join("")}</tr>`).join("")}</table>`;
686
+ }
687
+ function O(e, t) {
688
+ S(t);
689
+ let n = "", r, i = () => {
690
+ r && (n += `</${r.tag}>`), r = void 0;
691
+ };
692
+ for (let a of Array.from(e.children)) if (a.namespaceURI !== "http://schemas.openxmlformats.org/wordprocessingml/2006/main") i(), l("unsupported-content", "Нестандартный блок Word не сохраняется в HTML.");
693
+ else if (a.localName === "p") {
694
+ let e = E(a, t + 1);
695
+ e.list ? ((r?.id !== e.list.id || r.tag !== e.list.tag) && (i(), r = e.list, r.tag === "ol" && y.has(r.id) && l("numbering-restart", "Продолжение нумерованного списка после другого блока начнётся с 1: Hujjat удаляет атрибут start."), y.add(r.id), n += `<${r.tag}>`), n += `<li>${e.html}</li>`) : e.continuation && r && n.endsWith("</li>") ? n = n.slice(0, -5) + e.html + "</li>" : (i(), n += e.html);
696
+ } else if (a.localName === "tbl") i(), n += D(a, t + 1);
697
+ else if (a.localName === "sectPr") {
698
+ let e = I(a, "pgSz"), t = I(a, "pgMar");
699
+ (L(e, "orient") === "landscape" || L(e, "w") && Math.abs(Number(L(e, "w")) - 11906) > 2 || L(t, "bottom") && Math.abs(Number(L(t, "bottom")) - 1984) > 2) && w(c, "page-normalized", "Размеры и поля Word заменяются настройками Hujjat: A4, 15/20/35/20 мм.");
700
+ } else [
701
+ "sdt",
702
+ "customXml",
703
+ "ins",
704
+ "del",
705
+ "moveFrom",
706
+ "moveTo"
707
+ ].includes(a.localName) ? (i(), l("block-flattened", `Блок Word ${a.localName} преобразован без интерактивности/истории.`), ["del", "moveFrom"].includes(a.localName) || (n += O(I(a, "sdtContent") ?? a, t + 1))) : [
708
+ "tblPr",
709
+ "tblGrid",
710
+ "tcPr",
711
+ "trPr",
712
+ "bookmarkStart",
713
+ "bookmarkEnd",
714
+ "proofErr"
715
+ ].includes(a.localName) || (i(), l("unsupported-block", `Блок Word ${a.localName} не поддерживается HTML-адаптером.`));
716
+ return i(), n;
717
+ }
718
+ return {
719
+ html: O(s, 0) || "<p><br></p>",
720
+ warnings: c
721
+ };
722
+ }
723
+ //#endregion
724
+ //#region src/library/hujjat/html-to-docx.ts
725
+ var ue = /^(font-|color$|text-align$|text-indent$|text-transform$|line-height$|letter-spacing$|white-space$|text-decoration$|vertical-align$)/, W = new Set("p div h1 h2 h3 h4 h5 h6 ul ol li table hr".split(" ")), de = {
726
+ black: "000000",
727
+ white: "FFFFFF",
728
+ red: "FF0000",
729
+ green: "008000",
730
+ blue: "0000FF",
731
+ yellow: "FFFF00",
732
+ gray: "808080",
733
+ grey: "808080",
734
+ silver: "C0C0C0",
735
+ maroon: "800000",
736
+ purple: "800080",
737
+ fuchsia: "FF00FF",
738
+ lime: "00FF00",
739
+ olive: "808000",
740
+ navy: "000080",
741
+ teal: "008080",
742
+ aqua: "00FFFF"
743
+ };
744
+ function G(e) {
745
+ if (!e) return;
746
+ if (/^#[\da-f]{6}$/i.test(e)) return e.slice(1);
747
+ if (/^#[\da-f]{3}$/i.test(e)) return e.slice(1).split("").map((e) => e + e).join("");
748
+ let t = e.match(/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);
749
+ return t ? t.slice(1).map((e) => Math.min(255, Number(e)).toString(16).padStart(2, "0")).join("") : de[e.toLowerCase()];
750
+ }
751
+ function K(e) {
752
+ if (e === "0") return 0;
753
+ let t = e?.match(/^(-?\d*\.?\d+)(pt|px|in|cm|mm|pc)$/i);
754
+ return t ? Number(t[1]) * {
755
+ pt: 1,
756
+ px: .75,
757
+ in: 72,
758
+ cm: 72 / 2.54,
759
+ mm: 72 / 25.4,
760
+ pc: 12
761
+ }[t[2].toLowerCase()] : void 0;
762
+ }
763
+ var q = (e) => {
764
+ let t = K(e);
765
+ return t === void 0 ? void 0 : Math.round(t * 20);
766
+ };
767
+ function J(e, t) {
768
+ let n = { ...t }, r = e.style;
769
+ for (let e of Array.from(r)) n[e] = r.getPropertyValue(e).trim();
770
+ for (let e of ["margin", "padding"]) for (let t of [
771
+ "top",
772
+ "right",
773
+ "bottom",
774
+ "left"
775
+ ]) {
776
+ let i = r.getPropertyValue(`${e}-${t}`);
777
+ i && (n[`${e}-${t}`] = i);
778
+ }
779
+ let i = e.localName;
780
+ return ["b", "strong"].includes(i) && (n["font-weight"] = "bold"), ["i", "em"].includes(i) && (n["font-style"] = "italic"), i === "u" && (n["text-decoration"] = "underline"), i === "s" && (n["text-decoration"] = "line-through"), (i === "sub" || i === "sup") && (n["vertical-align"] = i === "sub" ? "sub" : "super"), /^h[1-6]$/.test(i) && (r.fontSize || (n["font-size"] = {
781
+ h1: "16pt",
782
+ h2: "13pt",
783
+ h3: "12pt"
784
+ }[i] ?? "12pt"), r.fontWeight || (n["font-weight"] = "bold")), n;
785
+ }
786
+ var Y = (e) => Object.fromEntries(Object.entries(e).filter(([e]) => ue.test(e)));
787
+ async function fe(e, t) {
788
+ let n = j(e), r = 1, i = [], a = [];
789
+ function o() {
790
+ let e = !0;
791
+ for (let t of a) t.data = t.data.replace(/[\t\r\n\f ]+/g, " ").split("").filter((t) => {
792
+ if (t === " ") {
793
+ if (e) return !1;
794
+ e = !0;
795
+ } else e = !1;
796
+ return !0;
797
+ }).join("");
798
+ for (let e = a.length - 1; e >= 0; e--) if (a[e].data) {
799
+ a[e].data = a[e].data.replace(/ $/, "");
800
+ break;
801
+ }
802
+ a = [];
803
+ }
804
+ function s(e, n = !1) {
805
+ if (e.nodeType === 3) {
806
+ n || a.push(e);
807
+ return;
808
+ }
809
+ let r = e instanceof Element ? e : null, i = r && (W.has(r.localName) || [
810
+ "br",
811
+ "td",
812
+ "th",
813
+ "tr"
814
+ ].includes(r.localName)), c = n || !!(r && /^(pre|pre-wrap|break-spaces)$/.test(r.style.whiteSpace));
815
+ (i || c) && o(), c && w(t, "preformatted-text", "Предформатированный текст требует проверки переносов и табуляции после открытия.");
816
+ for (let t of e.childNodes) s(t, c);
817
+ (i || c) && o();
818
+ }
819
+ s(n), o();
820
+ let c = {
821
+ "font-family": "freeserif",
822
+ "font-size": "12pt",
823
+ color: "#111111"
824
+ };
825
+ function l(e) {
826
+ let t = `<w:rFonts w:ascii="${P(e["font-family"] || "freeserif")}" w:hAnsi="${P(e["font-family"] || "freeserif")}"/>`, n = K(e["font-size"]);
827
+ return n !== void 0 && (t += `<w:sz w:val="${Math.round(n * 2)}"/>`), e["font-weight"] && (t += `<w:b w:val="${e["font-weight"] === "bold" || Number(e["font-weight"]) >= 600 ? "1" : "0"}"/>`), e["font-style"] && (t += `<w:i w:val="${e["font-style"] === "italic" ? "1" : "0"}"/>`), e["text-decoration"] && (t += `<w:u w:val="${e["text-decoration"].includes("underline") ? "single" : "none"}"/><w:strike w:val="${e["text-decoration"].includes("line-through") ? "1" : "0"}"/>`), G(e.color) && (t += `<w:color w:val="${G(e.color)}"/>`), G(e["background-color"]) && (t += `<w:shd w:fill="${G(e["background-color"])}"/>`), ["super", "sub"].includes(e["vertical-align"]) && (t += `<w:vertAlign w:val="${e["vertical-align"] === "super" ? "superscript" : "subscript"}"/>`), e["text-transform"] === "uppercase" && (t += "<w:caps/>"), q(e["letter-spacing"]) !== void 0 && (t += `<w:spacing w:val="${q(e["letter-spacing"])}"/>`), t;
828
+ }
829
+ function u(e, t) {
830
+ let n = "";
831
+ for (let r of e) r.nodeType === 3 ? r.textContent && (n += `<w:r><w:rPr>${l(t)}</w:rPr><w:t xml:space="preserve">${P(r.textContent)}</w:t></w:r>`) : r instanceof Element && (r.localName === "br" ? n += "<w:r><w:br/></w:r>" : n += u(r.childNodes, J(r, t)));
832
+ return n;
833
+ }
834
+ function f(e, t, n) {
835
+ let r = "", i = t["text-align"];
836
+ [
837
+ "left",
838
+ "right",
839
+ "center",
840
+ "justify"
841
+ ].includes(i) && (r += `<w:jc w:val="${i === "justify" ? "both" : i}"/>`);
842
+ let a = q(t["margin-top"]) ?? 0, o = q(t["margin-bottom"]) ?? 120, s = "", c = t["line-height"];
843
+ c && /^\d*\.?\d+$/.test(c) ? s = ` w:line="${Math.round(Number(c) * 240)}" w:lineRule="auto"` : K(c) !== void 0 && (s = ` w:line="${q(c)}" w:lineRule="exact"`), r += `<w:spacing w:before="${Math.max(0, a)}" w:after="${Math.max(0, o)}"${s}/>`;
844
+ let l = "";
845
+ for (let [e, n] of [
846
+ ["margin-left", "left"],
847
+ ["margin-right", "right"],
848
+ ["text-indent", "firstLine"]
849
+ ]) {
850
+ let r = q(t[e]);
851
+ r !== void 0 && (l += n === "firstLine" && r < 0 ? ` w:hanging="${-r}"` : ` w:${n}="${r}"`);
852
+ }
853
+ return l && (r += `<w:ind${l}/>`), t["page-break-before"] === "always" && (r += "<w:pageBreakBefore/>"), t["page-break-inside"] === "avoid" && (r += "<w:keepLines/>"), t["page-break-after"] === "avoid" && (r += "<w:keepNext/>"), n && (n.pending ? r += `<w:numPr><w:ilvl w:val="0"/><w:numId w:val="${n.id}"/></w:numPr>` : r += "<w:pStyle w:val=\"AzHujjatListContinuation\"/>", n.pending = !1), `<w:p><w:pPr>${r}</w:pPr>${u(e, t)}</w:p>` + (t["page-break-after"] === "always" ? "<w:p><w:pPr><w:pageBreakBefore/></w:pPr></w:p>" : "");
854
+ }
855
+ function p(e, t) {
856
+ let n = e.style, r = n.getPropertyValue(`border-${t}-style`) || n.borderStyle, i = n.getPropertyValue(`border-${t}-width`) || n.borderWidth, a = n.getPropertyValue(`border-${t}-color`) || n.borderColor;
857
+ return !r && !i ? "" : `<w:${t} w:val="${{
858
+ solid: "single",
859
+ dashed: "dashed",
860
+ dotted: "dotted",
861
+ double: "double",
862
+ none: "nil"
863
+ }[r] ?? "single"}" w:sz="${Math.max(0, Math.round((K(i) ?? .75) * 8))}" w:color="${G(a) ?? "000000"}"/>`;
864
+ }
865
+ function m(e, t) {
866
+ let n = Array.from(e.querySelectorAll("tr")).filter((t) => t.closest("table") === e), r = /* @__PURE__ */ new Map(), i = 1, a = (e) => {
867
+ if (e > 1e3) throw new C("Таблица содержит более 1000 столбцов с учётом объединённых ячеек.");
868
+ }, o = t.width?.endsWith("%") ? `<w:tblW w:w="${Math.round(parseFloat(t.width) * 50)}" w:type="pct"/>` : `<w:tblW w:w="${q(t.width) ?? 9638}" w:type="dxa"/>`, s = n.map((n) => {
869
+ let o = 0, s = "";
870
+ function c() {
871
+ for (; r.has(o);) {
872
+ let e = r.get(o);
873
+ s += `<w:tc><w:tcPr>${e.span > 1 ? `<w:gridSpan w:val="${e.span}"/>` : ""}<w:vMerge/></w:tcPr><w:p/></w:tc>`, --e.remaining === 0 && r.delete(o), o += e.span, a(o);
874
+ }
875
+ }
876
+ for (let i of Array.from(n.children).filter((e) => e.localName === "td" || e.localName === "th")) {
877
+ c();
878
+ let n = Number(i.getAttribute("colspan") || 1), l = Number(i.getAttribute("rowspan") || 1);
879
+ a(o + n);
880
+ let u = [], d = i.parentElement;
881
+ for (; d && d !== e;) u.unshift(d), d = d.parentElement;
882
+ let f = (e) => ({
883
+ ...Y(e),
884
+ ...e["background-color"] ? { "background-color": e["background-color"] } : {}
885
+ }), m = J(i, f(u.reduce((e, t) => J(t, f(e)), t)));
886
+ i.localName === "th" && (m["font-weight"] = "bold");
887
+ let g = n > 1 ? `<w:gridSpan w:val="${n}"/>` : "";
888
+ l > 1 && (g += "<w:vMerge w:val=\"restart\"/>", r.set(o, {
889
+ remaining: l - 1,
890
+ span: n
891
+ }));
892
+ let _ = G(m["background-color"]);
893
+ _ && (g += `<w:shd w:fill="${_}"/>`), [
894
+ "top",
895
+ "middle",
896
+ "bottom"
897
+ ].includes(m["vertical-align"]) && (g += `<w:vAlign w:val="${m["vertical-align"] === "middle" ? "center" : m["vertical-align"]}"/>`);
898
+ let v = q(m.width);
899
+ v === void 0 ? m.width?.endsWith("%") && (g += `<w:tcW w:w="${Math.round(parseFloat(m.width) * 50)}" w:type="pct"/>`) : g += `<w:tcW w:w="${Math.max(0, v)}" w:type="dxa"/>`;
900
+ let y = [
901
+ "top",
902
+ "left",
903
+ "bottom",
904
+ "right"
905
+ ], b = y.map((e) => p(i, e)).join("");
906
+ b && (g += `<w:tcBorders>${b}</w:tcBorders>`);
907
+ let x = y.map((e) => q(m[`padding-${e}`]) === void 0 ? "" : `<w:${e} w:w="${Math.max(0, q(m[`padding-${e}`]))}" w:type="dxa"/>`).join("");
908
+ x && (g += `<w:tcMar>${x}</w:tcMar>`);
909
+ let S = h(i.childNodes, Y(m));
910
+ (!S || S.endsWith("</w:tbl>")) && (S += "<w:p/>"), s += `<w:tc><w:tcPr>${g}</w:tcPr>${S}</w:tc>`, o += n;
911
+ }
912
+ return c(), i = Math.max(i, o), `<w:tr>${s || "<w:tc><w:p/></w:tc>"}</w:tr>`;
913
+ }).join(""), c = Array.from({ length: i }, () => `<w:gridCol w:w="${Math.round(9638 / i)}"/>`).join(""), l = [
914
+ "top",
915
+ "left",
916
+ "bottom",
917
+ "right"
918
+ ].map((t) => p(e, t)).join("");
919
+ return `<w:tbl><w:tblPr>${o}${l ? `<w:tblBorders>${l}</w:tblBorders>` : ""}<w:tblLayout w:type="fixed"/></w:tblPr><w:tblGrid>${c}</w:tblGrid>${s}</w:tbl>`;
920
+ }
921
+ function h(e, n, a) {
922
+ let o = "", s = [], c = () => {
923
+ s.some((e) => e.nodeType !== 3 || e.textContent?.trim()) && (o += f(s, n, a)), s = [];
924
+ };
925
+ for (let l of e) {
926
+ if (!(l instanceof Element) || !W.has(l.localName)) {
927
+ s.push(l);
928
+ continue;
929
+ }
930
+ c();
931
+ let e = J(l, Y(n));
932
+ if (l.localName === "table") o += m(l, e);
933
+ else if (l.localName === "ol" || l.localName === "ul") {
934
+ let n = r++;
935
+ i.push({
936
+ id: n,
937
+ tag: l.localName
938
+ }), a && w(t, "nested-list-normalized", "Вложенный список при открытии становится отдельным списком.", "loss");
939
+ for (let t of Array.from(l.children)) if (t.localName === "li") {
940
+ let r = {
941
+ id: n,
942
+ pending: !0
943
+ };
944
+ o += h(t.childNodes, J(t, Y(e)), r) || f([], e, r);
945
+ }
946
+ } else l.localName === "div" && Array.from(l.children).some((e) => W.has(e.localName)) ? (e["page-break-before"] === "always" && (o += f([], {
947
+ "page-break-before": "always",
948
+ "margin-bottom": "0pt"
949
+ })), o += h(l.childNodes, Y(e), a), e["page-break-after"] === "always" && (o += f([], {
950
+ "page-break-before": "always",
951
+ "margin-bottom": "0pt"
952
+ }))) : l.localName === "hr" ? (w(t, "rule-normalized", "Разделитель HTML преобразован в строку."), o += f([document.createTextNode("────────────────")], e)) : o += f(l.childNodes, e, a);
953
+ }
954
+ return c(), o;
955
+ }
956
+ let g = h(n.childNodes, c) || "<w:p/>";
957
+ if (new TextEncoder().encode(g).byteLength > 8387584) throw new C("После преобразования HTML документ превышает допустимый размер XML (8 МиБ).");
958
+ let _ = new Set("font-family font-size font-weight font-style color background-color text-align text-decoration text-transform vertical-align letter-spacing line-height margin margin-top margin-bottom margin-left margin-right text-indent width border border-style border-width border-color border-top border-right border-bottom border-left border-collapse table-layout padding padding-top padding-right padding-bottom padding-left page-break-before page-break-after page-break-inside".split(" "));
959
+ for (let e of n.querySelectorAll("[style]")) for (let n of Array.from(e.style)) {
960
+ let r = e.style.getPropertyValue(n), i = ["td", "th"].includes(e.localName);
961
+ (n.startsWith("padding") && !i || n.startsWith("border") && !i && e.localName !== "table" || n === "font-size" && K(r) === void 0 || ["color", "background-color"].includes(n) && G(r) === void 0 || !_.has(n) && !/^border-(top|right|bottom|left)-(width|style|color)$/.test(n)) && w(t, "html-style-approximation", `Стиль ${n} может измениться при открытии HTML в DOCX-редакторе.`);
962
+ }
963
+ let v = new d();
964
+ return v.file("[Content_Types].xml", "<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/><Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/><Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/></Types>"), v.file("_rels/.rels", "<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/></Relationships>"), v.file("word/_rels/document.xml.rels", "<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rIdStyles\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/><Relationship Id=\"rIdNumbering\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\" Target=\"numbering.xml\"/></Relationships>"), v.file("word/document.xml", `<w:document xmlns:w="${ae}"><w:body>${g}<w:sectPr><w:pgSz w:w="11906" w:h="16838"/><w:pgMar w:top="850" w:right="1134" w:bottom="1984" w:left="1134" w:header="0" w:footer="0" w:gutter="0"/></w:sectPr></w:body></w:document>`), v.file("word/styles.xml", `<w:styles xmlns:w="${ae}"><w:docDefaults><w:rPrDefault><w:rPr>${l(c)}</w:rPr></w:rPrDefault></w:docDefaults><w:style w:type="paragraph" w:default="1" w:styleId="Normal"><w:name w:val="Normal"/><w:pPr><w:spacing w:after="120"/></w:pPr></w:style><w:style w:type="paragraph" w:styleId="AzHujjatListContinuation"><w:name w:val="List continuation"/><w:basedOn w:val="Normal"/></w:style></w:styles>`), v.file("word/numbering.xml", `<w:numbering xmlns:w="${ae}">${i.map(({ id: e, tag: t }) => `<w:abstractNum w:abstractNumId="${e}"><w:multiLevelType w:val="singleLevel"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:numFmt w:val="${t === "ol" ? "decimal" : "bullet"}"/><w:lvlText w:val="${t === "ol" ? "%1." : "•"}"/><w:pPr><w:ind w:left="360" w:hanging="180"/></w:pPr></w:lvl></w:abstractNum><w:num w:numId="${e}"><w:abstractNumId w:val="${e}"/></w:num>`).join("")}</w:numbering>`), new Uint8Array(await v.generateAsync({
965
+ type: "arraybuffer",
966
+ compression: "DEFLATE"
967
+ }));
968
+ }
969
+ //#endregion
970
+ //#region src/library/hujjat/docx.ts
971
+ async function pe(e, t) {
972
+ let n = await le(e), r = ie(t.locales ?? {}, t.locale, n.html);
973
+ return r.warnings.unshift(...n.warnings), T(r.warnings, t.allowLossy), r;
974
+ }
975
+ async function me(e, t, n = {}) {
976
+ let r = M(re(e, t)), i = await fe(r.html, r.warnings);
977
+ return T(r.warnings, n.allowLossy), {
978
+ ...r,
979
+ document: i
980
+ };
981
+ }
982
+ //#endregion
983
+ //#region src/library/AzDocumentEditor.tsx
984
+ var he = () => {};
985
+ function ge({ onStatusChange: e }) {
986
+ let t = c((e) => e.page.total), r = c((e) => e.isLoading || !!e.isOpening), i = c((e) => e.parseError);
987
+ return n(() => {
988
+ e?.({
989
+ pages: t,
990
+ loading: r,
991
+ error: i
992
+ });
993
+ }, [
994
+ t,
995
+ r,
996
+ i,
997
+ e
998
+ ]), null;
999
+ }
1000
+ var _e = e(function(e, t) {
1001
+ let i = a(null), c = a(null), d = a(null), [h, g] = o(""), _ = l(u()), b = (t) => e.ui !== !1 && e.ui?.[t] !== !1;
1002
+ function x(e) {
1003
+ let t = c.current?.querySelector("[data-menu=\"file\"] > [role=\"menuitem\"][aria-expanded=\"true\"]");
1004
+ t?.click(), t?.focus(), e();
1005
+ }
1006
+ async function S() {
1007
+ let t = i.current?.getEditor();
1008
+ if (!t || !c.current || t.snapshot().isLoading || t.snapshot().parseError || window.document.querySelector("[data-az-print-root]")) return;
1009
+ d.current?.abort();
1010
+ let n = new AbortController();
1011
+ d.current = n, g("");
1012
+ try {
1013
+ await y(t, c.current, e.title ?? "Документ.docx", n.signal);
1014
+ } catch (e) {
1015
+ !n.signal.aborted && !(e instanceof DOMException && e.name === "AbortError") && g(e instanceof Error ? e.message : "Не удалось подготовить PDF.");
1016
+ }
1017
+ }
1018
+ return n(() => () => d.current?.abort(), []), n(() => {
1019
+ let t = (t) => {
1020
+ if (t.defaultPrevented || !(t.ctrlKey || t.metaKey) || t.altKey || t.shiftKey || !c.current || !v(c.current, t.target) || window.document.querySelector("[data-az-print-root]") || t.code !== "KeyS" && t.code !== "KeyO" && !(t.code === "KeyP" && b("print"))) return;
1021
+ let n = t.code === "KeyS" ? e.onSave : t.code === "KeyO" ? e.onOpen : t.code === "KeyP" && b("print") ? () => void S() : void 0;
1022
+ t.preventDefault(), t.stopImmediatePropagation(), e.actionsDisabled || n?.();
1023
+ };
1024
+ return window.addEventListener("keydown", t, !0), () => window.removeEventListener("keydown", t, !0);
1025
+ }), r(t, () => ({
1026
+ async save() {
1027
+ let e = await i.current?.save();
1028
+ if (!e) throw Error("Документ ещё не готов к сохранению.");
1029
+ return e;
1030
+ },
1031
+ async exportHujjat(e) {
1032
+ let t = await i.current?.save();
1033
+ if (!t) throw new C("Документ ещё не готов к экспорту.");
1034
+ return pe(t, e);
1035
+ },
1036
+ insertVariable(e) {
1037
+ if (!E(e)) throw new C("Некорректный ключ переменной. Используйте client.name, ASCII, до 100 символов.");
1038
+ let t = i.current?.exec({
1039
+ type: "pasteWithoutFormatting",
1040
+ text: `{${e}}`
1041
+ });
1042
+ if (!t?.ok) throw new C(t && !t.ok ? t.reason : "Редактор ещё не готов.");
1043
+ i.current?.focus();
1044
+ },
1045
+ focus() {
1046
+ i.current?.focus();
1047
+ },
1048
+ print: S
1049
+ })), /* @__PURE__ */ p("div", {
1050
+ className: ["az-document-editor", e.className].filter(Boolean).join(" "),
1051
+ style: e.style,
1052
+ ref: c,
1053
+ children: [h && /* @__PURE__ */ f("div", {
1054
+ role: "alert",
1055
+ className: "az-print-error",
1056
+ children: h
1057
+ }), /* @__PURE__ */ f(s, {
1058
+ ref: i,
1059
+ document: e.document ?? "blank",
1060
+ title: e.title ?? "Документ.docx",
1061
+ fonts: e.fonts ?? _,
1062
+ locale: e.locale ?? "ru-RU",
1063
+ i18n: e.i18n ?? m,
1064
+ mode: e.mode ?? "edit",
1065
+ colorMode: e.colorMode ?? "light",
1066
+ zoom: e.zoom,
1067
+ zoomMode: e.zoomMode,
1068
+ chrome: b("chrome"),
1069
+ rulers: b("rulers"),
1070
+ navigation: b("navigation"),
1071
+ contextMenu: b("contextMenu"),
1072
+ renderTitleBarLeft: e.renderTitleBarLeft,
1073
+ renderTitleBarRight: e.renderTitleBarRight,
1074
+ onChange: (t) => {
1075
+ t.source || e.onChange?.();
1076
+ },
1077
+ onSave: e.onSave,
1078
+ onOpen: e.onOpen,
1079
+ onFontError: (t) => e.onFontError?.(`Не удалось загрузить шрифт (${t.code}). Переносы могут отличаться от Word.`),
1080
+ menu: b("menu") && {
1081
+ reportIssue: !1,
1082
+ onOpen: he,
1083
+ onSave: he,
1084
+ children: /* @__PURE__ */ p(s.Menu.File, {
1085
+ preset: !1,
1086
+ children: [
1087
+ e.fileActions?.map((t) => /* @__PURE__ */ f(s.Menu.Row, {
1088
+ onSelect: () => x(t.onSelect),
1089
+ disabled: e.actionsDisabled || t.disabled,
1090
+ children: t.label
1091
+ }, t.id)),
1092
+ e.onOpen && /* @__PURE__ */ f(s.Menu.Row, {
1093
+ onSelect: () => x(e.onOpen),
1094
+ disabled: e.actionsDisabled,
1095
+ shortcut: "Ctrl+O",
1096
+ children: e.labels?.open ?? e.i18n?.toolbar?.open ?? m.toolbar?.open
1097
+ }),
1098
+ e.onSave && /* @__PURE__ */ f(s.Menu.Row, {
1099
+ onSelect: () => x(e.onSave),
1100
+ disabled: e.actionsDisabled,
1101
+ shortcut: "Ctrl+S",
1102
+ children: e.labels?.save ?? e.i18n?.toolbar?.save ?? m.toolbar?.save
1103
+ }),
1104
+ e.onExportPdf && /* @__PURE__ */ f(s.Menu.Row, {
1105
+ onSelect: () => x(e.onExportPdf),
1106
+ disabled: e.actionsDisabled,
1107
+ children: e.labels?.exportPdf ?? "Скачать PDF"
1108
+ }),
1109
+ b("print") && /* @__PURE__ */ f(s.Menu.Row, {
1110
+ onSelect: () => x(() => void S()),
1111
+ disabled: e.actionsDisabled,
1112
+ shortcut: "Ctrl+P",
1113
+ children: e.labels?.print ?? "Распечатать…"
1114
+ }),
1115
+ /* @__PURE__ */ f(s.Menu.PageSetup, {})
1116
+ ]
1117
+ })
1118
+ },
1119
+ children: /* @__PURE__ */ f(ge, { onStatusChange: e.onStatusChange })
1120
+ })]
1121
+ });
1122
+ });
1123
+ //#endregion
1124
+ //#region src/library/AzHtmlEditor.tsx
1125
+ function ve(...e) {
1126
+ let t = /* @__PURE__ */ new Map();
1127
+ for (let n of e.flat()) t.set(JSON.stringify(n), n);
1128
+ return [...t.values()];
1129
+ }
1130
+ var ye = e(function(e, s) {
1131
+ let { initialHtml: c, onChange: l, onStatusChange: u, renderFallback: d, ...m } = e, [h] = o(c), [g, _] = o(), [v, y] = o({
1132
+ phase: "loading",
1133
+ dirty: !1,
1134
+ pages: 0,
1135
+ error: null,
1136
+ warnings: []
1137
+ }), b = a(v), x = a(null), S = a(null), w = a(!1), E = a(0), D = a(0), O = a(e);
1138
+ i(() => {
1139
+ O.current = e;
1140
+ });
1141
+ let k = t((e) => {
1142
+ w.current && (b.current = {
1143
+ ...b.current,
1144
+ ...e
1145
+ }, y(b.current), O.current.onStatusChange?.(b.current));
1146
+ }, []), A = t(async (e = !1) => {
1147
+ let t = ++E.current;
1148
+ k({
1149
+ phase: "loading",
1150
+ error: null
1151
+ });
1152
+ try {
1153
+ let n = await me({ uz: { blocks: [{
1154
+ type: "html",
1155
+ props: { html: h.trim() ? h : "<p><br></p>" }
1156
+ }] } }, "uz", { allowLossy: e });
1157
+ if (!w.current || t !== E.current) return;
1158
+ S.current = n, _(n.document), k({ warnings: n.warnings });
1159
+ } catch (e) {
1160
+ if (!w.current || t !== E.current) return;
1161
+ let n = e instanceof C ? e.warnings : [];
1162
+ k({
1163
+ phase: n.some((e) => e.severity === "loss") ? "blocked" : "error",
1164
+ warnings: n,
1165
+ error: e instanceof Error ? e.message : String(e)
1166
+ });
1167
+ }
1168
+ }, [h, k]);
1169
+ n(() => (w.current = !0, A(), () => {
1170
+ w.current = !1, ++E.current;
1171
+ }), [A]);
1172
+ let ee = t((e) => {
1173
+ let t = e.error ? "error" : e.loading ? "loading" : b.current.phase === "exporting" ? "exporting" : "ready";
1174
+ k({
1175
+ phase: t,
1176
+ pages: e.pages,
1177
+ error: e.error
1178
+ });
1179
+ }, [k]), te = t(() => {
1180
+ w.current && ["ready", "exporting"].includes(b.current.phase) && (++D.current, k({ dirty: !0 }), O.current.onChange?.());
1181
+ }, [k]), j = t((e) => {
1182
+ w.current && e === E.current && b.current.phase === "exporting" && k({ phase: "ready" });
1183
+ }, [k]);
1184
+ return r(s, () => ({
1185
+ async exportHtml(e = {}) {
1186
+ if (!w.current || b.current.phase !== "ready" || !S.current || !x.current) throw new C("HTML-редактор ещё не готов или занят.");
1187
+ let t = S.current;
1188
+ if (!b.current.dirty) return {
1189
+ html: h,
1190
+ variables: [...t.variables],
1191
+ warnings: [...t.warnings],
1192
+ changed: !1
1193
+ };
1194
+ let n = E.current, r = D.current;
1195
+ k({
1196
+ phase: "exporting",
1197
+ error: null
1198
+ });
1199
+ try {
1200
+ let i = await x.current.exportHujjat({
1201
+ locale: "uz",
1202
+ allowLossy: !0
1203
+ });
1204
+ if (!w.current || n !== E.current || r !== D.current) throw new C("Черновик изменился или закрыт во время экспорта. Повторите экспорт актуального документа.");
1205
+ let a = ve(t.warnings, i.warnings);
1206
+ return k({ warnings: a }), T(a, e.allowLossy), {
1207
+ html: i.html,
1208
+ variables: i.variables,
1209
+ warnings: a,
1210
+ changed: !0
1211
+ };
1212
+ } finally {
1213
+ j(n);
1214
+ }
1215
+ },
1216
+ async acceptImportLoss() {
1217
+ if (!w.current || b.current.phase !== "blocked") throw new C("Нет ожидающего решения об импорте.");
1218
+ await A(!0);
1219
+ },
1220
+ insertVariable(e) {
1221
+ if (!w.current || b.current.phase !== "ready" || O.current.mode === "view" || !x.current) throw new C("Редактор недоступен для изменения.");
1222
+ x.current.insertVariable(e);
1223
+ },
1224
+ focus() {
1225
+ x.current?.focus();
1226
+ }
1227
+ }), [
1228
+ h,
1229
+ A,
1230
+ k,
1231
+ j
1232
+ ]), g ? /* @__PURE__ */ f(_e, {
1233
+ ...m,
1234
+ ref: x,
1235
+ document: g,
1236
+ ui: e.ui !== !1 && {
1237
+ menu: !1,
1238
+ print: !1,
1239
+ ...e.ui
1240
+ },
1241
+ mode: v.phase === "exporting" ? "view" : e.mode,
1242
+ actionsDisabled: e.actionsDisabled || v.phase !== "ready",
1243
+ onChange: te,
1244
+ onStatusChange: ee
1245
+ }) : /* @__PURE__ */ f("div", {
1246
+ className: ["az-html-editor", e.className].filter(Boolean).join(" "),
1247
+ style: e.style,
1248
+ children: d ? d(v) : /* @__PURE__ */ p("div", {
1249
+ role: v.error ? "alert" : "status",
1250
+ children: [v.error ?? "Загрузка документа…", v.warnings.length > 0 && /* @__PURE__ */ f("ul", { children: v.warnings.map((e, t) => /* @__PURE__ */ f("li", { children: e.message }, t)) })]
1251
+ })
1252
+ });
1253
+ }), be = 31457280, X = "application/vnd.openxmlformats-officedocument.wordprocessingml.document", xe = `${X}.main+xml`, Se = 8388608, Z = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
1254
+ function Q(e) {
1255
+ let t = new DOMParser().parseFromString(e, "application/xml");
1256
+ if (t.getElementsByTagName("parsererror").length || /<!DOCTYPE/i.test(e)) throw Error("XML документа повреждён или содержит неподдерживаемую структуру.");
1257
+ return t;
1258
+ }
1259
+ function $(e, t) {
1260
+ let n = e.file(t);
1261
+ return n ? new Promise((e, t) => {
1262
+ let r = n.internalStream("uint8array"), i = [], a = 0;
1263
+ r.on("data", (e) => {
1264
+ a += e.byteLength, a > Se ? (r.pause(), t(/* @__PURE__ */ Error("Структура документа слишком большая для этого прототипа."))) : i.push(e);
1265
+ }), r.on("error", t), r.on("end", () => {
1266
+ let t = new Uint8Array(a), n = 0;
1267
+ for (let e of i) t.set(e, n), n += e.byteLength;
1268
+ e(new TextDecoder().decode(t));
1269
+ }), r.resume();
1270
+ }) : Promise.resolve("");
1271
+ }
1272
+ async function Ce(e) {
1273
+ if (!/\.docx$/i.test(e.name)) throw Error("Откройте файл DOCX. Форматы DOC, DOCM и PDF здесь не поддерживаются.");
1274
+ if (!e.size) throw Error("Файл DOCX пуст.");
1275
+ if (e.size > 31457280) throw Error("Максимальный размер DOCX — 30 МБ.");
1276
+ let t = new Uint8Array(await e.arrayBuffer()), n;
1277
+ try {
1278
+ n = await d.loadAsync(t);
1279
+ } catch {
1280
+ throw Error("Файл повреждён, зашифрован или не является DOCX.");
1281
+ }
1282
+ let r = Object.keys(n.files);
1283
+ if (r.length > 2e3) throw Error("Слишком много вложенных частей в DOCX для этого прототипа.");
1284
+ if (!n.file("[Content_Types].xml") || !n.file("word/document.xml")) throw Error("Файл не содержит структуру DOCX.");
1285
+ let i = Q(await $(n, "[Content_Types].xml"));
1286
+ if (Array.from(i.getElementsByTagNameNS("*", "Override")).find((e) => e.getAttribute("PartName") === "/word/document.xml")?.getAttribute("ContentType") !== xe || r.some((e) => /vbaProject\.bin$/i.test(e))) throw Error("Поддерживается только обычный DOCX без макросов.");
1287
+ let a = Q(await $(n, "word/document.xml"));
1288
+ if (a.documentElement.localName !== "document" || !a.getElementsByTagNameNS(Z, "body").length) throw Error("XML документа повреждён или использует неподдерживаемую разновидность DOCX.");
1289
+ let o = /* @__PURE__ */ new Set(), s = [a];
1290
+ for (let e of ["word/styles.xml", "word/fontTable.xml"]) {
1291
+ let t = await $(n, e);
1292
+ t && s.push(Q(t));
1293
+ }
1294
+ for (let e of s) {
1295
+ for (let t of e.getElementsByTagNameNS(Z, "rFonts")) for (let e of [
1296
+ "ascii",
1297
+ "hAnsi",
1298
+ "cs",
1299
+ "eastAsia"
1300
+ ]) {
1301
+ let n = t.getAttributeNS(Z, e);
1302
+ n && o.add(n);
1303
+ }
1304
+ for (let t of e.getElementsByTagNameNS(Z, "font")) {
1305
+ let e = t.getAttributeNS(Z, "name");
1306
+ e && o.add(e);
1307
+ }
1308
+ }
1309
+ let c = await $(n, "docProps/app.xml"), l = c ? Number(Q(c).getElementsByTagNameNS("*", "Pages")[0]?.textContent) : 0, { openDocumentForExport: u } = await import("@docx-editor.dev/core/export"), f = u(t.slice());
1310
+ if (!f.ok) throw Error("Не удалось открыть структуру DOCX. Текущий документ сохранён в редакторе.");
1311
+ return f.session.dispose(), {
1312
+ name: e.name,
1313
+ original: t,
1314
+ metadata: {
1315
+ paragraphs: a.getElementsByTagNameNS(Z, "p").length,
1316
+ tables: a.getElementsByTagNameNS(Z, "tbl").length,
1317
+ sections: a.getElementsByTagNameNS(Z, "sectPr").length,
1318
+ savedPageCount: Number.isSafeInteger(l) && l > 0 ? l : null,
1319
+ hasHeaders: r.some((e) => /^word\/header[^/]*\.xml$/.test(e)),
1320
+ hasFooters: r.some((e) => /^word\/footer[^/]*\.xml$/.test(e)),
1321
+ hasReviewContent: r.some((e) => /^word\/comments[^/]*\.xml$/.test(e)) || ["ins", "del"].some((e) => a.getElementsByTagNameNS(Z, e).length > 0),
1322
+ fonts: [...o].sort()
1323
+ }
1324
+ };
1325
+ }
1326
+ function we(e) {
1327
+ return `${(e.replace(/\.docx$/i, "").replace(/[<>:"/\\|?*\x00-\x1f]/g, "_").trim() || "Документ").replace(/ — редакция$/, "")} — редакция.docx`;
1328
+ }
1329
+ function Te(e, t) {
1330
+ let n = URL.createObjectURL(new Blob([e], { type: X })), r = document.createElement("a");
1331
+ r.href = n, r.download = t, document.body.append(r), r.click(), r.remove(), window.setTimeout(() => URL.revokeObjectURL(n), 3e4);
1332
+ }
1333
+ //#endregion
1334
+ //#region src/library/pdf-export.ts
1335
+ async function Ee(e, t, n, r = {}) {
1336
+ let i = AbortSignal.any([AbortSignal.timeout(95e3), ...r.signal ? [r.signal] : []]);
1337
+ i.throwIfAborted();
1338
+ let a = new FormData();
1339
+ a.append("file", new File([e], t, { type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" })), a.append("renderProfile", n);
1340
+ let o = await (r.fetcher ?? fetch)(r.url ?? "/api/documents/export/pdf", {
1341
+ method: "POST",
1342
+ body: a,
1343
+ headers: r.headers,
1344
+ credentials: "same-origin",
1345
+ signal: i
1346
+ }), s = o.headers.get("content-type")?.split(";")[0].trim();
1347
+ if (!o.ok) {
1348
+ let e = s === "application/json" ? await o.json().catch(() => null) : null, t = typeof e?.error?.message == "string" ? e.error.message : "Не удалось скачать PDF.", n = typeof e?.error?.requestId == "string" ? e.error.requestId : o.headers.get("x-request-id");
1349
+ throw Error(n ? t + " Код запроса: " + n : t);
1350
+ }
1351
+ if (s !== "application/pdf") throw Error("Сервис вернул некорректный ответ вместо PDF.");
1352
+ let c = await o.blob();
1353
+ if (i.throwIfAborted(), !c.size) throw Error("Сервис вернул пустой PDF.");
1354
+ let l = t.replace(/\.docx$/i, "") + ".pdf", u = o.headers.get("content-disposition")?.match(/filename\*=UTF-8''([^;]+)/i)?.[1];
1355
+ if (u) try {
1356
+ l = decodeURIComponent(u);
1357
+ } catch {}
1358
+ return l = l.replace(/[\x00-\x1f\x7f/\\]/g, "") || "document.pdf", {
1359
+ blob: c,
1360
+ filename: l,
1361
+ warnings: (o.headers.get("x-pdf-warnings") ?? "").split(",").filter(Boolean)
1362
+ };
1363
+ }
1364
+ function De(e) {
1365
+ let t = URL.createObjectURL(e.blob), n = document.createElement("a");
1366
+ n.href = t, n.download = e.filename, document.body.append(n), n.click(), n.remove(), setTimeout(() => URL.revokeObjectURL(t), 6e4);
1367
+ }
1368
+ //#endregion
1369
+ //#region src/library/pdf-profile.ts
1370
+ var Oe = {
1371
+ id: "az-editor-pdf-a0c6eaaeb90716f0",
1372
+ protocolVersion: 1,
1373
+ core: "2.27.0",
1374
+ fonts: "2.27.0",
1375
+ playwright: "1.64.0",
1376
+ chromium: "156.0.8078.4",
1377
+ locale: "ru-RU",
1378
+ timezoneId: "Asia/Tashkent",
1379
+ viewport: {
1380
+ width: 1280,
1381
+ height: 1e3
1382
+ },
1383
+ deviceScaleFactor: 1,
1384
+ maxPages: 100,
1385
+ fontAssets: [
1386
+ {
1387
+ file: "Caladea-Bold.ttf",
1388
+ byteLength: 84492,
1389
+ hash: "sha256:ae3cb2dcbc925809dd29d2a44e9802211cab66be541bacbfc9c08c74b27c3742"
1390
+ },
1391
+ {
1392
+ file: "Caladea-BoldItalic.ttf",
1393
+ byteLength: 83356,
1394
+ hash: "sha256:ccabaa7b7e2fdf253d2b1a5fa699dd8a3df8d835a9eb285ad82631a677eb76c0"
1395
+ },
1396
+ {
1397
+ file: "Caladea-Italic.ttf",
1398
+ byteLength: 83780,
1399
+ hash: "sha256:4359a8e24f748b6447b1ff6d7a174febe70961d29f8bb8634b56dacd740a3deb"
1400
+ },
1401
+ {
1402
+ file: "Caladea-Regular.ttf",
1403
+ byteLength: 81600,
1404
+ hash: "sha256:f1e899278b7b4491aba5b6a8253c4b04c050cc59b21865be5c37559a775153cd"
1405
+ },
1406
+ {
1407
+ file: "Carlito-Bold.ttf",
1408
+ byteLength: 682468,
1409
+ hash: "sha256:bb5d20f79b82599ec72983597437373a80f2d2085fa91fc144fd74e876a594db"
1410
+ },
1411
+ {
1412
+ file: "Carlito-BoldItalic.ttf",
1413
+ byteLength: 808508,
1414
+ hash: "sha256:b32928186c119599e03ca6a1ffc680fdcb7fac95772f4b95d989cf6cd3861517"
1415
+ },
1416
+ {
1417
+ file: "Carlito-Italic.ttf",
1418
+ byteLength: 615236,
1419
+ hash: "sha256:0b019225e58d702bfedcbd35c21696769f8ee115cb6343f84c2f240312450d1c"
1420
+ },
1421
+ {
1422
+ file: "Carlito-Regular.ttf",
1423
+ byteLength: 628032,
1424
+ hash: "sha256:f6418f708baede9789daef5d458c0f53d2a888af9820e8062934e504fedc6595"
1425
+ },
1426
+ {
1427
+ file: "LiberationMono-Bold.ttf",
1428
+ byteLength: 307996,
1429
+ hash: "sha256:bd62a0672d0b9b6710b01df434c80ad54fa5f0835207eb7b17b7a761463067bb"
1430
+ },
1431
+ {
1432
+ file: "LiberationMono-BoldItalic.ttf",
1433
+ byteLength: 284068,
1434
+ hash: "sha256:79451f3c09fe25116098853b7a2ca6e2436220ccc11af022979adbcf195be130"
1435
+ },
1436
+ {
1437
+ file: "LiberationMono-Italic.ttf",
1438
+ byteLength: 281536,
1439
+ hash: "sha256:605c01c711b44480a7508d349dfbf3264e81fa43d69e61cfa7d10b86e764c4d1"
1440
+ },
1441
+ {
1442
+ file: "LiberationMono-Regular.ttf",
1443
+ byteLength: 319508,
1444
+ hash: "sha256:f2b83c763e8afd21709333370bed4774337fae82267937e2b5aea7e2fbd922c1"
1445
+ },
1446
+ {
1447
+ file: "LiberationSans-Bold.ttf",
1448
+ byteLength: 414456,
1449
+ hash: "sha256:788abee4c806d660e8aee46689dd8540cd4bb98da03dcc9d171ce3efd99a9173"
1450
+ },
1451
+ {
1452
+ file: "LiberationSans-BoldItalic.ttf",
1453
+ byteLength: 408996,
1454
+ hash: "sha256:698da70fc191cc5f33ad4d6d3fe830fe4624b898ea2e3169955928b7c491f1ee"
1455
+ },
1456
+ {
1457
+ file: "LiberationSans-Italic.ttf",
1458
+ byteLength: 415816,
1459
+ hash: "sha256:e5bae5c4cde31f22142753855f4f8fb86da6ff39955ed3c0a11248b0d16948b0"
1460
+ },
1461
+ {
1462
+ file: "LiberationSans-Regular.ttf",
1463
+ byteLength: 410712,
1464
+ hash: "sha256:76d04c18ea243f426b7de1f3ad208e927008f961dc5945e5aad352d0dfde8ee8"
1465
+ },
1466
+ {
1467
+ file: "LiberationSerif-Bold.ttf",
1468
+ byteLength: 370096,
1469
+ hash: "sha256:d754ba427cfe0bca54ae052384baa8f842da5bd6550ad4da024ac441e7a7d5ce"
1470
+ },
1471
+ {
1472
+ file: "LiberationSerif-BoldItalic.ttf",
1473
+ byteLength: 376772,
1474
+ hash: "sha256:f17db8af71e24d2066b587546021d4f0b296be389512b658dec3c09affeb11a7"
1475
+ },
1476
+ {
1477
+ file: "LiberationSerif-Italic.ttf",
1478
+ byteLength: 375632,
1479
+ hash: "sha256:0e3dea9f8d613e006ccfa62201f33e265d19167bd0907725c3e145368b04fc2e"
1480
+ },
1481
+ {
1482
+ file: "LiberationSerif-Regular.ttf",
1483
+ byteLength: 393576,
1484
+ hash: "sha256:058ea80864aef09a23f45cbec2bb5400bc3dfbdea01c3f10538a21fcb497fb74"
1485
+ },
1486
+ {
1487
+ file: "TeXGyreAdventor-Bold.otf",
1488
+ byteLength: 180292,
1489
+ hash: "sha256:881fcd422499d3c269697e37e4d483ee91a617a28428cdb6037029924dc47129"
1490
+ },
1491
+ {
1492
+ file: "TeXGyreAdventor-BoldItalic.otf",
1493
+ byteLength: 179620,
1494
+ hash: "sha256:a7aacff64987f83064eada3067887d7759675ac6286b7d1901fcc502b47f3822"
1495
+ },
1496
+ {
1497
+ file: "TeXGyreAdventor-Italic.otf",
1498
+ byteLength: 174948,
1499
+ hash: "sha256:f6e17fc59536385ffb1e8ed41a3c2b9d082f4a8bebd62d829283d0de50c0d3d4"
1500
+ },
1501
+ {
1502
+ file: "TeXGyreAdventor-Regular.otf",
1503
+ byteLength: 174340,
1504
+ hash: "sha256:17bfc0a97d48393453f28422f109d47099d54875600ea88a8d61c5ddd2dbffc4"
1505
+ }
1506
+ ],
1507
+ sources: {
1508
+ "packages/print-pages/src/index.ts": "cced4055ee764362de7d96de9a94546fc637f1096230ead8411bf5333231094c",
1509
+ "packages/print-pages/src/print.css": "157230a65b20648f2867762aae554783c2cf9179be41f59c66f8135c2623ba44",
1510
+ "renderer/main.tsx": "adcba54070e18000170219876dd8c412cacff23b6f8e8a8ef80d0a8e62bac8a4",
1511
+ "renderer/renderer.css": "74d111e8609cfbe7a67260dffbaadd8386a4e5c5fa11083ac98aa4ca1a7d6808",
1512
+ "renderer/index.html": "bbfcb89806092910b639a91ff6a16764b03135cce7586190af9114583292d061"
1513
+ }
1514
+ };
1515
+ //#endregion
1516
+ //#region src/library/hujjat/api.ts
1517
+ function ke(e) {
1518
+ if (!e || !Object.keys(e).length) throw new C("Нет локалей шаблона.");
1519
+ for (let [t, n] of Object.entries(e)) {
1520
+ if (N(t), !n || !Array.isArray(n.blocks) || !n.blocks.length) throw new C(`Нет блоков для ${t}.`);
1521
+ for (let e of n.blocks) if (e.type === "html") {
1522
+ if (typeof e.props?.html != "string" || !e.props.html.trim()) throw new C(`Пустой HTML для ${t}.`);
1523
+ if (new TextEncoder().encode(e.props.html).length > 1048576) throw new C(`HTML для ${t} превышает 1 МБ.`);
1524
+ }
1525
+ }
1526
+ }
1527
+ function Ae(e, t) {
1528
+ if (ke(t), !t.uz) throw new C("Для создания шаблона обязательна локаль uz.");
1529
+ if (!e.productId || !e.name.trim() || e.name.length > 255) throw new C("Укажите продукт и название шаблона до 255 символов.");
1530
+ return {
1531
+ product_id: e.productId,
1532
+ name: e.name,
1533
+ require_myid: e.requireMyid ?? !1,
1534
+ locales: structuredClone(t)
1535
+ };
1536
+ }
1537
+ async function je(e) {
1538
+ let t = AbortSignal.any([AbortSignal.timeout(95e3), ...e.signal ? [e.signal] : []]);
1539
+ t.throwIfAborted(), ke(e.locales);
1540
+ let n = e.locale ?? "uz";
1541
+ N(n);
1542
+ let r = new Headers(e.headers);
1543
+ r.set("Content-Type", "application/json"), r.set("Accept", "application/pdf, application/json");
1544
+ let i = await (e.fetcher ?? fetch)(e.url, {
1545
+ method: "POST",
1546
+ headers: r,
1547
+ credentials: e.credentials ?? "same-origin",
1548
+ signal: t,
1549
+ body: JSON.stringify({
1550
+ locales: e.locales,
1551
+ data: e.data ?? {},
1552
+ locale: n
1553
+ })
1554
+ });
1555
+ if (!i.ok) {
1556
+ let e = await i.json().catch(() => null), t = e?.errors && typeof e.errors == "object" ? Object.values(e.errors).flat().filter((e) => typeof e == "string").join("; ") : "";
1557
+ throw Error([typeof e?.message == "string" ? e.message : `Hujjat: ошибка HTTP ${i.status}`, t].filter(Boolean).join(": "));
1558
+ }
1559
+ if (i.headers.get("content-type")?.split(";")[0].trim().toLowerCase() !== "application/pdf") throw Error("Hujjat вернул ответ другого формата вместо PDF.");
1560
+ let a = await i.arrayBuffer();
1561
+ if (t.throwIfAborted(), new TextDecoder().decode(a.slice(0, 5)) !== "%PDF-") throw Error("Hujjat вернул некорректный или пустой PDF.");
1562
+ return {
1563
+ blob: new Blob([a], { type: "application/pdf" }),
1564
+ filename: "preview.pdf",
1565
+ warnings: []
1566
+ };
1567
+ }
1568
+ //#endregion
1569
+ export { _e as AzDocumentEditor, ye as AzHtmlEditor, X as DOCX_MIME, b as HUJJAT_LOCALES, x as HUJJAT_MAX_HTML_BYTES, S as HUJJAT_PAGE, C as HujjatCompatibilityError, be as MAX_DOCX_BYTES, Ae as createHujjatTemplatePayload, Te as downloadDocx, De as downloadPdf, we as exportFilename, pe as exportHujjatDocx, me as importHujjatTemplate, Oe as pdfRenderProfile, Ce as readDocxFile, re as readHujjatHtml, je as requestHujjatPreview, Ee as requestPdf, M as sanitizeHujjatHtml, E as validateHujjatVariable, ie as withHujjatLocale };