@aeriz/wysiwyg 1.0.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +82 -573
  3. package/angular/README.md +10 -4
  4. package/angular/aeriz-editor.directive.ts +40 -18
  5. package/dist/adapters/jquery.cjs +1 -1
  6. package/dist/adapters/jquery.js +14 -14
  7. package/dist/adapters/shared.cjs +1 -1
  8. package/dist/adapters/shared.js +59 -56
  9. package/dist/adapters/vue.cjs +1 -1
  10. package/dist/adapters/vue.js +64 -56
  11. package/dist/adapters/vue2.cjs +1 -1
  12. package/dist/adapters/vue2.js +24 -17
  13. package/dist/adapters/wc.cjs +1 -1
  14. package/dist/adapters/wc.js +108 -72
  15. package/dist/aeriz-wysiwyg-adapter.js +24 -32
  16. package/dist/aeriz-wysiwyg-adapter.min.js +1 -1
  17. package/dist/aeriz-wysiwyg-highlight.js +964 -0
  18. package/dist/aeriz-wysiwyg-highlight.min.js +5 -0
  19. package/dist/aeriz-wysiwyg-jquery.js +25 -32
  20. package/dist/aeriz-wysiwyg-jquery.min.js +1 -1
  21. package/dist/aeriz-wysiwyg-wc.js +80 -43
  22. package/dist/aeriz-wysiwyg-wc.min.js +1 -1
  23. package/dist/aeriz-wysiwyg.cjs +3688 -1757
  24. package/dist/aeriz-wysiwyg.css +2104 -1904
  25. package/dist/aeriz-wysiwyg.esm.js +3688 -1757
  26. package/dist/aeriz-wysiwyg.esm.min.js +4904 -3538
  27. package/dist/aeriz-wysiwyg.js +3688 -1757
  28. package/dist/aeriz-wysiwyg.min.cjs +53 -40
  29. package/dist/aeriz-wysiwyg.min.css +1 -1
  30. package/dist/aeriz-wysiwyg.min.js +53 -40
  31. package/dist/highlight.cjs +5 -0
  32. package/dist/highlight.js +895 -0
  33. package/dist/server.cjs +24 -19
  34. package/dist/server.js +612 -251
  35. package/dist-types/adapters/shared.d.ts +0 -8
  36. package/dist-types/adapters/shared.d.ts.map +1 -1
  37. package/dist-types/adapters/vue.d.ts +62 -21
  38. package/dist-types/adapters/vue.d.ts.map +1 -1
  39. package/dist-types/adapters/vue2.d.ts +33 -14
  40. package/dist-types/adapters/vue2.d.ts.map +1 -1
  41. package/dist-types/adapters/wc.d.ts +15 -6
  42. package/dist-types/adapters/wc.d.ts.map +1 -1
  43. package/dist-types/cjs/adapters/shared.d.cts +0 -8
  44. package/dist-types/cjs/adapters/vue.d.cts +62 -21
  45. package/dist-types/cjs/adapters/vue2.d.cts +33 -14
  46. package/dist-types/cjs/adapters/wc.d.cts +15 -6
  47. package/dist-types/cjs/core/AerizEditor.d.cts +238 -48
  48. package/dist-types/cjs/core/AerizViewer.d.cts +7 -0
  49. package/dist-types/cjs/core/block-meta.d.cts +40 -0
  50. package/dist-types/cjs/core/block-tracker.d.cts +64 -0
  51. package/dist-types/cjs/core/blocks.d.cts +39 -4
  52. package/dist-types/cjs/core/fonts.d.cts +33 -46
  53. package/dist-types/cjs/core/highlight.d.cts +2 -0
  54. package/dist-types/cjs/core/history.d.cts +28 -10
  55. package/dist-types/cjs/core/html-to-blocks.d.cts +10 -0
  56. package/dist-types/cjs/core/i18n.d.cts +44 -0
  57. package/dist-types/cjs/core/import-html.d.cts +0 -13
  58. package/dist-types/cjs/core/insert-fragment.d.cts +21 -0
  59. package/dist-types/cjs/core/paste-clean.d.cts +36 -0
  60. package/dist-types/cjs/core/sanitize-dom.d.cts +21 -0
  61. package/dist-types/cjs/core/sanitize-html.d.cts +8 -0
  62. package/dist-types/cjs/core/sanitize-policy.d.cts +22 -0
  63. package/dist-types/cjs/core/selection.d.cts +5 -0
  64. package/dist-types/cjs/core/table-grid.d.cts +87 -0
  65. package/dist-types/cjs/core/table-ops.d.cts +2 -22
  66. package/dist-types/cjs/highlight/index.d.cts +5 -0
  67. package/dist-types/cjs/index.d.cts +19 -11
  68. package/dist-types/cjs/server/index.d.cts +4 -5
  69. package/dist-types/cjs/types/index.d.cts +63 -15
  70. package/dist-types/cjs/ui/Toolbar.d.cts +10 -0
  71. package/dist-types/cjs/ui/doc-tools.d.cts +58 -0
  72. package/dist-types/cjs/ui/popovers.d.cts +14 -25
  73. package/dist-types/core/AerizEditor.d.ts +238 -48
  74. package/dist-types/core/AerizEditor.d.ts.map +1 -1
  75. package/dist-types/core/AerizViewer.d.ts +7 -0
  76. package/dist-types/core/AerizViewer.d.ts.map +1 -1
  77. package/dist-types/core/block-meta.d.ts +40 -0
  78. package/dist-types/core/block-meta.d.ts.map +1 -1
  79. package/dist-types/core/block-policy.d.ts.map +1 -1
  80. package/dist-types/core/block-tracker.d.ts +64 -0
  81. package/dist-types/core/block-tracker.d.ts.map +1 -0
  82. package/dist-types/core/blocks.d.ts +39 -4
  83. package/dist-types/core/blocks.d.ts.map +1 -1
  84. package/dist-types/core/fonts.d.ts +33 -46
  85. package/dist-types/core/fonts.d.ts.map +1 -1
  86. package/dist-types/core/highlight.d.ts +2 -0
  87. package/dist-types/core/highlight.d.ts.map +1 -1
  88. package/dist-types/core/history.d.ts +28 -10
  89. package/dist-types/core/history.d.ts.map +1 -1
  90. package/dist-types/core/html-mini.d.ts.map +1 -1
  91. package/dist-types/core/html-to-blocks.d.ts +10 -0
  92. package/dist-types/core/html-to-blocks.d.ts.map +1 -0
  93. package/dist-types/core/i18n.d.ts +44 -0
  94. package/dist-types/core/i18n.d.ts.map +1 -1
  95. package/dist-types/core/import-html.d.ts +0 -13
  96. package/dist-types/core/import-html.d.ts.map +1 -1
  97. package/dist-types/core/import-markdown.d.ts.map +1 -1
  98. package/dist-types/core/insert-fragment.d.ts +21 -0
  99. package/dist-types/core/insert-fragment.d.ts.map +1 -0
  100. package/dist-types/core/markdown-export.d.ts.map +1 -1
  101. package/dist-types/core/paste-clean.d.ts +36 -0
  102. package/dist-types/core/paste-clean.d.ts.map +1 -0
  103. package/dist-types/core/render-string.d.ts.map +1 -1
  104. package/dist-types/core/sanitize-dom.d.ts +21 -0
  105. package/dist-types/core/sanitize-dom.d.ts.map +1 -0
  106. package/dist-types/core/sanitize-html.d.ts +8 -0
  107. package/dist-types/core/sanitize-html.d.ts.map +1 -0
  108. package/dist-types/core/sanitize-policy.d.ts +22 -0
  109. package/dist-types/core/sanitize-policy.d.ts.map +1 -0
  110. package/dist-types/core/selection.d.ts +5 -0
  111. package/dist-types/core/selection.d.ts.map +1 -1
  112. package/dist-types/core/snapshot.d.ts.map +1 -1
  113. package/dist-types/core/table-grid.d.ts +87 -0
  114. package/dist-types/core/table-grid.d.ts.map +1 -0
  115. package/dist-types/core/table-ops.d.ts +2 -22
  116. package/dist-types/core/table-ops.d.ts.map +1 -1
  117. package/dist-types/highlight/index.d.ts +5 -0
  118. package/dist-types/highlight/index.d.ts.map +1 -0
  119. package/dist-types/index.d.ts +19 -11
  120. package/dist-types/index.d.ts.map +1 -1
  121. package/dist-types/server/index.d.ts +4 -5
  122. package/dist-types/server/index.d.ts.map +1 -1
  123. package/dist-types/types/index.d.ts +63 -15
  124. package/dist-types/types/index.d.ts.map +1 -1
  125. package/dist-types/ui/Toolbar.d.ts +10 -0
  126. package/dist-types/ui/Toolbar.d.ts.map +1 -1
  127. package/dist-types/ui/doc-tools.d.ts +58 -0
  128. package/dist-types/ui/doc-tools.d.ts.map +1 -0
  129. package/dist-types/ui/icons.d.ts.map +1 -1
  130. package/dist-types/ui/popovers.d.ts +14 -25
  131. package/dist-types/ui/popovers.d.ts.map +1 -1
  132. package/package.json +70 -5
