@cosense-toolbox/parser 0.1.0-beta.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 +21 -0
- package/README.md +794 -0
- package/dist/ast-CIKXwSl5.mjs +41 -0
- package/dist/ast-CIKXwSl5.mjs.map +1 -0
- package/dist/ast-uYWtkHwT.cjs +52 -0
- package/dist/ast-uYWtkHwT.cjs.map +1 -0
- package/dist/compile.cjs +265 -0
- package/dist/compile.cjs.map +1 -0
- package/dist/compile.d.cts +135 -0
- package/dist/compile.d.cts.map +1 -0
- package/dist/compile.d.mts +135 -0
- package/dist/compile.d.mts.map +1 -0
- package/dist/compile.mjs +256 -0
- package/dist/compile.mjs.map +1 -0
- package/dist/create-compiler-CvlndKOA.d.cts +23 -0
- package/dist/create-compiler-CvlndKOA.d.cts.map +1 -0
- package/dist/create-compiler-jdA408ny.d.mts +23 -0
- package/dist/create-compiler-jdA408ny.d.mts.map +1 -0
- package/dist/image-url-YcTed8tg.cjs +68 -0
- package/dist/image-url-YcTed8tg.cjs.map +1 -0
- package/dist/image-url-eQ6X-oN0.mjs +51 -0
- package/dist/image-url-eQ6X-oN0.mjs.map +1 -0
- package/dist/index.cjs +716 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +77 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +77 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +709 -0
- package/dist/index.mjs.map +1 -0
- package/dist/plugin.cjs +0 -0
- package/dist/plugin.d.cts +4 -0
- package/dist/plugin.d.mts +4 -0
- package/dist/plugin.mjs +1 -0
- package/dist/schema.cjs +171 -0
- package/dist/schema.cjs.map +1 -0
- package/dist/schema.d.cts +34 -0
- package/dist/schema.d.cts.map +1 -0
- package/dist/schema.d.mts +34 -0
- package/dist/schema.d.mts.map +1 -0
- package/dist/schema.mjs +148 -0
- package/dist/schema.mjs.map +1 -0
- package/dist/types-BXlnUFr0.d.mts +63 -0
- package/dist/types-BXlnUFr0.d.mts.map +1 -0
- package/dist/types-Bo_BrmvK.d.cts +230 -0
- package/dist/types-Bo_BrmvK.d.cts.map +1 -0
- package/dist/types-Bo_BrmvK.d.mts +230 -0
- package/dist/types-Bo_BrmvK.d.mts.map +1 -0
- package/dist/types-DVwlUtla.d.cts +63 -0
- package/dist/types-DVwlUtla.d.cts.map +1 -0
- package/dist/utils.cjs +80 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +46 -0
- package/dist/utils.d.cts.map +1 -0
- package/dist/utils.d.mts +46 -0
- package/dist/utils.d.mts.map +1 -0
- package/dist/utils.mjs +72 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { _ as InlineNodeInit, g as InlineNode } from "./types-Bo_BrmvK.mjs";
|
|
2
|
+
import { Option } from "effect";
|
|
3
|
+
//#region src/core/position.d.ts
|
|
4
|
+
/** 走査対象の文字列のインデックス 0 が、ソース上のどこにあるか。 */
|
|
5
|
+
interface Origin {
|
|
6
|
+
readonly line: number;
|
|
7
|
+
readonly column: number;
|
|
8
|
+
readonly offset: number;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region src/inline/types.d.ts
|
|
12
|
+
/**
|
|
13
|
+
* 走査中に共有される文脈。
|
|
14
|
+
*
|
|
15
|
+
* `tokenize` は装飾の中身のように部分文字列を再帰的に解析するためのフック。
|
|
16
|
+
* ルールが走査ループを直接 import すると循環参照になるので、文脈経由で渡している。
|
|
17
|
+
*/
|
|
18
|
+
interface InlineContext {
|
|
19
|
+
/** 装飾記法 (`[* ]` 等) を解釈してよいか。装飾の中では false (入れ子不可) */
|
|
20
|
+
readonly allowDecoration: boolean;
|
|
21
|
+
/** 走査対象 `source` のインデックス 0 がソース上のどこか */
|
|
22
|
+
readonly origin: Origin;
|
|
23
|
+
/** 拡張が追加した `[...]` のルール。既定のルールより先に試される */
|
|
24
|
+
readonly bracketRules: readonly BracketRule[];
|
|
25
|
+
readonly tokenize: (source: string, origin: Origin, allowDecoration: boolean) => readonly InlineNode[];
|
|
26
|
+
}
|
|
27
|
+
/** 記法が成立したときの結果。`length` は `index` から消費した文字数。 */
|
|
28
|
+
interface ConstructMatch {
|
|
29
|
+
readonly node: InlineNodeInit;
|
|
30
|
+
readonly length: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 行内の走査ルール。`source[index]` から記法が始まるなら Some を返す。
|
|
34
|
+
*
|
|
35
|
+
* None を返すと呼び出し側は 1 文字を素のテキストとして消費して次に進むので、
|
|
36
|
+
* 「記法として無効なので `[` は素の文字」といったケースも None で表せる。
|
|
37
|
+
*/
|
|
38
|
+
type InlineConstruct = (source: string, index: number, ctx: InlineContext) => Option.Option<ConstructMatch>;
|
|
39
|
+
/** `[...]` の中身を解釈するルールに渡る文脈。 */
|
|
40
|
+
interface BracketRuleContext extends InlineContext {
|
|
41
|
+
/** `inner` のインデックス 0 がソース上のどこか (子ノードの位置計算に使う) */
|
|
42
|
+
readonly innerOrigin: Origin;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* `[...]` の中身を解釈するルール。角括弧そのものは呼び出し側が扱うので、
|
|
46
|
+
* ルールは中身の文字列だけを見る。None なら次のルールへ、全部 None なら記法として無効。
|
|
47
|
+
*/
|
|
48
|
+
type BracketRule = (inner: string, ctx: BracketRuleContext) => Option.Option<InlineNodeInit>;
|
|
49
|
+
/**
|
|
50
|
+
* 記法の拡張。`parse` / `tokenizeInline` の options に渡すと、
|
|
51
|
+
* **既定のルールより先に**試されるようになる。
|
|
52
|
+
*
|
|
53
|
+
* 既定の記法を無効化する手段は今のところ用意していない (必要になれば非破壊に追加する)。
|
|
54
|
+
*/
|
|
55
|
+
interface Extension {
|
|
56
|
+
/** 行内の走査ルール。新しい開始文字を持つ記法を足すときはこちら */
|
|
57
|
+
readonly constructs?: readonly InlineConstruct[];
|
|
58
|
+
/** `[...]` の中身の解釈ルール。角括弧記法のバリエーションを足すときはこちら */
|
|
59
|
+
readonly bracketRules?: readonly BracketRule[];
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { InlineConstruct as a, Extension as i, BracketRuleContext as n, InlineContext as o, ConstructMatch as r, Origin as s, BracketRule as t };
|
|
63
|
+
//# sourceMappingURL=types-BXlnUFr0.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-BXlnUFr0.d.mts","names":[],"sources":["../src/core/position.ts","../src/inline/types.ts"],"mappings":";;;;UAUiB;WACN;WACA;WACA;;;;;;;;;;UCEM;;WAEN;;WAEA,QAAQ;;WAER,uBAAuB;WACvB,WACP,gBACA,QAAQ,QACR,sCACY;;;UAIC;WACN,MAAM;WACN;;;;;;;;KASC,mBACV,gBACA,eACA,KAAK,kBACF,OAAO,OAAO;;UAGF,2BAA2B;;WAEjC,aAAa;;;;;;KAOZ,eAAe,eAAe,KAAK,uBAAuB,OAAO,OAAO;;;;;;;UAQnE;;WAEN,sBAAsB;;WAEtB,wBAAwB"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
//#region src/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* types.ts — AST の型定義。このパッケージの単一情報源。
|
|
4
|
+
*
|
|
5
|
+
* NodeMap を type ではなく interface にしているのは、プラグインが declaration merging で
|
|
6
|
+
* ノード型を追加できる余地を残すため (mdast と同じ手法)。
|
|
7
|
+
*
|
|
8
|
+
* すべてのノードは plain object であること。class やメソッドを持たせると
|
|
9
|
+
* `JSON.stringify` / `JSON.parse` で往復できなくなり、worklet や postMessage の
|
|
10
|
+
* 境界を越えられなくなる。
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* ソース上の一点。すべて 0-based (unist は 1-based だが、JS の slice と噛み合わせるため逸脱)。
|
|
14
|
+
*/
|
|
15
|
+
interface Point {
|
|
16
|
+
/** ページ内の行番号。0 = タイトル行 */
|
|
17
|
+
readonly line: number;
|
|
18
|
+
/** 行内の文字オフセット */
|
|
19
|
+
readonly column: number;
|
|
20
|
+
/** ページ全文 (parse に渡した文字列) 中の文字オフセット */
|
|
21
|
+
readonly offset: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* ノードが占めるソース範囲。`end` は exclusive で、
|
|
25
|
+
* `source.slice(start.offset, end.offset)` がそのノードの生の記法テキスト全体
|
|
26
|
+
* (`[`・`#`・バッククォート等のマーカーを含む) と一致する。
|
|
27
|
+
*/
|
|
28
|
+
interface Position {
|
|
29
|
+
readonly start: Point;
|
|
30
|
+
readonly end: Point;
|
|
31
|
+
}
|
|
32
|
+
/** 位置情報を持つノードの共通形。 */
|
|
33
|
+
interface NodeBase {
|
|
34
|
+
readonly type: string;
|
|
35
|
+
readonly position: Position;
|
|
36
|
+
}
|
|
37
|
+
/** 記法として解釈されなかった素のテキスト。 */
|
|
38
|
+
interface TextNode extends NodeBase {
|
|
39
|
+
readonly type: 'text';
|
|
40
|
+
readonly value: string;
|
|
41
|
+
}
|
|
42
|
+
/** `[title]` — 同じプロジェクト内のページへのリンク。 */
|
|
43
|
+
interface InternalLink extends NodeBase {
|
|
44
|
+
readonly type: 'internalLink';
|
|
45
|
+
/** 表示テキスト。内部リンクでは target と同じ */
|
|
46
|
+
readonly label: string;
|
|
47
|
+
/** リンク先のページタイトル */
|
|
48
|
+
readonly target: string;
|
|
49
|
+
}
|
|
50
|
+
/** 裸の URL、`[url]`、`[url label]`、`[label url]`。 */
|
|
51
|
+
interface ExternalLink extends NodeBase {
|
|
52
|
+
readonly type: 'externalLink';
|
|
53
|
+
readonly label: string;
|
|
54
|
+
readonly target: string;
|
|
55
|
+
}
|
|
56
|
+
/** `[/project/title]` — 別プロジェクトのページへのリンク。 */
|
|
57
|
+
interface ProjectLink extends NodeBase {
|
|
58
|
+
readonly type: 'projectLink';
|
|
59
|
+
readonly label: string;
|
|
60
|
+
/** `/project/title` 形式のまま */
|
|
61
|
+
readonly target: string;
|
|
62
|
+
readonly project: string;
|
|
63
|
+
/** プロジェクト名を除いたページタイトル。`[/project]` のようにタイトルが無ければ空文字 */
|
|
64
|
+
readonly title: string;
|
|
65
|
+
}
|
|
66
|
+
/** `#tag` — 内部リンクと同じくページを指すが、記法が異なるので別ノードにする。 */
|
|
67
|
+
interface Hashtag extends NodeBase {
|
|
68
|
+
readonly type: 'hashtag';
|
|
69
|
+
readonly value: string;
|
|
70
|
+
}
|
|
71
|
+
/** バッククォートで囲んだインラインコード。 */
|
|
72
|
+
interface InlineCode extends NodeBase {
|
|
73
|
+
readonly type: 'inlineCode';
|
|
74
|
+
readonly value: string;
|
|
75
|
+
}
|
|
76
|
+
/** `[url.png]` / `[[url.png]]` (large) / `[linkUrl imageUrl]` (link 付き)。 */
|
|
77
|
+
interface ImageNode extends NodeBase {
|
|
78
|
+
readonly type: 'image';
|
|
79
|
+
readonly src: string;
|
|
80
|
+
/** `[[...]]` で囲まれた大きい表示 */
|
|
81
|
+
readonly large?: boolean;
|
|
82
|
+
/** 画像をクリックしたときの遷移先 */
|
|
83
|
+
readonly link?: string;
|
|
84
|
+
}
|
|
85
|
+
/** `[user.icon]` / `[user.icon*N]`。 */
|
|
86
|
+
interface IconNode extends NodeBase {
|
|
87
|
+
readonly type: 'icon';
|
|
88
|
+
readonly user: string;
|
|
89
|
+
/** 連打の個数 (1..20)。記法上省略されていても 1 が入る */
|
|
90
|
+
readonly count: number;
|
|
91
|
+
}
|
|
92
|
+
/** `[$ 数式]`。中身は解釈せず生のまま返す (KaTeX 等に渡す想定)。 */
|
|
93
|
+
interface FormulaNode extends NodeBase {
|
|
94
|
+
readonly type: 'formula';
|
|
95
|
+
readonly value: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* `[* text]` `[/ text]` `[- text]` `[_ text]` とその複合、および `[[text]]`。
|
|
99
|
+
*
|
|
100
|
+
* Cosense では 1 つの記法が複数の装飾を同時に持つ (`[-/ text]` は打ち消し かつ 斜体) ため、
|
|
101
|
+
* Markdown のように入れ子の強調へ分解せずフラグの集合として表す。
|
|
102
|
+
*/
|
|
103
|
+
interface Decoration extends NodeBase {
|
|
104
|
+
readonly type: 'decoration';
|
|
105
|
+
/** 装飾記号を除いた中身の生テキスト */
|
|
106
|
+
readonly value: string;
|
|
107
|
+
readonly bold: boolean;
|
|
108
|
+
readonly italic: boolean;
|
|
109
|
+
readonly strike: boolean;
|
|
110
|
+
readonly underline: boolean;
|
|
111
|
+
/** 見出しサイズ段階 0..4 (`[* ]` = 0 〜 `[***** ]` = 4) */
|
|
112
|
+
readonly sizeLevel: number;
|
|
113
|
+
/** 装飾内のネスト記法 (リンク・アイコン等)。装飾の入れ子は不可 */
|
|
114
|
+
readonly children: readonly InlineNode[];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* インラインノードの一覧。**このパッケージにおけるインライン記法の単一情報源。**
|
|
118
|
+
* 型を足したら Schema と conformance fixture にも追随させること。
|
|
119
|
+
*/
|
|
120
|
+
interface InlineNodeMap {
|
|
121
|
+
text: TextNode;
|
|
122
|
+
internalLink: InternalLink;
|
|
123
|
+
externalLink: ExternalLink;
|
|
124
|
+
projectLink: ProjectLink;
|
|
125
|
+
hashtag: Hashtag;
|
|
126
|
+
inlineCode: InlineCode;
|
|
127
|
+
image: ImageNode;
|
|
128
|
+
icon: IconNode;
|
|
129
|
+
formula: FormulaNode;
|
|
130
|
+
decoration: Decoration;
|
|
131
|
+
}
|
|
132
|
+
type InlineNodeType = keyof InlineNodeMap;
|
|
133
|
+
type InlineNode = InlineNodeMap[InlineNodeType];
|
|
134
|
+
/** ページの 1 行目。`code:` / `table:` として解釈しない (Cosense ではタイトル専用の行)。 */
|
|
135
|
+
interface TitleBlock extends NodeBase {
|
|
136
|
+
readonly type: 'title';
|
|
137
|
+
/** タイトル行の生テキスト。Cosense ではこれがページの識別子でもある */
|
|
138
|
+
readonly value: string;
|
|
139
|
+
readonly children: readonly InlineNode[];
|
|
140
|
+
}
|
|
141
|
+
/** `code:filename` ブロックの本体 1 行。記法は解釈しない。 */
|
|
142
|
+
interface CodeLine extends NodeBase {
|
|
143
|
+
readonly type: 'codeLine';
|
|
144
|
+
/**
|
|
145
|
+
* ブロックの左端に揃えた中身。ヘッダより 1 段深いところを左端とみなすので、
|
|
146
|
+
* それより深いインデントはコード自身の字下げとして残る。
|
|
147
|
+
*/
|
|
148
|
+
readonly value: string;
|
|
149
|
+
}
|
|
150
|
+
/** `code:filename` + それより深いインデントの行。 */
|
|
151
|
+
interface CodeBlock extends NodeBase {
|
|
152
|
+
readonly type: 'codeBlock';
|
|
153
|
+
readonly filename: string;
|
|
154
|
+
/** ヘッダ行のインデント。本体行はこれより深い */
|
|
155
|
+
readonly indent: number;
|
|
156
|
+
/** ヘッダ行自身は含まない */
|
|
157
|
+
readonly lines: readonly CodeLine[];
|
|
158
|
+
}
|
|
159
|
+
/** テーブルの 1 セル。中身は生テキスト (インライン記法は利用側で必要に応じて解釈する)。 */
|
|
160
|
+
interface TableCell extends NodeBase {
|
|
161
|
+
readonly type: 'tableCell';
|
|
162
|
+
readonly value: string;
|
|
163
|
+
}
|
|
164
|
+
/** テーブルの 1 行。タブ区切りでセルに分割済み。 */
|
|
165
|
+
interface TableRow extends NodeBase {
|
|
166
|
+
readonly type: 'tableRow';
|
|
167
|
+
readonly cells: readonly TableCell[];
|
|
168
|
+
}
|
|
169
|
+
/** `table:name` + それより深いインデントの行。 */
|
|
170
|
+
interface TableBlock extends NodeBase {
|
|
171
|
+
readonly type: 'table';
|
|
172
|
+
readonly name: string;
|
|
173
|
+
readonly indent: number;
|
|
174
|
+
readonly rows: readonly TableRow[];
|
|
175
|
+
}
|
|
176
|
+
/** 通常の行。 */
|
|
177
|
+
interface LineBlock extends NodeBase {
|
|
178
|
+
readonly type: 'line';
|
|
179
|
+
/** 行頭の空白 (半角スペース / タブ / 全角スペース) の文字数 */
|
|
180
|
+
readonly indent: number;
|
|
181
|
+
/** `>` で始まる引用行 */
|
|
182
|
+
readonly quote: boolean;
|
|
183
|
+
/** 行頭が `$` / `%` の等幅表示行 */
|
|
184
|
+
readonly monospace: boolean;
|
|
185
|
+
/** 空行では空配列 */
|
|
186
|
+
readonly children: readonly InlineNode[];
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* ブロックノードの一覧。**ブロック構造の単一情報源。**
|
|
190
|
+
* CodeLine / TableRow / TableCell も visitor から辿れるようここに含める。
|
|
191
|
+
*/
|
|
192
|
+
interface BlockNodeMap {
|
|
193
|
+
title: TitleBlock;
|
|
194
|
+
codeBlock: CodeBlock;
|
|
195
|
+
codeLine: CodeLine;
|
|
196
|
+
table: TableBlock;
|
|
197
|
+
tableRow: TableRow;
|
|
198
|
+
tableCell: TableCell;
|
|
199
|
+
line: LineBlock;
|
|
200
|
+
}
|
|
201
|
+
type BlockNodeType = keyof BlockNodeMap;
|
|
202
|
+
type BlockNode = BlockNodeMap[BlockNodeType];
|
|
203
|
+
/** `Page` の直下に並ぶブロック。 */
|
|
204
|
+
type TopLevelBlock = TitleBlock | CodeBlock | TableBlock | LineBlock;
|
|
205
|
+
/** パース結果のルート。 */
|
|
206
|
+
interface Page extends NodeBase {
|
|
207
|
+
readonly type: 'page';
|
|
208
|
+
readonly children: readonly TopLevelBlock[];
|
|
209
|
+
}
|
|
210
|
+
interface RootNodeMap {
|
|
211
|
+
page: Page;
|
|
212
|
+
}
|
|
213
|
+
/** すべてのノード型のマップ。visitor / compiler の handler map はここから導出する。 */
|
|
214
|
+
type AnyNodeMap = RootNodeMap & BlockNodeMap & InlineNodeMap;
|
|
215
|
+
type AnyNodeType = keyof AnyNodeMap;
|
|
216
|
+
type AnyNode = AnyNodeMap[AnyNodeType];
|
|
217
|
+
/** ノード型名からノードの型を引く。`NodeOfType<'image'>` = `ImageNode`。 */
|
|
218
|
+
type NodeOfType<K extends AnyNodeType> = AnyNodeMap[K];
|
|
219
|
+
/**
|
|
220
|
+
* `position` を除いたノード本体。
|
|
221
|
+
*
|
|
222
|
+
* 記法を判定する側は「何のノードか」だけを決め、位置の付与は走査側がまとめて行う。
|
|
223
|
+
* こうしておくと、記法を 1 つ足すたびにオフセット計算を書き足さずに済む。
|
|
224
|
+
*/
|
|
225
|
+
type WithoutPosition<T> = T extends unknown ? Omit<T, 'position'> : never;
|
|
226
|
+
/** 位置を持たないインラインノード。記法ルールの戻り値。 */
|
|
227
|
+
type InlineNodeInit = WithoutPosition<InlineNode>;
|
|
228
|
+
//#endregion
|
|
229
|
+
export { TableCell as A, NodeOfType as C, ProjectLink as D, Position as E, WithoutPosition as F, TextNode as M, TitleBlock as N, RootNodeMap as O, TopLevelBlock as P, NodeBase as S, Point as T, InlineNodeInit as _, BlockNodeMap as a, InternalLink as b, CodeLine as c, FormulaNode as d, Hashtag as f, InlineNode as g, InlineCode as h, BlockNode as i, TableRow as j, TableBlock as k, Decoration as l, ImageNode as m, AnyNodeMap as n, BlockNodeType as o, IconNode as p, AnyNodeType as r, CodeBlock as s, AnyNode as t, ExternalLink as u, InlineNodeMap as v, Page as w, LineBlock as x, InlineNodeType as y };
|
|
230
|
+
//# sourceMappingURL=types-Bo_BrmvK.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-Bo_BrmvK.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;;;;;;UAkBiB;;WAEN;;WAEA;;WAEA;;;;;;;UAQM;WACN,OAAO;WACP,KAAK;;;UAIC;WACN;WACA,UAAU;;;UAQJ,iBAAiB;WACvB;WACA;;;UAIM,qBAAqB;WAC3B;;WAEA;;WAEA;;;UAIM,qBAAqB;WAC3B;WACA;WACA;;;UAIM,oBAAoB;WAC1B;WACA;;WAEA;WACA;;WAEA;;;UAIM,gBAAgB;WACtB;WACA;;;UAIM,mBAAmB;WACzB;WACA;;;UAIM,kBAAkB;WACxB;WACA;;WAEA;;WAEA;;;UAIM,iBAAiB;WACvB;WACA;;WAEA;;;UAIM,oBAAoB;WAC1B;WACA;;;;;;;;UASM,mBAAmB;WACzB;;WAEA;WACA;WACA;WACA;WACA;;WAEA;;WAEA,mBAAmB;;;;;;UAOb;EACf,MAAM;EACN,cAAc;EACd,cAAc;EACd,aAAa;EACb,SAAS;EACT,YAAY;EACZ,OAAO;EACP,MAAM;EACN,SAAS;EACT,YAAY;;KAGF,uBAAuB;KACvB,aAAa,cAAc;;UAOtB,mBAAmB;WACzB;;WAEA;WACA,mBAAmB;;;UAIb,iBAAiB;WACvB;;;;;WAKA;;;UAIM,kBAAkB;WACxB;WACA;;WAEA;;WAEA,gBAAgB;;;UAIV,kBAAkB;WACxB;WACA;;;UAIM,iBAAiB;WACvB;WACA,gBAAgB;;;UAIV,mBAAmB;WACzB;WACA;WACA;WACA,eAAe;;;UAIT,kBAAkB;WACxB;;WAEA;;WAEA;;WAEA;;WAEA,mBAAmB;;;;;;UAOb;EACf,OAAO;EACP,WAAW;EACX,UAAU;EACV,OAAO;EACP,UAAU;EACV,WAAW;EACX,MAAM;;KAGI,sBAAsB;KACtB,YAAY,aAAa;;KAGzB,gBAAgB,aAAa,YAAY,aAAa;;UAOjD,aAAa;WACnB;WACA,mBAAmB;;UAOb;EACf,MAAM;;;KAII,aAAa,cAAc,eAAe;KAE1C,oBAAoB;KACpB,UAAU,WAAW;;KAGrB,WAAW,UAAU,eAAe,WAAW;;;;;;;KAQ/C,gBAAgB,KAAK,oBAAoB,KAAK;;KAG9C,iBAAiB,gBAAgB"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
//#region src/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* types.ts — AST の型定義。このパッケージの単一情報源。
|
|
4
|
+
*
|
|
5
|
+
* NodeMap を type ではなく interface にしているのは、プラグインが declaration merging で
|
|
6
|
+
* ノード型を追加できる余地を残すため (mdast と同じ手法)。
|
|
7
|
+
*
|
|
8
|
+
* すべてのノードは plain object であること。class やメソッドを持たせると
|
|
9
|
+
* `JSON.stringify` / `JSON.parse` で往復できなくなり、worklet や postMessage の
|
|
10
|
+
* 境界を越えられなくなる。
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* ソース上の一点。すべて 0-based (unist は 1-based だが、JS の slice と噛み合わせるため逸脱)。
|
|
14
|
+
*/
|
|
15
|
+
interface Point {
|
|
16
|
+
/** ページ内の行番号。0 = タイトル行 */
|
|
17
|
+
readonly line: number;
|
|
18
|
+
/** 行内の文字オフセット */
|
|
19
|
+
readonly column: number;
|
|
20
|
+
/** ページ全文 (parse に渡した文字列) 中の文字オフセット */
|
|
21
|
+
readonly offset: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* ノードが占めるソース範囲。`end` は exclusive で、
|
|
25
|
+
* `source.slice(start.offset, end.offset)` がそのノードの生の記法テキスト全体
|
|
26
|
+
* (`[`・`#`・バッククォート等のマーカーを含む) と一致する。
|
|
27
|
+
*/
|
|
28
|
+
interface Position {
|
|
29
|
+
readonly start: Point;
|
|
30
|
+
readonly end: Point;
|
|
31
|
+
}
|
|
32
|
+
/** 位置情報を持つノードの共通形。 */
|
|
33
|
+
interface NodeBase {
|
|
34
|
+
readonly type: string;
|
|
35
|
+
readonly position: Position;
|
|
36
|
+
}
|
|
37
|
+
/** 記法として解釈されなかった素のテキスト。 */
|
|
38
|
+
interface TextNode extends NodeBase {
|
|
39
|
+
readonly type: 'text';
|
|
40
|
+
readonly value: string;
|
|
41
|
+
}
|
|
42
|
+
/** `[title]` — 同じプロジェクト内のページへのリンク。 */
|
|
43
|
+
interface InternalLink extends NodeBase {
|
|
44
|
+
readonly type: 'internalLink';
|
|
45
|
+
/** 表示テキスト。内部リンクでは target と同じ */
|
|
46
|
+
readonly label: string;
|
|
47
|
+
/** リンク先のページタイトル */
|
|
48
|
+
readonly target: string;
|
|
49
|
+
}
|
|
50
|
+
/** 裸の URL、`[url]`、`[url label]`、`[label url]`。 */
|
|
51
|
+
interface ExternalLink extends NodeBase {
|
|
52
|
+
readonly type: 'externalLink';
|
|
53
|
+
readonly label: string;
|
|
54
|
+
readonly target: string;
|
|
55
|
+
}
|
|
56
|
+
/** `[/project/title]` — 別プロジェクトのページへのリンク。 */
|
|
57
|
+
interface ProjectLink extends NodeBase {
|
|
58
|
+
readonly type: 'projectLink';
|
|
59
|
+
readonly label: string;
|
|
60
|
+
/** `/project/title` 形式のまま */
|
|
61
|
+
readonly target: string;
|
|
62
|
+
readonly project: string;
|
|
63
|
+
/** プロジェクト名を除いたページタイトル。`[/project]` のようにタイトルが無ければ空文字 */
|
|
64
|
+
readonly title: string;
|
|
65
|
+
}
|
|
66
|
+
/** `#tag` — 内部リンクと同じくページを指すが、記法が異なるので別ノードにする。 */
|
|
67
|
+
interface Hashtag extends NodeBase {
|
|
68
|
+
readonly type: 'hashtag';
|
|
69
|
+
readonly value: string;
|
|
70
|
+
}
|
|
71
|
+
/** バッククォートで囲んだインラインコード。 */
|
|
72
|
+
interface InlineCode extends NodeBase {
|
|
73
|
+
readonly type: 'inlineCode';
|
|
74
|
+
readonly value: string;
|
|
75
|
+
}
|
|
76
|
+
/** `[url.png]` / `[[url.png]]` (large) / `[linkUrl imageUrl]` (link 付き)。 */
|
|
77
|
+
interface ImageNode extends NodeBase {
|
|
78
|
+
readonly type: 'image';
|
|
79
|
+
readonly src: string;
|
|
80
|
+
/** `[[...]]` で囲まれた大きい表示 */
|
|
81
|
+
readonly large?: boolean;
|
|
82
|
+
/** 画像をクリックしたときの遷移先 */
|
|
83
|
+
readonly link?: string;
|
|
84
|
+
}
|
|
85
|
+
/** `[user.icon]` / `[user.icon*N]`。 */
|
|
86
|
+
interface IconNode extends NodeBase {
|
|
87
|
+
readonly type: 'icon';
|
|
88
|
+
readonly user: string;
|
|
89
|
+
/** 連打の個数 (1..20)。記法上省略されていても 1 が入る */
|
|
90
|
+
readonly count: number;
|
|
91
|
+
}
|
|
92
|
+
/** `[$ 数式]`。中身は解釈せず生のまま返す (KaTeX 等に渡す想定)。 */
|
|
93
|
+
interface FormulaNode extends NodeBase {
|
|
94
|
+
readonly type: 'formula';
|
|
95
|
+
readonly value: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* `[* text]` `[/ text]` `[- text]` `[_ text]` とその複合、および `[[text]]`。
|
|
99
|
+
*
|
|
100
|
+
* Cosense では 1 つの記法が複数の装飾を同時に持つ (`[-/ text]` は打ち消し かつ 斜体) ため、
|
|
101
|
+
* Markdown のように入れ子の強調へ分解せずフラグの集合として表す。
|
|
102
|
+
*/
|
|
103
|
+
interface Decoration extends NodeBase {
|
|
104
|
+
readonly type: 'decoration';
|
|
105
|
+
/** 装飾記号を除いた中身の生テキスト */
|
|
106
|
+
readonly value: string;
|
|
107
|
+
readonly bold: boolean;
|
|
108
|
+
readonly italic: boolean;
|
|
109
|
+
readonly strike: boolean;
|
|
110
|
+
readonly underline: boolean;
|
|
111
|
+
/** 見出しサイズ段階 0..4 (`[* ]` = 0 〜 `[***** ]` = 4) */
|
|
112
|
+
readonly sizeLevel: number;
|
|
113
|
+
/** 装飾内のネスト記法 (リンク・アイコン等)。装飾の入れ子は不可 */
|
|
114
|
+
readonly children: readonly InlineNode[];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* インラインノードの一覧。**このパッケージにおけるインライン記法の単一情報源。**
|
|
118
|
+
* 型を足したら Schema と conformance fixture にも追随させること。
|
|
119
|
+
*/
|
|
120
|
+
interface InlineNodeMap {
|
|
121
|
+
text: TextNode;
|
|
122
|
+
internalLink: InternalLink;
|
|
123
|
+
externalLink: ExternalLink;
|
|
124
|
+
projectLink: ProjectLink;
|
|
125
|
+
hashtag: Hashtag;
|
|
126
|
+
inlineCode: InlineCode;
|
|
127
|
+
image: ImageNode;
|
|
128
|
+
icon: IconNode;
|
|
129
|
+
formula: FormulaNode;
|
|
130
|
+
decoration: Decoration;
|
|
131
|
+
}
|
|
132
|
+
type InlineNodeType = keyof InlineNodeMap;
|
|
133
|
+
type InlineNode = InlineNodeMap[InlineNodeType];
|
|
134
|
+
/** ページの 1 行目。`code:` / `table:` として解釈しない (Cosense ではタイトル専用の行)。 */
|
|
135
|
+
interface TitleBlock extends NodeBase {
|
|
136
|
+
readonly type: 'title';
|
|
137
|
+
/** タイトル行の生テキスト。Cosense ではこれがページの識別子でもある */
|
|
138
|
+
readonly value: string;
|
|
139
|
+
readonly children: readonly InlineNode[];
|
|
140
|
+
}
|
|
141
|
+
/** `code:filename` ブロックの本体 1 行。記法は解釈しない。 */
|
|
142
|
+
interface CodeLine extends NodeBase {
|
|
143
|
+
readonly type: 'codeLine';
|
|
144
|
+
/**
|
|
145
|
+
* ブロックの左端に揃えた中身。ヘッダより 1 段深いところを左端とみなすので、
|
|
146
|
+
* それより深いインデントはコード自身の字下げとして残る。
|
|
147
|
+
*/
|
|
148
|
+
readonly value: string;
|
|
149
|
+
}
|
|
150
|
+
/** `code:filename` + それより深いインデントの行。 */
|
|
151
|
+
interface CodeBlock extends NodeBase {
|
|
152
|
+
readonly type: 'codeBlock';
|
|
153
|
+
readonly filename: string;
|
|
154
|
+
/** ヘッダ行のインデント。本体行はこれより深い */
|
|
155
|
+
readonly indent: number;
|
|
156
|
+
/** ヘッダ行自身は含まない */
|
|
157
|
+
readonly lines: readonly CodeLine[];
|
|
158
|
+
}
|
|
159
|
+
/** テーブルの 1 セル。中身は生テキスト (インライン記法は利用側で必要に応じて解釈する)。 */
|
|
160
|
+
interface TableCell extends NodeBase {
|
|
161
|
+
readonly type: 'tableCell';
|
|
162
|
+
readonly value: string;
|
|
163
|
+
}
|
|
164
|
+
/** テーブルの 1 行。タブ区切りでセルに分割済み。 */
|
|
165
|
+
interface TableRow extends NodeBase {
|
|
166
|
+
readonly type: 'tableRow';
|
|
167
|
+
readonly cells: readonly TableCell[];
|
|
168
|
+
}
|
|
169
|
+
/** `table:name` + それより深いインデントの行。 */
|
|
170
|
+
interface TableBlock extends NodeBase {
|
|
171
|
+
readonly type: 'table';
|
|
172
|
+
readonly name: string;
|
|
173
|
+
readonly indent: number;
|
|
174
|
+
readonly rows: readonly TableRow[];
|
|
175
|
+
}
|
|
176
|
+
/** 通常の行。 */
|
|
177
|
+
interface LineBlock extends NodeBase {
|
|
178
|
+
readonly type: 'line';
|
|
179
|
+
/** 行頭の空白 (半角スペース / タブ / 全角スペース) の文字数 */
|
|
180
|
+
readonly indent: number;
|
|
181
|
+
/** `>` で始まる引用行 */
|
|
182
|
+
readonly quote: boolean;
|
|
183
|
+
/** 行頭が `$` / `%` の等幅表示行 */
|
|
184
|
+
readonly monospace: boolean;
|
|
185
|
+
/** 空行では空配列 */
|
|
186
|
+
readonly children: readonly InlineNode[];
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* ブロックノードの一覧。**ブロック構造の単一情報源。**
|
|
190
|
+
* CodeLine / TableRow / TableCell も visitor から辿れるようここに含める。
|
|
191
|
+
*/
|
|
192
|
+
interface BlockNodeMap {
|
|
193
|
+
title: TitleBlock;
|
|
194
|
+
codeBlock: CodeBlock;
|
|
195
|
+
codeLine: CodeLine;
|
|
196
|
+
table: TableBlock;
|
|
197
|
+
tableRow: TableRow;
|
|
198
|
+
tableCell: TableCell;
|
|
199
|
+
line: LineBlock;
|
|
200
|
+
}
|
|
201
|
+
type BlockNodeType = keyof BlockNodeMap;
|
|
202
|
+
type BlockNode = BlockNodeMap[BlockNodeType];
|
|
203
|
+
/** `Page` の直下に並ぶブロック。 */
|
|
204
|
+
type TopLevelBlock = TitleBlock | CodeBlock | TableBlock | LineBlock;
|
|
205
|
+
/** パース結果のルート。 */
|
|
206
|
+
interface Page extends NodeBase {
|
|
207
|
+
readonly type: 'page';
|
|
208
|
+
readonly children: readonly TopLevelBlock[];
|
|
209
|
+
}
|
|
210
|
+
interface RootNodeMap {
|
|
211
|
+
page: Page;
|
|
212
|
+
}
|
|
213
|
+
/** すべてのノード型のマップ。visitor / compiler の handler map はここから導出する。 */
|
|
214
|
+
type AnyNodeMap = RootNodeMap & BlockNodeMap & InlineNodeMap;
|
|
215
|
+
type AnyNodeType = keyof AnyNodeMap;
|
|
216
|
+
type AnyNode = AnyNodeMap[AnyNodeType];
|
|
217
|
+
/** ノード型名からノードの型を引く。`NodeOfType<'image'>` = `ImageNode`。 */
|
|
218
|
+
type NodeOfType<K extends AnyNodeType> = AnyNodeMap[K];
|
|
219
|
+
/**
|
|
220
|
+
* `position` を除いたノード本体。
|
|
221
|
+
*
|
|
222
|
+
* 記法を判定する側は「何のノードか」だけを決め、位置の付与は走査側がまとめて行う。
|
|
223
|
+
* こうしておくと、記法を 1 つ足すたびにオフセット計算を書き足さずに済む。
|
|
224
|
+
*/
|
|
225
|
+
type WithoutPosition<T> = T extends unknown ? Omit<T, 'position'> : never;
|
|
226
|
+
/** 位置を持たないインラインノード。記法ルールの戻り値。 */
|
|
227
|
+
type InlineNodeInit = WithoutPosition<InlineNode>;
|
|
228
|
+
//#endregion
|
|
229
|
+
export { TableCell as A, NodeOfType as C, ProjectLink as D, Position as E, WithoutPosition as F, TextNode as M, TitleBlock as N, RootNodeMap as O, TopLevelBlock as P, NodeBase as S, Point as T, InlineNodeInit as _, BlockNodeMap as a, InternalLink as b, CodeLine as c, FormulaNode as d, Hashtag as f, InlineNode as g, InlineCode as h, BlockNode as i, TableRow as j, TableBlock as k, Decoration as l, ImageNode as m, AnyNodeMap as n, BlockNodeType as o, IconNode as p, AnyNodeType as r, CodeBlock as s, AnyNode as t, ExternalLink as u, InlineNodeMap as v, Page as w, LineBlock as x, InlineNodeType as y };
|
|
230
|
+
//# sourceMappingURL=types-Bo_BrmvK.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-Bo_BrmvK.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;;;;;;UAkBiB;;WAEN;;WAEA;;WAEA;;;;;;;UAQM;WACN,OAAO;WACP,KAAK;;;UAIC;WACN;WACA,UAAU;;;UAQJ,iBAAiB;WACvB;WACA;;;UAIM,qBAAqB;WAC3B;;WAEA;;WAEA;;;UAIM,qBAAqB;WAC3B;WACA;WACA;;;UAIM,oBAAoB;WAC1B;WACA;;WAEA;WACA;;WAEA;;;UAIM,gBAAgB;WACtB;WACA;;;UAIM,mBAAmB;WACzB;WACA;;;UAIM,kBAAkB;WACxB;WACA;;WAEA;;WAEA;;;UAIM,iBAAiB;WACvB;WACA;;WAEA;;;UAIM,oBAAoB;WAC1B;WACA;;;;;;;;UASM,mBAAmB;WACzB;;WAEA;WACA;WACA;WACA;WACA;;WAEA;;WAEA,mBAAmB;;;;;;UAOb;EACf,MAAM;EACN,cAAc;EACd,cAAc;EACd,aAAa;EACb,SAAS;EACT,YAAY;EACZ,OAAO;EACP,MAAM;EACN,SAAS;EACT,YAAY;;KAGF,uBAAuB;KACvB,aAAa,cAAc;;UAOtB,mBAAmB;WACzB;;WAEA;WACA,mBAAmB;;;UAIb,iBAAiB;WACvB;;;;;WAKA;;;UAIM,kBAAkB;WACxB;WACA;;WAEA;;WAEA,gBAAgB;;;UAIV,kBAAkB;WACxB;WACA;;;UAIM,iBAAiB;WACvB;WACA,gBAAgB;;;UAIV,mBAAmB;WACzB;WACA;WACA;WACA,eAAe;;;UAIT,kBAAkB;WACxB;;WAEA;;WAEA;;WAEA;;WAEA,mBAAmB;;;;;;UAOb;EACf,OAAO;EACP,WAAW;EACX,UAAU;EACV,OAAO;EACP,UAAU;EACV,WAAW;EACX,MAAM;;KAGI,sBAAsB;KACtB,YAAY,aAAa;;KAGzB,gBAAgB,aAAa,YAAY,aAAa;;UAOjD,aAAa;WACnB;WACA,mBAAmB;;UAOb;EACf,MAAM;;;KAII,aAAa,cAAc,eAAe;KAE1C,oBAAoB;KACpB,UAAU,WAAW;;KAGrB,WAAW,UAAU,eAAe,WAAW;;;;;;;KAQ/C,gBAAgB,KAAK,oBAAoB,KAAK;;KAG9C,iBAAiB,gBAAgB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { _ as InlineNodeInit, g as InlineNode } from "./types-Bo_BrmvK.cjs";
|
|
2
|
+
import { Option } from "effect";
|
|
3
|
+
//#region src/core/position.d.ts
|
|
4
|
+
/** 走査対象の文字列のインデックス 0 が、ソース上のどこにあるか。 */
|
|
5
|
+
interface Origin {
|
|
6
|
+
readonly line: number;
|
|
7
|
+
readonly column: number;
|
|
8
|
+
readonly offset: number;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region src/inline/types.d.ts
|
|
12
|
+
/**
|
|
13
|
+
* 走査中に共有される文脈。
|
|
14
|
+
*
|
|
15
|
+
* `tokenize` は装飾の中身のように部分文字列を再帰的に解析するためのフック。
|
|
16
|
+
* ルールが走査ループを直接 import すると循環参照になるので、文脈経由で渡している。
|
|
17
|
+
*/
|
|
18
|
+
interface InlineContext {
|
|
19
|
+
/** 装飾記法 (`[* ]` 等) を解釈してよいか。装飾の中では false (入れ子不可) */
|
|
20
|
+
readonly allowDecoration: boolean;
|
|
21
|
+
/** 走査対象 `source` のインデックス 0 がソース上のどこか */
|
|
22
|
+
readonly origin: Origin;
|
|
23
|
+
/** 拡張が追加した `[...]` のルール。既定のルールより先に試される */
|
|
24
|
+
readonly bracketRules: readonly BracketRule[];
|
|
25
|
+
readonly tokenize: (source: string, origin: Origin, allowDecoration: boolean) => readonly InlineNode[];
|
|
26
|
+
}
|
|
27
|
+
/** 記法が成立したときの結果。`length` は `index` から消費した文字数。 */
|
|
28
|
+
interface ConstructMatch {
|
|
29
|
+
readonly node: InlineNodeInit;
|
|
30
|
+
readonly length: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 行内の走査ルール。`source[index]` から記法が始まるなら Some を返す。
|
|
34
|
+
*
|
|
35
|
+
* None を返すと呼び出し側は 1 文字を素のテキストとして消費して次に進むので、
|
|
36
|
+
* 「記法として無効なので `[` は素の文字」といったケースも None で表せる。
|
|
37
|
+
*/
|
|
38
|
+
type InlineConstruct = (source: string, index: number, ctx: InlineContext) => Option.Option<ConstructMatch>;
|
|
39
|
+
/** `[...]` の中身を解釈するルールに渡る文脈。 */
|
|
40
|
+
interface BracketRuleContext extends InlineContext {
|
|
41
|
+
/** `inner` のインデックス 0 がソース上のどこか (子ノードの位置計算に使う) */
|
|
42
|
+
readonly innerOrigin: Origin;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* `[...]` の中身を解釈するルール。角括弧そのものは呼び出し側が扱うので、
|
|
46
|
+
* ルールは中身の文字列だけを見る。None なら次のルールへ、全部 None なら記法として無効。
|
|
47
|
+
*/
|
|
48
|
+
type BracketRule = (inner: string, ctx: BracketRuleContext) => Option.Option<InlineNodeInit>;
|
|
49
|
+
/**
|
|
50
|
+
* 記法の拡張。`parse` / `tokenizeInline` の options に渡すと、
|
|
51
|
+
* **既定のルールより先に**試されるようになる。
|
|
52
|
+
*
|
|
53
|
+
* 既定の記法を無効化する手段は今のところ用意していない (必要になれば非破壊に追加する)。
|
|
54
|
+
*/
|
|
55
|
+
interface Extension {
|
|
56
|
+
/** 行内の走査ルール。新しい開始文字を持つ記法を足すときはこちら */
|
|
57
|
+
readonly constructs?: readonly InlineConstruct[];
|
|
58
|
+
/** `[...]` の中身の解釈ルール。角括弧記法のバリエーションを足すときはこちら */
|
|
59
|
+
readonly bracketRules?: readonly BracketRule[];
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { InlineConstruct as a, Extension as i, BracketRuleContext as n, InlineContext as o, ConstructMatch as r, Origin as s, BracketRule as t };
|
|
63
|
+
//# sourceMappingURL=types-DVwlUtla.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-DVwlUtla.d.cts","names":[],"sources":["../src/core/position.ts","../src/inline/types.ts"],"mappings":";;;;UAUiB;WACN;WACA;WACA;;;;;;;;;;UCEM;;WAEN;;WAEA,QAAQ;;WAER,uBAAuB;WACvB,WACP,gBACA,QAAQ,QACR,sCACY;;;UAIC;WACN,MAAM;WACN;;;;;;;;KASC,mBACV,gBACA,eACA,KAAK,kBACF,OAAO,OAAO;;UAGF,2BAA2B;;WAEjC,aAAa;;;;;;KAOZ,eAAe,eAAe,KAAK,uBAAuB,OAAO,OAAO;;;;;;;UAQnE;;WAEN,sBAAsB;;WAEtB,wBAAwB"}
|