pd-markdown 1.0.0 → 1.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/README.md +293 -0
- package/package.json +69 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.d.ts +0 -4
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.d.ts.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.js +0 -5
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.js.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.d.ts +0 -4
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.d.ts.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.js +0 -4
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.js.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.d.ts +0 -6
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.d.ts.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.js +0 -36
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.js.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.d.ts +0 -14
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.d.ts.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.js +0 -18
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.js.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.d.ts +0 -27
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.d.ts.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.js +0 -37
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.js.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.d.ts +0 -22
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.d.ts.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.js +0 -95
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.js.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.d.ts +0 -55
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.d.ts.map +0 -1
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.js +0 -2
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.js.map +0 -1
- package/packages/parser/__tests__/frontmatter.test.ts +0 -69
- package/packages/parser/__tests__/gfm.test.ts +0 -83
- package/packages/parser/__tests__/processor.test.ts +0 -136
- package/packages/parser/__tests__/transform/heading.test.ts +0 -56
- package/packages/parser/__tests__/transform/list.test.ts +0 -67
- package/packages/parser/__tests__/transform/table.test.ts +0 -85
- package/packages/parser/node_modules/.bin/yaml +0 -17
- package/packages/parser/package.json +0 -38
- package/packages/parser/rollup.config.ts +0 -38
- package/packages/parser/src/index.ts +0 -15
- package/packages/parser/src/plugins/index.ts +0 -3
- package/packages/parser/src/plugins/transform/heading.ts +0 -40
- package/packages/parser/src/plugins/transform/list.ts +0 -29
- package/packages/parser/src/plugins/transform/table.ts +0 -62
- package/packages/parser/src/processor.ts +0 -119
- package/packages/parser/src/types/index.ts +0 -60
- package/packages/parser/tsconfig.json +0 -9
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.d.ts +0 -36
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.d.ts.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.js +0 -99
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.js.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.d.ts +0 -22
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.d.ts.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.js +0 -46
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.js.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.d.ts +0 -7
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.d.ts.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.js +0 -8
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.js.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.d.ts +0 -22
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.d.ts.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.js +0 -140
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.js.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.d.ts +0 -16
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.d.ts.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.js +0 -39
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.js.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.d.ts +0 -49
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.d.ts.map +0 -1
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.js +0 -19
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.js.map +0 -1
- package/packages/utils/__tests__/query.test.ts +0 -155
- package/packages/utils/__tests__/sanitize.test.ts +0 -96
- package/packages/utils/__tests__/slugify.test.ts +0 -71
- package/packages/utils/__tests__/traverse.test.ts +0 -131
- package/packages/utils/package.json +0 -27
- package/packages/utils/rollup.config.ts +0 -26
- package/packages/utils/src/ast/query.ts +0 -127
- package/packages/utils/src/ast/traverse.ts +0 -73
- package/packages/utils/src/index.ts +0 -20
- package/packages/utils/src/string/sanitize.ts +0 -155
- package/packages/utils/src/string/slugify.ts +0 -43
- package/packages/utils/src/types/index.ts +0 -72
- package/packages/utils/tsconfig.json +0 -8
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.d.ts +0 -27
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.js +0 -39
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.d.ts +0 -10
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.js +0 -130
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.d.ts +0 -17
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.js +0 -14
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.d.ts +0 -8
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.js +0 -5
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.d.ts +0 -13
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.js +0 -9
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.d.ts +0 -8
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.js +0 -7
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.d.ts +0 -7
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.js +0 -5
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.d.ts +0 -8
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.js +0 -7
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.d.ts +0 -13
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.js +0 -14
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.d.ts +0 -8
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.js +0 -5
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.d.ts +0 -19
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.js +0 -18
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.d.ts +0 -34
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.js +0 -28
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.d.ts +0 -11
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.js +0 -28
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.js.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.d.ts +0 -6
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.d.ts.map +0 -1
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.js +0 -9
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.js.map +0 -1
- package/packages/web/__tests__/MarkdownRenderer.test.tsx +0 -89
- package/packages/web/__tests__/NodeRenderer.test.tsx +0 -97
- package/packages/web/__tests__/components/Code.test.tsx +0 -71
- package/packages/web/__tests__/components/Heading.test.tsx +0 -65
- package/packages/web/__tests__/components/List.test.tsx +0 -100
- package/packages/web/__tests__/components/Table.test.tsx +0 -105
- package/packages/web/__tests__/useMarkdown.test.ts +0 -63
- package/packages/web/package.json +0 -40
- package/packages/web/rollup.config.ts +0 -36
- package/packages/web/src/components/MarkdownRenderer.tsx +0 -70
- package/packages/web/src/components/NodeRenderer.tsx +0 -205
- package/packages/web/src/components/context.ts +0 -24
- package/packages/web/src/components/defaults/Blockquote.tsx +0 -11
- package/packages/web/src/components/defaults/Code.tsx +0 -26
- package/packages/web/src/components/defaults/Heading.tsx +0 -14
- package/packages/web/src/components/defaults/Image.tsx +0 -10
- package/packages/web/src/components/defaults/Link.tsx +0 -18
- package/packages/web/src/components/defaults/List.tsx +0 -33
- package/packages/web/src/components/defaults/Paragraph.tsx +0 -11
- package/packages/web/src/components/defaults/Table.tsx +0 -50
- package/packages/web/src/components/defaults/index.tsx +0 -80
- package/packages/web/src/hooks/useMarkdown.ts +0 -32
- package/packages/web/src/index.ts +0 -37
- package/packages/web/tsconfig.json +0 -11
- package/packages/web/vitest.config.ts +0 -9
- package/pnpm-workspace.yaml +0 -2
- package/tsconfig.base.json +0 -26
- package/tsconfig.json +0 -8
- package/vitest.config.ts +0 -28
- package/vitest.setup.ts +0 -1
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { unified } from 'unified';
|
|
2
|
-
import remarkParse from 'remark-parse';
|
|
3
|
-
import remarkGfm from 'remark-gfm';
|
|
4
|
-
import remarkFrontmatter from 'remark-frontmatter';
|
|
5
|
-
import { visit } from 'unist-util-visit';
|
|
6
|
-
import { parse as parseYaml } from 'yaml';
|
|
7
|
-
import { transformHeading, transformList, transformTable } from './plugins';
|
|
8
|
-
/**
|
|
9
|
-
* Default parser options
|
|
10
|
-
*/
|
|
11
|
-
const DEFAULT_OPTIONS = {
|
|
12
|
-
gfm: true,
|
|
13
|
-
frontmatter: true,
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Create frontmatter extraction plugin
|
|
17
|
-
*/
|
|
18
|
-
function extractFrontmatter() {
|
|
19
|
-
return (tree, file) => {
|
|
20
|
-
visit(tree, 'yaml', (node) => {
|
|
21
|
-
try {
|
|
22
|
-
const data = parseYaml(node.value);
|
|
23
|
-
file.data.frontmatter = data;
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
// Invalid YAML, ignore
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Create a markdown parser with the specified options
|
|
33
|
-
*
|
|
34
|
-
* @param options - Parser configuration options
|
|
35
|
-
* @returns Parser instance with parse method
|
|
36
|
-
*/
|
|
37
|
-
export function createParser(options = {}) {
|
|
38
|
-
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
39
|
-
const customPlugins = options.plugins || [];
|
|
40
|
-
// Build processor (使用 any 绕过复杂的类型检查)
|
|
41
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
42
|
-
let processor = unified().use(remarkParse);
|
|
43
|
-
// Add GFM support
|
|
44
|
-
if (opts.gfm) {
|
|
45
|
-
processor = processor.use(remarkGfm);
|
|
46
|
-
}
|
|
47
|
-
// Add frontmatter support
|
|
48
|
-
if (opts.frontmatter) {
|
|
49
|
-
processor = processor.use(remarkFrontmatter, ['yaml']);
|
|
50
|
-
}
|
|
51
|
-
// Run custom "before" plugins
|
|
52
|
-
const beforePlugins = customPlugins.filter((p) => p.phase === 'before');
|
|
53
|
-
for (const plugin of beforePlugins) {
|
|
54
|
-
processor = processor.use(() => plugin.transform);
|
|
55
|
-
}
|
|
56
|
-
// Add frontmatter extraction
|
|
57
|
-
if (opts.frontmatter) {
|
|
58
|
-
processor = processor.use(extractFrontmatter);
|
|
59
|
-
}
|
|
60
|
-
// Add built-in transform plugins
|
|
61
|
-
processor = processor
|
|
62
|
-
.use(() => transformHeading)
|
|
63
|
-
.use(() => transformList)
|
|
64
|
-
.use(() => transformTable);
|
|
65
|
-
// Run custom "after" plugins
|
|
66
|
-
const afterPlugins = customPlugins.filter((p) => p.phase === 'after');
|
|
67
|
-
for (const plugin of afterPlugins) {
|
|
68
|
-
processor = processor.use(() => plugin.transform);
|
|
69
|
-
}
|
|
70
|
-
// Freeze processor
|
|
71
|
-
processor.freeze();
|
|
72
|
-
return {
|
|
73
|
-
parse(content) {
|
|
74
|
-
// Parse markdown to AST
|
|
75
|
-
const tree = processor.parse(content);
|
|
76
|
-
// Run all transform plugins
|
|
77
|
-
processor.runSync(tree);
|
|
78
|
-
return tree;
|
|
79
|
-
},
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Type-safe helper to define a parser plugin
|
|
84
|
-
*
|
|
85
|
-
* @param config - Plugin configuration
|
|
86
|
-
* @returns Parser plugin
|
|
87
|
-
*/
|
|
88
|
-
export function definePlugin(config, options) {
|
|
89
|
-
return {
|
|
90
|
-
name: config.name,
|
|
91
|
-
phase: config.phase,
|
|
92
|
-
transform: config.transform(options),
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=processor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"processor.js","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,WAAW,MAAM,cAAc,CAAA;AACtC,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,iBAAiB,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAA;AAKzC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE3E;;GAEG;AACH,MAAM,eAAe,GAA6C;IAChE,GAAG,EAAE,IAAI;IACT,WAAW,EAAE,IAAI;CAClB,CAAA;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,OAAO,CAAC,IAAU,EAAE,IAAW,EAAE,EAAE;QACjC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAU,EAAE,EAAE;YACjC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAA4B,CAC5D;gBAAC,IAAI,CAAC,IAAiB,CAAC,WAAW,GAAG,IAAI,CAAA;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IACtD,MAAM,IAAI,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAA;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAA;IAE3C,qCAAqC;IACrC,8DAA8D;IAC9D,IAAI,SAAS,GAAQ,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAE/C,kBAAkB;IAClB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACtC,CAAC;IAED,0BAA0B;IAC1B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,8BAA8B;IAC9B,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAA;IACvE,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;IAED,6BAA6B;IAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAC/C,CAAC;IAED,iCAAiC;IACjC,SAAS,GAAG,SAAS;SAClB,GAAG,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC;SAC3B,GAAG,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC;SACxB,GAAG,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAA;IAE5B,6BAA6B;IAC7B,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAA;IACrE,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;IAED,mBAAmB;IACnB,SAAS,CAAC,MAAM,EAAE,CAAA;IAElB,OAAO;QACL,KAAK,CAAC,OAAe;YACnB,wBAAwB;YACxB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAS,CAAA;YAE7C,4BAA4B;YAC5B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAEvB,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,MAIC,EACD,OAAW;IAEX,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;KACrC,CAAA;AACH,CAAC"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import type { Root } from 'mdast';
|
|
2
|
-
import type { VFile } from 'vfile';
|
|
3
|
-
/**
|
|
4
|
-
* Parser plugin configuration
|
|
5
|
-
*/
|
|
6
|
-
export interface ParserPlugin {
|
|
7
|
-
/** Unique plugin name */
|
|
8
|
-
name: string;
|
|
9
|
-
/** When to run: before or after built-in transforms */
|
|
10
|
-
phase: 'before' | 'after';
|
|
11
|
-
/** Transform function */
|
|
12
|
-
transform: (tree: Root, file: VFile) => void;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Parser options
|
|
16
|
-
*/
|
|
17
|
-
export interface ParserOptions {
|
|
18
|
-
/** Custom plugins to add */
|
|
19
|
-
plugins?: ParserPlugin[];
|
|
20
|
-
/** Enable GFM syntax (default: true) */
|
|
21
|
-
gfm?: boolean;
|
|
22
|
-
/** Enable frontmatter parsing (default: true) */
|
|
23
|
-
frontmatter?: boolean;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Parser instance
|
|
27
|
-
*/
|
|
28
|
-
export interface Parser {
|
|
29
|
-
/** Parse markdown string to AST */
|
|
30
|
-
parse(content: string): Root;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Plugin definition helper config
|
|
34
|
-
*/
|
|
35
|
-
export interface PluginConfig<T = unknown> {
|
|
36
|
-
/** Plugin name */
|
|
37
|
-
name: string;
|
|
38
|
-
/** When to run */
|
|
39
|
-
phase: 'before' | 'after';
|
|
40
|
-
/** Transform function factory */
|
|
41
|
-
transform: (options?: T) => (tree: Root, file: VFile) => void;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Frontmatter data extracted from markdown
|
|
45
|
-
*/
|
|
46
|
-
export interface FrontmatterData {
|
|
47
|
-
[key: string]: unknown;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Extended file data with frontmatter
|
|
51
|
-
*/
|
|
52
|
-
export interface FileData {
|
|
53
|
-
frontmatter?: FrontmatterData;
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAElC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,yBAAyB;IACzB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,CAAA;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB,wCAAwC;IACxC,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,iDAAiD;IACjD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,mCAAmC;IACnC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB;IAClB,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,iCAAiC;IACjC,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,CAAA;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,WAAW,CAAC,EAAE,eAAe,CAAA;CAC9B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { createParser } from '../src/processor'
|
|
3
|
-
import type { Yaml } from 'mdast'
|
|
4
|
-
|
|
5
|
-
describe('Frontmatter support', () => {
|
|
6
|
-
describe('YAML frontmatter', () => {
|
|
7
|
-
it('should parse YAML frontmatter block', () => {
|
|
8
|
-
const parser = createParser({ frontmatter: true })
|
|
9
|
-
const ast = parser.parse(`---
|
|
10
|
-
title: My Article
|
|
11
|
-
author: John Doe
|
|
12
|
-
date: 2024-01-01
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# Content here`)
|
|
16
|
-
|
|
17
|
-
expect(ast.children[0].type).toBe('yaml')
|
|
18
|
-
const yaml = ast.children[0] as Yaml
|
|
19
|
-
expect(yaml.value).toContain('title: My Article')
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
it('should parse nested YAML values', () => {
|
|
23
|
-
const parser = createParser({ frontmatter: true })
|
|
24
|
-
const ast = parser.parse(`---
|
|
25
|
-
meta:
|
|
26
|
-
keywords:
|
|
27
|
-
- markdown
|
|
28
|
-
- parser
|
|
29
|
-
category: tech
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
Content`)
|
|
33
|
-
|
|
34
|
-
const yaml = ast.children[0] as Yaml
|
|
35
|
-
expect(yaml.value).toContain('keywords:')
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
it('should handle empty frontmatter', () => {
|
|
39
|
-
const parser = createParser({ frontmatter: true })
|
|
40
|
-
const ast = parser.parse(`---
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
Content`)
|
|
44
|
-
|
|
45
|
-
expect(ast.children[0].type).toBe('yaml')
|
|
46
|
-
})
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
describe('without frontmatter', () => {
|
|
50
|
-
it('should not parse frontmatter when disabled', () => {
|
|
51
|
-
const parser = createParser({ frontmatter: false })
|
|
52
|
-
const ast = parser.parse(`---
|
|
53
|
-
title: Test
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
Content`)
|
|
57
|
-
|
|
58
|
-
// First child should be thematicBreak, not yaml
|
|
59
|
-
expect(ast.children[0].type).toBe('thematicBreak')
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
it('should parse content without frontmatter', () => {
|
|
63
|
-
const parser = createParser({ frontmatter: true })
|
|
64
|
-
const ast = parser.parse('# Just a heading\n\nSome content')
|
|
65
|
-
|
|
66
|
-
expect(ast.children[0].type).toBe('heading')
|
|
67
|
-
})
|
|
68
|
-
})
|
|
69
|
-
})
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { createParser } from '../src/processor'
|
|
3
|
-
import type { Table, List, ListItem } from 'mdast'
|
|
4
|
-
|
|
5
|
-
describe('GFM syntax support', () => {
|
|
6
|
-
const parser = createParser({ gfm: true })
|
|
7
|
-
|
|
8
|
-
describe('tables', () => {
|
|
9
|
-
it('should parse basic table', () => {
|
|
10
|
-
const ast = parser.parse(`
|
|
11
|
-
| Header 1 | Header 2 |
|
|
12
|
-
|----------|----------|
|
|
13
|
-
| Cell 1 | Cell 2 |
|
|
14
|
-
| Cell 3 | Cell 4 |
|
|
15
|
-
`.trim())
|
|
16
|
-
|
|
17
|
-
const table = ast.children[0] as Table
|
|
18
|
-
expect(table.type).toBe('table')
|
|
19
|
-
expect(table.children).toHaveLength(3) // 1 header + 2 body rows
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
it('should parse table with alignment', () => {
|
|
23
|
-
const ast = parser.parse(`
|
|
24
|
-
| Left | Center | Right |
|
|
25
|
-
|:-----|:------:|------:|
|
|
26
|
-
| L | C | R |
|
|
27
|
-
`.trim())
|
|
28
|
-
|
|
29
|
-
const table = ast.children[0] as Table
|
|
30
|
-
expect(table.align).toEqual(['left', 'center', 'right'])
|
|
31
|
-
})
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
describe('task lists', () => {
|
|
35
|
-
it('should parse checked items', () => {
|
|
36
|
-
const ast = parser.parse('- [x] Completed task')
|
|
37
|
-
|
|
38
|
-
const list = ast.children[0] as List
|
|
39
|
-
const item = list.children[0] as ListItem
|
|
40
|
-
expect(item.checked).toBe(true)
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
it('should parse unchecked items', () => {
|
|
44
|
-
const ast = parser.parse('- [ ] Pending task')
|
|
45
|
-
|
|
46
|
-
const list = ast.children[0] as List
|
|
47
|
-
const item = list.children[0] as ListItem
|
|
48
|
-
expect(item.checked).toBe(false)
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('should parse mixed task list', () => {
|
|
52
|
-
const ast = parser.parse(`
|
|
53
|
-
- [x] Done
|
|
54
|
-
- [ ] Not done
|
|
55
|
-
- Regular item
|
|
56
|
-
`.trim())
|
|
57
|
-
|
|
58
|
-
const list = ast.children[0] as List
|
|
59
|
-
expect(list.children[0].checked).toBe(true)
|
|
60
|
-
expect(list.children[1].checked).toBe(false)
|
|
61
|
-
expect(list.children[2].checked).toBeNull()
|
|
62
|
-
})
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
describe('strikethrough', () => {
|
|
66
|
-
it('should parse strikethrough text', () => {
|
|
67
|
-
const ast = parser.parse('~~deleted text~~')
|
|
68
|
-
|
|
69
|
-
const paragraph = ast.children[0]
|
|
70
|
-
expect(paragraph.type).toBe('paragraph')
|
|
71
|
-
expect((paragraph as any).children[0].type).toBe('delete')
|
|
72
|
-
})
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
describe('autolinks', () => {
|
|
76
|
-
it('should parse URL autolinks', () => {
|
|
77
|
-
const ast = parser.parse('Visit https://example.com for more')
|
|
78
|
-
|
|
79
|
-
const paragraph = ast.children[0]
|
|
80
|
-
expect((paragraph as any).children[1].type).toBe('link')
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
})
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { createParser, definePlugin } from '../src/processor'
|
|
3
|
-
import type { Root, Heading, Paragraph } from 'mdast'
|
|
4
|
-
|
|
5
|
-
describe('createParser', () => {
|
|
6
|
-
it('should parse basic markdown', () => {
|
|
7
|
-
const parser = createParser()
|
|
8
|
-
const ast = parser.parse('# Hello World')
|
|
9
|
-
|
|
10
|
-
expect(ast.type).toBe('root')
|
|
11
|
-
expect(ast.children).toHaveLength(1)
|
|
12
|
-
expect(ast.children[0].type).toBe('heading')
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
it('should parse paragraphs', () => {
|
|
16
|
-
const parser = createParser()
|
|
17
|
-
const ast = parser.parse('Hello world\n\nSecond paragraph')
|
|
18
|
-
|
|
19
|
-
expect(ast.children).toHaveLength(2)
|
|
20
|
-
expect(ast.children[0].type).toBe('paragraph')
|
|
21
|
-
expect(ast.children[1].type).toBe('paragraph')
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
it('should parse inline elements', () => {
|
|
25
|
-
const parser = createParser()
|
|
26
|
-
const ast = parser.parse('Hello **bold** and *italic*')
|
|
27
|
-
|
|
28
|
-
const paragraph = ast.children[0] as Paragraph
|
|
29
|
-
expect(paragraph.children).toHaveLength(4)
|
|
30
|
-
expect(paragraph.children[1].type).toBe('strong')
|
|
31
|
-
expect(paragraph.children[3].type).toBe('emphasis')
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
it('should parse code blocks', () => {
|
|
35
|
-
const parser = createParser()
|
|
36
|
-
const ast = parser.parse('```js\nconsole.log("hello")\n```')
|
|
37
|
-
|
|
38
|
-
expect(ast.children[0].type).toBe('code')
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('should parse links and images', () => {
|
|
42
|
-
const parser = createParser()
|
|
43
|
-
const ast = parser.parse('[Link](https://example.com) ')
|
|
44
|
-
|
|
45
|
-
const paragraph = ast.children[0] as Paragraph
|
|
46
|
-
expect(paragraph.children[0].type).toBe('link')
|
|
47
|
-
expect(paragraph.children[2].type).toBe('image')
|
|
48
|
-
})
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
describe('createParser with GFM', () => {
|
|
52
|
-
it('should parse tables when gfm is enabled', () => {
|
|
53
|
-
const parser = createParser({ gfm: true })
|
|
54
|
-
const ast = parser.parse('| A | B |\n|---|---|\n| 1 | 2 |')
|
|
55
|
-
|
|
56
|
-
expect(ast.children[0].type).toBe('table')
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
it('should parse task lists', () => {
|
|
60
|
-
const parser = createParser({ gfm: true })
|
|
61
|
-
const ast = parser.parse('- [x] Done\n- [ ] Todo')
|
|
62
|
-
|
|
63
|
-
expect(ast.children[0].type).toBe('list')
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
it('should parse strikethrough', () => {
|
|
67
|
-
const parser = createParser({ gfm: true })
|
|
68
|
-
const ast = parser.parse('~~deleted~~')
|
|
69
|
-
|
|
70
|
-
const paragraph = ast.children[0] as Paragraph
|
|
71
|
-
expect(paragraph.children[0].type).toBe('delete')
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
it('should not parse GFM syntax when disabled', () => {
|
|
75
|
-
const parser = createParser({ gfm: false })
|
|
76
|
-
const ast = parser.parse('~~not deleted~~')
|
|
77
|
-
|
|
78
|
-
const paragraph = ast.children[0] as Paragraph
|
|
79
|
-
// Should be plain text, not delete node
|
|
80
|
-
expect(paragraph.children[0].type).toBe('text')
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
describe('createParser with frontmatter', () => {
|
|
85
|
-
it('should parse YAML frontmatter', () => {
|
|
86
|
-
const parser = createParser({ frontmatter: true })
|
|
87
|
-
const ast = parser.parse('---\ntitle: Hello\nauthor: John\n---\n\n# Content')
|
|
88
|
-
|
|
89
|
-
// Frontmatter should be in AST
|
|
90
|
-
expect(ast.children[0].type).toBe('yaml')
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
it('should not parse frontmatter when disabled', () => {
|
|
94
|
-
const parser = createParser({ frontmatter: false })
|
|
95
|
-
const ast = parser.parse('---\ntitle: Hello\n---\n\n# Content')
|
|
96
|
-
|
|
97
|
-
// Should be treated as thematic break
|
|
98
|
-
expect(ast.children[0].type).toBe('thematicBreak')
|
|
99
|
-
})
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
describe('createParser with custom plugins', () => {
|
|
103
|
-
it('should run before plugins', () => {
|
|
104
|
-
let visited = false
|
|
105
|
-
const plugin = definePlugin({
|
|
106
|
-
name: 'test-before',
|
|
107
|
-
phase: 'before',
|
|
108
|
-
transform: () => (tree) => {
|
|
109
|
-
visited = true
|
|
110
|
-
},
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
const parser = createParser({ plugins: [plugin] })
|
|
114
|
-
parser.parse('# Hello')
|
|
115
|
-
|
|
116
|
-
expect(visited).toBe(true)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('should run after plugins', () => {
|
|
120
|
-
let headingHasSlug = false
|
|
121
|
-
const plugin = definePlugin({
|
|
122
|
-
name: 'test-after',
|
|
123
|
-
phase: 'after',
|
|
124
|
-
transform: () => (tree) => {
|
|
125
|
-
const heading = tree.children[0] as Heading
|
|
126
|
-
// After built-in transforms, heading should have slug
|
|
127
|
-
headingHasSlug = Boolean(heading.data?.id)
|
|
128
|
-
},
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
const parser = createParser({ plugins: [plugin] })
|
|
132
|
-
parser.parse('# Hello')
|
|
133
|
-
|
|
134
|
-
expect(headingHasSlug).toBe(true)
|
|
135
|
-
})
|
|
136
|
-
})
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { createParser } from '../../src/processor'
|
|
3
|
-
import type { Heading } from 'mdast'
|
|
4
|
-
|
|
5
|
-
describe('transformHeading', () => {
|
|
6
|
-
const parser = createParser()
|
|
7
|
-
|
|
8
|
-
it('should add slug to heading', () => {
|
|
9
|
-
const ast = parser.parse('# Hello World')
|
|
10
|
-
|
|
11
|
-
const heading = ast.children[0] as Heading;
|
|
12
|
-
console.log('heading =>', heading)
|
|
13
|
-
expect(heading.data?.id).toBe('hello-world')
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
it('should generate unique slugs for duplicate headings', () => {
|
|
17
|
-
const ast = parser.parse(`
|
|
18
|
-
# Hello
|
|
19
|
-
# Hello
|
|
20
|
-
# Hello
|
|
21
|
-
`.trim())
|
|
22
|
-
|
|
23
|
-
const headings = ast.children as Heading[]
|
|
24
|
-
expect(headings[0].data?.id).toBe('hello')
|
|
25
|
-
expect(headings[1].data?.id).toBe('hello-1')
|
|
26
|
-
expect(headings[2].data?.id).toBe('hello-2')
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
it('should handle headings with inline formatting', () => {
|
|
30
|
-
const ast = parser.parse('# Hello **bold** and *italic*')
|
|
31
|
-
|
|
32
|
-
const heading = ast.children[0] as Heading
|
|
33
|
-
expect(heading.data?.id).toBe('hello-bold-and-italic')
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('should handle headings with special characters', () => {
|
|
37
|
-
const ast = parser.parse('# What is Markdown?')
|
|
38
|
-
|
|
39
|
-
const heading = ast.children[0] as Heading
|
|
40
|
-
expect(heading.data?.id).toBe('what-is-markdown')
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
it('should handle Chinese headings', () => {
|
|
44
|
-
const ast = parser.parse('# 你好世界')
|
|
45
|
-
|
|
46
|
-
const heading = ast.children[0] as Heading
|
|
47
|
-
expect(heading.data?.id).toBe('你好世界')
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
it('should add hProperties for compatibility', () => {
|
|
51
|
-
const ast = parser.parse('# Test Heading')
|
|
52
|
-
|
|
53
|
-
const heading = ast.children[0] as Heading
|
|
54
|
-
expect((heading.data?.hProperties as any)?.id).toBe('test-heading')
|
|
55
|
-
})
|
|
56
|
-
})
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { createParser } from '../../src/processor'
|
|
3
|
-
import type { List, ListItem } from 'mdast'
|
|
4
|
-
|
|
5
|
-
describe('transformList', () => {
|
|
6
|
-
const parser = createParser()
|
|
7
|
-
|
|
8
|
-
it('should add index to unordered list items', () => {
|
|
9
|
-
const ast = parser.parse(`
|
|
10
|
-
- First
|
|
11
|
-
- Second
|
|
12
|
-
- Third
|
|
13
|
-
`.trim())
|
|
14
|
-
|
|
15
|
-
const list = ast.children[0] as List
|
|
16
|
-
expect(list.children[0].data?.index).toBe(0)
|
|
17
|
-
expect(list.children[1].data?.index).toBe(1)
|
|
18
|
-
expect(list.children[2].data?.index).toBe(2)
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
it('should add correct index to ordered list items', () => {
|
|
22
|
-
const ast = parser.parse(`
|
|
23
|
-
1. First
|
|
24
|
-
2. Second
|
|
25
|
-
3. Third
|
|
26
|
-
`.trim())
|
|
27
|
-
|
|
28
|
-
const list = ast.children[0] as List
|
|
29
|
-
expect(list.ordered).toBe(true)
|
|
30
|
-
expect(list.children[0].data?.index).toBe(1)
|
|
31
|
-
expect(list.children[1].data?.index).toBe(2)
|
|
32
|
-
expect(list.children[2].data?.index).toBe(3)
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
it('should handle ordered list with custom start', () => {
|
|
36
|
-
const ast = parser.parse(`
|
|
37
|
-
5. Fifth
|
|
38
|
-
6. Sixth
|
|
39
|
-
7. Seventh
|
|
40
|
-
`.trim())
|
|
41
|
-
|
|
42
|
-
const list = ast.children[0] as List
|
|
43
|
-
expect(list.start).toBe(5)
|
|
44
|
-
expect(list.children[0].data?.index).toBe(5)
|
|
45
|
-
expect(list.children[1].data?.index).toBe(6)
|
|
46
|
-
expect(list.children[2].data?.index).toBe(7)
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('should handle nested lists', () => {
|
|
50
|
-
const ast = parser.parse(`
|
|
51
|
-
- Parent
|
|
52
|
-
- Child 1
|
|
53
|
-
- Child 2
|
|
54
|
-
- Another parent
|
|
55
|
-
`.trim())
|
|
56
|
-
|
|
57
|
-
const outerList = ast.children[0] as List
|
|
58
|
-
expect(outerList.children[0].data?.index).toBe(0)
|
|
59
|
-
expect(outerList.children[1].data?.index).toBe(1)
|
|
60
|
-
|
|
61
|
-
// Check nested list
|
|
62
|
-
const parentItem = outerList.children[0] as ListItem
|
|
63
|
-
const nestedList = parentItem.children[1] as List
|
|
64
|
-
expect(nestedList.children[0].data?.index).toBe(0)
|
|
65
|
-
expect(nestedList.children[1].data?.index).toBe(1)
|
|
66
|
-
})
|
|
67
|
-
})
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { createParser } from '../../src/processor'
|
|
3
|
-
import type { Table, TableRow, TableCell } from 'mdast'
|
|
4
|
-
|
|
5
|
-
describe('transformTable', () => {
|
|
6
|
-
const parser = createParser({ gfm: true })
|
|
7
|
-
|
|
8
|
-
it('should mark header cells', () => {
|
|
9
|
-
const ast = parser.parse(`
|
|
10
|
-
| A | B |
|
|
11
|
-
|---|---|
|
|
12
|
-
| 1 | 2 |
|
|
13
|
-
`.trim())
|
|
14
|
-
|
|
15
|
-
const table = ast.children[0] as Table
|
|
16
|
-
const headerRow = table.children[0] as TableRow
|
|
17
|
-
const headerCell = headerRow.children[0] as TableCell
|
|
18
|
-
|
|
19
|
-
expect(headerCell.data?.isHeader).toBe(true)
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
it('should mark body cells', () => {
|
|
23
|
-
const ast = parser.parse(`
|
|
24
|
-
| A | B |
|
|
25
|
-
|---|---|
|
|
26
|
-
| 1 | 2 |
|
|
27
|
-
`.trim())
|
|
28
|
-
|
|
29
|
-
const table = ast.children[0] as Table
|
|
30
|
-
const bodyRow = table.children[1] as TableRow
|
|
31
|
-
const bodyCell = bodyRow.children[0] as TableCell
|
|
32
|
-
|
|
33
|
-
expect(bodyCell.data?.isHeader).toBe(false)
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('should add alignment info to cells', () => {
|
|
37
|
-
const ast = parser.parse(`
|
|
38
|
-
| Left | Center | Right |
|
|
39
|
-
|:-----|:------:|------:|
|
|
40
|
-
| L | C | R |
|
|
41
|
-
`.trim())
|
|
42
|
-
|
|
43
|
-
const table = ast.children[0] as Table
|
|
44
|
-
const headerRow = table.children[0] as TableRow
|
|
45
|
-
|
|
46
|
-
expect(headerRow.children[0].data?.align).toBe('left')
|
|
47
|
-
expect(headerRow.children[1].data?.align).toBe('center')
|
|
48
|
-
expect(headerRow.children[2].data?.align).toBe('right')
|
|
49
|
-
|
|
50
|
-
// Body cells should also have alignment
|
|
51
|
-
const bodyRow = table.children[1] as TableRow
|
|
52
|
-
expect(bodyRow.children[0].data?.align).toBe('left')
|
|
53
|
-
expect(bodyRow.children[1].data?.align).toBe('center')
|
|
54
|
-
expect(bodyRow.children[2].data?.align).toBe('right')
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
it('should add column index to cells', () => {
|
|
58
|
-
const ast = parser.parse(`
|
|
59
|
-
| A | B | C |
|
|
60
|
-
|---|---|---|
|
|
61
|
-
| 1 | 2 | 3 |
|
|
62
|
-
`.trim())
|
|
63
|
-
|
|
64
|
-
const table = ast.children[0] as Table
|
|
65
|
-
const headerRow = table.children[0] as TableRow
|
|
66
|
-
|
|
67
|
-
expect(headerRow.children[0].data?.columnIndex).toBe(0)
|
|
68
|
-
expect(headerRow.children[1].data?.columnIndex).toBe(1)
|
|
69
|
-
expect(headerRow.children[2].data?.columnIndex).toBe(2)
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
it('should store header and body in table data', () => {
|
|
73
|
-
const ast = parser.parse(`
|
|
74
|
-
| Header |
|
|
75
|
-
|--------|
|
|
76
|
-
| Body 1 |
|
|
77
|
-
| Body 2 |
|
|
78
|
-
`.trim())
|
|
79
|
-
|
|
80
|
-
const table = ast.children[0] as Table
|
|
81
|
-
|
|
82
|
-
expect(table.data?.header).toBeDefined()
|
|
83
|
-
expect(table.data?.body).toHaveLength(2)
|
|
84
|
-
})
|
|
85
|
-
})
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
-
|
|
4
|
-
case `uname` in
|
|
5
|
-
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
|
6
|
-
esac
|
|
7
|
-
|
|
8
|
-
if [ -z "$NODE_PATH" ]; then
|
|
9
|
-
export NODE_PATH="/Users/pidan/Work/Learn/pd-markdown/node_modules/.pnpm/yaml@2.8.2/node_modules/yaml/node_modules:/Users/pidan/Work/Learn/pd-markdown/node_modules/.pnpm/yaml@2.8.2/node_modules:/Users/pidan/Work/Learn/pd-markdown/node_modules/.pnpm/node_modules"
|
|
10
|
-
else
|
|
11
|
-
export NODE_PATH="/Users/pidan/Work/Learn/pd-markdown/node_modules/.pnpm/yaml@2.8.2/node_modules/yaml/node_modules:/Users/pidan/Work/Learn/pd-markdown/node_modules/.pnpm/yaml@2.8.2/node_modules:/Users/pidan/Work/Learn/pd-markdown/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
12
|
-
fi
|
|
13
|
-
if [ -x "$basedir/node" ]; then
|
|
14
|
-
exec "$basedir/node" "$basedir/../yaml/bin.mjs" "$@"
|
|
15
|
-
else
|
|
16
|
-
exec node "$basedir/../yaml/bin.mjs" "$@"
|
|
17
|
-
fi
|