@@ -1,13 +1,15 @@
1
1
  import type { EditorOptions, SerializeHtmlOptions } from '../types/index.js';
2
2
  import { Toolbar } from '../ui/Toolbar.js';
3
- import type { Block, BlockAttrs, BlockKind, BlockSnapshot } from './blocks.js';
3
+ import type { Block, BlockAttrs, BlockKind, BlockSnapshot, InlineMarkName } from './blocks.js';
4
4
  export type { Block, BlockAttrs, BlockKind, BlockMatch, BlockSnapshot, BlockType, ClassifyResult, HeadingLevel, } from './blocks.js';
5
- export interface InlineState {
6
- bold: boolean;
7
- italic: boolean;
8
- underline: boolean;
9
- strike: boolean;
10
- }
5
+ /**
6
+ * 커서 위치에서 켜져 있는 인라인 마크들.
7
+ *
8
+ * 마크 목록을 그대로 따라간다 — 마크를 하나 늘릴 때 이 타입 · 상태 수집 ·
9
+ * 툴바 동기화를 각각 고치면 반드시 한 군데를 빠뜨린다 (그러면 버튼이 눌리긴
10
+ * 하는데 눌린 표시가 안 나는 식으로 어긋난다).
11
+ */
12
+ export type InlineState = Record<InlineMarkName, boolean>;
11
13
  export interface EditorState {
12
14
  blocks: Block[];
13
15
  activeBlockId: string | null;
@@ -31,26 +33,50 @@ export declare class AerizEditor {
31
33
  private readonly statusBlockEl;
32
34
  private readonly statusBlocksEl;
33
35
  private readonly statusCharsEl;
34
- private readonly statusSourceEl;
35
36
  private readonly options;
36
37
  private readonly observer;
37
38
  private readonly blockIds;
38
39
  private readonly idFor;
39
40
  private readonly listeners;
40
41
  private readonly handleSelectionChange;
42
+ /**
43
+ * 문서 전체의 selectionchange. **선택이 이 에디터 안에 있을 때만** 반응한다.
44
+ * 같은 페이지의 제목 입력란에서 타자를 칠 때도 이 이벤트가 오는데, 그때마다
45
+ * 에디터를 다시 동기화하면 키 하나에 수십 ms 를 쓴다(1.0 의 문제).
46
+ * 안에 있다가 밖으로 나간 순간 한 번은 동기화해서 활성 블록 표시를 지운다.
47
+ */
48
+ private readonly handleDocumentSelectionChange;
49
+ private selectionInside;
41
50
  private readonly handleResize;
42
51
  /** document 에 붙는다 — destroy() 에서 반드시 떼야 인스턴스가 GC 된다. */
43
52
  private readonly handleDocumentMouseUp;
44
53
  private state;
45
54
  private destroyed;
46
55
  private syncQueued;
47
- private lastSerialized;
56
+ /** 바뀐 블록만 다시 계산하기 위한 장부. */
57
+ private tracker;
58
+ /** 표식(data-block-kind · label) 을 다시 달아야 하는 블록. */
59
+ private readonly markerPending;
60
+ /** state.blocks 를 다시 만들어야 하는지. */
61
+ private blocksStale;
62
+ private cachedBlocks;
63
+ /** 표식을 단 마지막 활성 블록. */
64
+ private focusedEl;
65
+ /** 오버레이(핸들 · 라벨) 위치 계산을 프레임당 한 번으로 묶는 rAF 핸들. */
66
+ private overlayRaf;
67
+ /** 상태바 갱신을 타이핑이 멈춘 뒤로 미루는 타이머. */
68
+ private statusTimer;
48
69
  /** 포인터가 올라가 있는 블록. 그 블록의 컨트롤만 드러낸다. */
49
70
  private hoveredBlockId;
50
71
  /** hover 판정을 프레임당 1 회로 묶기 위한 rAF 핸들. */
51
72
  private hoverRaf;
52
73
  /** 라벨 pill 의 등장 애니메이션을 블록이 **바뀔 때만** 다시 재생하기 위한 표식. */
53
74
  private pillBlockId;
75
+ /**
76
+ * IME 조합이 진행 중인지. 한글 · 일본어 · 중국어 입력은 글자 하나가 여러
77
+ * 입력에 걸쳐 만들어지는데, 그 사이에 DOM 을 다시 쓰면 조합이 끊긴다.
78
+ */
79
+ private composing;
54
80
  /**
55
81
  * 편집 이력. 브라우저 기본 undo 는 우리가 직접 한 DOM 조작(블록 이동 · 표
56
82
  * 편집 · 유형 변경) 을 모르기 때문에 자체 스택을 둔다.
@@ -89,18 +115,39 @@ export declare class AerizEditor {
89
115
  * data-block-id 는 보존.
90
116
  */
91
117
  getHTML(options?: SerializeHtmlOptions): string;
92
- /** 가공 없는 원본 innerHTML. 직렬화 검증/디버그 용도. */
93
- getRawHTML(): string;
118
+ /**
119
+ * 본문을 통째로 갈아끼운다.
120
+ *
121
+ * 들어온 HTML 은 저장소에서 바로 온 값일 수 있으므로 정화를 거친다
122
+ * (`renderBlock` · `renderBlocksToHTML` 과 같은 규칙). 에디터가 스스로 만든
123
+ * 출력에는 걸릴 것이 없으니 왕복(`getHTML()` → 저장 → `setHTML()`) 은 그대로다.
124
+ */
94
125
  setHTML(html: string): void;
126
+ /**
127
+ * 블록 스냅샷(`getBlocks()` 의 결과 · 서버에 저장한 값) 으로 본문을 바꾼다.
128
+ * `setHTML` 과 같이 이력을 새로 시작한다.
129
+ */
130
+ setBlocks(blocks: readonly BlockSnapshot[]): void;
131
+ /** 본문을 통째로 갈아끼우는 공통 경로 (setHTML · setBlocks). */
132
+ private replaceDocument;
95
133
  focus(): void;
134
+ private readOnly;
135
+ /** 읽기 전용 켜고 끄기. 켜면 글을 고칠 수 없고 툴바는 인쇄 · 전체 화면만 남는다. */
136
+ setReadOnly(readOnly: boolean): void;
96
137
  setTheme(theme: 'light' | 'dark'): void;
97
138
  getState(): EditorState;
98
- getBlocks(): Block[];
99
139
  /**
100
- * 본문 블록들을 직렬화 가능한 BlockSnapshot 배열로 반환한다.
101
- * AerizViewer.setBlocks(snapshots) 가 받아 동일한 트리를 렌더할 수 있다.
140
+ * 본문을 블록 스냅샷 배열로. 서버에 저장하거나 `AerizViewer.setBlocks()` ·
141
+ * `setBlocks()` 로 그대로 되살릴 수 있는 직렬화 형식이다.
142
+ */
143
+ getBlocks(): BlockSnapshot[];
144
+ /**
145
+ * 블록 목록. 구조나 내용이 바뀐 뒤 처음 부를 때만 다시 만든다 — 바뀌지
146
+ * 않은 블록은 분류 결과와 Block 객체를 그대로 쓴다.
102
147
  */
103
- serialize(): BlockSnapshot[];
148
+ private currentBlocks;
149
+ /** 본문 직계 자식 하나를 Block 으로. 분류는 캐시를 쓴다. */
150
+ private blockOf;
104
151
  /**
105
152
  * data-block-id 로 본문에서 블록을 찾아 반환. 없으면 null.
106
153
  */
@@ -123,6 +170,11 @@ export declare class AerizEditor {
123
170
  * takeRecords 로 흡수한 뒤 onChange + queueSync.
124
171
  */
125
172
  private flush;
173
+ /** 지금 본문으로 이력 한 칸을 만든다. 바뀌지 않은 블록 문자열은 공유된다. */
174
+ private makeHistoryEntry;
175
+ /** 캐럿 위치를 "블록 순번 + 블록 안 글자 오프셋" 으로 읽는다. */
176
+ private captureDocSelection;
177
+ private restoreDocSelection;
126
178
  /**
127
179
  * 지금 본문을 이력에 기록한다.
128
180
  *
@@ -160,17 +212,45 @@ export declare class AerizEditor {
160
212
  redo(): void;
161
213
  private applyHistoryEntry;
162
214
  private handleToolbarAction;
215
+ /** 선택 영역이 걸친 본문 블록들 (캐럿만 있으면 그 블록 하나). */
216
+ private selectedTopBlocks;
217
+ /** 줄 간격(%) — 블록 단위. 한글처럼 문단 전체에 적용된다. */
218
+ private applyLineHeight;
219
+ /** 자간 — 선택한 글자에 `letter-spacing: Nem`. 0 은 기본으로 되돌린다. */
220
+ private applyLetterSpacing;
221
+ private findPanel;
222
+ /** 찾기 · 바꾸기 (Ctrl+H). */
223
+ openFind(): void;
224
+ private sourceArea;
225
+ private sourceStart;
226
+ /**
227
+ * HTML 소스 보기 ↔ 편집 화면. 소스에서 고친 내용은 돌아올 때 **거른 뒤**
228
+ * 본문에 넣고, 되돌리기 한 번으로 소스 편집 전체를 되돌릴 수 있다.
229
+ */
230
+ toggleSource(): void;
231
+ private fullscreenScroll;
232
+ /** 전체 화면 — 에디터가 창을 꽉 채운다. Esc 로 나온다. */
233
+ toggleFullscreen(): void;
163
234
  /**
164
235
  * 선택 영역의 인라인 서식을 지운다. 블록 유형은 건드리지 않는다 —
165
236
  * "서식 지우기" 로 제목이 본문이 되면 되돌릴 방법을 찾기 어렵다.
166
237
  */
167
238
  private clearInlineFormat;
168
239
  /**
169
- * 인라인 마크(bold/italic/underline/strike) 토글. 활성 블록의 allowedMarks
170
- * 에 포함되지 않은 마크면 무시. styleWithCSS=true 모드로 deprecated 태그
171
- * (<b>/<i>/<u>) 대신 `<span style="font-weight:bold">` 형태가 만들어진다.
240
+ * 인라인 마크 토글. 활성 블록의 allowedMarks 에 포함되지 않은 마크면 무시.
241
+ * styleWithCSS=true 모드로 deprecated 태그(<b>/<i>/<u>) 대신
242
+ * `<span style="font-weight:bold">` 형태가 만들어진다.
172
243
  *
173
- * 'strike' 는 execCommand 표준 명령명이 'strikeThrough'.
244
+ * 마크 이름과 execCommand 명령명이 다른 것만 {@link MARK_COMMAND} 로 옮긴다.
245
+ *
246
+ * **위/아래 첨자만 styleWithCSS 를 끈다.** 켜 두면 Chrome 이 `<sub>` 대신
247
+ * `<span style="vertical-align: sub">` 를 만드는데, 그 span 은
248
+ * - 글자가 작아지지 않아 첨자로 보이지 않고,
249
+ * - 스크린 리더가 첨자로 읽지 않으며,
250
+ * - 마크다운 내보내기가 `<sub>` / `<sup>` **태그**를 보고 판단하므로 첨자가
251
+ * 통째로 사라진다.
252
+ *
253
+ * 나머지 마크는 반대다 — deprecated 된 `<b>` / `<i>` 대신 style 을 원한다.
174
254
  */
175
255
  private applyMark;
176
256
  /**
@@ -225,14 +305,11 @@ export declare class AerizEditor {
225
305
  * 가 항상 우선하도록 setProperty('important') 로 박는다.
226
306
  */
227
307
  private applyCellBgToCells;
228
- /** 표 편집 드롭다운에서 받은 액션을 분기 실행. */
308
+ /**
309
+ * 표 편집 드롭다운에서 받은 액션을 실행한다. 행 · 열 계산은 병합 셀을 아는
310
+ * 격자 모델(`table-grid`) 이 맡는다 — DOM 의 셀 순번은 열 번호가 아니다.
311
+ */
229
312
  private runTableMenu;
230
- /** 활성 셀의 행 위/아래에 새 행 삽입. 같은 열 수, 빈 td 로 채움. */
231
- private insertRow;
232
- /** 활성 셀이 속한 열의 좌/우에 새 열 삽입. 모든 행에 빈 td 추가. */
233
- private insertColumn;
234
- /** 활성 셀의 행 전체 삭제. 마지막 행이면 보존(빈 표 회피). */
235
- private deleteRow;
236
313
  /**
237
314
  * 코드 블록 input 마다 호출되는 debounced rehighlight. 활성 블록이 codeBlock
238
315
  * 이고 data-language 가 설정돼 있을 때만 동작 — 타이핑 멈춘 뒤 300ms 후 1 회.
@@ -249,13 +326,17 @@ export declare class AerizEditor {
249
326
  * code 안에 있다면 textContent offset 으로 caret 위치 보존.
250
327
  */
251
328
  private rehighlightCode;
329
+ /**
330
+ * 코드 글을 `<code>` 안에 넣을 HTML 로. 색칠기가 없으면 글을 그대로(escape),
331
+ * 있으면 그 결과를 `<span class>` 만 남기고 거른다 — 바깥 색칠기가 돌려준
332
+ * HTML 이 본문에 스크립트나 이벤트 속성을 들이지 못하게.
333
+ */
334
+ private codeHtml;
252
335
  /**
253
336
  * 본문에서 모든 codeBlock 을 순회하며 highlight 적용. setHTML / 초기 로드
254
337
  * / 외부 import 후 호출.
255
338
  */
256
339
  private rehighlightAllCodeBlocks;
257
- /** 활성 셀의 열 전체 삭제. 마지막 열이면 보존(빈 표 회피). */
258
- private deleteColumn;
259
340
  /**
260
341
  * 마우스 이동 시 셀 우/하 가장자리에서 col-resize / row-resize 커서 표시.
261
342
  * 드래그 진행 중에는 별도 핸들러가 cursor 를 관리하므로 skip.
@@ -280,6 +361,28 @@ export declare class AerizEditor {
280
361
  * 사이에 캐럿이 항목 안으로 들어가 화면이 한 번 흔들린다.
281
362
  */
282
363
  private handleTaskToggle;
364
+ /**
365
+ * 콜아웃의 아이콘 자리를 누르면 종류를 순환시킨다
366
+ * (안내 → 도움말 → 주의 → 경고 → 안내).
367
+ *
368
+ * 종류마다 메뉴 항목을 따로 두면 삽입 메뉴가 콜아웃 넷으로 뒤덮인다. 반대로
369
+ * 종류를 바꿀 방법이 아예 없으면 안내 하나만 쓸 수 있는 반쪽 기능이 된다.
370
+ * 체크리스트의 체크박스 · 토글의 표식과 같은 "왼쪽 여백을 누른다" 규칙을
371
+ * 재사용해, 새로 배울 것 없이 자리만 알면 되게 했다.
372
+ */
373
+ private handleCalloutVariantClick;
374
+ /**
375
+ * 토글의 요약 줄을 클릭했을 때 접기/펴기를 할지 정한다.
376
+ *
377
+ * `<details>` 는 요약 줄 **어디를 눌러도** 열리고 닫힌다. 편집 중에는 그게
378
+ * 방해가 된다 — 제목의 오타를 고치려고 캐럿을 옮길 때마다 블록이 접혀서
379
+ * 방금 쓰던 본문이 사라진다.
380
+ *
381
+ * 그래서 삼각형 표식 자리를 누른 것만 접기/펴기로 보고, 글자 자리를 누른
382
+ * 것은 캐럿 이동으로만 둔다. 체크리스트 체크박스와 같은 판정 방식이라
383
+ * 사용자가 규칙을 새로 배울 필요가 없다.
384
+ */
385
+ private handleToggleSummaryClick;
283
386
  /**
284
387
  * 이미지 캡션(`<figcaption>`) 에 캐럿을 둔다. 없으면 만든다.
285
388
  *
@@ -316,11 +419,8 @@ export declare class AerizEditor {
316
419
  * 비어 있으면(캐럿만) 다음 입력 글꼴이 결정된다(브라우저 기본 동작).
317
420
  */
318
421
  private applyFontFamily;
319
- /**
320
- * 현재 selection 의 anchor 노드 기준 computed font-family 를 읽어 알려진
321
- * FONT_FAMILIES id 와 매칭. 글꼴 드롭다운의 active 표시에 사용.
322
- */
323
- private detectActiveFontId;
422
+ /** 캐럿 위치 요소의 계산된 스타일. 드롭다운의 "지금 값" 표시에 쓴다. */
423
+ private computedStyleAtCaret;
324
424
  /**
325
425
  * 선택 영역에 글자 크기를 적용한다. execCommand('fontSize') 는 1~7 만 받기
326
426
  * 때문에 px 적용을 위해 Range API 로 직접 `<span style="font-size: Xpx">`
@@ -332,11 +432,11 @@ export declare class AerizEditor {
332
432
  */
333
433
  private applyFontSize;
334
434
  /**
335
- * 현재 selection 의 anchor 노드 기준 computed font-size 를 px 정수로 읽어
336
- * FONT_SIZES 의 값과 일치할 때만 반환. 글자 크기 드롭다운의 active 표시에
337
- * 사용.
435
+ * 선택한 글자를 `<span style>` 로 감싼다. `execCommand` 는 글자 크기를 1~7
436
+ * 단계로만 받고 자간은 아예 없어 직접 감싼다. 캐럿만 있으면 빈 span 을 두어
437
+ * 다음에 칠 글자가 그 서식을 받게 한다.
338
438
  */
339
- private detectActiveFontSize;
439
+ private wrapSelectionStyle;
340
440
  /**
341
441
  * 블록 유형 드롭다운을 열어 사용자 선택 결과를 처리한다.
342
442
  * 툴바의 blockType 버튼 / 활성 블록 라벨 pill 양쪽 진입점이 동일한 분기
@@ -379,19 +479,25 @@ export declare class AerizEditor {
379
479
  */
380
480
  private openFileAttachmentDialogAndApply;
381
481
  /**
382
- * 파일 업로드 핸들러를 결정. onFileUpload 가 우선, 없으면 fileUploadUrl 에
383
- * multipart/form-data POST 후 응답 JSON 의 `url` 필드를 사용. 둘 다 없으면
384
- * undefined → 다이얼로그 업로드 탭 비활성.
385
- */
386
- private resolveFileUploadFn;
387
- /**
388
- * 이미지 업로드 핸들러를 결정. options.onImageUpload 가 우선이며, 없으면
389
- * options.imageUploadUrl 로 multipart/form-data POST 후 응답 JSON 의
390
- * `url` 필드를 사용. 둘 다 없으면 undefined → 다이얼로그 업로드 탭 비활성.
482
+ * 올리기 함수. `upload.handler` 가 있으면 그것, `upload.url` 이 있으면 그 주소로
483
+ * POST. 둘 다 없으면 undefined — 다이얼로그의 "올리기" 탭이 꺼진다.
484
+ * 크기 제한 · 오류 보고는 여기서 한 번에 처리한다.
391
485
  */
392
- private resolveImageUploadFn;
486
+ private uploader;
487
+ private reportError;
393
488
  private queueSync;
394
489
  private sync;
490
+ /**
491
+ * 캐럿 위치의 인라인 마크 상태.
492
+ *
493
+ * `queryCommandState` 는 부를 때마다 스타일 · 레이아웃을 강제로 다시 계산한다
494
+ * (마크 7개 × 키 하나). 같은 텍스트 노드 안에서 타이핑하는 동안에는 결과가
495
+ * 바뀌지 않으므로, 캐럿이 놓인 노드와 그 부모가 같으면 지난 결과를 쓴다.
496
+ * 서식 명령을 실행하면 {@link invalidateInlineState} 로 다시 읽게 한다.
497
+ */
498
+ private readInlineState;
499
+ private inlineCache;
500
+ private invalidateInlineState;
395
501
  private handleKeyDown;
396
502
  /**
397
503
  * 마크다운 입력 규칙.
@@ -451,6 +557,22 @@ export declare class AerizEditor {
451
557
  * 방법이 이것 말고는 없었다(마크다운으로 가져온 중첩 목록은 편집만 가능).
452
558
  */
453
559
  private handleTabKey;
560
+ /** 코드 블록의 들여쓰기 한 단계. 공백 두 칸 — 이 저장소의 코드 스타일과 같다. */
561
+ private static readonly CODE_INDENT;
562
+ /**
563
+ * 코드 블록 들여쓰기 / 내어쓰기 (Tab · Shift+Tab).
564
+ *
565
+ * 코드를 쓰는 자리에서 Tab 이 포커스를 툴바로 옮겨 버리면 들여쓰기를 할
566
+ * 방법이 없다. 다른 블록에서는 그 탈출구가 필요하지만(§7.5) 코드 블록은
567
+ * 예외다.
568
+ *
569
+ * 선택 영역이 여러 줄에 걸치면 **걸친 줄 전체**를 옮긴다. 한 줄 안에 캐럿만
570
+ * 있으면 그 자리에 들여쓰기를 넣는다 — 편집기들이 공통으로 하는 동작이다.
571
+ *
572
+ * 텍스트를 통째로 다시 쓰고 캐럿은 문자 오프셋으로 되돌린다. 하이라이트가
573
+ * 이미 같은 방식으로 동작하므로 경로가 하나로 모인다.
574
+ */
575
+ private indentCode;
454
576
  /**
455
577
  * Backspace 처리. 처리했으면 `true`.
456
578
  *
@@ -460,12 +582,38 @@ export declare class AerizEditor {
460
582
  * (제목 안에 목록이 들어가는 등) 도 함께 피한다.
461
583
  */
462
584
  private handleBackspaceKey;
585
+ /**
586
+ * 코드 블록 안에 줄바꿈을 넣는다 (Shift+Enter).
587
+ *
588
+ * `<pre>` 는 개행 문자를 그대로 보존하므로 줄바꿈은 **문자 하나**여야 한다.
589
+ * `<br>` 을 쓰면 `textContent` 가 그 자리를 빈 것으로 읽어, 하이라이트가
590
+ * 다시 그려지는 순간(타이핑 멈춘 뒤 300ms) 줄이 사라진다.
591
+ *
592
+ * 맨 끝에서는 개행을 **하나 더** 넣는다. `<pre>` 는 마지막 개행 하나를
593
+ * 접어 버려서, 하나만 넣으면 새 줄이 화면에 나타나지 않고 캐럿도 앞 줄에
594
+ * 머문 것처럼 보인다. 뒤쪽 개행은 자리를 만드는 용도이고, 이어서 글자를
595
+ * 치면 자연스럽게 그 줄의 내용이 된다.
596
+ */
597
+ private insertCodeLineBreak;
463
598
  /**
464
599
  * 활성 블록 뒤에 새 빈 **본문 블록**을 만들고 캐럿을 그 안에 둔다.
465
600
  * 인용구 / 코드 블록의 Enter 탈출, 제목 끝 Enter 에 사용.
466
601
  */
467
602
  private exitBlockOnEnter;
603
+ /**
604
+ * 핸들은 **보이는 블록에만** 만든다 — 캐럿이 있는 블록과 포인터가 올라간
605
+ * 블록, 많아야 두 개다.
606
+ *
607
+ * 1.0 은 블록마다 핸들 DOM 을 만들고 위치를 잡았다. 화면에는 하나만 보이는데
608
+ * 190쪽 문서에서는 3,000개를 만들고 블록마다 레이아웃을 다시 읽어서 열기에만
609
+ * 8초 가까이 걸렸다(초기화 시간의 86%).
610
+ */
468
611
  private syncBlockHandles;
612
+ /**
613
+ * 핸들 · 라벨 위치는 다음 프레임 직전에 한 번만 계산한다. 같은 프레임 안의
614
+ * 키 입력 · selectionchange · keyup 이 레이아웃을 여러 번 강제로 읽지 않게.
615
+ */
616
+ private scheduleOverlays;
469
617
  /**
470
618
  * 컨트롤(드래그 핸들 · 단락 추가) 은 **지금 다루고 있는 블록** 에만 보인다.
471
619
  * 포인터가 놓인 블록과 캐럿이 있는 블록 두 가지가 그 대상이다.
@@ -483,7 +631,14 @@ export declare class AerizEditor {
483
631
  * 가까운 블록으로 붙인다 — 문단 사이 간격에서 컨트롤이 깜빡이지 않게.
484
632
  */
485
633
  private blockIdAtViewportY;
634
+ /** `clientY` 가 걸치거나 그 아래에 있는 첫 블록의 순번 (이진 탐색). */
635
+ private blockIndexAtY;
486
636
  private repositionHandles;
637
+ /**
638
+ * id 로 블록 element 를 찾는다. 활성 · hover 블록은 대개 방금 본 것이라
639
+ * 그쪽부터 확인하고, 없을 때만 문서를 찾는다.
640
+ */
641
+ private elementOfId;
487
642
  private positionHandle;
488
643
  private createBlockHandle;
489
644
  /**
@@ -491,6 +646,22 @@ export declare class AerizEditor {
491
646
  * MutationObserver flush 가 새 단락에 신규 data-block-id 를 발급한다.
492
647
  */
493
648
  private insertParagraphAfter;
649
+ private plainPasteNext;
650
+ /**
651
+ * 붙여넣기. 브라우저 기본 동작에 맡기지 않는다 — 기본 동작은 워드 · 한글 ·
652
+ * 엑셀의 클래스 서식을 잃고 `mso-*` 쓰레기를 남기며, 웹 페이지의 위험한
653
+ * 속성도 일단 문서에 들어온다. 여기서 다듬고(`cleanPastedHtml`) 거른 뒤
654
+ * (`parseSafeFragment`) 직접 넣는다.
655
+ */
656
+ private handlePaste;
657
+ /** 클립보드 · 끌어 놓기 데이터를 지금 캐럿 자리에 넣는다. */
658
+ private insertTransfer;
659
+ private insertFragmentAtCaret;
660
+ /**
661
+ * 그림 파일을 지금 블록 뒤에 그림 블록으로 넣는다. 업로드 처리기가 있으면
662
+ * 올린 뒤의 주소를, 없으면 data URL 을 쓴다 (문서에 그림이 그대로 담긴다).
663
+ */
664
+ private insertImageFiles;
494
665
  private handleDragOver;
495
666
  private handleDrop;
496
667
  private handleDragLeave;
@@ -516,7 +687,14 @@ export declare class AerizEditor {
516
687
  * - 좌측: 활성 블록 라벨 + id (없으면 — )
517
688
  * - 우측: 총 블록 수, 본문 글자 수(공백 제외)
518
689
  */
519
- private syncStatusBar;
690
+ /**
691
+ * 상태바는 타이핑이 잠깐 멈춘 뒤에 갱신한다. 글자 수를 세려면 문서 전체
692
+ * 텍스트를 읽어야 해서, 키마다 하면 긴 문서에서 그 비용이 그대로 쌓인다.
693
+ * 활성 블록 라벨은 바로 바꾼다(싸고, 늦으면 어색하다).
694
+ */
695
+ private scheduleStatusBar;
696
+ private syncStatusBlock;
697
+ private syncStatusCounts;
520
698
  /**
521
699
  * 되돌리기 / 다시 실행 버튼의 활성 상태.
522
700
  *
@@ -524,7 +702,19 @@ export declare class AerizEditor {
524
702
  * 일어나는 경험을 준다. 이력 끝에 닿았다는 사실 자체가 정보다.
525
703
  */
526
704
  private syncHistoryButtons;
705
+ /**
706
+ * 바뀐 블록에만 표식(kind · label) 을 다시 달고, 활성 표시는 이전 활성
707
+ * 블록과 새 활성 블록 둘만 고친다. 1.0 은 키마다 모든 블록에 속성을 다시
708
+ * 썼다.
709
+ */
527
710
  private syncBlockMarkers;
711
+ /**
712
+ * 옵저버에 쌓인 레코드를 지금 장부로 옮긴다. 에디터가 스스로 쓴 표식만
713
+ * 바뀐 레코드는 장부가 버린다. 진짜 변경이 섞여 있었다면 확정은 다음
714
+ * 마이크로태스크의 flush 가 한다 — 가져간 레코드는 옵저버 콜백으로 다시
715
+ * 오지 않기 때문이다.
716
+ */
717
+ private absorb;
528
718
  private applyToolbarState;
529
719
  }
530
720
  //# sourceMappingURL=AerizEditor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AerizEditor.d.ts","sourceRoot":"","sources":["../../src/core/AerizEditor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AerizEditor.d.ts","sourceRoot":"","sources":["../../src/core/AerizEditor.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,11 @@ export interface ViewerOptions {
5
5
  element: HTMLElement;
6
6
  /** 초기 블록 상태 (1차 입력 경로). HTML 이 아닌 상태 모델을 사용. */
7
7
  initialBlocks?: BlockSnapshot[];
8
+ /**
9
+ * 처음 보여 줄 HTML. `initialBlocks` 와 함께 주면 `initialBlocks` 가 쓰인다.
10
+ * 저장된 값을 그대로 넣어도 된다 — 허용 목록으로 정화한 뒤 렌더한다.
11
+ */
12
+ initialHTML?: string;
8
13
  /** 초기 테마 */
9
14
  theme?: 'light' | 'dark';
10
15
  /** `getHTML()` 의 스타일 전략. 기본 `'inline'`. */
@@ -43,6 +48,8 @@ export declare class AerizViewer {
43
48
  */
44
49
  setBlocks(blocks: BlockSnapshot[]): void;
45
50
  /** 현재 본문의 BlockSnapshot 배열을 반환한다. */
51
+ /** HTML 로 내용을 바꾼다. 허용 목록으로 정화한 뒤 블록으로 렌더한다. */
52
+ setHTML(html: string): void;
46
53
  getBlocks(): BlockSnapshot[];
47
54
  /** 임의의 노드를 받아 그 노드가 속한 블록을 반환한다. 본문 밖이면 null. */
48
55
  getBlockOf(node: Node): Block | null;
@@ -1 +1 @@
1
- {"version":3,"file":"AerizViewer.d.ts","sourceRoot":"","sources":["../../src/core/AerizViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAerD,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,gDAAgD;IAChD,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;IAChC,YAAY;IACZ,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyD;IAC/E;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,aAAa;IA+BlC;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAKxC,qCAAqC;IACrC,SAAS,IAAI,aAAa,EAAE;IAI5B,iDAAiD;IACjD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI;IAKpC;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM;IAgBnD,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAIvC,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,kBAAkB;CAG3B"}
1
+ {"version":3,"file":"AerizViewer.d.ts","sourceRoot":"","sources":["../../src/core/AerizViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgBrD,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,gDAAgD;IAChD,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY;IACZ,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyD;IAC/E;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,aAAa;IAiClC;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAKxC,qCAAqC;IACrC,+CAA+C;IAC/C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,SAAS,IAAI,aAAa,EAAE;IAI5B,iDAAiD;IACjD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI;IAKpC;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM;IAgBnD,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAIvC,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,kBAAkB;CAG3B"}
@@ -78,6 +78,24 @@ export declare function mergeClassNames(...values: ReadonlyArray<string | undefi
78
78
  export declare const TASK_LIST_CLASS = "aw-task-list";
79
79
  /** 체크리스트 항목의 완료 여부를 담는 속성명. */
80
80
  export declare const TASK_CHECKED_ATTR = "data-checked";
81
+ /**
82
+ * 콜아웃(강조 상자) 의 종류.
83
+ *
84
+ * 인용구와 다른 블록인 이유 — 인용구는 "남의 말", 콜아웃은 "읽는 사람에게
85
+ * 하는 당부" 다. 둘을 한 블록으로 합치면 어느 쪽 의미도 실어 나르지 못한다.
86
+ */
87
+ export declare const CALLOUT_VARIANTS: readonly ["note", "tip", "warning", "danger"];
88
+ export type CalloutVariant = (typeof CALLOUT_VARIANTS)[number];
89
+ /** 콜아웃 블록의 정체성 클래스. */
90
+ export declare const CALLOUT_CLASS = "aw-callout";
91
+ /** 종류별 클래스는 이 접두사 + 종류 이름. */
92
+ export declare const CALLOUT_VARIANT_PREFIX = "aw-callout-";
93
+ /** 저장된 값을 알려진 종류로 정규화한다. 모르는 값이면 `'note'`. */
94
+ export declare function safeCalloutVariant(raw: string | undefined | null): CalloutVariant;
95
+ /** 토글의 요약 줄. 접혔을 때 유일하게 보이는 부분이다. */
96
+ export declare const TOGGLE_SUMMARY_CLASS = "aw-toggle-summary";
97
+ /** 토글의 본문. 펼쳤을 때 드러난다. */
98
+ export declare const TOGGLE_BODY_CLASS = "aw-toggle-body";
81
99
  /**
82
100
  * 링크 / 다운로드 URL 을 검사한다. 안전하면 원문 그대로, 아니면 빈 문자열.
83
101
  *
@@ -95,4 +113,26 @@ export declare function safeImageUrl(raw: string | undefined | null): string;
95
113
  * `../` 나 따옴표가 섞이면 URL 자체가 다른 곳을 가리키게 된다.
96
114
  */
97
115
  export declare function safeYouTubeId(raw: string | undefined | null): string;
116
+ /**
117
+ * 이벤트 핸들러 속성인지.
118
+ *
119
+ * `on` 으로 시작하는 속성은 **값 전체가 실행되는 코드다.** 목록으로 관리하지
120
+ * 않는 이유 — 표준에만 100 개가 넘고 계속 늘어나며, 하나라도 빠뜨리면 그것이
121
+ * 곧 구멍이다. `on` 접두사라는 형태 자체로 막는 편이 빠뜨릴 여지가 없다.
122
+ *
123
+ * `on` 으로 시작하는 정상 속성(`one`, `only` 같은 것) 은 HTML 표준에 없다.
124
+ */
125
+ export declare function isEventHandlerAttr(name: string): boolean;
126
+ export declare function isScriptBearingAttr(name: string): boolean;
127
+ /**
128
+ * `srcset` 의 모든 후보 URL 이 이미지로 안전한지.
129
+ *
130
+ * `src` 가 멀쩡해도 `srcset` 이 있으면 브라우저는 그쪽을 먼저 고른다. 그래서
131
+ * `src` 만 검사하면 우회가 된다.
132
+ *
133
+ * 후보 하나라도 통과하지 못하면 **속성을 통째로 버린다.** 일부만 남기면 남은
134
+ * 후보의 디스크립터(`2x`, `640w`) 조합이 원본과 달라져 엉뚱한 이미지가 뽑히고,
135
+ * 애초에 이 에디터는 `srcset` 을 만들지 않으므로 잃을 것이 없다.
136
+ */
137
+ export declare function isSafeSrcset(value: string): boolean;
98
138
  //# sourceMappingURL=block-meta.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"block-meta.d.ts","sourceRoot":"","sources":["../../src/core/block-meta.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,6BAA6B;AAC7B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAYvE;AAED,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED,0BAA0B;AAC1B,eAAO,MAAM,aAAa,QAGK,CAAC;AAEhC,4BAA4B;AAC5B,eAAO,MAAM,eAAe,QAGyD,CAAC;AAEtF,+BAA+B;AAC/B,eAAO,MAAM,oBAAoB,6FAC2D,CAAC;AAE7F,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,4CAA4C,CAAC;AAE5E,4BAA4B;AAC5B,eAAO,MAAM,kBAAkB,iBAAO,CAAC;AAEvC,0BAA0B;AAC1B,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAAY,CAAC;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAAC,MAAM,CAMvD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAIhD,CAAC;AAEH,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAIrE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,GAAG,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,GAClD,MAAM,CASR;AAED,uCAAuC;AACvC,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,+BAA+B;AAC/B,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AA2DhD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAOlE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CASnE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAGpE"}
1
+ {"version":3,"file":"block-meta.d.ts","sourceRoot":"","sources":["../../src/core/block-meta.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,6BAA6B;AAC7B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAYvE;AAED,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED,0BAA0B;AAC1B,eAAO,MAAM,aAAa,QAGK,CAAC;AAEhC,4BAA4B;AAC5B,eAAO,MAAM,eAAe,QAGyD,CAAC;AAEtF,+BAA+B;AAC/B,eAAO,MAAM,oBAAoB,6FAC2D,CAAC;AAE7F,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,4CAA4C,CAAC;AAE5E,4BAA4B;AAC5B,eAAO,MAAM,kBAAkB,iBAAO,CAAC;AAEvC,0BAA0B;AAC1B,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAAY,CAAC;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAAC,MAAM,CAMvD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAIhD,CAAC;AAEH,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAIrE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,GAAG,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,GAClD,MAAM,CASR;AAED,uCAAuC;AACvC,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,+BAA+B;AAC/B,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,+CAAgD,CAAC;AAE9E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,uBAAuB;AACvB,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C,8BAA8B;AAC9B,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AAEpD,8CAA8C;AAC9C,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC7B,cAAc,CAGhB;AAED,qCAAqC;AACrC,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AAExD,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AA2DlD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAOlE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CASnE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAGpE;AASD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAkBD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CASnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"block-policy.d.ts","sourceRoot":"","sources":["../../src/core/block-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,KAAK,EAAa,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS7E;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,KAAK,GAAG,IAAI,EACpB,IAAI,EAAE,cAAc,GACnB,OAAO,CAET;AAED,8BAA8B;AAC9B,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAEnE;AAED,yDAAyD;AACzD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAE/D;AAED,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAE5D;AAeD,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAE5D;AAED,mCAAmC;AACnC,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAE3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAGxE;AA2BD,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAGvD"}
1
+ {"version":3,"file":"block-policy.d.ts","sourceRoot":"","sources":["../../src/core/block-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,KAAK,EAAa,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS7E;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,KAAK,GAAG,IAAI,EACpB,IAAI,EAAE,cAAc,GACnB,OAAO,CAET;AAED,8BAA8B;AAC9B,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAEnE;AAED,yDAAyD;AACzD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAE/D;AAED,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAE5D;AAeD,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAE5D;AAED,mCAAmC;AACnC,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAE3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAGxE;AA6BD,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAGvD"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * 바뀐 블록만 다시 계산하기 위한 장부.
3
+ *
4
+ * ## 왜 필요한가
5
+ *
6
+ * 1.0 은 키를 누를 때마다 문서 전체를 세 번 직렬화했다 — 변경 감지용
7
+ * `innerHTML`, `onChange` 용 `getHTML()`(전체 clone 후 스타일 베이크), 상태바의
8
+ * 소스 길이. 여기에 이력 스냅샷(문서 전체 문자열) 과 전 블록 표식 갱신이
9
+ * 더해져 65쪽 문서에서 키 하나에 80ms 가 넘게 걸렸다.
10
+ *
11
+ * 타이핑 한 번에 바뀌는 블록은 보통 하나다. MutationRecord 가 어느 블록이
12
+ * 바뀌었는지 알려 주므로, 블록(본문 직계 자식) 마다 결과를 캐시해 두고 바뀐
13
+ * 블록만 다시 계산한다. 문서가 길어져도 키 하나의 비용이 거의 늘지 않는다.
14
+ *
15
+ * ## 무엇을 캐시하는가
16
+ *
17
+ * - `raw` : 블록의 HTML (편집 표식 제외). 변경 감지와 이력 스냅샷에 쓴다.
18
+ * 이력 칸들은 바뀌지 않은 블록의 문자열 객체를 그대로 공유한다.
19
+ * - `out` : `getHTML()` 출력 조각. 스타일 전략 · 테마가 같을 때만 재사용한다.
20
+ * - `info` : 블록 분류 결과(`classifyBlockElement`).
21
+ *
22
+ * 캐시는 element 를 키로 한 WeakMap 이라 지워진 블록은 저절로 사라진다.
23
+ * 블록을 옮겨도(끌어다 놓기) element 가 그대로이므로 캐시가 유효하다.
24
+ */
25
+ import type { ClassifyResult } from './blocks.js';
26
+ export declare class BlockTracker {
27
+ private readonly root;
28
+ /** 마지막 commit 이후 바뀐 블록. */
29
+ readonly dirty: Set<HTMLElement>;
30
+ /** 본문 직계 자식이 더해지거나 빠졌는지. */
31
+ private structure;
32
+ private readonly raw;
33
+ private readonly out;
34
+ private readonly info;
35
+ /** 마지막 commit 시점의 직계 자식 순서. 구조 변경이 실제로 있었는지 비교한다. */
36
+ private children;
37
+ constructor(root: HTMLElement);
38
+ /** 본문 직계 자식까지 거슬러 올라간다. 본문 밖이면 null. */
39
+ topLevelOf(node: Node | null): HTMLElement | null;
40
+ /** MutationRecord 들을 읽어 바뀐 블록을 표시한다. 캐시는 즉시 무효화한다. */
41
+ collect(records: readonly MutationRecord[]): void;
42
+ /** 블록 하나를 바뀐 것으로 표시한다. */
43
+ mark(el: HTMLElement): void;
44
+ /** 기록이 남아 있는지. */
45
+ get pending(): boolean;
46
+ /**
47
+ * 쌓인 변경을 확정한다. 바뀐 블록의 raw 를 다시 읽고, 실제로 내용이
48
+ * 달라졌는지 돌려준다. `changedBlocks` 에는 다시 읽은 블록이 담긴다.
49
+ *
50
+ * 같은 값을 다시 쓰는 변경(하이라이트 재적용 등) 은 레코드는 남지만 내용은
51
+ * 그대로다 — raw 문자열 비교로 걸러 `onChange` 가 헛돌지 않게 한다.
52
+ */
53
+ commit(changedBlocks: HTMLElement[]): boolean;
54
+ /** 현재 블록 순서대로 raw 문자열. commit 이후에 부른다. */
55
+ snapshot(): string[];
56
+ rawOf(el: Element): string;
57
+ /** `getHTML()` 조각. `key`(스타일 전략 + 테마) 가 같으면 캐시를 쓴다. */
58
+ output(el: Element, key: string, compute: (el: Element) => string): string;
59
+ /** 블록 분류. 바뀌지 않은 블록은 캐시를 쓴다. */
60
+ classify(el: HTMLElement): ClassifyResult;
61
+ /** 본문을 통째로 바꾼 뒤(초기화 · setHTML) 모든 캐시를 다시 채운다. */
62
+ reset(): void;
63
+ }
64
+ //# sourceMappingURL=block-tracker.d.ts.map