@aeriz/wysiwyg 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/aeriz-wysiwyg.css +1471 -0
- package/dist/aeriz-wysiwyg.esm.js +5602 -0
- package/dist/aeriz-wysiwyg.esm.min.js +4227 -0
- package/dist/aeriz-wysiwyg.js +5605 -0
- package/dist/aeriz-wysiwyg.min.css +1 -0
- package/dist/aeriz-wysiwyg.min.js +23 -0
- package/dist-types/core/AerizEditor.d.ts +337 -0
- package/dist-types/core/AerizEditor.d.ts.map +1 -0
- package/dist-types/core/AerizViewer.d.ts +49 -0
- package/dist-types/core/AerizViewer.d.ts.map +1 -0
- package/dist-types/core/blocks.d.ts +303 -0
- package/dist-types/core/blocks.d.ts.map +1 -0
- package/dist-types/core/fonts.d.ts +49 -0
- package/dist-types/core/fonts.d.ts.map +1 -0
- package/dist-types/core/highlight.d.ts +44 -0
- package/dist-types/core/highlight.d.ts.map +1 -0
- package/dist-types/core/i18n.d.ts +209 -0
- package/dist-types/core/i18n.d.ts.map +1 -0
- package/dist-types/core/import-html.d.ts +28 -0
- package/dist-types/core/import-html.d.ts.map +1 -0
- package/dist-types/core/import-markdown.d.ts +37 -0
- package/dist-types/core/import-markdown.d.ts.map +1 -0
- package/dist-types/index.d.ts +11 -0
- package/dist-types/index.d.ts.map +1 -0
- package/dist-types/types/index.d.ts +40 -0
- package/dist-types/types/index.d.ts.map +1 -0
- package/dist-types/ui/Toolbar.d.ts +21 -0
- package/dist-types/ui/Toolbar.d.ts.map +1 -0
- package/dist-types/ui/dialogs.d.ts +74 -0
- package/dist-types/ui/dialogs.d.ts.map +1 -0
- package/dist-types/ui/icons.d.ts +2 -0
- package/dist-types/ui/icons.d.ts.map +1 -0
- package/dist-types/ui/popovers.d.ts +70 -0
- package/dist-types/ui/popovers.d.ts.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
export type BlockKind = 'paragraph' | 'heading' | 'bulletList' | 'orderedList' | 'blockquote' | 'codeBlock' | 'image' | 'table' | 'hr' | 'linkCard' | 'youtube' | 'file' | 'importedHtml' | 'unknown';
|
|
2
|
+
export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
|
|
3
|
+
/** 단락 — 메타데이터 없음. */
|
|
4
|
+
export interface ParagraphAttrs {
|
|
5
|
+
}
|
|
6
|
+
/** 제목 — 1~6 의 level 만 가짐. */
|
|
7
|
+
export interface HeadingAttrs {
|
|
8
|
+
level: HeadingLevel;
|
|
9
|
+
}
|
|
10
|
+
/** 글머리 목록(unordered) — kind 자체가 ordered=false 를 의미. 추가 메타 없음. */
|
|
11
|
+
export interface BulletListAttrs {
|
|
12
|
+
}
|
|
13
|
+
/** 번호 목록(ordered) — kind 자체가 ordered=true 를 의미. 추가 메타 없음. */
|
|
14
|
+
export interface OrderedListAttrs {
|
|
15
|
+
}
|
|
16
|
+
/** 인용구 — 메타데이터 없음. */
|
|
17
|
+
export interface BlockquoteAttrs {
|
|
18
|
+
}
|
|
19
|
+
/** 코드 블록 — 언어 식별자(syntax highlight 에 사용). */
|
|
20
|
+
export interface CodeBlockAttrs {
|
|
21
|
+
/** 'javascript' / 'python' 등의 언어 식별자. 없으면 plaintext. */
|
|
22
|
+
language?: string;
|
|
23
|
+
}
|
|
24
|
+
/** 이미지 블록(<figure><img>). */
|
|
25
|
+
export interface ImageAttrs {
|
|
26
|
+
src?: string;
|
|
27
|
+
alt?: string;
|
|
28
|
+
/** wrapper(figure) 의 인라인 style — width / margin 등 outer 스타일 보존. */
|
|
29
|
+
wrapperStyle?: string;
|
|
30
|
+
}
|
|
31
|
+
/** 표 블록. 서버 저장 시 행/열 수만 기록 — 실제 cell 컨텐츠는 html 에 담김. */
|
|
32
|
+
export interface TableAttrs {
|
|
33
|
+
rows: number;
|
|
34
|
+
cols: number;
|
|
35
|
+
}
|
|
36
|
+
/** 구분선 — 메타데이터 없음. */
|
|
37
|
+
export interface HrAttrs {
|
|
38
|
+
}
|
|
39
|
+
/** 링크 카드 블록. */
|
|
40
|
+
export interface LinkCardAttrs {
|
|
41
|
+
href?: string;
|
|
42
|
+
/** 제목 / 표시 텍스트. 없으면 href 의 호스트명 사용. */
|
|
43
|
+
text?: string;
|
|
44
|
+
/** 부제 / 설명 (Open Graph description 등). 없으면 표시 안 함. */
|
|
45
|
+
description?: string;
|
|
46
|
+
/** 미리보기 이미지 (og:image 등). data: URL 또는 https URL. */
|
|
47
|
+
image?: string;
|
|
48
|
+
/** 파비콘 URL — 미설정 시 href 의 도메인으로부터 자동 추론. */
|
|
49
|
+
favicon?: string;
|
|
50
|
+
}
|
|
51
|
+
/** 유튜브 임베드 블록. */
|
|
52
|
+
export interface YoutubeAttrs {
|
|
53
|
+
/** YouTube 영상 ID (예: 'dQw4w9WgXcQ'). */
|
|
54
|
+
videoId?: string;
|
|
55
|
+
/** wrapper(div.aw-youtube-embed) 의 인라인 style — width / margin 등. */
|
|
56
|
+
wrapperStyle?: string;
|
|
57
|
+
}
|
|
58
|
+
/** 파일 첨부 블록. */
|
|
59
|
+
export interface FileAttrs {
|
|
60
|
+
/** 다운로드 URL — 외부 URL 또는 업로드 API 응답. */
|
|
61
|
+
fileSrc?: string;
|
|
62
|
+
/** 표시 / download attribute 에 사용할 원본 파일명. */
|
|
63
|
+
fileName?: string;
|
|
64
|
+
/** 바이트 크기. */
|
|
65
|
+
fileSize?: number;
|
|
66
|
+
/** MIME 타입 — 파일명 확장자가 없을 때 메타로 사용. */
|
|
67
|
+
fileType?: string;
|
|
68
|
+
}
|
|
69
|
+
/** 외부 HTML 가져오기로 만들어진 wrapper 블록. */
|
|
70
|
+
export interface ImportedHtmlAttrs {
|
|
71
|
+
/** body 의 computed style 이 베이크된 wrapper 의 인라인 style. */
|
|
72
|
+
importedStyle?: string;
|
|
73
|
+
/** body 에서 복사한 wrapper 의 class 문자열. */
|
|
74
|
+
importedClass?: string;
|
|
75
|
+
}
|
|
76
|
+
/** 어떤 BlockType 에도 매칭되지 않은 element. */
|
|
77
|
+
export interface UnknownAttrs {
|
|
78
|
+
}
|
|
79
|
+
/** BlockKind → 해당 블록의 attrs 타입 매핑. discriminated union 의 기반. */
|
|
80
|
+
export interface BlockAttrsByKind {
|
|
81
|
+
paragraph: ParagraphAttrs;
|
|
82
|
+
heading: HeadingAttrs;
|
|
83
|
+
bulletList: BulletListAttrs;
|
|
84
|
+
orderedList: OrderedListAttrs;
|
|
85
|
+
blockquote: BlockquoteAttrs;
|
|
86
|
+
codeBlock: CodeBlockAttrs;
|
|
87
|
+
image: ImageAttrs;
|
|
88
|
+
table: TableAttrs;
|
|
89
|
+
hr: HrAttrs;
|
|
90
|
+
linkCard: LinkCardAttrs;
|
|
91
|
+
youtube: YoutubeAttrs;
|
|
92
|
+
file: FileAttrs;
|
|
93
|
+
importedHtml: ImportedHtmlAttrs;
|
|
94
|
+
unknown: UnknownAttrs;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 모든 블록 종류의 attrs 를 합친 "느슨한" 인터페이스. 모든 필드가 optional
|
|
98
|
+
* 이라 BlockType.create 같이 kind 를 모르는 시점의 코드도 받을 수 있다.
|
|
99
|
+
* 외부에서 직렬화된 BlockSnapshot 의 attrs 는 BlockAttrsByKind[kind] 로 더
|
|
100
|
+
* 구체적으로 타입이 잡힌다 — 아래 BlockSnapshot 의 discriminated union 참고.
|
|
101
|
+
*/
|
|
102
|
+
export interface BlockAttrs extends Partial<HeadingAttrs>, Partial<BulletListAttrs>, Partial<OrderedListAttrs>, Partial<CodeBlockAttrs>, Partial<ImageAttrs>, Partial<TableAttrs>, Partial<LinkCardAttrs>, Partial<YoutubeAttrs>, Partial<FileAttrs>, Partial<ImportedHtmlAttrs> {
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* BlockType.matches() 의 반환 타입. 내부 사용은 느슨한 BlockAttrs 로 두고,
|
|
106
|
+
* 외부에서 narrow 하고 싶으면 `MatchOf<'image'>` 같은 별칭 사용.
|
|
107
|
+
*/
|
|
108
|
+
export interface BlockMatch {
|
|
109
|
+
kind: BlockKind;
|
|
110
|
+
attrs: BlockAttrs;
|
|
111
|
+
}
|
|
112
|
+
/** 본문에서 발견된 블록의 런타임 표현. element 참조를 포함. */
|
|
113
|
+
export interface Block {
|
|
114
|
+
id: string;
|
|
115
|
+
kind: BlockKind;
|
|
116
|
+
attrs: BlockAttrs;
|
|
117
|
+
element: HTMLElement;
|
|
118
|
+
}
|
|
119
|
+
/** 인라인 서식 마크 식별자. */
|
|
120
|
+
export type InlineMarkName = 'bold' | 'italic' | 'underline' | 'strike';
|
|
121
|
+
export declare const ALL_INLINE_MARKS: ReadonlyArray<InlineMarkName>;
|
|
122
|
+
/**
|
|
123
|
+
* 블록 정의. 같은 kind 의 BlockType 은 1개만 등록한다.
|
|
124
|
+
*/
|
|
125
|
+
export interface BlockType {
|
|
126
|
+
readonly kind: BlockKind;
|
|
127
|
+
readonly label: string;
|
|
128
|
+
/** 인라인 서식(굵게/기울임/...)이 허용되는 블록인지. UI 활성/비활성 판단에 사용. */
|
|
129
|
+
readonly allowsInlineFormat: boolean;
|
|
130
|
+
/**
|
|
131
|
+
* 이 블록 안에서 허용되는 인라인 마크의 화이트리스트.
|
|
132
|
+
* - 빈 배열 = 어떤 인라인 마크도 적용 불가 (codeBlock / image / hr)
|
|
133
|
+
* - allowsInlineFormat=false 인 블록은 [] 가 기본
|
|
134
|
+
*/
|
|
135
|
+
readonly allowedMarks: ReadonlyArray<InlineMarkName>;
|
|
136
|
+
/** 본문 직계 자식 element 가 이 type 인지 판별한다. */
|
|
137
|
+
matches(el: HTMLElement): BlockMatch | null;
|
|
138
|
+
/** 빈 인스턴스 element 를 새로 생성한다. */
|
|
139
|
+
create(attrs?: BlockAttrs): HTMLElement;
|
|
140
|
+
/** "비어 있는" 상태인지. 백스페이스 / 포커스 / placeholder 처리에 사용. */
|
|
141
|
+
isEmpty(el: HTMLElement): boolean;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 본문 직계 자식 element 를 분류할 때 시도되는 순서.
|
|
145
|
+
* 위에서부터 첫 번째로 매칭되는 BlockType 이 채택된다.
|
|
146
|
+
*/
|
|
147
|
+
export declare const BLOCK_TYPES: ReadonlyArray<BlockType>;
|
|
148
|
+
export declare const BLOCK_TYPE_BY_KIND: Readonly<Record<BlockKind, BlockType>>;
|
|
149
|
+
export interface ClassifyResult {
|
|
150
|
+
type: BlockType;
|
|
151
|
+
match: BlockMatch;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 본문 직계 자식 element 를 BLOCK_TYPES 와 순차 매칭해 분류한다.
|
|
155
|
+
* 어디에도 일치하지 않으면 unknown 으로 본다.
|
|
156
|
+
*/
|
|
157
|
+
export declare function classifyBlockElement(el: HTMLElement): ClassifyResult;
|
|
158
|
+
export declare const BLOCK_ID_ATTR = "data-block-id";
|
|
159
|
+
export declare class BlockIdRegistry {
|
|
160
|
+
private counter;
|
|
161
|
+
private readonly seen;
|
|
162
|
+
/** 외부에서 관측된 id (HTML 에 이미 있던 값 등) 를 이후 발급 시 회피하도록 등록. */
|
|
163
|
+
observe(id: string): void;
|
|
164
|
+
/** seen 과 충돌하지 않는 새 id 를 발급해 반환. */
|
|
165
|
+
generate(): string;
|
|
166
|
+
/**
|
|
167
|
+
* 단일 element 발급기. data-block-id 가 있으면 등록 후 그대로 반환,
|
|
168
|
+
* 없으면 신규 발급 후 element 에 기록한다. 같은 id 의 중복 element 처리는
|
|
169
|
+
* 이 함수 단독으로는 못 하므로, 본문 전체 정규화는 {@link assignMissingIds}
|
|
170
|
+
* 를 사용해야 한다.
|
|
171
|
+
*/
|
|
172
|
+
ensure(el: HTMLElement): string;
|
|
173
|
+
get(el: HTMLElement): string | null;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* `root` 의 직계 자식 element 들에 고유한 data-block-id 를 보장한다.
|
|
177
|
+
*
|
|
178
|
+
* - id 가 없는 자식 → 신규 발급
|
|
179
|
+
* - 같은 root 안에서 같은 id 가 두 번 이상 나타나면(예: Enter 키로 단락이
|
|
180
|
+
* 분할되며 브라우저가 attribute 를 클론한 경우) 첫 번째 element 만 기존
|
|
181
|
+
* id 를 유지하고, 그 이후에 등장한 element 는 새 id 로 재발급한다.
|
|
182
|
+
*
|
|
183
|
+
* 호출 후 모든 직계 자식이 root 안에서 unique 한 id 를 갖는다.
|
|
184
|
+
*/
|
|
185
|
+
export declare function assignMissingIds(root: HTMLElement, ids: BlockIdRegistry): void;
|
|
186
|
+
/**
|
|
187
|
+
* `root` 의 직계 자식 중 어떤 블록 element 에도 속하지 않은 텍스트 노드를
|
|
188
|
+
* paragraph 블록으로 감싼다. 비어 있는(공백뿐) 텍스트 노드는 제거한다.
|
|
189
|
+
*
|
|
190
|
+
* contentEditable 동작 중 li 분리 / 백스페이스 처리 등으로 본문 직계에
|
|
191
|
+
* "homeless" 텍스트가 생길 수 있는데, 이를 정규화하여 모든 본문 자식이
|
|
192
|
+
* 항상 유효한 블록 element 가 되도록 보장한다.
|
|
193
|
+
*/
|
|
194
|
+
export declare function normalizeContent(root: HTMLElement): void;
|
|
195
|
+
/**
|
|
196
|
+
* 사람이 읽을 수 있는 한국어 라벨. 포커스된 블록 위 태그 표시 등에 사용.
|
|
197
|
+
*/
|
|
198
|
+
export declare function getBlockLabel(match: BlockMatch): string;
|
|
199
|
+
export type BlockIdResolver = (el: HTMLElement) => string;
|
|
200
|
+
/**
|
|
201
|
+
* 직렬화된 Block 상태. Live element 참조 없이 JSON 으로 저장/전송 가능하다.
|
|
202
|
+
*
|
|
203
|
+
* - id : 원본 Block 의 안정 식별자
|
|
204
|
+
* - kind : 블록 유형 (BlockKind 의 string literal)
|
|
205
|
+
* - attrs : kind 에 대응하는 유형별 메타데이터 (BlockAttrsByKind[kind])
|
|
206
|
+
* - html : 블록 element 내부 HTML (인라인 컨텐츠 전체 직렬화)
|
|
207
|
+
*
|
|
208
|
+
* 서버 라운드트립을 위한 핵심 직렬화 형태. discriminated union 이라
|
|
209
|
+
* `if (snap.kind === 'heading')` 후 `snap.attrs.level` 처럼 바로 narrow 가능.
|
|
210
|
+
*/
|
|
211
|
+
export type BlockSnapshot = {
|
|
212
|
+
[K in BlockKind]: {
|
|
213
|
+
id: string;
|
|
214
|
+
kind: K;
|
|
215
|
+
attrs: BlockAttrsByKind[K];
|
|
216
|
+
html: string;
|
|
217
|
+
};
|
|
218
|
+
}[BlockKind];
|
|
219
|
+
/** 특정 BlockKind 에 한정된 BlockSnapshot 의 별칭. 외부에서 narrow 한
|
|
220
|
+
* 타입을 명시할 때 유용 (예: `Snapshot<'image'>`). */
|
|
221
|
+
export type Snapshot<K extends BlockKind> = Extract<BlockSnapshot, {
|
|
222
|
+
kind: K;
|
|
223
|
+
}>;
|
|
224
|
+
/** 단일 Block 을 직렬화 가능한 BlockSnapshot 으로 변환. */
|
|
225
|
+
export declare function serializeBlock(block: Block): BlockSnapshot;
|
|
226
|
+
/** Block 배열을 BlockSnapshot 배열로 직렬화. */
|
|
227
|
+
export declare function serializeBlocks(blocks: Block[]): BlockSnapshot[];
|
|
228
|
+
/**
|
|
229
|
+
* BlockSnapshot 을 새 element 로 렌더한다.
|
|
230
|
+
* BlockType.create(attrs) 로 골격을 만든 뒤 snapshot.html 로 인라인 컨텐츠를 채운다.
|
|
231
|
+
* 결과 element 는 data-block-id 가 snapshot.id 로 세팅되어 있다.
|
|
232
|
+
*/
|
|
233
|
+
export declare function renderBlock(snapshot: BlockSnapshot): HTMLElement;
|
|
234
|
+
/** BlockSnapshot 배열을 root 의 자식으로 렌더 (root 의 기존 자식은 모두 제거). */
|
|
235
|
+
export declare function renderBlocks(root: HTMLElement, snapshots: BlockSnapshot[]): void;
|
|
236
|
+
/**
|
|
237
|
+
* 본문(`root`) 의 직계 자식 element 들을 순서대로 Block 리스트로 반환한다.
|
|
238
|
+
*/
|
|
239
|
+
export declare function listBlocks(root: HTMLElement, idFor: BlockIdResolver): Block[];
|
|
240
|
+
/**
|
|
241
|
+
* 임의의 노드를 받아 본문(`root`) 직계 자식 element 까지 거슬러 올라간 뒤
|
|
242
|
+
* 해당 element 를 Block 으로 분류해 반환한다. 본문 밖이면 null.
|
|
243
|
+
*/
|
|
244
|
+
export declare function findBlockFrom(node: Node, root: HTMLElement, idFor: BlockIdResolver): Block | null;
|
|
245
|
+
/**
|
|
246
|
+
* 블록의 인라인 컨텐츠(텍스트와 인라인 element 들)를 추출해 반환한다.
|
|
247
|
+
* 블록 유형 변경 시 기존 컨텐츠를 새 블록으로 옮길 때 사용.
|
|
248
|
+
*
|
|
249
|
+
* - paragraph / heading : 직계 자식 노드 전체
|
|
250
|
+
* - bulletList / orderedList : 첫 li 의 자식 노드들
|
|
251
|
+
* - blockquote : 첫 p 의 자식 노드들 (없으면 자기 자식)
|
|
252
|
+
* - codeBlock : 첫 code 의 자식 노드들 (없으면 자기 자식)
|
|
253
|
+
* - image / table / hr / unknown : []
|
|
254
|
+
*/
|
|
255
|
+
export declare function extractInlineContent(block: Block): Node[];
|
|
256
|
+
/**
|
|
257
|
+
* 새로 생성한 블록 element 의 인라인 컨테이너에 노드를 채워 넣는다.
|
|
258
|
+
* 컨텐츠가 비어있으면 기본 placeholder(br)를 그대로 둔다.
|
|
259
|
+
*/
|
|
260
|
+
export declare function fillInlineContent(newEl: HTMLElement, kind: BlockKind, content: Node[]): void;
|
|
261
|
+
/**
|
|
262
|
+
* `getHTML()` 호출 시점에 에디터의 현재 테마(Css 변수)를 읽어 인라인 스타일에
|
|
263
|
+
* 그대로 베이크하기 위한 색 팔레트.
|
|
264
|
+
*
|
|
265
|
+
* 누락된 값은 안전한 기본값(에디터 다크 테마와 동일한 cyan 계열) 으로 폴백한다.
|
|
266
|
+
*/
|
|
267
|
+
export interface BlockStyleTheme {
|
|
268
|
+
primary?: string;
|
|
269
|
+
fg?: string;
|
|
270
|
+
bg?: string;
|
|
271
|
+
border?: string;
|
|
272
|
+
fgMuted?: string;
|
|
273
|
+
/** 'light' / 'dark'. 명시 시 syntax highlight token 색을 그 모드 팔레트로
|
|
274
|
+
* 베이크. 미지정 시 fg/bg lightness 로 자동 추정. */
|
|
275
|
+
mode?: 'light' | 'dark';
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* `getComputedStyle(host)` 에서 에디터 테마 변수(--aw-primary 등) 를 읽어
|
|
279
|
+
* BlockStyleTheme 객체로 반환한다. host 가 DOM 에 붙어 있어야 의미 있는 값.
|
|
280
|
+
*/
|
|
281
|
+
export declare function readBlockStyleTheme(host: Element): BlockStyleTheme;
|
|
282
|
+
/**
|
|
283
|
+
* `root` 트리에 인라인 스타일을 입힌다. (clone 트리에 사용)
|
|
284
|
+
*
|
|
285
|
+
* - 에디터의 현재 테마 색을 `theme` 으로 받아 baked 인라인으로 출력 → 에디터에서
|
|
286
|
+
* 보이는 그대로 외부 컨텍스트에서도 동일하게 보인다.
|
|
287
|
+
* - theme 미지정 시 cyan 계열 기본값으로 폴백.
|
|
288
|
+
*/
|
|
289
|
+
export declare function applyBlockInlineStyles(root: HTMLElement, theme?: BlockStyleTheme): void;
|
|
290
|
+
/**
|
|
291
|
+
* `getHTML()` 출력에서 에디터 전용 메타데이터 속성을 제거한다.
|
|
292
|
+
* data-block-id 만 보존(외부 반입 시 동일 id 유지에 유용).
|
|
293
|
+
*/
|
|
294
|
+
export declare function stripEditorOnlyAttrs(root: HTMLElement): void;
|
|
295
|
+
/**
|
|
296
|
+
* `el` 시작 위치에 캐럿을 둔다. 컨테이너 블록(UL/OL/BLOCKQUOTE/PRE/TABLE)의
|
|
297
|
+
* 경우 안쪽의 텍스트 컨테이너(li/p/code/td)까지 파고 들어가, 다음 키 입력이
|
|
298
|
+
* 컨테이너 자체가 아닌 안쪽에서 일어나도록 한다. hr 은 컨텐츠가 없으므로 그
|
|
299
|
+
* 뒤에 둔다.
|
|
300
|
+
*/
|
|
301
|
+
export declare function placeCaretAtStart(el: HTMLElement): void;
|
|
302
|
+
export declare function isElementBlank(el: HTMLElement): boolean;
|
|
303
|
+
//# sourceMappingURL=blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/core/blocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 글꼴 라이브러리 — 한국어 본문에 친화적인 무료 / 상용 가능 글꼴만 큐레이션.
|
|
3
|
+
* 모두 SIL Open Font License 또는 자체 무제한 상용 라이선스.
|
|
4
|
+
*
|
|
5
|
+
* 로딩 정책:
|
|
6
|
+
* - 모든 글꼴은 글꼴 드롭다운이 처음 열릴 때 1회 일괄 lazy 로드.
|
|
7
|
+
* - Google Fonts CSS2 endpoint 한 번 + 외부 CDN(Pretendard) 별도 1 회.
|
|
8
|
+
* - 실패해도 stack 의 fallback 글꼴이 자동 적용되므로 graceful degradation.
|
|
9
|
+
*/
|
|
10
|
+
export interface FontFamily {
|
|
11
|
+
/** 안정 식별자 — 직렬화 / 다음 선택 비교에 사용. */
|
|
12
|
+
id: string;
|
|
13
|
+
/** 드롭다운에 표시되는 한국어 라벨. */
|
|
14
|
+
label: string;
|
|
15
|
+
/** CSS font-family 스택 — execCommand fontName 의 인자로 들어간다. */
|
|
16
|
+
stack: string;
|
|
17
|
+
/** Google Fonts CSS2 family 파라미터 (예: "Noto+Sans+KR:wght@400;700"). */
|
|
18
|
+
googleFonts?: string;
|
|
19
|
+
/** 외부 CDN 의 전체 CSS URL (Google Fonts 가 아닌 글꼴용). */
|
|
20
|
+
cssUrl?: string;
|
|
21
|
+
}
|
|
22
|
+
/** "시스템 기본" 항목의 id. clearFormat / 초기화 분기에 사용. */
|
|
23
|
+
export declare const SYSTEM_FONT_ID = "system";
|
|
24
|
+
export declare const FONT_FAMILIES: ReadonlyArray<FontFamily>;
|
|
25
|
+
/** id → FontFamily lookup. */
|
|
26
|
+
export declare const FONT_FAMILY_BY_ID: Readonly<Record<string, FontFamily>>;
|
|
27
|
+
/**
|
|
28
|
+
* 글자 크기 프리셋 (px). 본문 기본은 16px.
|
|
29
|
+
* 12 ~ 48px 범위에서 자주 쓰이는 단계만 큐레이션.
|
|
30
|
+
*/
|
|
31
|
+
export declare const FONT_SIZES: ReadonlyArray<number>;
|
|
32
|
+
/**
|
|
33
|
+
* Computed CSS font-size 문자열(예: "16px", "1.125rem")을 px 정수로 변환.
|
|
34
|
+
* 매칭 실패 시 null. 활성 toolbar 크기 표시에 사용.
|
|
35
|
+
*/
|
|
36
|
+
export declare function pxFromCss(css: string | null | undefined): number | null;
|
|
37
|
+
/**
|
|
38
|
+
* 모든 글꼴의 CSS 를 1 회만 lazy 로드한다. 글꼴 드롭다운이 열릴 때 호출.
|
|
39
|
+
* 두 번째 이후 호출은 즉시 반환.
|
|
40
|
+
*/
|
|
41
|
+
export declare function ensureFontFamiliesLoaded(): void;
|
|
42
|
+
/**
|
|
43
|
+
* 임의의 CSS font-family 문자열에 대해 FONT_FAMILIES 중 가장 비슷한 항목을
|
|
44
|
+
* 찾아 id 를 반환. 매칭 실패 시 null. 활성 toolbar 표시에 사용.
|
|
45
|
+
*
|
|
46
|
+
* 비교는 stack 의 첫 family 토큰을 추출해 case-insensitive 비교.
|
|
47
|
+
*/
|
|
48
|
+
export declare function findFontIdFromCss(css: string | null | undefined): string | null;
|
|
49
|
+
//# sourceMappingURL=fonts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../../src/core/fonts.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,iDAAiD;AACjD,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,UAAU,CAwDnD,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAI/D,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,MAAM,CAE5C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAQvE;AAKD;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAmB/C;AAcD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAU/E"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 가벼운 자체 syntax highlighter — 외부 의존성 없음.
|
|
3
|
+
*
|
|
4
|
+
* 단일 generic tokenizer 가 LanguageDef 의 룰(keywords / comments / strings /
|
|
5
|
+
* builtins) 을 받아 동작. 결과는 `<span class="hl-…">` 으로 wrap 된 HTML
|
|
6
|
+
* 문자열로 반환되며, AerizEditor 가 codeBlock 의 innerHTML 로 적용한다.
|
|
7
|
+
*
|
|
8
|
+
* 지원 언어: 15 종 — JavaScript / TypeScript / Python / JSON / HTML / CSS /
|
|
9
|
+
* Bash / SQL / Markdown / C / C++ / C# / Java / Kotlin / Go / Rust.
|
|
10
|
+
*
|
|
11
|
+
* 정확도 목표: 일반적인 코드 80% 케이스. 100% 정확한 파서가 아니므로 corner
|
|
12
|
+
* case (예: regex 리터럴 vs 나누기 연산자, 템플릿 문자열의 ${…} 내부 표현식)
|
|
13
|
+
* 는 단순화되어 있다.
|
|
14
|
+
*/
|
|
15
|
+
export interface LanguageDef {
|
|
16
|
+
/** 안정 식별자 — `data-language` 속성에 저장되는 값. */
|
|
17
|
+
id: string;
|
|
18
|
+
/** UI 드롭다운에 표시되는 라벨. */
|
|
19
|
+
label: string;
|
|
20
|
+
/** 키워드 집합. 이 단어로 매칭되면 hl-keyword 로 wrap. */
|
|
21
|
+
keywords: ReadonlySet<string>;
|
|
22
|
+
/** 빌트인 / 라이브러리 함수. hl-builtin. */
|
|
23
|
+
builtins?: ReadonlySet<string>;
|
|
24
|
+
/** 라인 주석 prefix (예: '//'). */
|
|
25
|
+
lineComment?: string;
|
|
26
|
+
/** 블록 주석. */
|
|
27
|
+
blockComment?: {
|
|
28
|
+
start: string;
|
|
29
|
+
end: string;
|
|
30
|
+
};
|
|
31
|
+
/** 문자열 구분자 목록. 일반적으로 ['"', "'"], JS 는 백틱 추가. */
|
|
32
|
+
stringDelims?: ReadonlyArray<string>;
|
|
33
|
+
/** 키워드 매칭 시 case-insensitive (SQL 용). */
|
|
34
|
+
caseInsensitiveKeywords?: boolean;
|
|
35
|
+
/** HTML / CSS 등 특수 처리가 필요한 언어. 자체 토크나이저 사용. */
|
|
36
|
+
custom?: (code: string) => string;
|
|
37
|
+
}
|
|
38
|
+
export declare const LANGUAGES: ReadonlyArray<LanguageDef>;
|
|
39
|
+
/**
|
|
40
|
+
* 코드 문자열을 언어 식별자에 따라 highlight HTML 로 변환.
|
|
41
|
+
* 알 수 없는 언어 또는 'plaintext' 면 escape 만 적용.
|
|
42
|
+
*/
|
|
43
|
+
export declare function highlightCode(code: string, langId: string | undefined): string;
|
|
44
|
+
//# sourceMappingURL=highlight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../src/core/highlight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,kCAAkC;IAClC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,gDAAgD;IAChD,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,yCAAyC;IACzC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,+CAA+C;IAC/C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACnC;AA0HD,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,WAAW,CA2EhD,CAAC;AAQF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAM9E"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 다국어 (i18n) 문자열 사전 — UI 정적 라벨, tooltip, 다이얼로그 제목/필드,
|
|
3
|
+
* 블록 라벨, 팝오버 항목 등.
|
|
4
|
+
*
|
|
5
|
+
* 4 개 로케일: 영어 / 한국어 / 일본어 / 중국어(간체).
|
|
6
|
+
*
|
|
7
|
+
* 사용 모델 — 모듈 레벨 "current locale" 을 두고 `t()` accessor 로 어디서든
|
|
8
|
+
* 같은 사전을 참조한다. `AerizEditor` 가 옵션에 따라 시작 시 setLocale() 1 회.
|
|
9
|
+
*/
|
|
10
|
+
export type Locale = 'en' | 'ko' | 'ja' | 'zh';
|
|
11
|
+
export interface Strings {
|
|
12
|
+
toolbar: {
|
|
13
|
+
undo: string;
|
|
14
|
+
redo: string;
|
|
15
|
+
blockType: string;
|
|
16
|
+
fontFamily: string;
|
|
17
|
+
fontSize: string;
|
|
18
|
+
bold: string;
|
|
19
|
+
italic: string;
|
|
20
|
+
underline: string;
|
|
21
|
+
strike: string;
|
|
22
|
+
color: string;
|
|
23
|
+
backgroundColor: string;
|
|
24
|
+
align: string;
|
|
25
|
+
cellBg: string;
|
|
26
|
+
tableMenu: string;
|
|
27
|
+
codeLang: string;
|
|
28
|
+
bulletList: string;
|
|
29
|
+
orderedList: string;
|
|
30
|
+
blockquote: string;
|
|
31
|
+
codeBlock: string;
|
|
32
|
+
link: string;
|
|
33
|
+
image: string;
|
|
34
|
+
table: string;
|
|
35
|
+
hr: string;
|
|
36
|
+
clearFormat: string;
|
|
37
|
+
blockTypeChangeTooltip: string;
|
|
38
|
+
blockMoveTooltip: string;
|
|
39
|
+
addBelowTooltip: string;
|
|
40
|
+
};
|
|
41
|
+
blocks: {
|
|
42
|
+
paragraph: string;
|
|
43
|
+
/** "Heading {n}" 형식 — caller 가 {n} 을 level 숫자로 치환 */
|
|
44
|
+
heading: string;
|
|
45
|
+
bulletList: string;
|
|
46
|
+
orderedList: string;
|
|
47
|
+
blockquote: string;
|
|
48
|
+
codeBlock: string;
|
|
49
|
+
image: string;
|
|
50
|
+
table: string;
|
|
51
|
+
hr: string;
|
|
52
|
+
linkCard: string;
|
|
53
|
+
youtube: string;
|
|
54
|
+
file: string;
|
|
55
|
+
importedHtml: string;
|
|
56
|
+
unknown: string;
|
|
57
|
+
};
|
|
58
|
+
blockMenu: {
|
|
59
|
+
body: string;
|
|
60
|
+
h1: string;
|
|
61
|
+
h2: string;
|
|
62
|
+
h3: string;
|
|
63
|
+
bulletList: string;
|
|
64
|
+
orderedList: string;
|
|
65
|
+
blockquote: string;
|
|
66
|
+
codeBlock: string;
|
|
67
|
+
hr: string;
|
|
68
|
+
link: string;
|
|
69
|
+
image: string;
|
|
70
|
+
table: string;
|
|
71
|
+
youtube: string;
|
|
72
|
+
file: string;
|
|
73
|
+
importHtml: string;
|
|
74
|
+
importMarkdown: string;
|
|
75
|
+
};
|
|
76
|
+
align: {
|
|
77
|
+
left: string;
|
|
78
|
+
center: string;
|
|
79
|
+
right: string;
|
|
80
|
+
justify: string;
|
|
81
|
+
};
|
|
82
|
+
color: {
|
|
83
|
+
customColor: string;
|
|
84
|
+
defaultColor: string;
|
|
85
|
+
recent: string;
|
|
86
|
+
};
|
|
87
|
+
tableMenu: {
|
|
88
|
+
rowAbove: string;
|
|
89
|
+
rowBelow: string;
|
|
90
|
+
colLeft: string;
|
|
91
|
+
colRight: string;
|
|
92
|
+
deleteRow: string;
|
|
93
|
+
deleteCol: string;
|
|
94
|
+
};
|
|
95
|
+
fontFamily: {
|
|
96
|
+
systemDefault: string;
|
|
97
|
+
};
|
|
98
|
+
blockAlign: {
|
|
99
|
+
left: string;
|
|
100
|
+
center: string;
|
|
101
|
+
right: string;
|
|
102
|
+
};
|
|
103
|
+
comingSoon: {
|
|
104
|
+
label: string;
|
|
105
|
+
};
|
|
106
|
+
dialogs: {
|
|
107
|
+
confirm: string;
|
|
108
|
+
cancel: string;
|
|
109
|
+
insert: string;
|
|
110
|
+
apply: string;
|
|
111
|
+
importBtn: string;
|
|
112
|
+
close: string;
|
|
113
|
+
selectedFileNone: string;
|
|
114
|
+
dropOrClick: string;
|
|
115
|
+
};
|
|
116
|
+
link: {
|
|
117
|
+
title: string;
|
|
118
|
+
text: string;
|
|
119
|
+
textPlaceholder: string;
|
|
120
|
+
url: string;
|
|
121
|
+
urlPlaceholder: string;
|
|
122
|
+
openNewWindow: string;
|
|
123
|
+
};
|
|
124
|
+
image: {
|
|
125
|
+
title: string;
|
|
126
|
+
embedTab: string;
|
|
127
|
+
embedTabTitle: string;
|
|
128
|
+
urlTab: string;
|
|
129
|
+
urlTabTitle: string;
|
|
130
|
+
uploadTab: string;
|
|
131
|
+
uploadTabTitle: string;
|
|
132
|
+
uploadDisabledTitle: string;
|
|
133
|
+
embedDropzone: string;
|
|
134
|
+
urlLabel: string;
|
|
135
|
+
urlPlaceholder: string;
|
|
136
|
+
uploadDropzone: string;
|
|
137
|
+
noUploadApi: string;
|
|
138
|
+
};
|
|
139
|
+
youtube: {
|
|
140
|
+
title: string;
|
|
141
|
+
urlLabel: string;
|
|
142
|
+
urlPlaceholder: string;
|
|
143
|
+
formatHint: string;
|
|
144
|
+
};
|
|
145
|
+
table: {
|
|
146
|
+
title: string;
|
|
147
|
+
statusZero: string;
|
|
148
|
+
/** "{r} × {c} 표" 형식 — caller 가 {r}, {c} 치환 */
|
|
149
|
+
statusFormat: string;
|
|
150
|
+
pickerHint: string;
|
|
151
|
+
};
|
|
152
|
+
importHtml: {
|
|
153
|
+
title: string;
|
|
154
|
+
fileSelect: string;
|
|
155
|
+
pasteLabel: string;
|
|
156
|
+
pastePlaceholder: string;
|
|
157
|
+
hint: string;
|
|
158
|
+
errEmpty: string;
|
|
159
|
+
errNoBody: string;
|
|
160
|
+
errFailed: string;
|
|
161
|
+
};
|
|
162
|
+
importMarkdown: {
|
|
163
|
+
title: string;
|
|
164
|
+
fileSelect: string;
|
|
165
|
+
pasteLabel: string;
|
|
166
|
+
pastePlaceholder: string;
|
|
167
|
+
hint: string;
|
|
168
|
+
errEmpty: string;
|
|
169
|
+
errNoBody: string;
|
|
170
|
+
errFailed: string;
|
|
171
|
+
};
|
|
172
|
+
fileAttach: {
|
|
173
|
+
title: string;
|
|
174
|
+
urlTab: string;
|
|
175
|
+
urlTabTitle: string;
|
|
176
|
+
uploadTab: string;
|
|
177
|
+
uploadTabTitle: string;
|
|
178
|
+
uploadDisabledTitle: string;
|
|
179
|
+
urlLabel: string;
|
|
180
|
+
urlPlaceholder: string;
|
|
181
|
+
nameLabel: string;
|
|
182
|
+
namePlaceholder: string;
|
|
183
|
+
noUploadApi: string;
|
|
184
|
+
uploadDropzone: string;
|
|
185
|
+
uploadComplete: string;
|
|
186
|
+
uploadFailed: string;
|
|
187
|
+
errEmpty: string;
|
|
188
|
+
};
|
|
189
|
+
status: {
|
|
190
|
+
/** "{label} ({id8})" 의 prefix 라벨용 */
|
|
191
|
+
noActive: string;
|
|
192
|
+
/** "{n} 블록(s)" — {n} 치환 */
|
|
193
|
+
blocksCount: string;
|
|
194
|
+
/** "텍스트 {n} 자" — {n} 치환 */
|
|
195
|
+
chars: string;
|
|
196
|
+
/** "소스 {n}" — {n} 치환 (formatCount 결과) */
|
|
197
|
+
source: string;
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
export declare function setLocale(locale: Locale): void;
|
|
201
|
+
export declare function getLocale(): Locale;
|
|
202
|
+
/** 현재 활성화된 strings 사전을 반환. 모든 UI 코드에서 호출 진입점. */
|
|
203
|
+
export declare function t(): Strings;
|
|
204
|
+
/**
|
|
205
|
+
* 템플릿 치환 유틸. `{key}` 패턴을 `vars[key]` 로 치환.
|
|
206
|
+
* 예: format('Heading {n}', { n: 1 }) → 'Heading 1'
|
|
207
|
+
*/
|
|
208
|
+
export declare function format(template: string, vars: Record<string, string | number>): string;
|
|
209
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/core/i18n.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 외부 HTML 문서를 가져와 모든 스타일을 인라인으로 베이크한다.
|
|
3
|
+
*
|
|
4
|
+
* 흐름:
|
|
5
|
+
* 1. 숨김 iframe 을 만들고 srcdoc 으로 HTML 주입
|
|
6
|
+
* 2. iframe load 이벤트(=body 의 마지막 동기 스크립트까지 실행 완료) +
|
|
7
|
+
* 추가 RAF/idle 대기 → setTimeout(0) 류 비동기 스타일 적용까지 안정화
|
|
8
|
+
* 3. body 트리 전체를 walk 하면서 각 element 의 computed style 의 모든
|
|
9
|
+
* 프로퍼티를 인라인 style 속성으로 베이크
|
|
10
|
+
* 4. iframe 제거 후 변환된 element 들의 outerHTML 배열 반환
|
|
11
|
+
*
|
|
12
|
+
* 다른 origin / iframe contentDocument 접근 제한이 발생하면 reject.
|
|
13
|
+
*/
|
|
14
|
+
export interface ImportHtmlOptions {
|
|
15
|
+
/** iframe load 후 추가 idle 대기(ms). Tailwind CDN 등 런타임 스타일 주입을
|
|
16
|
+
* 기다리기 위해 기본 1000ms. */
|
|
17
|
+
settleMs?: number;
|
|
18
|
+
/** iframe load timeout(ms). 기본 30_000. */
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
/** 화면 밖 iframe 폭. computed style 의 width/height 단위 변환에 영향. */
|
|
21
|
+
width?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 외부 HTML 을 받아 인라인 스타일이 베이크된 element 배열을 반환한다.
|
|
25
|
+
* 호출자는 원하는 위치에 `appendChild` / `insertBefore` 등으로 삽입하면 된다.
|
|
26
|
+
*/
|
|
27
|
+
export declare function importHtmlWithComputedStyles(html: string, options?: ImportHtmlOptions): Promise<HTMLElement[]>;
|
|
28
|
+
//# sourceMappingURL=import-html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-html.d.ts","sourceRoot":"","sources":["../../src/core/import-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,MAAM,WAAW,iBAAiB;IAChC;6BACyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,EAAE,CAAC,CA+FxB"}
|