@aeriz/wysiwyg 1.0.2 → 1.0.4
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 +634 -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 +8759 -0
- package/dist/aeriz-wysiwyg.css +587 -163
- package/dist/aeriz-wysiwyg.esm.js +4249 -1381
- package/dist/aeriz-wysiwyg.esm.min.js +4456 -1995
- package/dist/aeriz-wysiwyg.js +4249 -1381
- package/dist/aeriz-wysiwyg.min.cjs +56 -0
- package/dist/aeriz-wysiwyg.min.css +1 -1
- package/dist/aeriz-wysiwyg.min.js +54 -21
- package/dist/server.cjs +34 -0
- package/dist/server.js +798 -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 +530 -0
- package/dist-types/cjs/core/AerizViewer.d.cts +61 -0
- package/dist-types/cjs/core/block-meta.d.cts +98 -0
- package/dist-types/cjs/core/block-policy.d.cts +43 -0
- package/dist-types/cjs/core/blocks.d.cts +411 -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/history.d.cts +86 -0
- package/dist-types/cjs/core/html-mini.d.cts +65 -0
- package/dist-types/cjs/core/i18n.d.cts +221 -0
- package/dist-types/cjs/core/import-html.d.cts +40 -0
- package/dist-types/cjs/core/import-markdown.d.cts +33 -0
- package/dist-types/cjs/core/input-rules.d.cts +46 -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/selection.d.cts +46 -0
- package/dist-types/cjs/core/snapshot.d.cts +51 -0
- package/dist-types/cjs/core/table-ops.d.cts +30 -0
- package/dist-types/cjs/index.d.cts +22 -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 +210 -17
- 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 +98 -0
- package/dist-types/core/block-meta.d.ts.map +1 -0
- package/dist-types/core/block-policy.d.ts +43 -0
- package/dist-types/core/block-policy.d.ts.map +1 -0
- package/dist-types/core/blocks.d.ts +109 -11
- 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/history.d.ts +86 -0
- package/dist-types/core/history.d.ts.map +1 -0
- 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/i18n.d.ts +12 -0
- package/dist-types/core/i18n.d.ts.map +1 -1
- package/dist-types/core/import-html.d.ts +1 -0
- package/dist-types/core/import-html.d.ts.map +1 -1
- package/dist-types/core/import-markdown.d.ts +0 -4
- package/dist-types/core/import-markdown.d.ts.map +1 -1
- package/dist-types/core/input-rules.d.ts +46 -0
- package/dist-types/core/input-rules.d.ts.map +1 -0
- 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/selection.d.ts +46 -0
- package/dist-types/core/selection.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/core/table-ops.d.ts +30 -0
- package/dist-types/core/table-ops.d.ts.map +1 -0
- package/dist-types/index.d.ts +21 -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/Toolbar.d.ts.map +1 -1
- package/dist-types/ui/dialogs.d.ts.map +1 -1
- package/dist-types/ui/icons.d.ts.map +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,60 @@
|
|
|
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
|
+
* 현재 실제로 쓸 수 있는 글꼴만 반환한다. 드롭다운은 이 목록으로 그린다.
|
|
39
|
+
*
|
|
40
|
+
* `FONT_FAMILIES` 전체는 그대로 남겨 둔다 — 이미 그 글꼴로 저장된 본문의
|
|
41
|
+
* 라벨을 표시하려면(`findFontIdFromCss`) 실패한 항목도 알고 있어야 한다.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getAvailableFontFamilies(): ReadonlyArray<FontFamily>;
|
|
44
|
+
/** 사용 가능 목록이 바뀌면 호출된다. 반환값을 부르면 구독이 해제된다. */
|
|
45
|
+
export declare function subscribeFontAvailability(listener: () => void): () => void;
|
|
46
|
+
/**
|
|
47
|
+
* 모든 글꼴의 CSS 를 1 회만 lazy 로드한다. 글꼴 드롭다운이 열릴 때 호출.
|
|
48
|
+
* 두 번째 이후 호출은 즉시 반환.
|
|
49
|
+
*
|
|
50
|
+
* 실패는 조용히 넘어가지 않는다 — 받지 못한 글꼴은 목록에서 빠진다.
|
|
51
|
+
*/
|
|
52
|
+
export declare function ensureFontFamiliesLoaded(): void;
|
|
53
|
+
/**
|
|
54
|
+
* 임의의 CSS font-family 문자열에 대해 FONT_FAMILIES 중 가장 비슷한 항목을
|
|
55
|
+
* 찾아 id 를 반환. 매칭 실패 시 null. 활성 toolbar 표시에 사용.
|
|
56
|
+
*
|
|
57
|
+
* 비교는 stack 의 첫 family 토큰을 추출해 case-insensitive 비교.
|
|
58
|
+
*/
|
|
59
|
+
export declare function findFontIdFromCss(css: string | null | undefined): string | null;
|
|
60
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -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
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 본문 편집 이력(undo / redo).
|
|
3
|
+
*
|
|
4
|
+
* ## 왜 브라우저 기본 undo 를 쓰지 않는가
|
|
5
|
+
*
|
|
6
|
+
* `document.execCommand('undo')` 는 브라우저가 **자기가 만든 변경**만 되돌린다.
|
|
7
|
+
* 이 에디터는 블록 이동 · 표 행/열 편집 · 이미지 리사이즈 · 블록 유형 변경을
|
|
8
|
+
* 전부 직접 DOM 조작으로 처리하는데, 그 조작들은 브라우저 undo 스택에 아예
|
|
9
|
+
* 올라가지 않는다. 결과적으로 Ctrl+Z 를 누르면 방금 옮긴 블록은 그대로 있고
|
|
10
|
+
* 그 전에 타이핑한 글자가 지워지는, 예측할 수 없는 동작이 된다.
|
|
11
|
+
*
|
|
12
|
+
* ## 무엇을 저장하는가
|
|
13
|
+
*
|
|
14
|
+
* 본문 HTML 전체와 캐럿 위치를 한 항목으로 저장하는 스냅샷 방식이다.
|
|
15
|
+
* 조작 단위 이력(operation log) 이 메모리는 덜 쓰지만, 되돌리기가 **정확히**
|
|
16
|
+
* 원래 화면으로 돌아간다는 보장을 얻기가 훨씬 어렵다. 스냅샷은 그 보장이
|
|
17
|
+
* 공짜다 — 문자열을 도로 넣기만 하면 된다.
|
|
18
|
+
*
|
|
19
|
+
* 캐럿은 문자 오프셋으로 저장한다. HTML 을 통째로 갈아끼우면 노드 참조는
|
|
20
|
+
* 전부 무효가 되지만, "본문 시작에서 몇 번째 글자" 는 그대로 살아남는다.
|
|
21
|
+
*
|
|
22
|
+
* ## 언제 한 항목으로 묶는가
|
|
23
|
+
*
|
|
24
|
+
* 글자 하나마다 항목을 쌓으면 되돌리기가 사실상 쓸모없어진다. 연속된 타이핑은
|
|
25
|
+
* {@link COALESCE_MS} 안에 이어지는 한 하나로 합친다. 반대로 블록 이동 ·
|
|
26
|
+
* 유형 변경처럼 **구조가 바뀌는 조작**은 합치지 않는다 — 그건 사용자가 한
|
|
27
|
+
* 번에 하나씩 되돌리길 기대하는 단위다.
|
|
28
|
+
*/
|
|
29
|
+
/** 이력 한 항목 — 그 순간의 본문 전체와 캐럿. */
|
|
30
|
+
export interface HistoryEntry {
|
|
31
|
+
html: string;
|
|
32
|
+
/** 본문 시작 기준 캐럿 시작/끝 문자 오프셋. 셀렉션이 없으면 null. */
|
|
33
|
+
selection: {
|
|
34
|
+
start: number;
|
|
35
|
+
end: number;
|
|
36
|
+
} | null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 이 시간 안에 이어지는 타이핑은 한 항목으로 합친다.
|
|
40
|
+
* 사람이 문장 하나를 치는 동안의 간격보다 짧게, 생각하고 다시 치기 시작하는
|
|
41
|
+
* 간격보다는 길게 잡은 값이다.
|
|
42
|
+
*/
|
|
43
|
+
export declare const COALESCE_MS = 600;
|
|
44
|
+
/** 스택에 쌓아 두는 최대 항목 수. 넘치면 가장 오래된 것부터 버린다. */
|
|
45
|
+
export declare const HISTORY_LIMIT = 200;
|
|
46
|
+
/**
|
|
47
|
+
* 이 길이를 넘게 한 번에 바뀌면 타이핑으로 보지 않는다.
|
|
48
|
+
*
|
|
49
|
+
* 붙여넣기는 `input` 이벤트로 들어와 타이핑과 구분되지 않는다. 그대로 두면
|
|
50
|
+
* "글 좀 쓰다가 붙여넣기" 가 한 항목으로 묶여, 붙여넣기를 되돌리려다 앞서
|
|
51
|
+
* 쓴 글까지 함께 사라진다. 사람이 600ms 안에 칠 수 있는 양보다 넉넉히 크게
|
|
52
|
+
* 잡아, 실제 타이핑이 여기 걸리지 않도록 한다.
|
|
53
|
+
*/
|
|
54
|
+
export declare const BULK_CHANGE_CHARS = 64;
|
|
55
|
+
/** 변경의 성격 — 합쳐도 되는 타이핑인지, 한 단위로 남아야 하는 조작인지. */
|
|
56
|
+
export type ChangeKind = 'typing' | 'structural';
|
|
57
|
+
export declare class History {
|
|
58
|
+
private readonly past;
|
|
59
|
+
private readonly future;
|
|
60
|
+
/** 지금 화면에 보이는 상태. past 의 마지막이 아니라 이 값이 현재다. */
|
|
61
|
+
private present;
|
|
62
|
+
/** 마지막으로 항목을 쌓은 시각과 성격 — 합침 판단에 쓴다. */
|
|
63
|
+
private lastPushAt;
|
|
64
|
+
private lastKind;
|
|
65
|
+
constructor(initial: HistoryEntry);
|
|
66
|
+
get canUndo(): boolean;
|
|
67
|
+
get canRedo(): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* 새 상태를 기록한다.
|
|
70
|
+
*
|
|
71
|
+
* @param now 현재 시각(ms). 테스트가 시간을 직접 넣을 수 있도록 인자로 받는다.
|
|
72
|
+
*/
|
|
73
|
+
record(entry: HistoryEntry, kind: ChangeKind, now: number): void;
|
|
74
|
+
/** 되돌린다. 되돌릴 것이 없으면 null. */
|
|
75
|
+
undo(): HistoryEntry | null;
|
|
76
|
+
/** 다시 실행한다. 없으면 null. */
|
|
77
|
+
redo(): HistoryEntry | null;
|
|
78
|
+
/** 현재 상태. 외부에서 비교용으로 읽는다. */
|
|
79
|
+
current(): HistoryEntry;
|
|
80
|
+
/**
|
|
81
|
+
* 이력을 비우고 주어진 상태에서 다시 시작한다.
|
|
82
|
+
* `setHTML()` 처럼 문서를 통째로 갈아끼우는 프로그램적 변경에 쓴다.
|
|
83
|
+
*/
|
|
84
|
+
reset(entry: HistoryEntry): void;
|
|
85
|
+
}
|
|
86
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -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
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,221 @@
|
|
|
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
|
+
/** 툴바 컨테이너의 aria-label. */
|
|
14
|
+
ariaLabel: string;
|
|
15
|
+
undo: string;
|
|
16
|
+
redo: string;
|
|
17
|
+
blockType: string;
|
|
18
|
+
fontFamily: string;
|
|
19
|
+
fontSize: string;
|
|
20
|
+
bold: string;
|
|
21
|
+
italic: string;
|
|
22
|
+
underline: string;
|
|
23
|
+
strike: string;
|
|
24
|
+
color: string;
|
|
25
|
+
backgroundColor: string;
|
|
26
|
+
align: string;
|
|
27
|
+
cellBg: string;
|
|
28
|
+
tableMenu: string;
|
|
29
|
+
codeLang: string;
|
|
30
|
+
bulletList: string;
|
|
31
|
+
orderedList: string;
|
|
32
|
+
blockquote: string;
|
|
33
|
+
codeBlock: string;
|
|
34
|
+
link: string;
|
|
35
|
+
image: string;
|
|
36
|
+
table: string;
|
|
37
|
+
hr: string;
|
|
38
|
+
clearFormat: string;
|
|
39
|
+
blockTypeChangeTooltip: string;
|
|
40
|
+
blockMoveTooltip: string;
|
|
41
|
+
addBelowTooltip: string;
|
|
42
|
+
};
|
|
43
|
+
blocks: {
|
|
44
|
+
paragraph: string;
|
|
45
|
+
/** "Heading {n}" 형식 — caller 가 {n} 을 level 숫자로 치환 */
|
|
46
|
+
heading: string;
|
|
47
|
+
bulletList: string;
|
|
48
|
+
orderedList: string;
|
|
49
|
+
taskList: string;
|
|
50
|
+
blockquote: string;
|
|
51
|
+
codeBlock: string;
|
|
52
|
+
image: string;
|
|
53
|
+
table: string;
|
|
54
|
+
hr: string;
|
|
55
|
+
linkCard: string;
|
|
56
|
+
youtube: string;
|
|
57
|
+
file: string;
|
|
58
|
+
importedHtml: string;
|
|
59
|
+
unknown: string;
|
|
60
|
+
};
|
|
61
|
+
blockMenu: {
|
|
62
|
+
body: string;
|
|
63
|
+
taskList: string;
|
|
64
|
+
h1: string;
|
|
65
|
+
h2: string;
|
|
66
|
+
h3: string;
|
|
67
|
+
bulletList: string;
|
|
68
|
+
orderedList: string;
|
|
69
|
+
blockquote: string;
|
|
70
|
+
codeBlock: string;
|
|
71
|
+
hr: string;
|
|
72
|
+
link: string;
|
|
73
|
+
image: string;
|
|
74
|
+
table: string;
|
|
75
|
+
youtube: string;
|
|
76
|
+
file: string;
|
|
77
|
+
importHtml: string;
|
|
78
|
+
importMarkdown: string;
|
|
79
|
+
};
|
|
80
|
+
align: {
|
|
81
|
+
left: string;
|
|
82
|
+
center: string;
|
|
83
|
+
right: string;
|
|
84
|
+
justify: string;
|
|
85
|
+
};
|
|
86
|
+
color: {
|
|
87
|
+
customColor: string;
|
|
88
|
+
defaultColor: string;
|
|
89
|
+
recent: string;
|
|
90
|
+
};
|
|
91
|
+
tableMenu: {
|
|
92
|
+
rowAbove: string;
|
|
93
|
+
rowBelow: string;
|
|
94
|
+
colLeft: string;
|
|
95
|
+
colRight: string;
|
|
96
|
+
deleteRow: string;
|
|
97
|
+
deleteCol: string;
|
|
98
|
+
};
|
|
99
|
+
fontFamily: {
|
|
100
|
+
systemDefault: string;
|
|
101
|
+
};
|
|
102
|
+
blockAlign: {
|
|
103
|
+
left: string;
|
|
104
|
+
center: string;
|
|
105
|
+
right: string;
|
|
106
|
+
};
|
|
107
|
+
comingSoon: {
|
|
108
|
+
label: string;
|
|
109
|
+
};
|
|
110
|
+
dialogs: {
|
|
111
|
+
confirm: string;
|
|
112
|
+
cancel: string;
|
|
113
|
+
insert: string;
|
|
114
|
+
apply: string;
|
|
115
|
+
importBtn: string;
|
|
116
|
+
close: string;
|
|
117
|
+
selectedFileNone: string;
|
|
118
|
+
dropOrClick: string;
|
|
119
|
+
};
|
|
120
|
+
link: {
|
|
121
|
+
title: string;
|
|
122
|
+
text: string;
|
|
123
|
+
textPlaceholder: string;
|
|
124
|
+
url: string;
|
|
125
|
+
urlPlaceholder: string;
|
|
126
|
+
openNewWindow: string;
|
|
127
|
+
};
|
|
128
|
+
image: {
|
|
129
|
+
title: string;
|
|
130
|
+
embedTab: string;
|
|
131
|
+
embedTabTitle: string;
|
|
132
|
+
urlTab: string;
|
|
133
|
+
urlTabTitle: string;
|
|
134
|
+
uploadTab: string;
|
|
135
|
+
uploadTabTitle: string;
|
|
136
|
+
uploadDisabledTitle: string;
|
|
137
|
+
embedDropzone: string;
|
|
138
|
+
urlLabel: string;
|
|
139
|
+
urlPlaceholder: string;
|
|
140
|
+
uploadDropzone: string;
|
|
141
|
+
noUploadApi: string;
|
|
142
|
+
/** 캡션 버튼 tooltip. */
|
|
143
|
+
captionAdd: string;
|
|
144
|
+
/** 빈 캡션에 흐리게 뜨는 안내. */
|
|
145
|
+
captionPlaceholder: string;
|
|
146
|
+
};
|
|
147
|
+
youtube: {
|
|
148
|
+
title: string;
|
|
149
|
+
urlLabel: string;
|
|
150
|
+
urlPlaceholder: string;
|
|
151
|
+
formatHint: string;
|
|
152
|
+
};
|
|
153
|
+
table: {
|
|
154
|
+
title: string;
|
|
155
|
+
statusZero: string;
|
|
156
|
+
/** "{r} × {c} 표" 형식 — caller 가 {r}, {c} 치환 */
|
|
157
|
+
statusFormat: string;
|
|
158
|
+
pickerHint: string;
|
|
159
|
+
};
|
|
160
|
+
importHtml: {
|
|
161
|
+
title: string;
|
|
162
|
+
fileSelect: string;
|
|
163
|
+
pasteLabel: string;
|
|
164
|
+
pastePlaceholder: string;
|
|
165
|
+
hint: string;
|
|
166
|
+
errEmpty: string;
|
|
167
|
+
errNoBody: string;
|
|
168
|
+
errFailed: string;
|
|
169
|
+
};
|
|
170
|
+
importMarkdown: {
|
|
171
|
+
title: string;
|
|
172
|
+
fileSelect: string;
|
|
173
|
+
pasteLabel: string;
|
|
174
|
+
pastePlaceholder: string;
|
|
175
|
+
hint: string;
|
|
176
|
+
errEmpty: string;
|
|
177
|
+
errNoBody: string;
|
|
178
|
+
errFailed: string;
|
|
179
|
+
};
|
|
180
|
+
fileAttach: {
|
|
181
|
+
title: string;
|
|
182
|
+
urlTab: string;
|
|
183
|
+
urlTabTitle: string;
|
|
184
|
+
uploadTab: string;
|
|
185
|
+
uploadTabTitle: string;
|
|
186
|
+
uploadDisabledTitle: string;
|
|
187
|
+
urlLabel: string;
|
|
188
|
+
urlPlaceholder: string;
|
|
189
|
+
nameLabel: string;
|
|
190
|
+
namePlaceholder: string;
|
|
191
|
+
noUploadApi: string;
|
|
192
|
+
uploadDropzone: string;
|
|
193
|
+
uploadComplete: string;
|
|
194
|
+
uploadFailed: string;
|
|
195
|
+
errEmpty: string;
|
|
196
|
+
};
|
|
197
|
+
content: {
|
|
198
|
+
/** 캐럿이 놓인 빈 본문 블록에 흐릿하게 뜨는 안내. */
|
|
199
|
+
emptyHint: string;
|
|
200
|
+
};
|
|
201
|
+
status: {
|
|
202
|
+
/** "{label} ({id8})" 의 prefix 라벨용 */
|
|
203
|
+
noActive: string;
|
|
204
|
+
/** "{n} 블록(s)" — {n} 치환 */
|
|
205
|
+
blocksCount: string;
|
|
206
|
+
/** "텍스트 {n} 자" — {n} 치환 */
|
|
207
|
+
chars: string;
|
|
208
|
+
/** "소스 {n}" — {n} 치환 (formatCount 결과) */
|
|
209
|
+
source: string;
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
export declare function setLocale(locale: Locale): void;
|
|
213
|
+
export declare function getLocale(): Locale;
|
|
214
|
+
/** 현재 활성화된 strings 사전을 반환. 모든 UI 코드에서 호출 진입점. */
|
|
215
|
+
export declare function t(): Strings;
|
|
216
|
+
/**
|
|
217
|
+
* 템플릿 치환 유틸. `{key}` 패턴을 `vars[key]` 로 치환.
|
|
218
|
+
* 예: format('Heading {n}', { n: 1 }) → 'Heading 1'
|
|
219
|
+
*/
|
|
220
|
+
export declare function format(template: string, vars: Record<string, string | number>): string;
|
|
221
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,40 @@
|
|
|
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 declare function isBlockLevelTag(tagName: string): boolean;
|
|
15
|
+
export interface ImportHtmlOptions {
|
|
16
|
+
/** iframe load 후 추가 idle 대기(ms). Tailwind CDN 등 런타임 스타일 주입을
|
|
17
|
+
* 기다리기 위해 기본 1000ms. */
|
|
18
|
+
settleMs?: number;
|
|
19
|
+
/** iframe load timeout(ms). 기본 30_000. */
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
/** 화면 밖 iframe 폭. computed style 의 width/height 단위 변환에 영향. */
|
|
22
|
+
width?: number;
|
|
23
|
+
/**
|
|
24
|
+
* 가져온 element 들이 최종적으로 삽입될 destination element. 지정하면
|
|
25
|
+
* 해당 위치의 CSS 캐스케이드를 고려한 baseline 비교로 인라인 스타일을 더
|
|
26
|
+
* 엄격하게 추려낸다 — destination 의 descendant selector 룰
|
|
27
|
+
* (`.aw-content blockquote { ... }` 등) 이 imported 트리에 적용될 값을
|
|
28
|
+
* baseline 으로 간주해, 같은 값이면 인라인을 박지 않는다.
|
|
29
|
+
*
|
|
30
|
+
* 미지정 시 iframe 단독 baseline (UA 기본값) 으로 처리되어, 결과 트리가
|
|
31
|
+
* destination 의 descendant 룰에 영향받을 수 있다.
|
|
32
|
+
*/
|
|
33
|
+
mountTarget?: HTMLElement;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 외부 HTML 을 받아 인라인 스타일이 베이크된 element 배열을 반환한다.
|
|
37
|
+
* 호출자는 원하는 위치에 `appendChild` / `insertBefore` 등으로 삽입하면 된다.
|
|
38
|
+
*/
|
|
39
|
+
export declare function importHtmlWithComputedStyles(html: string, options?: ImportHtmlOptions): Promise<HTMLElement[]>;
|
|
40
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 가벼운 Markdown → HTMLElement[] 변환기.
|
|
3
|
+
*
|
|
4
|
+
* 외부 의존성 없이 CommonMark 의 자주 쓰이는 문법만 지원한다 — 에디터의
|
|
5
|
+
* 네이티브 블록 유형(p / h1~6 / ul / ol / blockquote / pre / hr / table /
|
|
6
|
+
* a / img) 으로 직접 매핑되도록 결과 구조를 단순하게 유지.
|
|
7
|
+
*
|
|
8
|
+
* 지원 문법 (블록):
|
|
9
|
+
* - ATX 제목: `# … ###### …`
|
|
10
|
+
* - 단락
|
|
11
|
+
* - 글머리 목록: `- `, `* `, `+ `
|
|
12
|
+
* - 번호 목록: `1. `
|
|
13
|
+
* - 인용구: `> …`
|
|
14
|
+
* - 코드 블록: ```lang\n…\n```
|
|
15
|
+
* - 구분선: `---`, `***`, `___`
|
|
16
|
+
* - 표 (GFM): `| a | b |\n|---|---|\n…`
|
|
17
|
+
*
|
|
18
|
+
* 지원 문법 (인라인):
|
|
19
|
+
* - 굵게: `**…**`, `__…__`
|
|
20
|
+
* - 기울임: `*…*`, `_…_`
|
|
21
|
+
* - 취소선: `~~…~~`
|
|
22
|
+
* - 인라인 코드: `` `…` ``
|
|
23
|
+
* - 링크: `[text](url)`
|
|
24
|
+
* - 이미지: ``
|
|
25
|
+
* - 자동 링크: `<https://…>`
|
|
26
|
+
* - 줄바꿈: 줄 끝 두 칸 공백 → `<br>`
|
|
27
|
+
*/
|
|
28
|
+
export declare function markdownToBlocks(md: string): HTMLElement[];
|
|
29
|
+
/**
|
|
30
|
+
* Markdown 문자열을 HTML 문자열로 변환. 외부 직접 사용 가능 (테스트 등).
|
|
31
|
+
*/
|
|
32
|
+
export declare function markdownToHtml(md: string): string;
|
|
33
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 키보드와 타이핑을 블록 유형으로 옮기는 표.
|
|
3
|
+
*
|
|
4
|
+
* 블록 유형을 고르는 길은 둘이다 — 메뉴에서 고르거나, 쓰던 흐름 그대로
|
|
5
|
+
* 신호를 주거나. 후자가 여기다. 두 갈래를 한 파일에 두는 이유는 둘이 같은
|
|
6
|
+
* 목적지(BlockKind) 를 가리키기 때문이고, 한쪽만 고치면 곧바로 어긋난다.
|
|
7
|
+
*
|
|
8
|
+
* 문법은 마크다운 가져오기(`import-markdown.ts`) 와 같은 것을 쓴다. 한쪽에서
|
|
9
|
+
* 되는 표기가 다른 쪽에서 안 되면 사용자가 규칙을 두 벌 외워야 한다.
|
|
10
|
+
*/
|
|
11
|
+
import type { BlockAttrs, BlockKind } from './blocks.cjs';
|
|
12
|
+
/** 블록 유형을 가리키는 목적지. */
|
|
13
|
+
export interface BlockTarget {
|
|
14
|
+
kind: BlockKind;
|
|
15
|
+
attrs?: BlockAttrs;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* `Ctrl/Cmd + Alt + 키` → 바꿀 블록 유형.
|
|
19
|
+
*
|
|
20
|
+
* 숫자는 제목 레벨과 그대로 맞춘다(1 → 제목 1). 0 이 본문인 것도 같은 이유다
|
|
21
|
+
* — "제목 아님" 자리다. 목록·인용구는 툴바 툴팁이 예전부터 광고해 온 7/8/9
|
|
22
|
+
* 자리를 그대로 쓴다.
|
|
23
|
+
*
|
|
24
|
+
* `Ctrl + 숫자` 가 아니라 `Ctrl + Alt + 숫자` 인 이유는 브라우저의 탭 전환
|
|
25
|
+
* 단축키와 겹치지 않기 위해서다.
|
|
26
|
+
*/
|
|
27
|
+
export declare const BLOCK_SHORTCUTS: Readonly<Record<string, BlockTarget>>;
|
|
28
|
+
/**
|
|
29
|
+
* 블록 첫 글자들이 마크다운 방아쇠인지 본다. 아니면 null.
|
|
30
|
+
*
|
|
31
|
+
* 방아쇠는 **본문 블록의 맨 앞**에서만 인식한다 (호출자 책임). 이미 쓴 문단
|
|
32
|
+
* 중간에서 "- " 를 고치다가 블록이 통째로 바뀌면 사고다.
|
|
33
|
+
*/
|
|
34
|
+
export declare function matchInputRule(text: string): BlockTarget | null;
|
|
35
|
+
/**
|
|
36
|
+
* 목록 **항목 안**에서 체크박스 표기를 알아본다. 완료 여부를 함께 돌려준다.
|
|
37
|
+
*
|
|
38
|
+
* `- [ ] ` 를 통째로 방아쇠로 삼을 수는 없다 — 앞의 `- ` 에서 이미 글머리
|
|
39
|
+
* 목록으로 바뀌기 때문에 뒤 절반은 영영 도달하지 않는다. 그래서 "글머리
|
|
40
|
+
* 목록 항목 맨 앞의 `[ ] `" 를 따로 본다. 사용자가 치는 순서(`- ` → `[ ] `)
|
|
41
|
+
* 를 그대로 따라가는 셈이고, 결과도 기대한 것과 같다.
|
|
42
|
+
*/
|
|
43
|
+
export declare function matchTaskItemRule(text: string): {
|
|
44
|
+
checked: boolean;
|
|
45
|
+
} | null;
|
|
46
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -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.cjs';
|
|
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
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `BlockSnapshot[]` → 평문. DOM 을 쓰지 않는다.
|
|
3
|
+
*
|
|
4
|
+
* 전문 검색(FTS) 색인 · 요약 스니펫 · 글자 수 계산용이다. 서식은 전부 버리고
|
|
5
|
+
* **사람이 읽는 텍스트만** 남긴다. 이미지는 `alt`, 링크는 표시 텍스트,
|
|
6
|
+
* 파일 첨부는 파일명이 텍스트로 들어간다 — 색인에 걸려야 의미가 있는 값들이다.
|
|
7
|
+
*/
|
|
8
|
+
import type { BlockSnapshot } from './blocks.cjs';
|
|
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
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|