@aeriz/wysiwyg 1.0.2 → 1.0.3
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/README.md +610 -96
- package/angular/README.md +112 -0
- package/angular/aeriz-editor.directive.ts +243 -0
- package/angular/aeriz-wysiwyg.module.ts +14 -0
- package/angular/index.ts +5 -0
- package/dist/adapters/jquery.cjs +1 -0
- package/dist/adapters/jquery.js +91 -0
- package/dist/adapters/react.cjs +1 -0
- package/dist/adapters/react.js +66 -0
- package/dist/adapters/shared.cjs +1 -0
- package/dist/adapters/shared.js +87 -0
- package/dist/adapters/svelte.cjs +1 -0
- package/dist/adapters/svelte.js +29 -0
- package/dist/adapters/vue.cjs +1 -0
- package/dist/adapters/vue.js +110 -0
- package/dist/adapters/vue2.cjs +1 -0
- package/dist/adapters/vue2.js +117 -0
- package/dist/adapters/wc.cjs +1 -0
- package/dist/adapters/wc.js +207 -0
- package/dist/aeriz-wysiwyg-adapter.js +169 -0
- package/dist/aeriz-wysiwyg-adapter.min.js +1 -0
- package/dist/aeriz-wysiwyg-jquery.js +275 -0
- package/dist/aeriz-wysiwyg-jquery.min.js +1 -0
- package/dist/aeriz-wysiwyg-wc.js +401 -0
- package/dist/aeriz-wysiwyg-wc.min.js +1 -0
- package/dist/aeriz-wysiwyg.cjs +6912 -0
- package/dist/aeriz-wysiwyg.css +37 -129
- package/dist/aeriz-wysiwyg.esm.js +1170 -149
- package/dist/aeriz-wysiwyg.esm.min.js +2057 -1209
- package/dist/aeriz-wysiwyg.js +1169 -148
- package/dist/aeriz-wysiwyg.min.cjs +54 -0
- package/dist/aeriz-wysiwyg.min.css +1 -1
- package/dist/aeriz-wysiwyg.min.js +44 -13
- package/dist/server.cjs +32 -0
- package/dist/server.js +666 -0
- package/dist-types/adapters/jquery.d.ts +34 -0
- package/dist-types/adapters/jquery.d.ts.map +1 -0
- package/dist-types/adapters/react.d.ts +28 -0
- package/dist-types/adapters/react.d.ts.map +1 -0
- package/dist-types/adapters/shared.d.ts +83 -0
- package/dist-types/adapters/shared.d.ts.map +1 -0
- package/dist-types/adapters/svelte.d.ts +38 -0
- package/dist-types/adapters/svelte.d.ts.map +1 -0
- package/dist-types/adapters/vue.d.ts +189 -0
- package/dist-types/adapters/vue.d.ts.map +1 -0
- package/dist-types/adapters/vue2.d.ts +175 -0
- package/dist-types/adapters/vue2.d.ts.map +1 -0
- package/dist-types/adapters/wc.d.ts +96 -0
- package/dist-types/adapters/wc.d.ts.map +1 -0
- package/dist-types/cjs/adapters/jquery.d.cts +34 -0
- package/dist-types/cjs/adapters/react.d.cts +28 -0
- package/dist-types/cjs/adapters/shared.d.cts +83 -0
- package/dist-types/cjs/adapters/svelte.d.cts +38 -0
- package/dist-types/cjs/adapters/vue.d.cts +189 -0
- package/dist-types/cjs/adapters/vue2.d.cts +175 -0
- package/dist-types/cjs/adapters/wc.d.cts +96 -0
- package/dist-types/cjs/core/AerizEditor.d.cts +357 -0
- package/dist-types/cjs/core/AerizViewer.d.cts +61 -0
- package/dist-types/cjs/core/block-meta.d.cts +32 -0
- package/dist-types/cjs/core/blocks.d.cts +368 -0
- package/dist-types/cjs/core/fonts.d.cts +60 -0
- package/dist-types/cjs/core/highlight.d.cts +44 -0
- package/dist-types/cjs/core/html-mini.d.cts +65 -0
- package/dist-types/cjs/core/i18n.d.cts +209 -0
- package/dist-types/cjs/core/import-html.d.cts +39 -0
- package/dist-types/cjs/core/import-markdown.d.cts +37 -0
- package/dist-types/cjs/core/markdown-export.d.cts +30 -0
- package/dist-types/cjs/core/plain-text.d.cts +17 -0
- package/dist-types/cjs/core/render-string.d.cts +68 -0
- package/dist-types/cjs/core/snapshot.d.cts +51 -0
- package/dist-types/cjs/index.d.cts +20 -0
- package/dist-types/cjs/server/index.d.cts +37 -0
- package/dist-types/cjs/types/index.d.cts +61 -0
- package/dist-types/cjs/ui/Toolbar.d.cts +21 -0
- package/dist-types/cjs/ui/dialogs.d.cts +74 -0
- package/dist-types/cjs/ui/icons.d.cts +2 -0
- package/dist-types/cjs/ui/popovers.d.cts +70 -0
- package/dist-types/core/AerizEditor.d.ts +30 -10
- package/dist-types/core/AerizEditor.d.ts.map +1 -1
- package/dist-types/core/AerizViewer.d.ts +16 -4
- package/dist-types/core/AerizViewer.d.ts.map +1 -1
- package/dist-types/core/block-meta.d.ts +32 -0
- package/dist-types/core/block-meta.d.ts.map +1 -0
- package/dist-types/core/blocks.d.ts +62 -7
- package/dist-types/core/blocks.d.ts.map +1 -1
- package/dist-types/core/fonts.d.ts +11 -0
- package/dist-types/core/fonts.d.ts.map +1 -1
- package/dist-types/core/html-mini.d.ts +65 -0
- package/dist-types/core/html-mini.d.ts.map +1 -0
- package/dist-types/core/import-html.d.ts.map +1 -1
- package/dist-types/core/markdown-export.d.ts +30 -0
- package/dist-types/core/markdown-export.d.ts.map +1 -0
- package/dist-types/core/plain-text.d.ts +17 -0
- package/dist-types/core/plain-text.d.ts.map +1 -0
- package/dist-types/core/render-string.d.ts +68 -0
- package/dist-types/core/render-string.d.ts.map +1 -0
- package/dist-types/core/snapshot.d.ts +51 -0
- package/dist-types/core/snapshot.d.ts.map +1 -0
- package/dist-types/index.d.ts +19 -10
- package/dist-types/index.d.ts.map +1 -1
- package/dist-types/server/index.d.ts +37 -0
- package/dist-types/server/index.d.ts.map +1 -0
- package/dist-types/types/index.d.ts +21 -0
- package/dist-types/types/index.d.ts.map +1 -1
- package/dist-types/ui/Toolbar.d.ts +1 -1
- package/dist-types/ui/popovers.d.ts +1 -1
- package/dist-types/ui/popovers.d.ts.map +1 -1
- package/package.json +213 -58
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export interface DialogResult {
|
|
2
|
+
confirmed: boolean;
|
|
3
|
+
}
|
|
4
|
+
export interface LinkDialogResult extends DialogResult {
|
|
5
|
+
text?: string;
|
|
6
|
+
href?: string;
|
|
7
|
+
newWindow?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ImageDialogResult extends DialogResult {
|
|
10
|
+
src?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface YouTubeDialogResult extends DialogResult {
|
|
13
|
+
url?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ImportHtmlDialogResult extends DialogResult {
|
|
16
|
+
/** 사용자가 선택했거나 붙여넣은 원본 HTML 문서 텍스트. */
|
|
17
|
+
html?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ImportMarkdownDialogResult extends DialogResult {
|
|
20
|
+
/** 사용자가 선택했거나 붙여넣은 원본 Markdown 텍스트. */
|
|
21
|
+
markdown?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface FileAttachmentDialogResult extends DialogResult {
|
|
24
|
+
/** 다운로드 URL — 외부 URL 또는 업로드 API 응답에서 받은 URL. */
|
|
25
|
+
src?: string;
|
|
26
|
+
/** 원본 파일명. download attr 와 표시 라벨에 사용. */
|
|
27
|
+
name?: string;
|
|
28
|
+
/** 바이트 크기 (선택). 파일 업로드/메타에서 알 수 있을 때만. */
|
|
29
|
+
size?: number;
|
|
30
|
+
/** MIME 타입 (선택). 파일 업로드 시에만 알 수 있다. */
|
|
31
|
+
type?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface TableDialogResult extends DialogResult {
|
|
34
|
+
rows?: number;
|
|
35
|
+
cols?: number;
|
|
36
|
+
}
|
|
37
|
+
export declare function openLinkDialog(initial?: {
|
|
38
|
+
text?: string;
|
|
39
|
+
href?: string;
|
|
40
|
+
newWindow?: boolean;
|
|
41
|
+
}, theme?: 'light' | 'dark'): Promise<LinkDialogResult>;
|
|
42
|
+
export declare function openImageDialog(options?: {
|
|
43
|
+
onUpload?: (file: File) => Promise<string>;
|
|
44
|
+
}, theme?: 'light' | 'dark'): Promise<ImageDialogResult>;
|
|
45
|
+
export declare function openTableDialog(theme?: 'light' | 'dark'): Promise<TableDialogResult>;
|
|
46
|
+
/**
|
|
47
|
+
* HTML 파일을 골라 본문에 임포트하기 위한 다이얼로그.
|
|
48
|
+
* 파일 선택(.html / .htm) 또는 textarea 직접 붙여넣기를 모두 지원한다.
|
|
49
|
+
* 확인 시 원본 HTML 문자열을 resolve.
|
|
50
|
+
*
|
|
51
|
+
* 다이얼로그 안에서는 가져오기 동작 자체는 수행하지 않는다 — 호출자가
|
|
52
|
+
* 받은 html 을 importHtmlWithComputedStyles 로 처리한다.
|
|
53
|
+
*/
|
|
54
|
+
export declare function openImportHtmlDialog(theme?: 'light' | 'dark'): Promise<ImportHtmlDialogResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Markdown 파일을 골라 본문에 임포트하기 위한 다이얼로그.
|
|
57
|
+
* 파일 선택(.md / .markdown) 또는 textarea 직접 붙여넣기 모두 지원. 확인 시
|
|
58
|
+
* 원본 markdown 문자열을 resolve. 호출자가 받은 markdown 을 markdownToBlocks
|
|
59
|
+
* 으로 처리해 본문에 삽입한다.
|
|
60
|
+
*/
|
|
61
|
+
export declare function openMarkdownImportDialog(theme?: 'light' | 'dark'): Promise<ImportMarkdownDialogResult>;
|
|
62
|
+
/**
|
|
63
|
+
* 파일 첨부 다이얼로그. 두 가지 입력 방식:
|
|
64
|
+
* 1) 링크 — 외부 URL + 표시 이름(선택) 입력
|
|
65
|
+
* 2) 업로드 — 사용자가 등록한 onUpload(file) 로 서버 업로드 후 응답 URL 사용
|
|
66
|
+
*
|
|
67
|
+
* 이미지 다이얼로그와 달리 base64 임베드 모드는 의도적으로 제외 — 첨부
|
|
68
|
+
* 파일은 보통 크기가 커서 직렬화 snapshot 비대화의 부작용이 크다.
|
|
69
|
+
*/
|
|
70
|
+
export declare function openFileAttachmentDialog(options?: {
|
|
71
|
+
onUpload?: (file: File) => Promise<string>;
|
|
72
|
+
}, theme?: 'light' | 'dark'): Promise<FileAttachmentDialogResult>;
|
|
73
|
+
export declare function openYouTubeDialog(theme?: 'light' | 'dark'): Promise<YouTubeDialogResult>;
|
|
74
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { BlockAttrs, BlockKind } from '../core/blocks.cjs';
|
|
2
|
+
export declare const COLOR_PALETTE: string[];
|
|
3
|
+
export declare function openColorPicker(anchor: HTMLElement, onPick: (color: string | null) => void, recents?: ReadonlyArray<string>): void;
|
|
4
|
+
/**
|
|
5
|
+
* 블록 드롭다운에서 사용자가 고른 항목.
|
|
6
|
+
* - `kind` 가 BlockKind 인 경우 일반 블록 추가/변환
|
|
7
|
+
* - `kind` 가 'importHtml' / 'importMarkdown' 인 경우 외부 가져오기 액션(특수 처리)
|
|
8
|
+
*/
|
|
9
|
+
export interface BlockTypeChoice {
|
|
10
|
+
kind: BlockKind | 'importHtml' | 'importMarkdown';
|
|
11
|
+
attrs: BlockAttrs;
|
|
12
|
+
}
|
|
13
|
+
export declare function openBlockTypeDropdown(anchor: HTMLElement, onPick: (choice: BlockTypeChoice) => void): void;
|
|
14
|
+
export declare function openAlignDropdown(anchor: HTMLElement, onPick: (value: 'left' | 'center' | 'right' | 'justify') => void): void;
|
|
15
|
+
export interface FontFamilyChoice {
|
|
16
|
+
id: string;
|
|
17
|
+
label: string;
|
|
18
|
+
stack: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 글꼴 선택 드롭다운. 첫 호출 시 모든 글꼴 CSS 를 lazy 로드(Google Fonts +
|
|
22
|
+
* Pretendard CDN), 항목 라벨은 각 글꼴 자신으로 미리보기 렌더한다.
|
|
23
|
+
*
|
|
24
|
+
* - `currentId` 가 지정되면 해당 글꼴 항목에 `aw-popover-item-active` 적용
|
|
25
|
+
* - 선택 시 `onPick(choice)` 호출 + 팝오버 닫힘
|
|
26
|
+
*/
|
|
27
|
+
export declare function openFontFamilyDropdown(anchor: HTMLElement, onPick: (choice: FontFamilyChoice) => void, currentId?: string): void;
|
|
28
|
+
export interface CodeLanguageChoice {
|
|
29
|
+
id: string;
|
|
30
|
+
label: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 코드 블록의 언어 선택 드롭다운. highlight.ts 의 LANGUAGES 를 그대로 노출.
|
|
34
|
+
*
|
|
35
|
+
* - `currentId` 가 일치하는 항목에 active(✓) 표시
|
|
36
|
+
* - 선택 시 onPick(choice) 호출 + 팝오버 닫힘
|
|
37
|
+
*/
|
|
38
|
+
export declare function openCodeLanguageDropdown(anchor: HTMLElement, onPick: (choice: CodeLanguageChoice) => void, currentId?: string): void;
|
|
39
|
+
export type TableMenuAction = 'rowAbove' | 'rowBelow' | 'colLeft' | 'colRight' | 'deleteRow' | 'deleteCol';
|
|
40
|
+
/**
|
|
41
|
+
* 표 편집 드롭다운 — 행/열 추가·삭제. 활성 블록이 table 일 때만 의미가 있어
|
|
42
|
+
* AerizEditor 가 toolbar 'tableMenu' 항목 클릭 시점에 호출.
|
|
43
|
+
*/
|
|
44
|
+
export declare function openTableMenuDropdown(anchor: HTMLElement, onPick: (action: TableMenuAction) => void): void;
|
|
45
|
+
export interface FontSizeChoice {
|
|
46
|
+
px: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 글자 크기 프리셋 드롭다운. FONT_SIZES 의 px 값을 작은 라벨로 나열.
|
|
50
|
+
*
|
|
51
|
+
* - `currentPx` 가 일치하는 항목에 active 표시
|
|
52
|
+
* - 선택 시 `onPick({ px })` 호출 + 팝오버 닫힘
|
|
53
|
+
*/
|
|
54
|
+
export declare function openFontSizeDropdown(anchor: HTMLElement, onPick: (choice: FontSizeChoice) => void, currentPx?: number): void;
|
|
55
|
+
/**
|
|
56
|
+
* 기능 미구현 메뉴 항목용 placeholder 드롭다운.
|
|
57
|
+
* 항목명만 노출하고 "준비 중" 메시지를 보여준다.
|
|
58
|
+
*/
|
|
59
|
+
export declare function openComingSoonDropdown(anchor: HTMLElement, label: string): void;
|
|
60
|
+
/**
|
|
61
|
+
* 표 삽입 드롭다운. 모달 대신 anchor 아래에 떠 호버 위치에 따라 2x2 부터
|
|
62
|
+
* 12x12 까지 그리드가 동적으로 늘어난다. 셀을 클릭하면 onPick 호출 + 닫힘,
|
|
63
|
+
* 외부 클릭 / Esc → 취소.
|
|
64
|
+
*/
|
|
65
|
+
export interface TableSizeChoice {
|
|
66
|
+
rows: number;
|
|
67
|
+
cols: number;
|
|
68
|
+
}
|
|
69
|
+
export declare function openTableDropdown(anchor: HTMLElement, onPick: (choice: TableSizeChoice) => void): void;
|
|
70
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { EditorOptions } from '../types';
|
|
2
|
-
import { Toolbar } from '../ui/Toolbar';
|
|
3
|
-
import type { Block, BlockAttrs, BlockKind, BlockSnapshot } from './blocks';
|
|
4
|
-
export type { Block, BlockAttrs, BlockKind, BlockMatch, BlockSnapshot, BlockType, ClassifyResult, HeadingLevel, } from './blocks';
|
|
1
|
+
import type { EditorOptions, SerializeHtmlOptions } from '../types/index.js';
|
|
2
|
+
import { Toolbar } from '../ui/Toolbar.js';
|
|
3
|
+
import type { Block, BlockAttrs, BlockKind, BlockSnapshot } from './blocks.js';
|
|
4
|
+
export type { Block, BlockAttrs, BlockKind, BlockMatch, BlockSnapshot, BlockType, ClassifyResult, HeadingLevel, } from './blocks.js';
|
|
5
5
|
export interface InlineState {
|
|
6
6
|
bold: boolean;
|
|
7
7
|
italic: boolean;
|
|
@@ -43,14 +43,25 @@ export declare class AerizEditor {
|
|
|
43
43
|
private recentCustomColors;
|
|
44
44
|
constructor(options: EditorOptions);
|
|
45
45
|
/**
|
|
46
|
-
* 본문 HTML 을 반환한다.
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
46
|
+
* 본문 HTML 을 반환한다.
|
|
47
|
+
*
|
|
48
|
+
* 두 가지 스타일 전략을 지원한다 (`options.styles`, 기본값은 생성 시
|
|
49
|
+
* `EditorOptions.htmlStyles`, 그것도 없으면 `'inline'`).
|
|
50
|
+
*
|
|
51
|
+
* - `'inline'` — 호출 시점의 테마 변수(--aw-primary 등) 를 읽어 블록 단위
|
|
52
|
+
* 인라인 스타일에 베이크한다. 스타일시트 없이 어디에 붙여도(이메일 본문,
|
|
53
|
+
* 다른 페이지) 에디터에서 보이는 그대로 렌더된다.
|
|
54
|
+
* - `'class'` — 테마 스타일을 베이크하지 않고 `aw-block-*` / `aw-align-*`
|
|
55
|
+
* 클래스만 남긴다. `style` 속성을 지우는 서버 sanitizer 아래에서 서식을
|
|
56
|
+
* 보존해야 할 때 쓴다. 출력은 `aeriz-wysiwyg.min.css` 를 로드한 페이지의
|
|
57
|
+
* `.aeriz-wysiwyg > .aw-content` 안에 넣는 것을 전제로 한다.
|
|
58
|
+
*
|
|
59
|
+
* 어느 쪽이든 에디터 내부 DOM 은 변형되지 않으며(clone 트리에 적용),
|
|
60
|
+
* data-block-kind / data-block-focused 같은 에디터 전용 속성과 리사이즈
|
|
61
|
+
* 핸들 · 정렬 컨트롤 같은 편집 보조 마크업은 출력에서 제거된다.
|
|
51
62
|
* data-block-id 는 보존.
|
|
52
63
|
*/
|
|
53
|
-
getHTML(): string;
|
|
64
|
+
getHTML(options?: SerializeHtmlOptions): string;
|
|
54
65
|
/** 가공 없는 원본 innerHTML. 직렬화 검증/디버그 용도. */
|
|
55
66
|
getRawHTML(): string;
|
|
56
67
|
setHTML(html: string): void;
|
|
@@ -199,8 +210,17 @@ export declare class AerizEditor {
|
|
|
199
210
|
* 이미지 / 유튜브 wrapper 의 너비를 드래그로 조정. 높이는 자동 (이미지는
|
|
200
211
|
* 종횡비 유지, 유튜브는 CSS aspect-ratio 16/9). mouseup 에서 cursor 복귀
|
|
201
212
|
* + flush.
|
|
213
|
+
*
|
|
214
|
+
* 너비는 본문 안쪽 폭을 상한으로 한다. 상한이 없으면 오른쪽으로 계속 끌 때
|
|
215
|
+
* wrapper 가 본문보다 넓어지고, 그만큼 에디터 전체가 가로로 늘어난다
|
|
216
|
+
* (드래그를 멈춰도 늘어난 상태가 남는다).
|
|
202
217
|
*/
|
|
203
218
|
private startBlockResize;
|
|
219
|
+
/**
|
|
220
|
+
* 본문의 padding 을 제외한 실제 컨텐츠 폭. 블록 리사이즈의 상한이다.
|
|
221
|
+
* 에디터가 아주 좁을 때도 최소 폭은 확보되도록 하한을 둔다.
|
|
222
|
+
*/
|
|
223
|
+
private contentInnerWidth;
|
|
204
224
|
private currentTheme;
|
|
205
225
|
/**
|
|
206
226
|
* 선택 영역에 글꼴을 적용한다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AerizEditor.d.ts","sourceRoot":"","sources":["../../src/core/AerizEditor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"AerizEditor.d.ts","sourceRoot":"","sources":["../../src/core/AerizEditor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HtmlStyleMode, SerializeHtmlOptions } from '../types/index.js';
|
|
2
|
+
import type { Block, BlockSnapshot } from './blocks.js';
|
|
2
3
|
export interface ViewerOptions {
|
|
3
4
|
/** 마운트할 호스트 element */
|
|
4
5
|
element: HTMLElement;
|
|
@@ -6,6 +7,8 @@ export interface ViewerOptions {
|
|
|
6
7
|
initialBlocks?: BlockSnapshot[];
|
|
7
8
|
/** 초기 테마 */
|
|
8
9
|
theme?: 'light' | 'dark';
|
|
10
|
+
/** `getHTML()` 의 스타일 전략. 기본 `'inline'`. */
|
|
11
|
+
htmlStyles?: HtmlStyleMode;
|
|
9
12
|
}
|
|
10
13
|
/**
|
|
11
14
|
* 편집 불가 모드의 읽기 전용 뷰어.
|
|
@@ -25,6 +28,12 @@ export declare class AerizViewer {
|
|
|
25
28
|
readonly content: HTMLDivElement;
|
|
26
29
|
private readonly blockIds;
|
|
27
30
|
private readonly idFor;
|
|
31
|
+
/**
|
|
32
|
+
* 생성 시 받은 options 객체를 그대로 들고 있는다. `htmlStyles` 를 여기서
|
|
33
|
+
* 매번 다시 읽으므로, 호출자가 이 객체를 갱신하면 재생성 없이 출력 전략이
|
|
34
|
+
* 바뀐다 (AerizEditor 와 같은 규약).
|
|
35
|
+
*/
|
|
36
|
+
private readonly options;
|
|
28
37
|
private destroyed;
|
|
29
38
|
constructor(options: ViewerOptions);
|
|
30
39
|
/**
|
|
@@ -38,10 +47,13 @@ export declare class AerizViewer {
|
|
|
38
47
|
/** 임의의 노드를 받아 그 노드가 속한 블록을 반환한다. 본문 밖이면 null. */
|
|
39
48
|
getBlockOf(node: Node): Block | null;
|
|
40
49
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
50
|
+
* 본문 HTML 을 반환한다. 전략은 `AerizEditor.getHTML()` 과 동일하다.
|
|
51
|
+
*
|
|
52
|
+
* - `'inline'` (기본) — 외부 컨텍스트(이메일, 다른 페이지의 HTML 영역 등)
|
|
53
|
+
* 에서도 동일한 시각으로 보이도록 portable 인라인 스타일을 베이크한다.
|
|
54
|
+
* - `'class'` — 클래스만 남긴다. `style` 속성을 지우는 sanitizer 대응.
|
|
43
55
|
*/
|
|
44
|
-
getHTML(): string;
|
|
56
|
+
getHTML(options?: SerializeHtmlOptions): string;
|
|
45
57
|
setTheme(theme: 'light' | 'dark'): void;
|
|
46
58
|
destroy(): void;
|
|
47
59
|
private listBlocksInternal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AerizViewer.d.ts","sourceRoot":"","sources":["../../src/core/AerizViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 블록 렌더링에 쓰이는 순수 헬퍼와 상수.
|
|
3
|
+
*
|
|
4
|
+
* DOM 을 참조하지 않는다. 브라우저 렌더 경로(`blocks.ts`) 와 DOM 없는 문자열
|
|
5
|
+
* 렌더 경로(`render-string.ts`) 가 **같은** 값을 쓰도록 여기 한 곳에 둔다.
|
|
6
|
+
* 두 경로가 갈라지면 서버 재렌더 결과와 에디터 출력이 미묘하게 달라지므로,
|
|
7
|
+
* 양쪽이 공유해야 하는 것은 반드시 이 모듈로 올린다.
|
|
8
|
+
*/
|
|
9
|
+
/** 바이트 수를 사람이 읽는 크기 문자열로. */
|
|
10
|
+
export declare function formatBytes(bytes: number): string;
|
|
11
|
+
/** 표시용 짧은 타입 라벨. 파일명 확장자 우선, 없으면 MIME subtype. */
|
|
12
|
+
export declare function fileExtensionLabel(name?: string, mime?: string): string;
|
|
13
|
+
/** URL 의 hostname (subdomain 포함) 만 추출. 실패 시 빈 문자열. */
|
|
14
|
+
export declare function hostnameFromUrl(url: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Google 의 무료 favicon 서비스 URL 을 반환. CORS / 인증 불필요. URL 파싱
|
|
17
|
+
* 실패 시 빈 문자열.
|
|
18
|
+
*/
|
|
19
|
+
export declare function defaultFaviconUrl(url: string): string;
|
|
20
|
+
/** 파일 첨부 카드 좌측 문서 아이콘. */
|
|
21
|
+
export declare const FILE_ICON_SVG: string;
|
|
22
|
+
/** 파일 첨부 카드 우측 다운로드 아이콘. */
|
|
23
|
+
export declare const FILE_ACTION_SVG: string;
|
|
24
|
+
/** 유튜브 iframe 의 `allow` 목록. */
|
|
25
|
+
export declare const YOUTUBE_IFRAME_ALLOW = "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture";
|
|
26
|
+
/** 유튜브 임베드 base URL. 쿠키를 덜 쓰는 nocookie 도메인을 사용한다. */
|
|
27
|
+
export declare const YOUTUBE_EMBED_BASE = "https://www.youtube-nocookie.com/embed/";
|
|
28
|
+
/** 파일명이 없는 첨부의 기본 표시 이름. */
|
|
29
|
+
export declare const FILE_FALLBACK_NAME = "\uD30C\uC77C";
|
|
30
|
+
/** 블록의 안정 식별자를 담는 속성명. */
|
|
31
|
+
export declare const BLOCK_ID_ATTR = "data-block-id";
|
|
32
|
+
//# sourceMappingURL=block-meta.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -161,7 +161,7 @@ export interface ClassifyResult {
|
|
|
161
161
|
* 어디에도 일치하지 않으면 unknown 으로 본다.
|
|
162
162
|
*/
|
|
163
163
|
export declare function classifyBlockElement(el: HTMLElement): ClassifyResult;
|
|
164
|
-
export
|
|
164
|
+
export { BLOCK_ID_ATTR } from './block-meta.js';
|
|
165
165
|
export declare class BlockIdRegistry {
|
|
166
166
|
private counter;
|
|
167
167
|
private readonly seen;
|
|
@@ -206,20 +206,29 @@ export type BlockIdResolver = (el: HTMLElement) => string;
|
|
|
206
206
|
/**
|
|
207
207
|
* 직렬화된 Block 상태. Live element 참조 없이 JSON 으로 저장/전송 가능하다.
|
|
208
208
|
*
|
|
209
|
-
* -
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
209
|
+
* - version : 스키마 버전. 직렬화 시 항상 {@link SNAPSHOT_VERSION} 이 기록된다.
|
|
210
|
+
* optional 인 이유는 버전 필드 도입(1.0.3) 이전에 저장된 데이터를
|
|
211
|
+
* 그대로 읽을 수 있어야 하기 때문 — 없으면 1 로 간주한다.
|
|
212
|
+
* 변경 정책은 `src/core/snapshot.ts` 의 SNAPSHOT_VERSION 문서 참고.
|
|
213
|
+
* - id : 원본 Block 의 안정 식별자
|
|
214
|
+
* - kind : 블록 유형 (BlockKind 의 string literal)
|
|
215
|
+
* - attrs : kind 에 대응하는 유형별 메타데이터 (BlockAttrsByKind[kind])
|
|
216
|
+
* - html : 블록 element 내부 HTML (인라인 컨텐츠 전체 직렬화)
|
|
217
|
+
* - style : 블록 element **자신**의 인라인 style. `html` 은 내부만 담으므로
|
|
218
|
+
* 정렬(text-align) 처럼 블록에 직접 걸리는 서식은 이 필드가 없으면
|
|
219
|
+
* 스냅샷 왕복에서 사라진다.
|
|
213
220
|
*
|
|
214
221
|
* 서버 라운드트립을 위한 핵심 직렬화 형태. discriminated union 이라
|
|
215
222
|
* `if (snap.kind === 'heading')` 후 `snap.attrs.level` 처럼 바로 narrow 가능.
|
|
216
223
|
*/
|
|
217
224
|
export type BlockSnapshot = {
|
|
218
225
|
[K in BlockKind]: {
|
|
226
|
+
version?: number;
|
|
219
227
|
id: string;
|
|
220
228
|
kind: K;
|
|
221
229
|
attrs: BlockAttrsByKind[K];
|
|
222
230
|
html: string;
|
|
231
|
+
style?: string;
|
|
223
232
|
};
|
|
224
233
|
}[BlockKind];
|
|
225
234
|
/** 특정 BlockKind 에 한정된 BlockSnapshot 의 별칭. 외부에서 narrow 한
|
|
@@ -237,8 +246,13 @@ export declare function serializeBlocks(blocks: Block[]): BlockSnapshot[];
|
|
|
237
246
|
* 결과 element 는 data-block-id 가 snapshot.id 로 세팅되어 있다.
|
|
238
247
|
*/
|
|
239
248
|
export declare function renderBlock(snapshot: BlockSnapshot): HTMLElement;
|
|
240
|
-
/**
|
|
241
|
-
|
|
249
|
+
/**
|
|
250
|
+
* BlockSnapshot 배열을 root 의 자식으로 렌더 (root 의 기존 자식은 모두 제거).
|
|
251
|
+
*
|
|
252
|
+
* 저장소에서 바로 읽은 데이터가 들어올 수 있으므로 {@link upgradeSnapshots} 로
|
|
253
|
+
* 스키마를 정규화한 뒤 렌더한다.
|
|
254
|
+
*/
|
|
255
|
+
export declare function renderBlocks(root: HTMLElement, snapshots: readonly BlockSnapshot[]): void;
|
|
242
256
|
/**
|
|
243
257
|
* 본문(`root`) 의 직계 자식 element 들을 순서대로 Block 리스트로 반환한다.
|
|
244
258
|
*/
|
|
@@ -297,6 +311,47 @@ export declare function readBlockStyleTheme(host: Element): BlockStyleTheme;
|
|
|
297
311
|
* - theme 미지정 시 cyan 계열 기본값으로 폴백.
|
|
298
312
|
*/
|
|
299
313
|
export declare function applyBlockInlineStyles(root: HTMLElement, theme?: BlockStyleTheme): void;
|
|
314
|
+
/** 정렬 값 → 클래스명. `styles: 'class'` 출력에서 text-align 을 대체한다. */
|
|
315
|
+
export declare const ALIGN_CLASS_BY_VALUE: Readonly<Record<string, string>>;
|
|
316
|
+
/**
|
|
317
|
+
* 클래스 기반 출력용 정규화. (`getHTML({ styles: 'class' })` 에서 사용)
|
|
318
|
+
*
|
|
319
|
+
* `style` 속성을 지우는 서버 sanitizer 아래에서도 서식이 살아남게 하는 것이
|
|
320
|
+
* 목적이다. 두 가지를 한다.
|
|
321
|
+
*
|
|
322
|
+
* 1. 본문 직계 블록에 `aw-block` + `aw-block-{kind}` 클래스를 붙인다 — 배포된
|
|
323
|
+
* `aeriz-wysiwyg.min.css` 없이 자체 스타일을 입히려는 소비자의 훅.
|
|
324
|
+
* 2. `text-align` 인라인 선언을 `aw-align-*` 클래스로 옮긴다. 정렬은 값의
|
|
325
|
+
* 가짓수가 네 개로 한정돼 클래스로 완전히 표현되는 유일한 서식이다.
|
|
326
|
+
*
|
|
327
|
+
* 색 · 글자 크기 · 글꼴 · 표 셀 배경은 임의의 값을 갖기 때문에 클래스로 옮길 수
|
|
328
|
+
* 없고 `style` 속성에 남는다. sanitizer 는 `style` 을 통째로 지우는 대신
|
|
329
|
+
* 프로퍼티 단위 허용목록을 쓰면 된다 — 실제로 나오는 프로퍼티 목록은
|
|
330
|
+
* SPEC.md 의 "출력 HTML 허용목록" 절에 확정 명세로 정리돼 있다.
|
|
331
|
+
*/
|
|
332
|
+
export declare function applyBlockClassNames(root: HTMLElement): void;
|
|
333
|
+
/**
|
|
334
|
+
* `aw-align-*` 클래스를 인라인 `text-align` 으로 되돌린다.
|
|
335
|
+
*
|
|
336
|
+
* 정렬의 **내부 표현은 언제나 인라인 style** 이고 클래스는 출력 인코딩일
|
|
337
|
+
* 뿐이라는 불변식을 유지한다. 이 되돌리기가 없으면 class 모드로 저장한 문서를
|
|
338
|
+
* 다시 불러왔을 때
|
|
339
|
+
* - 툴바가 현재 정렬을 알아보지 못하고,
|
|
340
|
+
* - 기본 inline 전략으로 내보낼 때 정렬이 통째로 사라진다
|
|
341
|
+
* (applyBlockInlineStyles 는 클래스를 모른다).
|
|
342
|
+
*
|
|
343
|
+
* 이미 인라인 값이 있으면 그쪽을 우선한다 — 더 구체적인 지정이다.
|
|
344
|
+
*/
|
|
345
|
+
export declare function restoreAlignFromClasses(root: HTMLElement): void;
|
|
346
|
+
/**
|
|
347
|
+
* `getHTML()` 출력에서 편집 보조 element / 속성을 제거한다.
|
|
348
|
+
*
|
|
349
|
+
* 이미지·유튜브 블록의 리사이즈 핸들과 정렬 컨트롤은 에디터 안에서만 의미가
|
|
350
|
+
* 있는 UI 이고, `contenteditable` 도 발행된 문서에서는 불필요하다. 둘 다
|
|
351
|
+
* `normalizeContent()` 가 다시 만들어 주므로 `setHTML(getHTML())` 라운드트립은
|
|
352
|
+
* 그대로 성립한다.
|
|
353
|
+
*/
|
|
354
|
+
export declare function stripEditorOnlyNodes(root: HTMLElement): void;
|
|
300
355
|
/**
|
|
301
356
|
* `getHTML()` 출력에서 에디터 전용 메타데이터 속성을 제거한다.
|
|
302
357
|
* data-block-id 만 보존(외부 반입 시 동일 id 유지에 유용).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/core/blocks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/core/blocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,9 +34,20 @@ export declare const FONT_SIZES: ReadonlyArray<number>;
|
|
|
34
34
|
* 매칭 실패 시 null. 활성 toolbar 크기 표시에 사용.
|
|
35
35
|
*/
|
|
36
36
|
export declare function pxFromCss(css: string | null | undefined): number | null;
|
|
37
|
+
/**
|
|
38
|
+
* 현재 실제로 쓸 수 있는 글꼴만 반환한다. 드롭다운은 이 목록으로 그린다.
|
|
39
|
+
*
|
|
40
|
+
* `FONT_FAMILIES` 전체는 그대로 남겨 둔다 — 이미 그 글꼴로 저장된 본문의
|
|
41
|
+
* 라벨을 표시하려면(`findFontIdFromCss`) 실패한 항목도 알고 있어야 한다.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getAvailableFontFamilies(): ReadonlyArray<FontFamily>;
|
|
44
|
+
/** 사용 가능 목록이 바뀌면 호출된다. 반환값을 부르면 구독이 해제된다. */
|
|
45
|
+
export declare function subscribeFontAvailability(listener: () => void): () => void;
|
|
37
46
|
/**
|
|
38
47
|
* 모든 글꼴의 CSS 를 1 회만 lazy 로드한다. 글꼴 드롭다운이 열릴 때 호출.
|
|
39
48
|
* 두 번째 이후 호출은 즉시 반환.
|
|
49
|
+
*
|
|
50
|
+
* 실패는 조용히 넘어가지 않는다 — 받지 못한 글꼴은 목록에서 빠진다.
|
|
40
51
|
*/
|
|
41
52
|
export declare function ensureFontFamiliesLoaded(): void;
|
|
42
53
|
/**
|
|
@@ -1 +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;
|
|
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;AAoBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,aAAa,CAAC,UAAU,CAAC,CAGpE;AAED,6CAA6C;AAC7C,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAK1E;AAyDD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAiB/C;AAyBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAU/E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM 없이 동작하는 최소 HTML 파서.
|
|
3
|
+
*
|
|
4
|
+
* `blocksToMarkdown` / `blocksToPlainText` 가 `snapshot.html` 의 인라인
|
|
5
|
+
* 컨텐츠를 해석하기 위해 쓴다. `document` 를 쓸 수 없는 런타임(workerd, Node,
|
|
6
|
+
* Deno) 에서 돌아야 하므로 브라우저 파서를 쓸 수 없다.
|
|
7
|
+
*
|
|
8
|
+
* 범위를 의도적으로 좁게 잡았다 — 에디터가 만든 인라인 마크업과, HTML 가져오기
|
|
9
|
+
* 로 들어온 정도의 일반적인 마크업을 다루는 것이 목표이며, 브라우저 HTML5
|
|
10
|
+
* 파싱 알고리즘의 완전한 재현은 목표가 아니다. 아래 두 가지만 보장한다.
|
|
11
|
+
*
|
|
12
|
+
* 1. 어떤 입력에도 예외를 던지지 않는다 (깨진 마크업은 최선 해석 후 통과).
|
|
13
|
+
* 2. `<script>` / `<style>` 의 내용은 결과 트리에 남기지 않는다.
|
|
14
|
+
*/
|
|
15
|
+
export interface HtmlText {
|
|
16
|
+
type: 'text';
|
|
17
|
+
value: string;
|
|
18
|
+
}
|
|
19
|
+
export interface HtmlElementNode {
|
|
20
|
+
type: 'element';
|
|
21
|
+
/** 소문자 태그명. */
|
|
22
|
+
tag: string;
|
|
23
|
+
/** 소문자 속성명 → 값. 엔티티가 해제된 상태. */
|
|
24
|
+
attrs: Readonly<Record<string, string>>;
|
|
25
|
+
children: HtmlNode[];
|
|
26
|
+
}
|
|
27
|
+
export type HtmlNode = HtmlText | HtmlElementNode;
|
|
28
|
+
/** HTML 엔티티를 문자로 되돌린다. 해석할 수 없는 참조는 원문 유지. */
|
|
29
|
+
export declare function decodeEntities(input: string): string;
|
|
30
|
+
/** 텍스트를 HTML 본문에 넣을 수 있게 이스케이프한다. */
|
|
31
|
+
export declare function escapeHtml(input: string): string;
|
|
32
|
+
/** 텍스트를 큰따옴표 속성값으로 넣을 수 있게 이스케이프한다. */
|
|
33
|
+
export declare function escapeAttr(input: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* HTML 조각을 노드 트리로 파싱한다.
|
|
36
|
+
*
|
|
37
|
+
* 텍스트 노드의 값은 엔티티가 해제된 상태로 들어온다.
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseHtmlFragment(html: string): HtmlNode[];
|
|
40
|
+
/** 노드 트리를 HTML 문자열로 되돌린다. 파싱 → 직렬화는 정규화 역할을 한다. */
|
|
41
|
+
export declare function serializeNodes(nodes: readonly HtmlNode[]): string;
|
|
42
|
+
/**
|
|
43
|
+
* 노드 트리의 텍스트만 이어붙인다. `<br>` 은 개행으로 바꾼다.
|
|
44
|
+
*
|
|
45
|
+
* 블록 경계는 무시한다 — 코드 블록처럼 원문 그대로가 필요한 곳에서 쓴다.
|
|
46
|
+
* 사람이 읽는 텍스트를 뽑을 때는 {@link textWithBlockBreaks} 를 쓸 것.
|
|
47
|
+
*/
|
|
48
|
+
export declare function textOf(nodes: readonly HtmlNode[]): string;
|
|
49
|
+
/**
|
|
50
|
+
* 텍스트를 뽑되 블록 경계에 개행을 넣는다.
|
|
51
|
+
*
|
|
52
|
+
* `textOf` 만으로는 `<p>첫 문장</p><p>둘째 문장</p>` 이
|
|
53
|
+
* `"첫 문장둘째 문장"` 이 되어 버린다. 전문 검색 색인에 그대로 들어가면 두
|
|
54
|
+
* 단어가 한 토큰으로 붙어 어느 쪽으로도 검색되지 않고, 미리보기 스니펫도
|
|
55
|
+
* 문장이 뭉개진 채 나온다.
|
|
56
|
+
*/
|
|
57
|
+
export declare function textWithBlockBreaks(nodes: readonly HtmlNode[]): string;
|
|
58
|
+
/** 트리에서 주어진 태그의 직계 자식들만 모은다. */
|
|
59
|
+
export declare function childElements(nodes: readonly HtmlNode[], tag: string): HtmlElementNode[];
|
|
60
|
+
/**
|
|
61
|
+
* 트리를 깊이 우선으로 훑어 주어진 태그의 첫 노드를 찾는다.
|
|
62
|
+
* 없으면 `null`.
|
|
63
|
+
*/
|
|
64
|
+
export declare function findElement(nodes: readonly HtmlNode[], tag: string): HtmlElementNode | null;
|
|
65
|
+
//# sourceMappingURL=html-mini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-mini.d.ts","sourceRoot":"","sources":["../../src/core/html-mini.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,eAAe;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxC,QAAQ,EAAE,QAAQ,EAAE,CAAC;CACtB;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAC;AAwDlD,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBpD;AAED,qCAAqC;AACrC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAgBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAmG1D;AAED,mDAAmD;AACnD,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAiBjE;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAczD;AAUD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAiBtE;AAED,gCAAgC;AAChC,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,GAAG,EAAE,MAAM,GACV,eAAe,EAAE,CAInB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,GAAG,EAAE,MAAM,GACV,eAAe,GAAG,IAAI,CAQxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-html.d.ts","sourceRoot":"","sources":["../../src/core/import-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"import-html.d.ts","sourceRoot":"","sources":["../../src/core/import-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiJH,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;IACf;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,EAAE,CAAC,CAgGxB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `BlockSnapshot[]` → 마크다운. DOM 을 쓰지 않는다.
|
|
3
|
+
*
|
|
4
|
+
* `import-markdown.ts` 의 역방향이다. 포맷 종속을 푸는 탈출구 — 저장된 글을
|
|
5
|
+
* 언제든 에디터 밖으로 꺼낼 수 있게 한다.
|
|
6
|
+
*
|
|
7
|
+
* ## 표현 범위
|
|
8
|
+
*
|
|
9
|
+
* 마크다운으로 표현할 수 없는 서식은 다음 두 갈래로 처리한다.
|
|
10
|
+
* - **원시 HTML 로 보존** — 밑줄(`<u>`), 위/아래 첨자, 가져온 HTML 블록.
|
|
11
|
+
* GFM 은 인라인 HTML 을 허용하므로 정보가 사라지지 않는다.
|
|
12
|
+
* - **버림** — 글자색 · 배경색 · 글자 크기 · 글꼴 · 정렬. 마크다운에 대응
|
|
13
|
+
* 개념이 없고 HTML 로 남기면 결과가 마크다운이라 부르기 어려워진다.
|
|
14
|
+
*/
|
|
15
|
+
import type { BlockSnapshot } from './blocks.js';
|
|
16
|
+
export interface MarkdownOptions {
|
|
17
|
+
/**
|
|
18
|
+
* 글머리 목록 기호. 기본 `'-'`.
|
|
19
|
+
*/
|
|
20
|
+
bullet?: '-' | '*' | '+';
|
|
21
|
+
/**
|
|
22
|
+
* 표를 GFM 표로 낼지. 기본 `true`.
|
|
23
|
+
* `false` 면 표를 원시 HTML 로 보존한다 (셀 병합 등 GFM 이 표현할 수 없는
|
|
24
|
+
* 구조를 잃지 않아야 할 때).
|
|
25
|
+
*/
|
|
26
|
+
gfmTables?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** 스냅샷 배열을 마크다운 문서로 변환한다. */
|
|
29
|
+
export declare function blocksToMarkdown(snapshots: readonly BlockSnapshot[], options?: MarkdownOptions): string;
|
|
30
|
+
//# sourceMappingURL=markdown-export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-export.d.ts","sourceRoot":"","sources":["../../src/core/markdown-export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAM9C,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACzB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAOD,6BAA6B;AAC7B,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,aAAa,EAAE,EACnC,OAAO,GAAE,eAAoB,GAC5B,MAAM,CAWR"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `BlockSnapshot[]` → 평문. DOM 을 쓰지 않는다.
|
|
3
|
+
*
|
|
4
|
+
* 전문 검색(FTS) 색인 · 요약 스니펫 · 글자 수 계산용이다. 서식은 전부 버리고
|
|
5
|
+
* **사람이 읽는 텍스트만** 남긴다. 이미지는 `alt`, 링크는 표시 텍스트,
|
|
6
|
+
* 파일 첨부는 파일명이 텍스트로 들어간다 — 색인에 걸려야 의미가 있는 값들이다.
|
|
7
|
+
*/
|
|
8
|
+
import type { BlockSnapshot } from './blocks.js';
|
|
9
|
+
export interface PlainTextOptions {
|
|
10
|
+
/** 블록 사이 구분자. 기본 `'\n\n'`. 색인용으로 `' '` 를 쓰기도 한다. */
|
|
11
|
+
blockSeparator?: string;
|
|
12
|
+
/** 표 셀 구분자. 기본 `'\t'`. */
|
|
13
|
+
cellSeparator?: string;
|
|
14
|
+
}
|
|
15
|
+
/** 스냅샷 배열에서 평문을 추출한다. */
|
|
16
|
+
export declare function blocksToPlainText(snapshots: readonly BlockSnapshot[], options?: PlainTextOptions): string;
|
|
17
|
+
//# sourceMappingURL=plain-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plain-text.d.ts","sourceRoot":"","sources":["../../src/core/plain-text.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAS9C,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,yBAAyB;AACzB,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,aAAa,EAAE,EACnC,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAUR"}
|