pd-markdown 2.0.3 → 2.0.4-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/package.json +7 -2
- package/packages/parser/dist/index.cjs +1 -1
- package/packages/parser/dist/index.mjs +4 -184
- package/packages/parser/dist/index.mjs.map +1 -1
- package/packages/parser/dist/plugins/transform/heading.mjs +39 -0
- package/packages/parser/dist/plugins/transform/heading.mjs.map +1 -0
- package/packages/parser/dist/plugins/transform/list.mjs +21 -0
- package/packages/parser/dist/plugins/transform/list.mjs.map +1 -0
- package/packages/parser/dist/plugins/transform/table.mjs +40 -0
- package/packages/parser/dist/plugins/transform/table.mjs.map +1 -0
- package/packages/parser/dist/processor.mjs +100 -0
- package/packages/parser/dist/processor.mjs.map +1 -0
- package/packages/web/dist/MarkdownRenderer-CflS5zy_.js +43 -0
- package/packages/web/dist/MarkdownRenderer-CflS5zy_.js.map +1 -0
- package/packages/web/dist/NodeRenderer-DTR-8m1G.js +225 -0
- package/packages/web/dist/NodeRenderer-DTR-8m1G.js.map +1 -0
- package/packages/web/dist/client.cjs +16 -0
- package/packages/web/dist/client.cjs.map +1 -0
- package/packages/web/dist/client.mjs +5 -0
- package/packages/web/dist/client.mjs.map +1 -0
- package/packages/web/dist/components/MarkdownRenderer.mjs +41 -0
- package/packages/web/dist/components/MarkdownRenderer.mjs.map +1 -0
- package/packages/web/dist/components/NodeRenderer.mjs +131 -0
- package/packages/web/dist/components/NodeRenderer.mjs.map +1 -0
- package/packages/web/dist/components/StreamMarkdownRenderer.mjs +145 -0
- package/packages/web/dist/components/StreamMarkdownRenderer.mjs.map +1 -0
- package/packages/web/dist/components/context.mjs +17 -0
- package/packages/web/dist/components/context.mjs.map +1 -0
- package/packages/web/dist/components/defaults/Blockquote.mjs +8 -0
- package/packages/web/dist/components/defaults/Blockquote.mjs.map +1 -0
- package/packages/web/dist/components/defaults/Code.mjs +12 -0
- package/packages/web/dist/components/defaults/Code.mjs.map +1 -0
- package/packages/web/dist/components/defaults/Heading.mjs +10 -0
- package/packages/web/dist/components/defaults/Heading.mjs.map +1 -0
- package/packages/web/dist/components/defaults/Image.mjs +8 -0
- package/packages/web/dist/components/defaults/Image.mjs.map +1 -0
- package/packages/web/dist/components/defaults/Link.mjs +10 -0
- package/packages/web/dist/components/defaults/Link.mjs.map +1 -0
- package/packages/web/dist/components/defaults/List.mjs +17 -0
- package/packages/web/dist/components/defaults/List.mjs.map +1 -0
- package/packages/web/dist/components/defaults/Paragraph.mjs +8 -0
- package/packages/web/dist/components/defaults/Paragraph.mjs.map +1 -0
- package/packages/web/dist/components/defaults/Table.mjs +21 -0
- package/packages/web/dist/components/defaults/Table.mjs.map +1 -0
- package/packages/web/dist/components/defaults/index.mjs +29 -0
- package/packages/web/dist/components/defaults/index.mjs.map +1 -0
- package/packages/web/dist/context-DR5sJXYw.js +86 -0
- package/packages/web/dist/context-DR5sJXYw.js.map +1 -0
- package/packages/web/dist/hooks/useMarkdown.mjs +31 -0
- package/packages/web/dist/hooks/useMarkdown.mjs.map +1 -0
- package/packages/web/dist/hooks/useStreamMarkdown.mjs +274 -0
- package/packages/web/dist/hooks/useStreamMarkdown.mjs.map +1 -0
- package/packages/web/dist/index.cjs +29 -712
- package/packages/web/dist/index.cjs.map +1 -1
- package/packages/web/dist/index.d.ts +28 -26
- package/packages/web/dist/index.mjs +15 -693
- package/packages/web/dist/index.mjs.map +1 -1
- package/packages/web/dist/server.cjs +25 -0
- package/packages/web/dist/server.cjs.map +1 -0
- package/packages/web/dist/server.mjs +12 -0
- package/packages/web/dist/server.mjs.map +1 -0
- package/packages/web/dist/useStreamMarkdown-CXM4Hrzx.js +417 -0
- package/packages/web/dist/useStreamMarkdown-CXM4Hrzx.js.map +1 -0
- package/packages/web/dist/useStreamMarkdown-DEOfH8Ve.js +459 -0
- package/packages/web/dist/useStreamMarkdown-DEOfH8Ve.js.map +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pd-markdown",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4-0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./packages/web/dist/index.cjs",
|
|
6
6
|
"module": "./packages/web/dist/index.mjs",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
11
|
"types": "./packages/web/dist/index.d.ts",
|
|
12
|
+
"react-server": "./packages/web/dist/server.mjs",
|
|
12
13
|
"import": "./packages/web/dist/index.mjs",
|
|
13
14
|
"require": "./packages/web/dist/index.cjs"
|
|
14
15
|
},
|
|
@@ -24,6 +25,7 @@
|
|
|
24
25
|
},
|
|
25
26
|
"./web": {
|
|
26
27
|
"types": "./packages/web/dist/index.d.ts",
|
|
28
|
+
"react-server": "./packages/web/dist/server.mjs",
|
|
27
29
|
"import": "./packages/web/dist/index.mjs",
|
|
28
30
|
"require": "./packages/web/dist/index.cjs"
|
|
29
31
|
}
|
|
@@ -65,7 +67,10 @@
|
|
|
65
67
|
"remark-parse": "^11.0.0",
|
|
66
68
|
"unified": "^11.0.5",
|
|
67
69
|
"unist-util-visit": "^5.0.0",
|
|
68
|
-
"yaml": "^2.7.0"
|
|
70
|
+
"yaml": "^2.7.0",
|
|
71
|
+
"pd-markdown-parser": "0.1.0",
|
|
72
|
+
"pd-markdown-utils": "0.1.0",
|
|
73
|
+
"pd-markdown-web": "0.1.0"
|
|
69
74
|
},
|
|
70
75
|
"devDependencies": {
|
|
71
76
|
"@rollup/plugin-commonjs": "^28.0.2",
|
|
@@ -6,7 +6,7 @@ var remarkGfm = require('remark-gfm');
|
|
|
6
6
|
var remarkFrontmatter = require('remark-frontmatter');
|
|
7
7
|
var unistUtilVisit = require('unist-util-visit');
|
|
8
8
|
var yaml = require('yaml');
|
|
9
|
-
var pdMarkdownUtils = require('pd-markdown
|
|
9
|
+
var pdMarkdownUtils = require('pd-markdown-utils');
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Extract text content from phrasing content nodes
|
|
@@ -1,185 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { visit } from 'unist-util-visit';
|
|
6
|
-
import { parse } from 'yaml';
|
|
7
|
-
import { uniqueSlugify } from 'pd-markdown/utils';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Extract text content from phrasing content nodes
|
|
11
|
-
*/
|
|
12
|
-
function extractText(nodes) {
|
|
13
|
-
return nodes
|
|
14
|
-
.map((node) => {
|
|
15
|
-
if (node.type === 'text') {
|
|
16
|
-
return node.value;
|
|
17
|
-
}
|
|
18
|
-
if ('children' in node) {
|
|
19
|
-
return extractText(node.children);
|
|
20
|
-
}
|
|
21
|
-
return '';
|
|
22
|
-
})
|
|
23
|
-
.join('');
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Transform plugin that adds slug IDs to headings
|
|
27
|
-
*/
|
|
28
|
-
function transformHeading(tree) {
|
|
29
|
-
const slugs = new Set();
|
|
30
|
-
visit(tree, 'heading', (node) => {
|
|
31
|
-
const text = extractText(node.children);
|
|
32
|
-
const slug = uniqueSlugify(text, slugs);
|
|
33
|
-
// Add data.id to the heading node
|
|
34
|
-
const data = (node.data || {});
|
|
35
|
-
data.id = slug;
|
|
36
|
-
const hProperties = (data.hProperties || {});
|
|
37
|
-
hProperties.id = slug;
|
|
38
|
-
data.hProperties = hProperties;
|
|
39
|
-
node.data = data;
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Transform plugin that adds index to list items
|
|
45
|
-
*/
|
|
46
|
-
function transformList(tree) {
|
|
47
|
-
visit(tree, 'list', (node) => {
|
|
48
|
-
node.children.forEach((item, index) => {
|
|
49
|
-
item.data = item.data || {};
|
|
50
|
-
item.data.index = index;
|
|
51
|
-
// For ordered lists, also store the actual number
|
|
52
|
-
if (node.ordered) {
|
|
53
|
-
const start = node.start ?? 1;
|
|
54
|
-
item.data.index = start + index;
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Transform plugin that enhances table structure
|
|
62
|
-
* - Separates header and body rows
|
|
63
|
-
* - Adds alignment and index info to cells
|
|
64
|
-
*/
|
|
65
|
-
function transformTable(tree) {
|
|
66
|
-
visit(tree, 'table', (node) => {
|
|
67
|
-
if (node.children.length === 0)
|
|
68
|
-
return;
|
|
69
|
-
const [headerRow, ...bodyRows] = node.children;
|
|
70
|
-
const align = node.align || [];
|
|
71
|
-
// Mark header row and cells
|
|
72
|
-
if (headerRow) {
|
|
73
|
-
headerRow.children.forEach((cell, index) => {
|
|
74
|
-
cell.data = cell.data || {};
|
|
75
|
-
cell.data.isHeader = true;
|
|
76
|
-
cell.data.align = align[index] || null;
|
|
77
|
-
cell.data.columnIndex = index;
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
// Mark body cells
|
|
81
|
-
bodyRows.forEach((row) => {
|
|
82
|
-
row.children.forEach((cell, index) => {
|
|
83
|
-
cell.data = cell.data || {};
|
|
84
|
-
cell.data.isHeader = false;
|
|
85
|
-
cell.data.align = align[index] || null;
|
|
86
|
-
cell.data.columnIndex = index;
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
// Store structured data on table node
|
|
90
|
-
node.data = node.data || {};
|
|
91
|
-
node.data.header = headerRow;
|
|
92
|
-
node.data.body = bodyRows;
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Default parser options
|
|
98
|
-
*/
|
|
99
|
-
const DEFAULT_OPTIONS = {
|
|
100
|
-
gfm: true,
|
|
101
|
-
frontmatter: true,
|
|
102
|
-
};
|
|
103
|
-
/**
|
|
104
|
-
* Create frontmatter extraction plugin
|
|
105
|
-
*/
|
|
106
|
-
function extractFrontmatter() {
|
|
107
|
-
return (tree, file) => {
|
|
108
|
-
visit(tree, 'yaml', (node) => {
|
|
109
|
-
try {
|
|
110
|
-
const data = parse(node.value);
|
|
111
|
-
file.data.frontmatter = data;
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
// Invalid YAML, ignore
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Create a markdown parser with the specified options
|
|
121
|
-
*
|
|
122
|
-
* @param options - Parser configuration options
|
|
123
|
-
* @returns Parser instance with parse method
|
|
124
|
-
*/
|
|
125
|
-
function createParser(options = {}) {
|
|
126
|
-
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
127
|
-
const customPlugins = options.plugins || [];
|
|
128
|
-
// Build processor (使用 any 绕过复杂的类型检查)
|
|
129
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
130
|
-
let processor = unified().use(remarkParse);
|
|
131
|
-
// Add GFM support
|
|
132
|
-
if (opts.gfm) {
|
|
133
|
-
processor = processor.use(remarkGfm);
|
|
134
|
-
}
|
|
135
|
-
// Add frontmatter support
|
|
136
|
-
if (opts.frontmatter) {
|
|
137
|
-
processor = processor.use(remarkFrontmatter, ['yaml']);
|
|
138
|
-
}
|
|
139
|
-
// Run custom "before" plugins
|
|
140
|
-
const beforePlugins = customPlugins.filter((p) => p.phase === 'before');
|
|
141
|
-
for (const plugin of beforePlugins) {
|
|
142
|
-
processor = processor.use(() => plugin.transform);
|
|
143
|
-
}
|
|
144
|
-
// Add frontmatter extraction
|
|
145
|
-
if (opts.frontmatter) {
|
|
146
|
-
processor = processor.use(extractFrontmatter);
|
|
147
|
-
}
|
|
148
|
-
// Add built-in transform plugins
|
|
149
|
-
processor = processor
|
|
150
|
-
.use(() => transformHeading)
|
|
151
|
-
.use(() => transformList)
|
|
152
|
-
.use(() => transformTable);
|
|
153
|
-
// Run custom "after" plugins
|
|
154
|
-
const afterPlugins = customPlugins.filter((p) => p.phase === 'after');
|
|
155
|
-
for (const plugin of afterPlugins) {
|
|
156
|
-
processor = processor.use(() => plugin.transform);
|
|
157
|
-
}
|
|
158
|
-
// Freeze processor
|
|
159
|
-
processor.freeze();
|
|
160
|
-
return {
|
|
161
|
-
parse(content) {
|
|
162
|
-
// Parse markdown to AST
|
|
163
|
-
const tree = processor.parse(content);
|
|
164
|
-
// Run all transform plugins
|
|
165
|
-
processor.runSync(tree);
|
|
166
|
-
return tree;
|
|
167
|
-
},
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Type-safe helper to define a parser plugin
|
|
172
|
-
*
|
|
173
|
-
* @param config - Plugin configuration
|
|
174
|
-
* @returns Parser plugin
|
|
175
|
-
*/
|
|
176
|
-
function definePlugin(config, options) {
|
|
177
|
-
return {
|
|
178
|
-
name: config.name,
|
|
179
|
-
phase: config.phase,
|
|
180
|
-
transform: config.transform(options),
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
export { createParser, definePlugin, transformHeading, transformList, transformTable };
|
|
1
|
+
export { createParser, definePlugin } from './processor.mjs';
|
|
2
|
+
export { transformHeading } from './plugins/transform/heading.mjs';
|
|
3
|
+
export { transformList } from './plugins/transform/list.mjs';
|
|
4
|
+
export { transformTable } from './plugins/transform/table.mjs';
|
|
185
5
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":[
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { visit } from 'unist-util-visit';
|
|
2
|
+
import { uniqueSlugify } from 'pd-markdown-utils';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Extract text content from phrasing content nodes
|
|
6
|
+
*/
|
|
7
|
+
function extractText(nodes) {
|
|
8
|
+
return nodes
|
|
9
|
+
.map((node) => {
|
|
10
|
+
if (node.type === 'text') {
|
|
11
|
+
return node.value;
|
|
12
|
+
}
|
|
13
|
+
if ('children' in node) {
|
|
14
|
+
return extractText(node.children);
|
|
15
|
+
}
|
|
16
|
+
return '';
|
|
17
|
+
})
|
|
18
|
+
.join('');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Transform plugin that adds slug IDs to headings
|
|
22
|
+
*/
|
|
23
|
+
function transformHeading(tree) {
|
|
24
|
+
const slugs = new Set();
|
|
25
|
+
visit(tree, 'heading', (node) => {
|
|
26
|
+
const text = extractText(node.children);
|
|
27
|
+
const slug = uniqueSlugify(text, slugs);
|
|
28
|
+
// Add data.id to the heading node
|
|
29
|
+
const data = (node.data || {});
|
|
30
|
+
data.id = slug;
|
|
31
|
+
const hProperties = (data.hProperties || {});
|
|
32
|
+
hProperties.id = slug;
|
|
33
|
+
data.hProperties = hProperties;
|
|
34
|
+
node.data = data;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { transformHeading };
|
|
39
|
+
//# sourceMappingURL=heading.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heading.mjs","sources":["../../../src/plugins/transform/heading.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAIA;;AAEG;AACH,SAAS,WAAW,CAAC,KAAwB,EAAA;AAC3C,IAAA,OAAO;AACJ,SAAA,GAAG,CAAC,CAAC,IAAI,KAAI;AACZ,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;YACxB,OAAO,IAAI,CAAC,KAAK;QACnB;AACA,QAAA,IAAI,UAAU,IAAI,IAAI,EAAE;AACtB,YAAA,OAAO,WAAW,CAAC,IAAI,CAAC,QAA6B,CAAC;QACxD;AACA,QAAA,OAAO,EAAE;AACX,IAAA,CAAC;SACA,IAAI,CAAC,EAAE,CAAC;AACb;AAEA;;AAEG;AACG,SAAU,gBAAgB,CAAC,IAAU,EAAA;AACzC,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU;IAE/B,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAa,KAAI;QACvC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC;;QAGvC,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAA4B;AACzD,QAAA,IAAI,CAAC,EAAE,GAAG,IAAI;QACd,MAAM,WAAW,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAA2B;AACtE,QAAA,WAAW,CAAC,EAAE,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;AAC9B,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAClB,IAAA,CAAC,CAAC;AACJ;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { visit } from 'unist-util-visit';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Transform plugin that adds index to list items
|
|
5
|
+
*/
|
|
6
|
+
function transformList(tree) {
|
|
7
|
+
visit(tree, 'list', (node) => {
|
|
8
|
+
node.children.forEach((item, index) => {
|
|
9
|
+
item.data = item.data || {};
|
|
10
|
+
item.data.index = index;
|
|
11
|
+
// For ordered lists, also store the actual number
|
|
12
|
+
if (node.ordered) {
|
|
13
|
+
const start = node.start ?? 1;
|
|
14
|
+
item.data.index = start + index;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { transformList };
|
|
21
|
+
//# sourceMappingURL=list.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.mjs","sources":["../../../src/plugins/transform/list.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAYA;;AAEG;AACG,SAAU,aAAa,CAAC,IAAU,EAAA;IACtC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAU,KAAI;QACjC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAc,EAAE,KAAa,KAAI;YACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE;AAC3B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK;;AAGvB,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK;YACjC;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,CAAC;AACJ;;;;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { visit } from 'unist-util-visit';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Transform plugin that enhances table structure
|
|
5
|
+
* - Separates header and body rows
|
|
6
|
+
* - Adds alignment and index info to cells
|
|
7
|
+
*/
|
|
8
|
+
function transformTable(tree) {
|
|
9
|
+
visit(tree, 'table', (node) => {
|
|
10
|
+
if (node.children.length === 0)
|
|
11
|
+
return;
|
|
12
|
+
const [headerRow, ...bodyRows] = node.children;
|
|
13
|
+
const align = node.align || [];
|
|
14
|
+
// Mark header row and cells
|
|
15
|
+
if (headerRow) {
|
|
16
|
+
headerRow.children.forEach((cell, index) => {
|
|
17
|
+
cell.data = cell.data || {};
|
|
18
|
+
cell.data.isHeader = true;
|
|
19
|
+
cell.data.align = align[index] || null;
|
|
20
|
+
cell.data.columnIndex = index;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
// Mark body cells
|
|
24
|
+
bodyRows.forEach((row) => {
|
|
25
|
+
row.children.forEach((cell, index) => {
|
|
26
|
+
cell.data = cell.data || {};
|
|
27
|
+
cell.data.isHeader = false;
|
|
28
|
+
cell.data.align = align[index] || null;
|
|
29
|
+
cell.data.columnIndex = index;
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
// Store structured data on table node
|
|
33
|
+
node.data = node.data || {};
|
|
34
|
+
node.data.header = headerRow;
|
|
35
|
+
node.data.body = bodyRows;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { transformTable };
|
|
40
|
+
//# sourceMappingURL=table.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.mjs","sources":["../../../src/plugins/transform/table.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAwBA;;;;AAIG;AACG,SAAU,cAAc,CAAC,IAAU,EAAA;IACvC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,IAAW,KAAI;AACnC,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE;QAEhC,MAAM,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ;AAC9C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;;QAG9B,IAAI,SAAS,EAAE;YACb,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAe,EAAE,KAAa,KAAI;gBAC5D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE;AAC3B,gBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI;gBACzB,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI;AACtC,gBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK;AAC/B,YAAA,CAAC,CAAC;QACJ;;AAGA,QAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YACvB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAe,EAAE,KAAa,KAAI;gBACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE;AAC3B,gBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK;gBAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI;AACtC,gBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK;AAC/B,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;;QAGF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ;AAC3B,IAAA,CAAC,CAAC;AACJ;;;;"}
|
|
@@ -0,0 +1,100 @@
|
|
|
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 } from 'yaml';
|
|
7
|
+
import { transformHeading } from './plugins/transform/heading.mjs';
|
|
8
|
+
import { transformList } from './plugins/transform/list.mjs';
|
|
9
|
+
import { transformTable } from './plugins/transform/table.mjs';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Default parser options
|
|
13
|
+
*/
|
|
14
|
+
const DEFAULT_OPTIONS = {
|
|
15
|
+
gfm: true,
|
|
16
|
+
frontmatter: true,
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Create frontmatter extraction plugin
|
|
20
|
+
*/
|
|
21
|
+
function extractFrontmatter() {
|
|
22
|
+
return (tree, file) => {
|
|
23
|
+
visit(tree, 'yaml', (node) => {
|
|
24
|
+
try {
|
|
25
|
+
const data = parse(node.value);
|
|
26
|
+
file.data.frontmatter = data;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Invalid YAML, ignore
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a markdown parser with the specified options
|
|
36
|
+
*
|
|
37
|
+
* @param options - Parser configuration options
|
|
38
|
+
* @returns Parser instance with parse method
|
|
39
|
+
*/
|
|
40
|
+
function createParser(options = {}) {
|
|
41
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
42
|
+
const customPlugins = options.plugins || [];
|
|
43
|
+
// Build processor (使用 any 绕过复杂的类型检查)
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
|
+
let processor = unified().use(remarkParse);
|
|
46
|
+
// Add GFM support
|
|
47
|
+
if (opts.gfm) {
|
|
48
|
+
processor = processor.use(remarkGfm);
|
|
49
|
+
}
|
|
50
|
+
// Add frontmatter support
|
|
51
|
+
if (opts.frontmatter) {
|
|
52
|
+
processor = processor.use(remarkFrontmatter, ['yaml']);
|
|
53
|
+
}
|
|
54
|
+
// Run custom "before" plugins
|
|
55
|
+
const beforePlugins = customPlugins.filter((p) => p.phase === 'before');
|
|
56
|
+
for (const plugin of beforePlugins) {
|
|
57
|
+
processor = processor.use(() => plugin.transform);
|
|
58
|
+
}
|
|
59
|
+
// Add frontmatter extraction
|
|
60
|
+
if (opts.frontmatter) {
|
|
61
|
+
processor = processor.use(extractFrontmatter);
|
|
62
|
+
}
|
|
63
|
+
// Add built-in transform plugins
|
|
64
|
+
processor = processor
|
|
65
|
+
.use(() => transformHeading)
|
|
66
|
+
.use(() => transformList)
|
|
67
|
+
.use(() => transformTable);
|
|
68
|
+
// Run custom "after" plugins
|
|
69
|
+
const afterPlugins = customPlugins.filter((p) => p.phase === 'after');
|
|
70
|
+
for (const plugin of afterPlugins) {
|
|
71
|
+
processor = processor.use(() => plugin.transform);
|
|
72
|
+
}
|
|
73
|
+
// Freeze processor
|
|
74
|
+
processor.freeze();
|
|
75
|
+
return {
|
|
76
|
+
parse(content) {
|
|
77
|
+
// Parse markdown to AST
|
|
78
|
+
const tree = processor.parse(content);
|
|
79
|
+
// Run all transform plugins
|
|
80
|
+
processor.runSync(tree);
|
|
81
|
+
return tree;
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Type-safe helper to define a parser plugin
|
|
87
|
+
*
|
|
88
|
+
* @param config - Plugin configuration
|
|
89
|
+
* @returns Parser plugin
|
|
90
|
+
*/
|
|
91
|
+
function definePlugin(config, options) {
|
|
92
|
+
return {
|
|
93
|
+
name: config.name,
|
|
94
|
+
phase: config.phase,
|
|
95
|
+
transform: config.transform(options),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export { createParser, definePlugin };
|
|
100
|
+
//# sourceMappingURL=processor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.mjs","sources":["../src/processor.ts"],"sourcesContent":[null],"names":["parseYaml"],"mappings":";;;;;;;;;;AAYA;;AAEG;AACH,MAAM,eAAe,GAA6C;AAChE,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,WAAW,EAAE,IAAI;CAClB;AAED;;AAEG;AACH,SAAS,kBAAkB,GAAA;AACzB,IAAA,OAAO,CAAC,IAAU,EAAE,IAAW,KAAI;QACjC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAU,KAAI;AACjC,YAAA,IAAI;gBACF,MAAM,IAAI,GAAGA,KAAS,CAAC,IAAI,CAAC,KAAK,CAA4B;AAC3D,gBAAA,IAAI,CAAC,IAAiB,CAAC,WAAW,GAAG,IAAI;YAC7C;AAAE,YAAA,MAAM;;YAER;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AACH;AAEA;;;;;AAKG;AACG,SAAU,YAAY,CAAC,OAAA,GAAyB,EAAE,EAAA;IACtD,MAAM,IAAI,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE;AAC/C,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE;;;IAI3C,IAAI,SAAS,GAAQ,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC;;AAG/C,IAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,QAAA,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;IACtC;;AAGA,IAAA,IAAI,IAAI,CAAC,WAAW,EAAE;QACpB,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC;IACxD;;AAGA,IAAA,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;AACvE,IAAA,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE;AAClC,QAAA,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC;IACnD;;AAGA,IAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,QAAA,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC/C;;AAGA,IAAA,SAAS,GAAG;AACT,SAAA,GAAG,CAAC,MAAM,gBAAgB;AAC1B,SAAA,GAAG,CAAC,MAAM,aAAa;AACvB,SAAA,GAAG,CAAC,MAAM,cAAc,CAAC;;AAG5B,IAAA,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;AACrE,IAAA,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE;AACjC,QAAA,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC;IACnD;;IAGA,SAAS,CAAC,MAAM,EAAE;IAElB,OAAO;AACL,QAAA,KAAK,CAAC,OAAe,EAAA;;YAEnB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAS;;AAG7C,YAAA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;AAEvB,YAAA,OAAO,IAAI;QACb,CAAC;KACF;AACH;AAEA;;;;;AAKG;AACG,SAAU,YAAY,CAC1B,MAIC,EACD,OAAW,EAAA;IAEX,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,QAAA,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;KACrC;AACH;;;;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var pdMarkdownParser = require('pd-markdown-parser');
|
|
5
|
+
var NodeRenderer = require('./NodeRenderer-DTR-8m1G.js');
|
|
6
|
+
|
|
7
|
+
// Singleton parser for client-side use
|
|
8
|
+
let defaultParser = null;
|
|
9
|
+
function getParser(options) {
|
|
10
|
+
if (options) {
|
|
11
|
+
return pdMarkdownParser.createParser(options);
|
|
12
|
+
}
|
|
13
|
+
if (!defaultParser) {
|
|
14
|
+
defaultParser = pdMarkdownParser.createParser();
|
|
15
|
+
}
|
|
16
|
+
return defaultParser;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Main markdown renderer component
|
|
20
|
+
*
|
|
21
|
+
* Supports both client-side and server-side rendering:
|
|
22
|
+
* - Pass `source` for automatic parsing
|
|
23
|
+
* - Pass `ast` for pre-parsed content (SSR optimization)
|
|
24
|
+
*/
|
|
25
|
+
const MarkdownRenderer = ({ source, ast, components = {}, className, style, parserOptions, }) => {
|
|
26
|
+
// Use provided AST or parse source
|
|
27
|
+
let tree;
|
|
28
|
+
if (ast) {
|
|
29
|
+
tree = ast;
|
|
30
|
+
}
|
|
31
|
+
else if (source) {
|
|
32
|
+
const parser = getParser(parserOptions);
|
|
33
|
+
tree = parser.parse(source);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// No content provided
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return (jsxRuntime.jsx("div", { className: className, style: style, children: jsxRuntime.jsx(NodeRenderer.NodeRenderer, { node: tree, components: components }) }));
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
exports.MarkdownRenderer = MarkdownRenderer;
|
|
43
|
+
//# sourceMappingURL=MarkdownRenderer-CflS5zy_.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownRenderer-CflS5zy_.js","sources":["../src/components/MarkdownRenderer.tsx"],"sourcesContent":[null],"names":["createParser","_jsx","NodeRenderer"],"mappings":";;;;;;AAqBA;AACA,IAAI,aAAa,GAA2C,IAAI;AAEhE,SAAS,SAAS,CAAC,OAAuB,EAAA;IACxC,IAAI,OAAO,EAAE;AACX,QAAA,OAAOA,6BAAY,CAAC,OAAO,CAAC;IAC9B;IACA,IAAI,CAAC,aAAa,EAAE;QAClB,aAAa,GAAGA,6BAAY,EAAE;IAChC;AACA,IAAA,OAAO,aAAa;AACtB;AAEA;;;;;;AAMG;MACU,gBAAgB,GAA8B,CAAC,EAC1D,MAAM,EACN,GAAG,EACH,UAAU,GAAG,EAAE,EACf,SAAS,EACT,KAAK,EACL,aAAa,GACd,KAAI;;AAEH,IAAA,IAAI,IAAU;IACd,IAAI,GAAG,EAAE;QACP,IAAI,GAAG,GAAG;IACZ;SAAO,IAAI,MAAM,EAAE;AACjB,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC;AACvC,QAAA,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B;SAAO;;AAEL,QAAA,OAAO,IAAI;IACb;IAEA,QACEC,wBAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAA,QAAA,EACrCA,cAAA,CAACC,yBAAY,EAAA,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAA,CAAI,EAAA,CAChD;AAEV;;;;"}
|