@incremark/core 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +68 -3
- package/README.md +68 -8
- package/dist/{MarkedAstBuildter-DDP1An5M.d.ts → MarkedAstBuildter-B2QhLKKy.d.ts} +2 -2
- package/dist/engines/marked/index.d.ts +4 -4
- package/dist/engines/marked/index.js +1 -1
- package/dist/engines/marked/index.js.map +1 -1
- package/dist/engines/micromark/index.d.ts +4 -4
- package/dist/engines/micromark/index.js +2 -2
- package/dist/engines/micromark/index.js.map +1 -1
- package/dist/index.d.ts +33 -6
- package/dist/index.js +151 -16
- package/dist/index.js.map +1 -1
- package/dist/{types-N1b99kYB.d.ts → types-B7GTGJc2.d.ts} +2 -1
- package/dist/utils/index.d.ts +8 -1
- package/dist/utils/index.js +15 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -31,8 +31,9 @@ interface IAstBuilder {
|
|
|
31
31
|
parse(text: string): Root;
|
|
32
32
|
/**
|
|
33
33
|
* 将 AST 节点转换为 ParsedBlock
|
|
34
|
+
* @param generateBlockId - 接收 block 的 startOffset 参数,用于生成稳定的 id
|
|
34
35
|
*/
|
|
35
|
-
nodesToBlocks(nodes: RootContent[], startOffset: number, rawText: string, status: BlockStatus, generateBlockId: () => string): ParsedBlock[];
|
|
36
|
+
nodesToBlocks(nodes: RootContent[], startOffset: number, rawText: string, status: BlockStatus, generateBlockId: (startOffset: number) => string): ParsedBlock[];
|
|
36
37
|
/**
|
|
37
38
|
* 更新配置选项(动态更新,不需要重建实例)
|
|
38
39
|
* @param options 部分配置选项
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -23,6 +23,13 @@ declare function splitLines(text: string): string[];
|
|
|
23
23
|
declare function joinLines(lines: string[], start: number, end: number): string;
|
|
24
24
|
declare function isDefinitionNode(node: RootContent): node is Definition;
|
|
25
25
|
declare function isFootnoteDefinitionNode(node: RootContent): node is FootnoteDefinition;
|
|
26
|
+
/**
|
|
27
|
+
* 从 AST 节点中收集脚注引用标识符
|
|
28
|
+
*
|
|
29
|
+
* @param node 起始节点
|
|
30
|
+
* @returns 脚注引用标识符列表(按出现顺序,去重)
|
|
31
|
+
*/
|
|
32
|
+
declare function collectFootnoteReferences(node: RootContent): string[];
|
|
26
33
|
/**
|
|
27
34
|
* AST 节点遍历器
|
|
28
35
|
* 深度优先遍历 AST 节点
|
|
@@ -40,4 +47,4 @@ declare function traverseAst(node: RootContent, visitor: (node: RootContent) =>
|
|
|
40
47
|
*/
|
|
41
48
|
declare function collectAstNodes<T extends RootContent>(node: RootContent, predicate: (node: RootContent) => node is T): T[];
|
|
42
49
|
|
|
43
|
-
export { calculateLineOffset, collectAstNodes, generateId, isDefinitionNode, isFootnoteDefinitionNode, joinLines, resetIdCounter, splitLines, traverseAst };
|
|
50
|
+
export { calculateLineOffset, collectAstNodes, collectFootnoteReferences, generateId, isDefinitionNode, isFootnoteDefinitionNode, joinLines, resetIdCounter, splitLines, traverseAst };
|
package/dist/utils/index.js
CHANGED
|
@@ -25,6 +25,20 @@ function isDefinitionNode(node) {
|
|
|
25
25
|
function isFootnoteDefinitionNode(node) {
|
|
26
26
|
return node.type === "footnoteDefinition";
|
|
27
27
|
}
|
|
28
|
+
function collectFootnoteReferences(node) {
|
|
29
|
+
const references = [];
|
|
30
|
+
const seen = /* @__PURE__ */ new Set();
|
|
31
|
+
traverseAst(node, (n) => {
|
|
32
|
+
if (n.type === "footnoteReference" && "identifier" in n) {
|
|
33
|
+
const identifier = n.identifier;
|
|
34
|
+
if (!seen.has(identifier)) {
|
|
35
|
+
seen.add(identifier);
|
|
36
|
+
references.push(identifier);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return references;
|
|
41
|
+
}
|
|
28
42
|
function traverseAst(node, visitor) {
|
|
29
43
|
const stopEarly = visitor(node);
|
|
30
44
|
if (stopEarly === true) {
|
|
@@ -46,6 +60,6 @@ function collectAstNodes(node, predicate) {
|
|
|
46
60
|
return results;
|
|
47
61
|
}
|
|
48
62
|
|
|
49
|
-
export { calculateLineOffset, collectAstNodes, generateId, isDefinitionNode, isFootnoteDefinitionNode, joinLines, resetIdCounter, splitLines, traverseAst };
|
|
63
|
+
export { calculateLineOffset, collectAstNodes, collectFootnoteReferences, generateId, isDefinitionNode, isFootnoteDefinitionNode, joinLines, resetIdCounter, splitLines, traverseAst };
|
|
50
64
|
//# sourceMappingURL=index.js.map
|
|
51
65
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/index.ts"],"names":["node"],"mappings":";AASA,IAAI,SAAA,GAAY,CAAA;AACT,SAAS,UAAA,CAAW,SAAS,OAAA,EAAiB;AACnD,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,SAAS,CAAA,CAAA;AACjC;AAKO,SAAS,cAAA,GAAuB;AACrC,EAAA,SAAA,GAAY,CAAA;AACd;AAKO,SAAS,mBAAA,CAAoB,OAAiB,SAAA,EAA2B;AAC9E,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,aAAa,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACtD,IAAA,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,WAAW,IAAA,EAAwB;AACjD,EAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AACxB;AAKO,SAAS,SAAA,CAAU,KAAA,EAAiB,KAAA,EAAe,GAAA,EAAqB;AAC7E,EAAA,OAAO,MAAM,KAAA,CAAM,KAAA,EAAO,MAAM,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9C;AAEO,SAAS,iBAAiB,IAAA,EAAuC;AACtE,EAAA,OAAO,KAAK,IAAA,KAAS,YAAA;AACvB;AAEO,SAAS,yBAAyB,IAAA,EAA+C;AACtF,EAAA,OAAO,KAAK,IAAA,KAAS,oBAAA;AACvB;AASO,SAAS,WAAA,CACd,MACA,OAAA,EACM;AAEN,EAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA;AAC9B,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,cAAc,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AACtD,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,WAAA,CAAY,OAAsB,OAAO,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;AASO,SAAS,eAAA,CACd,MACA,SAAA,EACK;AACL,EAAA,MAAM,UAAe,EAAC;AAEtB,EAAA,WAAA,CAAY,IAAA,EAAM,CAACA,KAAAA,KAAS;AAC1B,IAAA,IAAI,SAAA,CAAUA,KAAI,CAAA,EAAG;AACnB,MAAA,OAAA,CAAQ,KAAKA,KAAI,CAAA;AAAA,IACnB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT","file":"index.js","sourcesContent":["/**\n * 工具函数\n */\n\nimport type { Definition, FootnoteDefinition, RootContent } from \"mdast\"\n\n/**\n * 生成唯一 ID\n */\nlet idCounter = 0\nexport function generateId(prefix = 'block'): string {\n return `${prefix}-${++idCounter}`\n}\n\n/**\n * 重置 ID 计数器(用于测试)\n */\nexport function resetIdCounter(): void {\n idCounter = 0\n}\n\n/**\n * 计算行的偏移量\n */\nexport function calculateLineOffset(lines: string[], lineIndex: number): number {\n let offset = 0\n for (let i = 0; i < lineIndex && i < lines.length; i++) {\n offset += lines[i].length + 1 // +1 for newline\n }\n return offset\n}\n\n/**\n * 将文本按行分割\n */\nexport function splitLines(text: string): string[] {\n return text.split('\\n')\n}\n\n/**\n * 合并行为文本\n */\nexport function joinLines(lines: string[], start: number, end: number): string {\n return lines.slice(start, end + 1).join('\\n')\n}\n\nexport function isDefinitionNode(node: RootContent): node is Definition {\n return node.type === 'definition'\n}\n\nexport function isFootnoteDefinitionNode(node: RootContent): node is FootnoteDefinition {\n return node.type === 'footnoteDefinition'\n}\n\n/**\n * AST 节点遍历器\n * 深度优先遍历 AST 节点\n *\n * @param node 起始节点\n * @param visitor 访问者函数,返回 true 可以提前终止遍历\n */\nexport function traverseAst(\n node: RootContent,\n visitor: (node: RootContent) => boolean | void\n): void {\n // 访问当前节点\n const stopEarly = visitor(node)\n if (stopEarly === true) {\n return\n }\n\n // 递归遍历子节点\n if ('children' in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n traverseAst(child as RootContent, visitor)\n }\n }\n}\n\n/**\n * 从 AST 节点中收集指定类型的节点\n *\n * @param node 起始节点\n * @param predicate 匹配谓词\n * @returns 匹配的节点列表\n */\nexport function collectAstNodes<T extends RootContent>(\n node: RootContent,\n predicate: (node: RootContent) => node is T\n): T[] {\n const results: T[] = []\n\n traverseAst(node, (node) => {\n if (predicate(node)) {\n results.push(node)\n }\n })\n\n return results\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/index.ts"],"names":["node"],"mappings":";AASA,IAAI,SAAA,GAAY,CAAA;AACT,SAAS,UAAA,CAAW,SAAS,OAAA,EAAiB;AACnD,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,SAAS,CAAA,CAAA;AACjC;AAKO,SAAS,cAAA,GAAuB;AACrC,EAAA,SAAA,GAAY,CAAA;AACd;AAKO,SAAS,mBAAA,CAAoB,OAAiB,SAAA,EAA2B;AAC9E,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,aAAa,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACtD,IAAA,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,WAAW,IAAA,EAAwB;AACjD,EAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AACxB;AAKO,SAAS,SAAA,CAAU,KAAA,EAAiB,KAAA,EAAe,GAAA,EAAqB;AAC7E,EAAA,OAAO,MAAM,KAAA,CAAM,KAAA,EAAO,MAAM,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9C;AAEO,SAAS,iBAAiB,IAAA,EAAuC;AACtE,EAAA,OAAO,KAAK,IAAA,KAAS,YAAA;AACvB;AAEO,SAAS,yBAAyB,IAAA,EAA+C;AACtF,EAAA,OAAO,KAAK,IAAA,KAAS,oBAAA;AACvB;AAQO,SAAS,0BAA0B,IAAA,EAA6B;AACrE,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,WAAA,CAAY,IAAA,EAAM,CAAC,CAAA,KAAM;AACvB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,mBAAA,IAAuB,YAAA,IAAgB,CAAA,EAAG;AACvD,MAAA,MAAM,aAAa,CAAA,CAAE,UAAA;AACrB,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,IAAI,UAAU,CAAA;AACnB,QAAA,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,UAAA;AACT;AASO,SAAS,WAAA,CACd,MACA,OAAA,EACM;AAEN,EAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA;AAC9B,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,cAAc,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AACtD,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,WAAA,CAAY,OAAsB,OAAO,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;AASO,SAAS,eAAA,CACd,MACA,SAAA,EACK;AACL,EAAA,MAAM,UAAe,EAAC;AAEtB,EAAA,WAAA,CAAY,IAAA,EAAM,CAACA,KAAAA,KAAS;AAC1B,IAAA,IAAI,SAAA,CAAUA,KAAI,CAAA,EAAG;AACnB,MAAA,OAAA,CAAQ,KAAKA,KAAI,CAAA;AAAA,IACnB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT","file":"index.js","sourcesContent":["/**\n * 工具函数\n */\n\nimport type { Definition, FootnoteDefinition, RootContent } from \"mdast\"\n\n/**\n * 生成唯一 ID\n */\nlet idCounter = 0\nexport function generateId(prefix = 'block'): string {\n return `${prefix}-${++idCounter}`\n}\n\n/**\n * 重置 ID 计数器(用于测试)\n */\nexport function resetIdCounter(): void {\n idCounter = 0\n}\n\n/**\n * 计算行的偏移量\n */\nexport function calculateLineOffset(lines: string[], lineIndex: number): number {\n let offset = 0\n for (let i = 0; i < lineIndex && i < lines.length; i++) {\n offset += lines[i].length + 1 // +1 for newline\n }\n return offset\n}\n\n/**\n * 将文本按行分割\n */\nexport function splitLines(text: string): string[] {\n return text.split('\\n')\n}\n\n/**\n * 合并行为文本\n */\nexport function joinLines(lines: string[], start: number, end: number): string {\n return lines.slice(start, end + 1).join('\\n')\n}\n\nexport function isDefinitionNode(node: RootContent): node is Definition {\n return node.type === 'definition'\n}\n\nexport function isFootnoteDefinitionNode(node: RootContent): node is FootnoteDefinition {\n return node.type === 'footnoteDefinition'\n}\n\n/**\n * 从 AST 节点中收集脚注引用标识符\n *\n * @param node 起始节点\n * @returns 脚注引用标识符列表(按出现顺序,去重)\n */\nexport function collectFootnoteReferences(node: RootContent): string[] {\n const references: string[] = []\n const seen = new Set<string>()\n\n traverseAst(node, (n) => {\n if (n.type === 'footnoteReference' && 'identifier' in n) {\n const identifier = n.identifier as string\n if (!seen.has(identifier)) {\n seen.add(identifier)\n references.push(identifier)\n }\n }\n })\n\n return references\n}\n\n/**\n * AST 节点遍历器\n * 深度优先遍历 AST 节点\n *\n * @param node 起始节点\n * @param visitor 访问者函数,返回 true 可以提前终止遍历\n */\nexport function traverseAst(\n node: RootContent,\n visitor: (node: RootContent) => boolean | void\n): void {\n // 访问当前节点\n const stopEarly = visitor(node)\n if (stopEarly === true) {\n return\n }\n\n // 递归遍历子节点\n if ('children' in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n traverseAst(child as RootContent, visitor)\n }\n }\n}\n\n/**\n * 从 AST 节点中收集指定类型的节点\n *\n * @param node 起始节点\n * @param predicate 匹配谓词\n * @returns 匹配的节点列表\n */\nexport function collectAstNodes<T extends RootContent>(\n node: RootContent,\n predicate: (node: RootContent) => node is T\n): T[] {\n const results: T[] = []\n\n traverseAst(node, (node) => {\n if (predicate(node)) {\n results.push(node)\n }\n })\n\n return results\n}"]}
|
package/package.json
CHANGED