@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.
- package/LICENSE +201 -0
- package/README.md +104 -0
- package/dist/directives.d.ts +39 -0
- package/dist/directives.d.ts.map +1 -0
- package/dist/directives.js +106 -0
- package/dist/directives.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/normalize.d.ts +31 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +479 -0
- package/dist/normalize.js.map +1 -0
- package/dist/options.d.ts +81 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +34 -0
- package/dist/options.js.map +1 -0
- package/dist/parse.d.ts +11 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +24 -0
- package/dist/parse.js.map +1 -0
- package/dist/plugin.d.ts +18 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +49 -0
- package/dist/plugin.js.map +1 -0
- package/dist/transform.d.ts +15 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +73 -0
- package/dist/transform.js.map +1 -0
- package/package.json +60 -0
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* remark 插件:一次性接上古籍扩展。
|
|
3
|
+
*
|
|
4
|
+
* ```js
|
|
5
|
+
* unified().use(remarkParse).use(remarkGuji).use(remarkRehype)
|
|
6
|
+
* ```
|
|
7
|
+
*
|
|
8
|
+
* 插件做三件事:
|
|
9
|
+
* 1. 注册 directive 的 micromark / mdast 扩展(不必再单独 use remark-directive);
|
|
10
|
+
* 2. 包裹 parser,在解析前把短记号规范化为指令;
|
|
11
|
+
* 3. 解析后归一指令名、并做抬头的行作用域归并。
|
|
12
|
+
*/
|
|
13
|
+
import type { Root } from 'mdast';
|
|
14
|
+
import type { Plugin } from 'unified';
|
|
15
|
+
import { type GujiOptions } from './options.js';
|
|
16
|
+
declare const remarkGuji: Plugin<[GujiOptions?], Root>;
|
|
17
|
+
export default remarkGuji;
|
|
18
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAGjC,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,SAAS,CAAA;AAEhD,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAM/D,QAAA,MAAM,UAAU,EAAE,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CA+B5C,CAAA;AAED,eAAe,UAAU,CAAA"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* remark 插件:一次性接上古籍扩展。
|
|
3
|
+
*
|
|
4
|
+
* ```js
|
|
5
|
+
* unified().use(remarkParse).use(remarkGuji).use(remarkRehype)
|
|
6
|
+
* ```
|
|
7
|
+
*
|
|
8
|
+
* 插件做三件事:
|
|
9
|
+
* 1. 注册 directive 的 micromark / mdast 扩展(不必再单独 use remark-directive);
|
|
10
|
+
* 2. 包裹 parser,在解析前把短记号规范化为指令;
|
|
11
|
+
* 3. 解析后归一指令名、并做抬头的行作用域归并。
|
|
12
|
+
*/
|
|
13
|
+
import { directiveFromMarkdown, directiveToMarkdown } from 'mdast-util-directive';
|
|
14
|
+
import { directive } from 'micromark-extension-directive';
|
|
15
|
+
import { gujiToDirective } from './normalize.js';
|
|
16
|
+
import { resolveOptions } from './options.js';
|
|
17
|
+
import { applyLineScope, normalizeDirectiveNames } from './transform.js';
|
|
18
|
+
/** 同一个 processor 上避免重复注册 directive 扩展。 */
|
|
19
|
+
const installed = new WeakSet();
|
|
20
|
+
const remarkGuji = function remarkGuji(options) {
|
|
21
|
+
const settings = resolveOptions(options);
|
|
22
|
+
const self = this;
|
|
23
|
+
const data = self.data();
|
|
24
|
+
if (!installed.has(self)) {
|
|
25
|
+
installed.add(self);
|
|
26
|
+
const micromarkExtensions = data.micromarkExtensions ?? (data.micromarkExtensions = []);
|
|
27
|
+
const fromMarkdownExtensions = data.fromMarkdownExtensions ?? (data.fromMarkdownExtensions = []);
|
|
28
|
+
const toMarkdownExtensions = data.toMarkdownExtensions ?? (data.toMarkdownExtensions = []);
|
|
29
|
+
micromarkExtensions.push(directive());
|
|
30
|
+
fromMarkdownExtensions.push(directiveFromMarkdown());
|
|
31
|
+
toMarkdownExtensions.push(directiveToMarkdown());
|
|
32
|
+
}
|
|
33
|
+
if (settings.shorthand) {
|
|
34
|
+
const parser = self.parser;
|
|
35
|
+
if (typeof parser !== 'function') {
|
|
36
|
+
throw new Error('remark-guji: 需要先注册 remark-parse,例如 unified().use(remarkParse).use(remarkGuji)。' +
|
|
37
|
+
'若只做序列化,请传 { shorthand: false }。');
|
|
38
|
+
}
|
|
39
|
+
self.parser = (document, file) => parser(gujiToDirective(String(document), settings), file);
|
|
40
|
+
}
|
|
41
|
+
return (tree) => {
|
|
42
|
+
if (settings.normalizeNames)
|
|
43
|
+
normalizeDirectiveNames(tree);
|
|
44
|
+
if (settings.lineScope)
|
|
45
|
+
applyLineScope(tree);
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export default remarkGuji;
|
|
49
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAExE,0CAA0C;AAC1C,MAAM,SAAS,GAAG,IAAI,OAAO,EAAU,CAAA;AAEvC,MAAM,UAAU,GAAiC,SAAS,UAAU,CAAC,OAAO;IAC1E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,IAA4B,CAAA;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAExB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAyB,CAAC,EAAE,CAAC;QAC9C,SAAS,CAAC,GAAG,CAAC,IAAyB,CAAC,CAAA;QACxC,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAA;QACvF,MAAM,sBAAsB,GAC1B,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAA;QACnE,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAA;QAC1F,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QACrC,sBAAsB,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAA;QACpD,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,gFAAgF;gBAC9E,iCAAiC,CACpC,CAAA;QACH,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;IAC7F,CAAC;IAED,OAAO,CAAC,IAAU,EAAE,EAAE;QACpB,IAAI,QAAQ,CAAC,cAAc;YAAE,uBAAuB,CAAC,IAAI,CAAC,CAAA;QAC1D,IAAI,QAAQ,CAAC,SAAS;YAAE,cAAc,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC,CAAA;AACH,CAAC,CAAA;AAED,eAAe,UAAU,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mdast 层的两个变换:指令名归一、抬头的行作用域归并。
|
|
3
|
+
* 规范见 spec/ast.md §1。
|
|
4
|
+
*/
|
|
5
|
+
import type { Root } from 'mdast';
|
|
6
|
+
/** 把别名(`note`、`add` …)改写为规范名(`jz`、`bz` …)。 */
|
|
7
|
+
export declare function normalizeDirectiveNames(tree: Root): void;
|
|
8
|
+
/**
|
|
9
|
+
* 把 `:tt{n}` 之后、直到本行结束(下一个 `break`、文本中的换行,
|
|
10
|
+
* 或父节点结束)的兄弟节点,移入该指令的 children。
|
|
11
|
+
*
|
|
12
|
+
* 变换后 `tt` 与其他行内指令形态一致,渲染器只需处理一种情况。
|
|
13
|
+
*/
|
|
14
|
+
export declare function applyLineScope(tree: Root): void;
|
|
15
|
+
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAS,IAAI,EAAE,MAAM,OAAO,CAAA;AAyBxC,8CAA8C;AAC9C,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAIxD;AAYD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAO/C"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mdast 层的两个变换:指令名归一、抬头的行作用域归并。
|
|
3
|
+
* 规范见 spec/ast.md §1。
|
|
4
|
+
*/
|
|
5
|
+
import { visit } from 'unist-util-visit';
|
|
6
|
+
import { resolveDirectiveName } from './directives.js';
|
|
7
|
+
const DIRECTIVE_TYPES = new Set(['textDirective', 'leafDirective', 'containerDirective']);
|
|
8
|
+
function isDirective(node) {
|
|
9
|
+
return (typeof node === 'object' &&
|
|
10
|
+
node !== null &&
|
|
11
|
+
DIRECTIVE_TYPES.has(node.type ?? ''));
|
|
12
|
+
}
|
|
13
|
+
/** 把别名(`note`、`add` …)改写为规范名(`jz`、`bz` …)。 */
|
|
14
|
+
export function normalizeDirectiveNames(tree) {
|
|
15
|
+
visit(tree, (node) => {
|
|
16
|
+
if (isDirective(node))
|
|
17
|
+
node.name = resolveDirectiveName(node.name);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** `:tt{n}` 空标记:无 label 的抬头行内指令。 */
|
|
21
|
+
function isTaitouMarker(node) {
|
|
22
|
+
return (isDirective(node) &&
|
|
23
|
+
node.type === 'textDirective' &&
|
|
24
|
+
resolveDirectiveName(node.name) === 'tt' &&
|
|
25
|
+
(!node.children || node.children.length === 0));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 把 `:tt{n}` 之后、直到本行结束(下一个 `break`、文本中的换行,
|
|
29
|
+
* 或父节点结束)的兄弟节点,移入该指令的 children。
|
|
30
|
+
*
|
|
31
|
+
* 变换后 `tt` 与其他行内指令形态一致,渲染器只需处理一种情况。
|
|
32
|
+
*/
|
|
33
|
+
export function applyLineScope(tree) {
|
|
34
|
+
visit(tree, (node) => {
|
|
35
|
+
if (!('children' in node) || !Array.isArray(node.children))
|
|
36
|
+
return;
|
|
37
|
+
const children = node.children;
|
|
38
|
+
if (!children.some(isTaitouMarker))
|
|
39
|
+
return;
|
|
40
|
+
node.children = scopeChildren(children);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function scopeChildren(children) {
|
|
44
|
+
const out = [];
|
|
45
|
+
for (let i = 0; i < children.length; i++) {
|
|
46
|
+
const child = children[i];
|
|
47
|
+
if (!isTaitouMarker(child)) {
|
|
48
|
+
out.push(child);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const collected = [];
|
|
52
|
+
let j = i + 1;
|
|
53
|
+
for (; j < children.length; j++) {
|
|
54
|
+
const next = children[j];
|
|
55
|
+
if (next.type === 'break')
|
|
56
|
+
break;
|
|
57
|
+
if (next.type === 'text' && next.value.includes('\n')) {
|
|
58
|
+
const at = next.value.indexOf('\n');
|
|
59
|
+
if (at > 0)
|
|
60
|
+
collected.push({ type: 'text', value: next.value.slice(0, at) });
|
|
61
|
+
children[j] = { type: 'text', value: next.value.slice(at) };
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
collected.push(next);
|
|
65
|
+
}
|
|
66
|
+
;
|
|
67
|
+
child.children = collected;
|
|
68
|
+
out.push(child);
|
|
69
|
+
i = j - 1;
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@open-guji/markdown-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "古籍 Markdown 扩展的核心:短记号 → Directive 规范化器与 remark 插件",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"markdown",
|
|
7
|
+
"remark",
|
|
8
|
+
"directive",
|
|
9
|
+
"古籍",
|
|
10
|
+
"guji",
|
|
11
|
+
"chinese",
|
|
12
|
+
"classics"
|
|
13
|
+
],
|
|
14
|
+
"license": "Apache-2.0",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/open-guji/guji-markdown.git",
|
|
18
|
+
"directory": "packages/core"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/open-guji/guji-markdown/tree/main/packages/core",
|
|
21
|
+
"bugs": "https://github.com/open-guji/guji-markdown/issues",
|
|
22
|
+
"type": "module",
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18.18"
|
|
26
|
+
},
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"default": "./dist/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./package.json": "./package.json"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"README.md",
|
|
37
|
+
"LICENSE"
|
|
38
|
+
],
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@types/mdast": "^4.0.4",
|
|
41
|
+
"mdast-util-directive": "^3.1.0",
|
|
42
|
+
"micromark-extension-directive": "^4.0.0",
|
|
43
|
+
"remark-parse": "^11.0.0",
|
|
44
|
+
"remark-stringify": "^11.0.0",
|
|
45
|
+
"unified": "^11.0.5",
|
|
46
|
+
"unist-util-visit": "^5.1.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"typescript": "^5.9.3",
|
|
50
|
+
"vitest": "^3.2.4"
|
|
51
|
+
},
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsc -p tsconfig.json",
|
|
57
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
58
|
+
"test": "vitest run"
|
|
59
|
+
}
|
|
60
|
+
}
|