@open-guji/markdown-core 0.1.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.
@@ -0,0 +1,479 @@
1
+ /**
2
+ * 规范化器:古籍 Markdown 短记号 → Directive Markdown。
3
+ *
4
+ * 规范见 spec/syntax.md 与 spec/directives.md。三条硬性保证:
5
+ *
6
+ * 1. 逐行处理,输出行数与行序不变;
7
+ * 2. 幂等:`normalize(normalize(x)) === normalize(x)`;
8
+ * 3. 不生效区(代码块、代码片段、链接目标、HTML、转义)逐字保留。
9
+ */
10
+ import { resolveSyntaxOptions } from './options.js';
11
+ /** 掩码串中代表「此字符不参与记号识别」的哨兵。 */
12
+ const NUL = '\u0000';
13
+ const ASCII_PUNCT = new Set("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~");
14
+ /** CJK 统一表意文字(含扩展 A、兼容区,以及代理对表示的扩展 B 以上)。 */
15
+ const CJK_RE = /[㐀-䶿一-鿿豈-﫿]|[\ud840-\ud8ff][\udc00-\udfff]/;
16
+ /** 原始 HTML 标签、注释、声明、自动链接、邮件自动链接。 */
17
+ const RAW_ANGLE_RE = /^<(?:!--[\s\S]*?--|![A-Za-z][^<>]*|\?[^<>]*\?|\/[A-Za-z][A-Za-z0-9-]*[ \t]*|[A-Za-z][A-Za-z0-9-]*(?:[ \t][^<>]*?)?\/?|[A-Za-z][A-Za-z0-9+.-]*:[^<>\s]*|[^\s<>@]+@[^\s<>@]+)>/;
18
+ /** 行首块结构前缀:缩进、块引用、列表标记、ATX 标题标记。 */
19
+ const BLOCK_PREFIX_RE = /^([ \t]*(?:>[ \t]?)*[ \t]*(?:(?:[-*+]|\d{1,9}[.)])[ \t]+|#{1,6}[ \t]+)?[ \t]*)/;
20
+ function isAsciiAlnum(c) {
21
+ if (c === undefined)
22
+ return false;
23
+ return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
24
+ }
25
+ function isSpace(c) {
26
+ return c !== undefined && /\s/.test(c);
27
+ }
28
+ function hasCjk(s) {
29
+ return CJK_RE.test(s);
30
+ }
31
+ function matchFence(line) {
32
+ const m = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);
33
+ if (!m)
34
+ return undefined;
35
+ const info = m[2];
36
+ // 反引号围栏的 info string 不得含反引号
37
+ if (m[1][0] === '`' && info.includes('`'))
38
+ return undefined;
39
+ return { char: m[1][0], len: m[1].length, info: info.trim() };
40
+ }
41
+ /** 去掉块引用标记后,剩余内容的缩进量(tab 记 4)。 */
42
+ function contentIndent(line) {
43
+ const rest = line.replace(/^(?:[ \t]*(?:>[ \t]?)+)/, '');
44
+ let n = 0;
45
+ for (const c of rest) {
46
+ if (c === ' ')
47
+ n += 1;
48
+ else if (c === '\t')
49
+ n += 4;
50
+ else
51
+ break;
52
+ }
53
+ return n;
54
+ }
55
+ /**
56
+ * 构造与 `s` 等长的掩码串:不生效区的字符置为 NUL。
57
+ * 之后所有记号匹配都在掩码串上做、输出时取原串,索引天然对齐。
58
+ */
59
+ export function buildMask(s) {
60
+ const mask = s.split('');
61
+ const blank = (from, to) => {
62
+ for (let k = from; k < to; k++)
63
+ mask[k] = NUL;
64
+ };
65
+ let i = 0;
66
+ while (i < s.length) {
67
+ const c = s[i];
68
+ // 反斜杠转义
69
+ if (c === '\\' && i + 1 < s.length && ASCII_PUNCT.has(s[i + 1])) {
70
+ blank(i, i + 2);
71
+ i += 2;
72
+ continue;
73
+ }
74
+ // 代码片段:等长反引号串配对
75
+ if (c === '`') {
76
+ let n = 0;
77
+ while (s[i + n] === '`')
78
+ n++;
79
+ let j = i + n;
80
+ let close = -1;
81
+ while (j < s.length) {
82
+ if (s[j] === '`') {
83
+ let m = 0;
84
+ while (s[j + m] === '`')
85
+ m++;
86
+ if (m === n) {
87
+ close = j;
88
+ break;
89
+ }
90
+ j += m;
91
+ }
92
+ else {
93
+ j++;
94
+ }
95
+ }
96
+ if (close >= 0) {
97
+ blank(i, close + n);
98
+ i = close + n;
99
+ }
100
+ else {
101
+ blank(i, i + n);
102
+ i += n;
103
+ }
104
+ continue;
105
+ }
106
+ // 原始 HTML / 自动链接
107
+ if (c === '<') {
108
+ const m = RAW_ANGLE_RE.exec(s.slice(i));
109
+ if (m) {
110
+ blank(i, i + m[0].length);
111
+ i += m[0].length;
112
+ continue;
113
+ }
114
+ }
115
+ // 行内链接 / 图片的目标部分:`](` … `)`
116
+ if (c === '(' && i > 0 && s[i - 1] === ']') {
117
+ let depth = 1;
118
+ let j = i + 1;
119
+ while (j < s.length && depth > 0) {
120
+ const d = s[j];
121
+ if (d === '\\')
122
+ j++;
123
+ else if (d === '(')
124
+ depth++;
125
+ else if (d === ')')
126
+ depth--;
127
+ j++;
128
+ }
129
+ if (depth === 0) {
130
+ blank(i, j);
131
+ i = j;
132
+ continue;
133
+ }
134
+ }
135
+ i++;
136
+ }
137
+ return mask.join('');
138
+ }
139
+ function canOpenJz(mask, i, end) {
140
+ if (i + 1 >= end)
141
+ return false;
142
+ const next = mask[i + 1];
143
+ if (next === undefined || next === NUL)
144
+ return false;
145
+ // 避开 HTML 标签、闭合标签、注释/声明、自动链接、空夹注
146
+ return !/[A-Za-z/!?>\s]/.test(next);
147
+ }
148
+ /**
149
+ * 改字 `[…]` 的起始条件。方括号在 Markdown 里用得很多,
150
+ * 这里逐项排除:指令 label(`:jz[`)、图片(`![`)、引用式链接(`][`)、
151
+ * 脚注(`[^`)、任务列表(`[ ]`)、以及预留给阙文的 `[[…]]`。
152
+ */
153
+ function canOpenGz(src, mask, i, end) {
154
+ const prev = i > 0 ? src[i - 1] : undefined;
155
+ if (prev !== undefined && (isAsciiAlnum(prev) || prev === '!' || prev === '[' || prev === ']')) {
156
+ return false;
157
+ }
158
+ if (i + 1 >= end)
159
+ return false;
160
+ const next = mask[i + 1];
161
+ if (next === undefined || next === NUL)
162
+ return false;
163
+ return !isSpace(next) && next !== ']' && next !== '[' && next !== '^';
164
+ }
165
+ /**
166
+ * 改字的结束条件:内容不得含 `[`,且结束的 `]` 之后不能是
167
+ * `(`(行内链接)、`[`(引用式链接)或 `:`(链接定义)。
168
+ */
169
+ function findGzClose(src, mask, from, end, o) {
170
+ let i = from;
171
+ while (i < end && i - from <= o.maxSpanLength) {
172
+ if (mask[i] === NUL) {
173
+ i++;
174
+ continue;
175
+ }
176
+ if (mask[i] === '[')
177
+ return -1;
178
+ if (mask[i] !== ']') {
179
+ i++;
180
+ continue;
181
+ }
182
+ const prev = src[i - 1];
183
+ const next = src[i + 1];
184
+ if (isSpace(prev))
185
+ return -1;
186
+ if (next === '(' || next === '[' || next === ':')
187
+ return -1;
188
+ const content = src.slice(from, i);
189
+ if (content.length === 0)
190
+ return -1;
191
+ if (o.gzRequireCjk && !hasCjk(content))
192
+ return -1;
193
+ return i;
194
+ }
195
+ return -1;
196
+ }
197
+ function canOpenZm(src, mask, i, end) {
198
+ const prev = i > 0 ? src[i - 1] : undefined;
199
+ if (prev !== undefined && (isAsciiAlnum(prev) || prev === ':' || prev === '/'))
200
+ return false;
201
+ if (i + 1 >= end)
202
+ return false;
203
+ const next = mask[i + 1];
204
+ if (next === undefined || next === NUL)
205
+ return false;
206
+ return !isSpace(next) && next !== '/';
207
+ }
208
+ /** 找配对的结束记号,支持同类嵌套;找不到返回 -1。 */
209
+ function findPair(mask, from, end, open, close) {
210
+ let depth = 1;
211
+ let i = from;
212
+ while (i < end) {
213
+ if (mask[i] === NUL) {
214
+ i++;
215
+ continue;
216
+ }
217
+ if (i + close.length <= end && mask.startsWith(close, i)) {
218
+ depth--;
219
+ if (depth === 0)
220
+ return i;
221
+ i += close.length;
222
+ continue;
223
+ }
224
+ if (i + open.length <= end && mask.startsWith(open, i)) {
225
+ depth += 1;
226
+ i += open.length;
227
+ continue;
228
+ }
229
+ i++;
230
+ }
231
+ return -1;
232
+ }
233
+ /** 夹注的配对:嵌套的 `<` 也须通过起始条件才计数。 */
234
+ function findJzClose(mask, from, end) {
235
+ let depth = 1;
236
+ let i = from;
237
+ while (i < end) {
238
+ const c = mask[i];
239
+ if (c === NUL) {
240
+ i++;
241
+ continue;
242
+ }
243
+ if (c === '>') {
244
+ depth--;
245
+ if (depth === 0)
246
+ return i;
247
+ i++;
248
+ continue;
249
+ }
250
+ if (c === '<' && canOpenJz(mask, i, end))
251
+ depth++;
252
+ i++;
253
+ }
254
+ return -1;
255
+ }
256
+ /** 专名号的结束条件较特殊:内容不得含 `/`,且默认必须含 CJK。 */
257
+ function findZmClose(src, mask, from, end, o) {
258
+ let i = from;
259
+ while (i < end && i - from <= o.maxSpanLength) {
260
+ if (mask[i] === NUL) {
261
+ i++;
262
+ continue;
263
+ }
264
+ if (mask[i] !== '/') {
265
+ i++;
266
+ continue;
267
+ }
268
+ // 遇到的第一个 `/` 要么合法收尾,要么整体作废
269
+ const prev = src[i - 1];
270
+ const next = src[i + 1];
271
+ if (isSpace(prev) || next === '/')
272
+ return -1;
273
+ const content = src.slice(from, i);
274
+ if (content.length === 0)
275
+ return -1;
276
+ if (o.zmRequireCjk && !hasCjk(content))
277
+ return -1;
278
+ return i;
279
+ }
280
+ return -1;
281
+ }
282
+ /**
283
+ * 转义 label 中不配对的方括号,否则指令会被提前截断。
284
+ * 配对的方括号(例如 label 内含链接)保持原样。
285
+ */
286
+ export function escapeDirectiveLabel(s) {
287
+ const open = [];
288
+ const bad = new Set();
289
+ for (let i = 0; i < s.length; i++) {
290
+ const c = s[i];
291
+ if (c === '\\') {
292
+ i++;
293
+ continue;
294
+ }
295
+ if (c === '[')
296
+ open.push(i);
297
+ else if (c === ']') {
298
+ if (open.length > 0)
299
+ open.pop();
300
+ else
301
+ bad.add(i);
302
+ }
303
+ }
304
+ for (const i of open)
305
+ bad.add(i);
306
+ if (bad.size === 0)
307
+ return s;
308
+ let out = '';
309
+ for (let i = 0; i < s.length; i++) {
310
+ if (bad.has(i))
311
+ out += '\\';
312
+ out += s[i];
313
+ }
314
+ return out;
315
+ }
316
+ function emit(name, label) {
317
+ return ':' + name + '[' + escapeDirectiveLabel(label) + ']';
318
+ }
319
+ /**
320
+ * 在 [start, end) 范围内扫描行内记号,递归处理内容。
321
+ * 起始记号的优先级:`((` > `{{` > `《` > `[` > `<` > `/`(见 spec/syntax.md §11.1)。
322
+ */
323
+ function transformRange(src, mask, start, end, o) {
324
+ let out = '';
325
+ let i = start;
326
+ while (i < end) {
327
+ const c = mask[i];
328
+ if (c === NUL) {
329
+ out += src[i];
330
+ i++;
331
+ continue;
332
+ }
333
+ if (o.bz && c === '(' && mask[i + 1] === '(') {
334
+ const close = findPair(mask, i + 2, end, '((', '))');
335
+ if (close > i + 2 && close - (i + 2) <= o.maxSpanLength) {
336
+ out += emit('bz', transformRange(src, mask, i + 2, close, o));
337
+ i = close + 2;
338
+ continue;
339
+ }
340
+ }
341
+ if (o.sz && c === '{' && mask[i + 1] === '{') {
342
+ const close = findPair(mask, i + 2, end, '{{', '}}');
343
+ if (close > i + 2 && close - (i + 2) <= o.maxSpanLength) {
344
+ out += emit('sz', transformRange(src, mask, i + 2, close, o));
345
+ i = close + 2;
346
+ continue;
347
+ }
348
+ }
349
+ if (o.sm && c === '《') {
350
+ const close = findPair(mask, i + 1, end, '《', '》');
351
+ if (close > i + 1 && close - (i + 1) <= o.maxSpanLength) {
352
+ out += emit('sm', transformRange(src, mask, i + 1, close, o));
353
+ i = close + 1;
354
+ continue;
355
+ }
356
+ }
357
+ if (o.gz && c === '[' && canOpenGz(src, mask, i, end)) {
358
+ const close = findGzClose(src, mask, i + 1, end, o);
359
+ if (close > i + 1) {
360
+ out += emit('gz', transformRange(src, mask, i + 1, close, o));
361
+ i = close + 1;
362
+ continue;
363
+ }
364
+ }
365
+ if (o.jz && c === '<' && canOpenJz(mask, i, end)) {
366
+ const close = findJzClose(mask, i + 1, end);
367
+ if (close > i + 1 && close - (i + 1) <= o.maxSpanLength) {
368
+ out += emit('jz', transformRange(src, mask, i + 1, close, o));
369
+ i = close + 1;
370
+ continue;
371
+ }
372
+ }
373
+ if (o.zm && c === '/' && canOpenZm(src, mask, i, end)) {
374
+ const close = findZmClose(src, mask, i + 1, end, o);
375
+ if (close > i + 1) {
376
+ out += emit('zm', transformRange(src, mask, i + 1, close, o));
377
+ i = close + 1;
378
+ continue;
379
+ }
380
+ }
381
+ out += src[i];
382
+ i++;
383
+ }
384
+ return out;
385
+ }
386
+ /** 只做行内记号的转换,供测试与其他实现参考。 */
387
+ export function transformInline(text, options) {
388
+ if (text === '')
389
+ return text;
390
+ const o = resolveSyntaxOptions(options);
391
+ return transformRange(text, buildMask(text), 0, text.length, o);
392
+ }
393
+ /**
394
+ * 古籍 Markdown → Directive Markdown。
395
+ *
396
+ * @example
397
+ * gujiToDirective('^惟我\n.皇上<聖躬>')
398
+ * // ':tt{n=1}惟我\n:kg{n=1}皇上:jz[聖躬]'
399
+ */
400
+ export function gujiToDirective(source, options) {
401
+ const o = resolveSyntaxOptions(options);
402
+ const lines = source.split('\n');
403
+ const out = new Array(lines.length);
404
+ let fence;
405
+ let inIndentedCode = false;
406
+ let prevBlank = true;
407
+ for (let li = 0; li < lines.length; li++) {
408
+ const line = lines[li];
409
+ // 1. 围栏代码块
410
+ if (fence) {
411
+ out[li] = line;
412
+ const f = matchFence(line);
413
+ if (f && f.char === fence.char && f.len >= fence.len && f.info === '')
414
+ fence = undefined;
415
+ prevBlank = false;
416
+ continue;
417
+ }
418
+ const f = matchFence(line);
419
+ if (f) {
420
+ fence = { char: f.char, len: f.len };
421
+ out[li] = line;
422
+ prevBlank = false;
423
+ continue;
424
+ }
425
+ // 2. 空行
426
+ if (line.trim() === '') {
427
+ out[li] = line;
428
+ prevBlank = true;
429
+ continue;
430
+ }
431
+ // 3. 缩进代码块
432
+ if (o.indentedCode) {
433
+ const indent = contentIndent(line);
434
+ if (inIndentedCode) {
435
+ if (indent >= 4) {
436
+ out[li] = line;
437
+ prevBlank = false;
438
+ continue;
439
+ }
440
+ inIndentedCode = false;
441
+ }
442
+ else if (prevBlank && indent >= 4) {
443
+ inIndentedCode = true;
444
+ out[li] = line;
445
+ prevBlank = false;
446
+ continue;
447
+ }
448
+ }
449
+ prevBlank = false;
450
+ // 4. 行首标记:抬头、空格
451
+ const prefix = BLOCK_PREFIX_RE.exec(line)[1];
452
+ let rest = line.slice(prefix.length);
453
+ let markers = '';
454
+ let k = 0;
455
+ if (o.tt) {
456
+ let n = 0;
457
+ while (rest[k] === '^' && n < o.maxLevel) {
458
+ n++;
459
+ k++;
460
+ }
461
+ if (n > 0)
462
+ markers += ':tt{n=' + n + '}';
463
+ }
464
+ if (o.kg) {
465
+ let n = 0;
466
+ while (rest[k] === '.' && n < o.maxLevel) {
467
+ n++;
468
+ k++;
469
+ }
470
+ if (n > 0)
471
+ markers += ':kg{n=' + n + '}';
472
+ }
473
+ rest = rest.slice(k);
474
+ // 5. 行内记号
475
+ out[li] = prefix + markers + transformInline(rest, o);
476
+ }
477
+ return out.join('\n');
478
+ }
479
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * 古籍 Markdown 的选项定义。
3
+ *
4
+ * 语法层({@link GujiSyntaxOptions})控制"哪些短记号被识别",
5
+ * 只影响规范化;树层({@link GujiOptions})控制 remark 插件的行为。
6
+ */
7
+ /** 每个扩展记号的开关。默认全开。 */
8
+ export interface GujiToggles {
9
+ /** 夹注 `<…>` → `:jz[…]` */
10
+ jz?: boolean;
11
+ /** 补字 `((…))` → `:bz[…]` */
12
+ bz?: boolean;
13
+ /** 删字 `{{…}}` → `:sz[…]` */
14
+ sz?: boolean;
15
+ /** 改字 `[…]` → `:gz[…]` */
16
+ gz?: boolean;
17
+ /** 抬头 行首 `^` → `:tt{n}` */
18
+ tt?: boolean;
19
+ /** 空格 行首 `.` → `:kg{n}` */
20
+ kg?: boolean;
21
+ /** 专名号 `/…/` → `:zm[…]` */
22
+ zm?: boolean;
23
+ /** 书名号 `《…》` → `:sm[…]` */
24
+ sm?: boolean;
25
+ }
26
+ export interface GujiSyntaxOptions extends GujiToggles {
27
+ /**
28
+ * 行内记号内容的最大字符数,超出即视为未闭合。
29
+ * 用来避免误匹配吞掉整行。
30
+ * @default 64
31
+ */
32
+ maxSpanLength?: number;
33
+ /**
34
+ * `n` 类属性(抬头级数、空格数)的上限。
35
+ * @default 9
36
+ */
37
+ maxLevel?: number;
38
+ /**
39
+ * 改字内容必须至少含一个 CJK 字符。
40
+ * 关闭后 `[x]`、`[TODO]` 之类会被误判为改字,务必谨慎。
41
+ * @default true
42
+ */
43
+ gzRequireCjk?: boolean;
44
+ /**
45
+ * 专名号内容必须至少含一个 CJK 字符。
46
+ * 关闭后 `/path/like/this` 会被误判为专名,仅在纯中文语料中才建议关闭。
47
+ * @default true
48
+ */
49
+ zmRequireCjk?: boolean;
50
+ /**
51
+ * 把"空行之后缩进 ≥ 4 空格"的行按缩进代码块处理(其中不做任何转换)。
52
+ * 若文档大量使用深层列表,可关闭。
53
+ * @default true
54
+ */
55
+ indentedCode?: boolean;
56
+ }
57
+ export type ResolvedSyntaxOptions = Required<GujiSyntaxOptions>;
58
+ export declare const DEFAULT_SYNTAX_OPTIONS: ResolvedSyntaxOptions;
59
+ export declare function resolveSyntaxOptions(options?: GujiSyntaxOptions): ResolvedSyntaxOptions;
60
+ export interface GujiOptions extends GujiSyntaxOptions {
61
+ /**
62
+ * 解析前先把短记号规范化为指令。
63
+ * 关闭后只支持显式的 `:jz[…]` 写法。
64
+ * @default true
65
+ */
66
+ shorthand?: boolean;
67
+ /**
68
+ * 把 `:tt{n}` 空标记之后、直到行尾的兄弟节点收进该指令。
69
+ * 见 spec/ast.md §1.1。
70
+ * @default true
71
+ */
72
+ lineScope?: boolean;
73
+ /**
74
+ * 把指令别名(`note`、`add` …)归一到规范名(`jz`、`bz` …)。
75
+ * @default true
76
+ */
77
+ normalizeNames?: boolean;
78
+ }
79
+ export type ResolvedGujiOptions = ResolvedSyntaxOptions & Required<Pick<GujiOptions, 'shorthand' | 'lineScope' | 'normalizeNames'>>;
80
+ export declare function resolveOptions(options?: GujiOptions): ResolvedGujiOptions;
81
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,sBAAsB;AACtB,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,4BAA4B;IAC5B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,4BAA4B;IAC5B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,0BAA0B;IAC1B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,2BAA2B;IAC3B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,2BAA2B;IAC3B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,2BAA2B;IAC3B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,2BAA2B;IAC3B,EAAE,CAAC,EAAE,OAAO,CAAA;CACb;AAED,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAA;AAE/D,eAAO,MAAM,sBAAsB,EAAE,qBAcpC,CAAA;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,qBAAqB,CAEvF;AAED,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,GACrD,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAA;AAE3E,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,mBAAmB,CAQzE"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 古籍 Markdown 的选项定义。
3
+ *
4
+ * 语法层({@link GujiSyntaxOptions})控制"哪些短记号被识别",
5
+ * 只影响规范化;树层({@link GujiOptions})控制 remark 插件的行为。
6
+ */
7
+ export const DEFAULT_SYNTAX_OPTIONS = {
8
+ jz: true,
9
+ bz: true,
10
+ sz: true,
11
+ gz: true,
12
+ tt: true,
13
+ kg: true,
14
+ zm: true,
15
+ sm: true,
16
+ maxSpanLength: 64,
17
+ maxLevel: 9,
18
+ gzRequireCjk: true,
19
+ zmRequireCjk: true,
20
+ indentedCode: true
21
+ };
22
+ export function resolveSyntaxOptions(options) {
23
+ return { ...DEFAULT_SYNTAX_OPTIONS, ...options };
24
+ }
25
+ export function resolveOptions(options) {
26
+ return {
27
+ ...DEFAULT_SYNTAX_OPTIONS,
28
+ shorthand: true,
29
+ lineScope: true,
30
+ normalizeNames: true,
31
+ ...options
32
+ };
33
+ }
34
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwDH,MAAM,CAAC,MAAM,sBAAsB,GAA0B;IAC3D,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,aAAa,EAAE,EAAE;IACjB,QAAQ,EAAE,CAAC;IACX,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;CACnB,CAAA;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA2B;IAC9D,OAAO,EAAE,GAAG,sBAAsB,EAAE,GAAG,OAAO,EAAE,CAAA;AAClD,CAAC;AAyBD,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,OAAO;QACL,GAAG,sBAAsB;QACzB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,IAAI;QACpB,GAAG,OAAO;KACX,CAAA;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** 开箱即用的解析入口。 */
2
+ import type { Root } from 'mdast';
3
+ import { type Processor } from 'unified';
4
+ import { type GujiOptions } from './options.js';
5
+ /** 创建一个「古籍 Markdown → mdast」的 processor。 */
6
+ export declare function gujiProcessor(options?: GujiOptions): Processor<Root>;
7
+ /** 古籍 Markdown → mdast(已完成指令名归一与抬头行作用域归并)。 */
8
+ export declare function parseGuji(source: string, options?: GujiOptions): Root;
9
+ /** mdast → Directive Markdown,供格式化与调试使用。 */
10
+ export declare function formatDirective(tree: Root, options?: GujiOptions): string;
11
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,iBAAiB;AAEjB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAGjC,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAG/D,4CAA4C;AAC5C,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAEpE;AAED,8CAA8C;AAC9C,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAGrE;AAED,4CAA4C;AAC5C,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAMzE"}
package/dist/parse.js ADDED
@@ -0,0 +1,24 @@
1
+ /** 开箱即用的解析入口。 */
2
+ import remarkParse from 'remark-parse';
3
+ import remarkStringify from 'remark-stringify';
4
+ import { unified } from 'unified';
5
+ import { resolveOptions } from './options.js';
6
+ import remarkGuji from './plugin.js';
7
+ /** 创建一个「古籍 Markdown → mdast」的 processor。 */
8
+ export function gujiProcessor(options) {
9
+ return unified().use(remarkParse).use(remarkGuji, options);
10
+ }
11
+ /** 古籍 Markdown → mdast(已完成指令名归一与抬头行作用域归并)。 */
12
+ export function parseGuji(source, options) {
13
+ const processor = gujiProcessor(options);
14
+ return processor.runSync(processor.parse(source));
15
+ }
16
+ /** mdast → Directive Markdown,供格式化与调试使用。 */
17
+ export function formatDirective(tree, options) {
18
+ const settings = resolveOptions({ ...options, shorthand: false });
19
+ const processor = unified()
20
+ .use(remarkStringify)
21
+ .use(remarkGuji, settings);
22
+ return String(processor.stringify(tree));
23
+ }
24
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,iBAAiB;AAGjB,OAAO,WAAW,MAAM,cAAc,CAAA;AACtC,OAAO,eAAe,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAkB,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAA;AAC/D,OAAO,UAAU,MAAM,aAAa,CAAA;AAEpC,4CAA4C;AAC5C,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAA+B,CAAA;AAC1F,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,OAAqB;IAC7D,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACxC,OAAO,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAoB,CAAA;AACtE,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,eAAe,CAAC,IAAU,EAAE,OAAqB;IAC/D,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;IACjE,MAAM,SAAS,GAAG,OAAO,EAAE;SACxB,GAAG,CAAC,eAAe,CAAC;SACpB,GAAG,CAAC,UAAU,EAAE,QAAQ,CAA+B,CAAA;IAC1D,OAAO,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AAC1C,CAAC"}