pd-markdown 1.0.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 +26 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.d.ts +4 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.d.ts.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.js +5 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.js.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.d.ts +4 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.d.ts.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.js +4 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.js.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.d.ts +6 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.d.ts.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.js +36 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.js.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.d.ts +14 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.d.ts.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.js +18 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.js.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.d.ts +27 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.d.ts.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.js +37 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.js.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.d.ts +22 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.d.ts.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.js +95 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.js.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.d.ts +55 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.d.ts.map +1 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.js +2 -0
- package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.js.map +1 -0
- package/packages/parser/__tests__/frontmatter.test.ts +69 -0
- package/packages/parser/__tests__/gfm.test.ts +83 -0
- package/packages/parser/__tests__/processor.test.ts +136 -0
- package/packages/parser/__tests__/transform/heading.test.ts +56 -0
- package/packages/parser/__tests__/transform/list.test.ts +67 -0
- package/packages/parser/__tests__/transform/table.test.ts +85 -0
- package/packages/parser/dist/index.cjs +191 -0
- package/packages/parser/dist/index.cjs.map +1 -0
- package/packages/parser/dist/index.d.ts +4 -0
- package/packages/parser/dist/index.d.ts.map +1 -0
- package/packages/parser/dist/index.mjs +185 -0
- package/packages/parser/dist/index.mjs.map +1 -0
- package/packages/parser/dist/plugins/index.d.ts +4 -0
- package/packages/parser/dist/plugins/index.d.ts.map +1 -0
- package/packages/parser/dist/plugins/transform/heading.d.ts +6 -0
- package/packages/parser/dist/plugins/transform/heading.d.ts.map +1 -0
- package/packages/parser/dist/plugins/transform/list.d.ts +14 -0
- package/packages/parser/dist/plugins/transform/list.d.ts.map +1 -0
- package/packages/parser/dist/plugins/transform/table.d.ts +27 -0
- package/packages/parser/dist/plugins/transform/table.d.ts.map +1 -0
- package/packages/parser/dist/processor.d.ts +22 -0
- package/packages/parser/dist/processor.d.ts.map +1 -0
- package/packages/parser/dist/types/index.d.ts +55 -0
- package/packages/parser/dist/types/index.d.ts.map +1 -0
- package/packages/parser/node_modules/.bin/yaml +17 -0
- package/packages/parser/package.json +38 -0
- package/packages/parser/rollup.config.ts +38 -0
- package/packages/parser/src/index.ts +15 -0
- package/packages/parser/src/plugins/index.ts +3 -0
- package/packages/parser/src/plugins/transform/heading.ts +40 -0
- package/packages/parser/src/plugins/transform/list.ts +29 -0
- package/packages/parser/src/plugins/transform/table.ts +62 -0
- package/packages/parser/src/processor.ts +119 -0
- package/packages/parser/src/types/index.ts +60 -0
- package/packages/parser/tsconfig.json +9 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.d.ts +36 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.d.ts.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.js +99 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.js.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.d.ts +22 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.d.ts.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.js +46 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.js.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.d.ts +7 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.d.ts.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.js +8 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.js.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.d.ts +22 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.d.ts.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.js +140 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.js.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.d.ts +16 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.d.ts.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.js +39 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.js.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.d.ts +49 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.d.ts.map +1 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.js +19 -0
- package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.js.map +1 -0
- package/packages/utils/__tests__/query.test.ts +155 -0
- package/packages/utils/__tests__/sanitize.test.ts +96 -0
- package/packages/utils/__tests__/slugify.test.ts +71 -0
- package/packages/utils/__tests__/traverse.test.ts +131 -0
- package/packages/utils/dist/ast/query.d.ts +36 -0
- package/packages/utils/dist/ast/query.d.ts.map +1 -0
- package/packages/utils/dist/ast/traverse.d.ts +22 -0
- package/packages/utils/dist/ast/traverse.d.ts.map +1 -0
- package/packages/utils/dist/index.cjs +358 -0
- package/packages/utils/dist/index.cjs.map +1 -0
- package/packages/utils/dist/index.d.ts +7 -0
- package/packages/utils/dist/index.d.ts.map +1 -0
- package/packages/utils/dist/index.mjs +343 -0
- package/packages/utils/dist/index.mjs.map +1 -0
- package/packages/utils/dist/string/sanitize.d.ts +22 -0
- package/packages/utils/dist/string/sanitize.d.ts.map +1 -0
- package/packages/utils/dist/string/slugify.d.ts +16 -0
- package/packages/utils/dist/string/slugify.d.ts.map +1 -0
- package/packages/utils/dist/types/index.d.ts +49 -0
- package/packages/utils/dist/types/index.d.ts.map +1 -0
- package/packages/utils/package.json +27 -0
- package/packages/utils/rollup.config.ts +26 -0
- package/packages/utils/src/ast/query.ts +127 -0
- package/packages/utils/src/ast/traverse.ts +73 -0
- package/packages/utils/src/index.ts +20 -0
- package/packages/utils/src/string/sanitize.ts +155 -0
- package/packages/utils/src/string/slugify.ts +43 -0
- package/packages/utils/src/types/index.ts +72 -0
- package/packages/utils/tsconfig.json +8 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.d.ts +27 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.js +39 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.d.ts +10 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.js +130 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.d.ts +17 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.js +14 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.d.ts +8 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.js +5 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.d.ts +13 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.js +9 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.d.ts +8 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.js +7 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.d.ts +7 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.js +5 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.d.ts +8 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.js +7 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.d.ts +13 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.js +14 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.d.ts +8 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.js +5 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.d.ts +19 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.js +18 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.d.ts +34 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.js +28 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.d.ts +11 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.js +28 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.js.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.d.ts +6 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.d.ts.map +1 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.js +9 -0
- package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.js.map +1 -0
- package/packages/web/__tests__/MarkdownRenderer.test.tsx +89 -0
- package/packages/web/__tests__/NodeRenderer.test.tsx +97 -0
- package/packages/web/__tests__/components/Code.test.tsx +71 -0
- package/packages/web/__tests__/components/Heading.test.tsx +65 -0
- package/packages/web/__tests__/components/List.test.tsx +100 -0
- package/packages/web/__tests__/components/Table.test.tsx +105 -0
- package/packages/web/__tests__/useMarkdown.test.ts +63 -0
- package/packages/web/dist/components/MarkdownRenderer.d.ts +27 -0
- package/packages/web/dist/components/MarkdownRenderer.d.ts.map +1 -0
- package/packages/web/dist/components/NodeRenderer.d.ts +10 -0
- package/packages/web/dist/components/NodeRenderer.d.ts.map +1 -0
- package/packages/web/dist/components/context.d.ts +17 -0
- package/packages/web/dist/components/context.d.ts.map +1 -0
- package/packages/web/dist/components/defaults/Blockquote.d.ts +8 -0
- package/packages/web/dist/components/defaults/Blockquote.d.ts.map +1 -0
- package/packages/web/dist/components/defaults/Code.d.ts +13 -0
- package/packages/web/dist/components/defaults/Code.d.ts.map +1 -0
- package/packages/web/dist/components/defaults/Heading.d.ts +8 -0
- package/packages/web/dist/components/defaults/Heading.d.ts.map +1 -0
- package/packages/web/dist/components/defaults/Image.d.ts +7 -0
- package/packages/web/dist/components/defaults/Image.d.ts.map +1 -0
- package/packages/web/dist/components/defaults/Link.d.ts +8 -0
- package/packages/web/dist/components/defaults/Link.d.ts.map +1 -0
- package/packages/web/dist/components/defaults/List.d.ts +13 -0
- package/packages/web/dist/components/defaults/List.d.ts.map +1 -0
- package/packages/web/dist/components/defaults/Paragraph.d.ts +8 -0
- package/packages/web/dist/components/defaults/Paragraph.d.ts.map +1 -0
- package/packages/web/dist/components/defaults/Table.d.ts +19 -0
- package/packages/web/dist/components/defaults/Table.d.ts.map +1 -0
- package/packages/web/dist/components/defaults/index.d.ts +34 -0
- package/packages/web/dist/components/defaults/index.d.ts.map +1 -0
- package/packages/web/dist/hooks/useMarkdown.d.ts +11 -0
- package/packages/web/dist/hooks/useMarkdown.d.ts.map +1 -0
- package/packages/web/dist/index.cjs +306 -0
- package/packages/web/dist/index.cjs.map +1 -0
- package/packages/web/dist/index.d.ts +6 -0
- package/packages/web/dist/index.d.ts.map +1 -0
- package/packages/web/dist/index.mjs +287 -0
- package/packages/web/dist/index.mjs.map +1 -0
- package/packages/web/package.json +40 -0
- package/packages/web/rollup.config.ts +36 -0
- package/packages/web/src/components/MarkdownRenderer.tsx +70 -0
- package/packages/web/src/components/NodeRenderer.tsx +205 -0
- package/packages/web/src/components/context.ts +24 -0
- package/packages/web/src/components/defaults/Blockquote.tsx +11 -0
- package/packages/web/src/components/defaults/Code.tsx +26 -0
- package/packages/web/src/components/defaults/Heading.tsx +14 -0
- package/packages/web/src/components/defaults/Image.tsx +10 -0
- package/packages/web/src/components/defaults/Link.tsx +18 -0
- package/packages/web/src/components/defaults/List.tsx +33 -0
- package/packages/web/src/components/defaults/Paragraph.tsx +11 -0
- package/packages/web/src/components/defaults/Table.tsx +50 -0
- package/packages/web/src/components/defaults/index.tsx +80 -0
- package/packages/web/src/hooks/useMarkdown.ts +32 -0
- package/packages/web/src/index.ts +37 -0
- package/packages/web/tsconfig.json +11 -0
- package/packages/web/vitest.config.ts +9 -0
- package/pnpm-workspace.yaml +2 -0
- package/tsconfig.base.json +26 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +28 -0
- package/vitest.setup.ts +1 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type guard to check if node is a parent node
|
|
3
|
+
*/
|
|
4
|
+
function isParent(node) {
|
|
5
|
+
return 'children' in node && Array.isArray(node.children);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Type guard to check if node is a literal node
|
|
9
|
+
*/
|
|
10
|
+
function isLiteral(node) {
|
|
11
|
+
return 'value' in node && typeof node.value === 'string';
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Type guard to check if node has specific type
|
|
15
|
+
*/
|
|
16
|
+
function isNodeType(node, type) {
|
|
17
|
+
return node.type === type;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Traverse AST in depth-first order
|
|
22
|
+
*
|
|
23
|
+
* @param node - Root node to start traversal
|
|
24
|
+
* @param visitor - Visitor function called for each node
|
|
25
|
+
* Return `false` to skip children of current node
|
|
26
|
+
* Return `true` or `undefined` to continue
|
|
27
|
+
*/
|
|
28
|
+
function traverseAst(node, visitor) {
|
|
29
|
+
function visit(current, index, parent) {
|
|
30
|
+
const result = visitor(current, index, parent);
|
|
31
|
+
// Skip children if visitor returns false
|
|
32
|
+
if (result === false) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (isParent(current)) {
|
|
36
|
+
const children = current.children;
|
|
37
|
+
for (let i = 0; i < children.length; i++) {
|
|
38
|
+
visit(children[i], i, current);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
visit(node, undefined, undefined);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Traverse AST with enter and leave callbacks
|
|
46
|
+
*
|
|
47
|
+
* @param node - Root node to start traversal
|
|
48
|
+
* @param callbacks - Object with optional enter and leave functions
|
|
49
|
+
*/
|
|
50
|
+
function traverseAstWithCallbacks(node, callbacks) {
|
|
51
|
+
const { enter, leave } = callbacks;
|
|
52
|
+
function visit(current, index, parent) {
|
|
53
|
+
const shouldSkipChildren = enter?.(current, index, parent) === false;
|
|
54
|
+
if (!shouldSkipChildren && isParent(current)) {
|
|
55
|
+
const children = current.children;
|
|
56
|
+
for (let i = 0; i < children.length; i++) {
|
|
57
|
+
visit(children[i], i, current);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
leave?.(current, index, parent);
|
|
61
|
+
}
|
|
62
|
+
visit(node, undefined, undefined);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Find all nodes of a specific type in the AST
|
|
67
|
+
*
|
|
68
|
+
* @param node - Root node to search from
|
|
69
|
+
* @param type - Node type to find
|
|
70
|
+
* @returns Array of matching nodes
|
|
71
|
+
*/
|
|
72
|
+
function findNodes(node, type) {
|
|
73
|
+
const results = [];
|
|
74
|
+
function visit(current) {
|
|
75
|
+
if (current.type === type) {
|
|
76
|
+
results.push(current);
|
|
77
|
+
}
|
|
78
|
+
if (isParent(current)) {
|
|
79
|
+
for (const child of current.children) {
|
|
80
|
+
visit(child);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
visit(node);
|
|
85
|
+
return results;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Find the first node of a specific type in the AST
|
|
89
|
+
*
|
|
90
|
+
* @param node - Root node to search from
|
|
91
|
+
* @param type - Node type to find
|
|
92
|
+
* @returns The first matching node or undefined
|
|
93
|
+
*/
|
|
94
|
+
function findNode(node, type) {
|
|
95
|
+
let result;
|
|
96
|
+
function visit(current) {
|
|
97
|
+
if (current.type === type) {
|
|
98
|
+
result = current;
|
|
99
|
+
return true; // Found, stop searching
|
|
100
|
+
}
|
|
101
|
+
if (isParent(current)) {
|
|
102
|
+
for (const child of current.children) {
|
|
103
|
+
if (visit(child)) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
visit(node);
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Find all nodes matching a predicate
|
|
115
|
+
*
|
|
116
|
+
* @param node - Root node to search from
|
|
117
|
+
* @param predicate - Function to test each node
|
|
118
|
+
* @returns Array of matching nodes
|
|
119
|
+
*/
|
|
120
|
+
function findNodesBy(node, predicate) {
|
|
121
|
+
const results = [];
|
|
122
|
+
function visit(current) {
|
|
123
|
+
if (predicate(current)) {
|
|
124
|
+
results.push(current);
|
|
125
|
+
}
|
|
126
|
+
if (isParent(current)) {
|
|
127
|
+
for (const child of current.children) {
|
|
128
|
+
visit(child);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
visit(node);
|
|
133
|
+
return results;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get the parent of a node in the AST
|
|
137
|
+
* Note: This requires traversing from root, use sparingly
|
|
138
|
+
*
|
|
139
|
+
* @param root - Root node of the AST
|
|
140
|
+
* @param target - Node to find parent of
|
|
141
|
+
* @returns Parent node or undefined if not found or is root
|
|
142
|
+
*/
|
|
143
|
+
function findParent(root, target) {
|
|
144
|
+
let result;
|
|
145
|
+
function visit(current, parent) {
|
|
146
|
+
if (current === target) {
|
|
147
|
+
result = parent;
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
if (isParent(current)) {
|
|
151
|
+
for (const child of current.children) {
|
|
152
|
+
if (visit(child, current)) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
visit(root, undefined);
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Convert text to URL-safe slug
|
|
165
|
+
*
|
|
166
|
+
* @param text - Text to slugify
|
|
167
|
+
* @returns URL-safe slug
|
|
168
|
+
*/
|
|
169
|
+
function slugify(text) {
|
|
170
|
+
return (text
|
|
171
|
+
// Convert to lowercase
|
|
172
|
+
.toLowerCase()
|
|
173
|
+
// Replace Chinese characters with pinyin-like representation (keep as-is for simplicity)
|
|
174
|
+
// Replace spaces and special chars with hyphens
|
|
175
|
+
.replace(/[\s_]+/g, '-')
|
|
176
|
+
// Remove characters that aren't alphanumeric, hyphens, or common CJK
|
|
177
|
+
.replace(/[^\w\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff-]/g, '')
|
|
178
|
+
// Replace multiple consecutive hyphens with single hyphen
|
|
179
|
+
.replace(/-+/g, '-')
|
|
180
|
+
// Remove leading/trailing hyphens
|
|
181
|
+
.replace(/^-+|-+$/g, ''));
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Generate unique slug with counter suffix for duplicates
|
|
185
|
+
*
|
|
186
|
+
* @param text - Text to slugify
|
|
187
|
+
* @param existingSlugs - Set of existing slugs to check against
|
|
188
|
+
* @returns Unique slug
|
|
189
|
+
*/
|
|
190
|
+
function uniqueSlugify(text, existingSlugs) {
|
|
191
|
+
const baseSlug = slugify(text);
|
|
192
|
+
let slug = baseSlug;
|
|
193
|
+
let counter = 1;
|
|
194
|
+
while (existingSlugs.has(slug)) {
|
|
195
|
+
slug = `${baseSlug}-${counter}`;
|
|
196
|
+
counter++;
|
|
197
|
+
}
|
|
198
|
+
existingSlugs.add(slug);
|
|
199
|
+
return slug;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* HTML entities that need escaping
|
|
204
|
+
*/
|
|
205
|
+
const HTML_ESCAPE_MAP = {
|
|
206
|
+
'&': '&',
|
|
207
|
+
'<': '<',
|
|
208
|
+
'>': '>',
|
|
209
|
+
'"': '"',
|
|
210
|
+
"'": ''',
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* Escape HTML special characters
|
|
214
|
+
*
|
|
215
|
+
* @param text - Text to escape
|
|
216
|
+
* @returns Escaped text safe for HTML insertion
|
|
217
|
+
*/
|
|
218
|
+
function escapeHtml(text) {
|
|
219
|
+
return text.replace(/[&<>"']/g, (char) => HTML_ESCAPE_MAP[char] || char);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Allowed HTML tags for sanitization
|
|
223
|
+
*/
|
|
224
|
+
const ALLOWED_TAGS = new Set([
|
|
225
|
+
'a',
|
|
226
|
+
'abbr',
|
|
227
|
+
'b',
|
|
228
|
+
'blockquote',
|
|
229
|
+
'br',
|
|
230
|
+
'code',
|
|
231
|
+
'dd',
|
|
232
|
+
'del',
|
|
233
|
+
'div',
|
|
234
|
+
'dl',
|
|
235
|
+
'dt',
|
|
236
|
+
'em',
|
|
237
|
+
'h1',
|
|
238
|
+
'h2',
|
|
239
|
+
'h3',
|
|
240
|
+
'h4',
|
|
241
|
+
'h5',
|
|
242
|
+
'h6',
|
|
243
|
+
'hr',
|
|
244
|
+
'i',
|
|
245
|
+
'img',
|
|
246
|
+
'ins',
|
|
247
|
+
'kbd',
|
|
248
|
+
'li',
|
|
249
|
+
'ol',
|
|
250
|
+
'p',
|
|
251
|
+
'pre',
|
|
252
|
+
'q',
|
|
253
|
+
's',
|
|
254
|
+
'samp',
|
|
255
|
+
'small',
|
|
256
|
+
'span',
|
|
257
|
+
'strong',
|
|
258
|
+
'sub',
|
|
259
|
+
'sup',
|
|
260
|
+
'table',
|
|
261
|
+
'tbody',
|
|
262
|
+
'td',
|
|
263
|
+
'tfoot',
|
|
264
|
+
'th',
|
|
265
|
+
'thead',
|
|
266
|
+
'tr',
|
|
267
|
+
'u',
|
|
268
|
+
'ul',
|
|
269
|
+
]);
|
|
270
|
+
/**
|
|
271
|
+
* Allowed attributes for sanitization
|
|
272
|
+
*/
|
|
273
|
+
const ALLOWED_ATTRS = new Set([
|
|
274
|
+
'href',
|
|
275
|
+
'src',
|
|
276
|
+
'alt',
|
|
277
|
+
'title',
|
|
278
|
+
'class',
|
|
279
|
+
'id',
|
|
280
|
+
'name',
|
|
281
|
+
'target',
|
|
282
|
+
'rel',
|
|
283
|
+
'width',
|
|
284
|
+
'height',
|
|
285
|
+
'align',
|
|
286
|
+
'colspan',
|
|
287
|
+
'rowspan',
|
|
288
|
+
]);
|
|
289
|
+
/**
|
|
290
|
+
* Sanitize HTML string by removing dangerous content
|
|
291
|
+
*
|
|
292
|
+
* @param html - HTML string to sanitize
|
|
293
|
+
* @returns Sanitized HTML string
|
|
294
|
+
*/
|
|
295
|
+
function sanitizeHtml(html) {
|
|
296
|
+
let result = html;
|
|
297
|
+
// Remove script tags first
|
|
298
|
+
result = result.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
|
|
299
|
+
// Remove event handlers
|
|
300
|
+
result = result.replace(/\s+on\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]*)/gi, '');
|
|
301
|
+
// Remove disallowed tags (keep content) and sanitize attributes
|
|
302
|
+
result = result.replace(/<\/?(\w+)([^>]*)>/g, (match, tagName, attrs) => {
|
|
303
|
+
const tag = tagName.toLowerCase();
|
|
304
|
+
if (!ALLOWED_TAGS.has(tag)) {
|
|
305
|
+
return '';
|
|
306
|
+
}
|
|
307
|
+
// For closing tags, just return them
|
|
308
|
+
if (match.startsWith('</')) {
|
|
309
|
+
return `</${tag}>`;
|
|
310
|
+
}
|
|
311
|
+
// Sanitize attributes
|
|
312
|
+
const sanitizedAttrs = [];
|
|
313
|
+
const attrRegex = /\s+([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\S+))/g;
|
|
314
|
+
let attrMatch;
|
|
315
|
+
while ((attrMatch = attrRegex.exec(attrs)) !== null) {
|
|
316
|
+
const [, attrName, v1, v2, v3] = attrMatch;
|
|
317
|
+
const attr = attrName.toLowerCase();
|
|
318
|
+
if (ALLOWED_ATTRS.has(attr)) {
|
|
319
|
+
let value = v1 ?? v2 ?? v3 ?? '';
|
|
320
|
+
// Check for dangerous URLs in href/src
|
|
321
|
+
if ((attr === 'href' || attr === 'src') && /^\s*javascript\s*:/i.test(value)) {
|
|
322
|
+
value = '';
|
|
323
|
+
}
|
|
324
|
+
sanitizedAttrs.push(`${attr}="${value}"`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const attrStr = sanitizedAttrs.length > 0 ? ' ' + sanitizedAttrs.join(' ') : '';
|
|
328
|
+
return `<${tag}${attrStr}>`;
|
|
329
|
+
});
|
|
330
|
+
return result;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Strip all HTML tags from a string
|
|
334
|
+
*
|
|
335
|
+
* @param html - HTML string to strip
|
|
336
|
+
* @returns Plain text without HTML tags
|
|
337
|
+
*/
|
|
338
|
+
function stripHtml(html) {
|
|
339
|
+
return html.replace(/<[^>]*>/g, '');
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
export { escapeHtml, findNode, findNodes, findNodesBy, findParent, isLiteral, isNodeType, isParent, sanitizeHtml, slugify, stripHtml, traverseAst, traverseAstWithCallbacks, uniqueSlugify };
|
|
343
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/types/index.ts","../src/ast/traverse.ts","../src/ast/query.ts","../src/string/slugify.ts","../src/string/sanitize.ts"],"sourcesContent":[null,null,null,null,null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escape HTML special characters
|
|
3
|
+
*
|
|
4
|
+
* @param text - Text to escape
|
|
5
|
+
* @returns Escaped text safe for HTML insertion
|
|
6
|
+
*/
|
|
7
|
+
export declare function escapeHtml(text: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Sanitize HTML string by removing dangerous content
|
|
10
|
+
*
|
|
11
|
+
* @param html - HTML string to sanitize
|
|
12
|
+
* @returns Sanitized HTML string
|
|
13
|
+
*/
|
|
14
|
+
export declare function sanitizeHtml(html: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Strip all HTML tags from a string
|
|
17
|
+
*
|
|
18
|
+
* @param html - HTML string to strip
|
|
19
|
+
* @returns Plain text without HTML tags
|
|
20
|
+
*/
|
|
21
|
+
export declare function stripHtml(html: string): string;
|
|
22
|
+
//# sourceMappingURL=sanitize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/string/sanitize.ts"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAwED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+CjD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert text to URL-safe slug
|
|
3
|
+
*
|
|
4
|
+
* @param text - Text to slugify
|
|
5
|
+
* @returns URL-safe slug
|
|
6
|
+
*/
|
|
7
|
+
export declare function slugify(text: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Generate unique slug with counter suffix for duplicates
|
|
10
|
+
*
|
|
11
|
+
* @param text - Text to slugify
|
|
12
|
+
* @param existingSlugs - Set of existing slugs to check against
|
|
13
|
+
* @returns Unique slug
|
|
14
|
+
*/
|
|
15
|
+
export declare function uniqueSlugify(text: string, existingSlugs: Set<string>): string;
|
|
16
|
+
//# sourceMappingURL=slugify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slugify.d.ts","sourceRoot":"","sources":["../../src/string/slugify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe5C;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAY9E"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Root, Content, Parent, Literal } from 'mdast';
|
|
2
|
+
import type { Node as UnistNode } from 'unist';
|
|
3
|
+
export type { Root, Content, Parent, Literal };
|
|
4
|
+
/**
|
|
5
|
+
* All possible markdown node types
|
|
6
|
+
*/
|
|
7
|
+
export type MdNode = Root | Content;
|
|
8
|
+
/**
|
|
9
|
+
* Root node of markdown AST
|
|
10
|
+
*/
|
|
11
|
+
export type MdRoot = Root;
|
|
12
|
+
/**
|
|
13
|
+
* Visitor function for AST traversal
|
|
14
|
+
*/
|
|
15
|
+
export type Visitor<T extends UnistNode = MdNode> = (node: T, index: number | undefined, parent: Parent | undefined) => void | boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Plugin options base interface
|
|
18
|
+
*/
|
|
19
|
+
export interface PluginOptions {
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Position information in source
|
|
24
|
+
*/
|
|
25
|
+
export interface Position {
|
|
26
|
+
line: number;
|
|
27
|
+
column: number;
|
|
28
|
+
offset?: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Location in source
|
|
32
|
+
*/
|
|
33
|
+
export interface Location {
|
|
34
|
+
start: Position;
|
|
35
|
+
end: Position;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Type guard to check if node is a parent node
|
|
39
|
+
*/
|
|
40
|
+
export declare function isParent(node: UnistNode): node is Parent;
|
|
41
|
+
/**
|
|
42
|
+
* Type guard to check if node is a literal node
|
|
43
|
+
*/
|
|
44
|
+
export declare function isLiteral(node: UnistNode): node is Literal;
|
|
45
|
+
/**
|
|
46
|
+
* Type guard to check if node has specific type
|
|
47
|
+
*/
|
|
48
|
+
export declare function isNodeType<T extends MdNode>(node: UnistNode, type: T['type']): node is T;
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC3D,OAAO,KAAK,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,OAAO,CAAA;AAG9C,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAE9C;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAA;AAEnC;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,IAAI,CAAA;AAEzB;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,MAAM,IAAI,CAClD,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,KACvB,IAAI,GAAG,OAAO,CAAA;AAEnB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,CAAA;IACf,GAAG,EAAE,QAAQ,CAAA;CACd;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GACd,IAAI,IAAI,CAAC,CAEX"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pd-markdown/utils",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Utility functions and types for pd-markdown",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"import": "./dist/index.mjs",
|
|
9
|
+
"require": "./dist/index.cjs",
|
|
10
|
+
"types": "./dist/index.d.ts"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"main": "./dist/index.cjs",
|
|
14
|
+
"module": "./dist/index.mjs",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"files": ["dist"],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "rollup -c rollup.config.ts --configPlugin typescript",
|
|
19
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/mdast": "^4.0.4",
|
|
23
|
+
"@types/unist": "^3.0.3"
|
|
24
|
+
},
|
|
25
|
+
"sideEffects": false,
|
|
26
|
+
"license": "MIT"
|
|
27
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import typescript from '@rollup/plugin-typescript'
|
|
2
|
+
import { defineConfig } from 'rollup'
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
input: 'src/index.ts',
|
|
6
|
+
output: [
|
|
7
|
+
{
|
|
8
|
+
file: 'dist/index.mjs',
|
|
9
|
+
format: 'esm',
|
|
10
|
+
sourcemap: true,
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
file: 'dist/index.cjs',
|
|
14
|
+
format: 'cjs',
|
|
15
|
+
sourcemap: true,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
plugins: [
|
|
19
|
+
typescript({
|
|
20
|
+
tsconfig: './tsconfig.json',
|
|
21
|
+
declaration: true,
|
|
22
|
+
declarationDir: './dist',
|
|
23
|
+
}),
|
|
24
|
+
],
|
|
25
|
+
external: [],
|
|
26
|
+
})
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { Node } from 'unist'
|
|
2
|
+
import type { MdNode, Parent } from '../types'
|
|
3
|
+
import { isParent } from '../types'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Find all nodes of a specific type in the AST
|
|
7
|
+
*
|
|
8
|
+
* @param node - Root node to search from
|
|
9
|
+
* @param type - Node type to find
|
|
10
|
+
* @returns Array of matching nodes
|
|
11
|
+
*/
|
|
12
|
+
export function findNodes<T extends Node = MdNode>(
|
|
13
|
+
node: Node,
|
|
14
|
+
type: string
|
|
15
|
+
): T[] {
|
|
16
|
+
const results: T[] = []
|
|
17
|
+
|
|
18
|
+
function visit(current: Node): void {
|
|
19
|
+
if (current.type === type) {
|
|
20
|
+
results.push(current as T)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (isParent(current)) {
|
|
24
|
+
for (const child of current.children) {
|
|
25
|
+
visit(child)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
visit(node)
|
|
31
|
+
return results
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Find the first node of a specific type in the AST
|
|
36
|
+
*
|
|
37
|
+
* @param node - Root node to search from
|
|
38
|
+
* @param type - Node type to find
|
|
39
|
+
* @returns The first matching node or undefined
|
|
40
|
+
*/
|
|
41
|
+
export function findNode<T extends Node = MdNode>(
|
|
42
|
+
node: Node,
|
|
43
|
+
type: string
|
|
44
|
+
): T | undefined {
|
|
45
|
+
let result: T | undefined
|
|
46
|
+
|
|
47
|
+
function visit(current: Node): boolean {
|
|
48
|
+
if (current.type === type) {
|
|
49
|
+
result = current as T
|
|
50
|
+
return true // Found, stop searching
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (isParent(current)) {
|
|
54
|
+
for (const child of current.children) {
|
|
55
|
+
if (visit(child)) {
|
|
56
|
+
return true
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return false
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
visit(node)
|
|
65
|
+
return result
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Find all nodes matching a predicate
|
|
70
|
+
*
|
|
71
|
+
* @param node - Root node to search from
|
|
72
|
+
* @param predicate - Function to test each node
|
|
73
|
+
* @returns Array of matching nodes
|
|
74
|
+
*/
|
|
75
|
+
export function findNodesBy<T extends Node = MdNode>(
|
|
76
|
+
node: Node,
|
|
77
|
+
predicate: (node: Node) => boolean
|
|
78
|
+
): T[] {
|
|
79
|
+
const results: T[] = []
|
|
80
|
+
|
|
81
|
+
function visit(current: Node): void {
|
|
82
|
+
if (predicate(current)) {
|
|
83
|
+
results.push(current as T)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (isParent(current)) {
|
|
87
|
+
for (const child of current.children) {
|
|
88
|
+
visit(child)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
visit(node)
|
|
94
|
+
return results
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get the parent of a node in the AST
|
|
99
|
+
* Note: This requires traversing from root, use sparingly
|
|
100
|
+
*
|
|
101
|
+
* @param root - Root node of the AST
|
|
102
|
+
* @param target - Node to find parent of
|
|
103
|
+
* @returns Parent node or undefined if not found or is root
|
|
104
|
+
*/
|
|
105
|
+
export function findParent(root: Node, target: Node): Parent | undefined {
|
|
106
|
+
let result: Parent | undefined
|
|
107
|
+
|
|
108
|
+
function visit(current: Node, parent: Parent | undefined): boolean {
|
|
109
|
+
if (current === target) {
|
|
110
|
+
result = parent
|
|
111
|
+
return true
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (isParent(current)) {
|
|
115
|
+
for (const child of current.children) {
|
|
116
|
+
if (visit(child, current)) {
|
|
117
|
+
return true
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return false
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
visit(root, undefined)
|
|
126
|
+
return result
|
|
127
|
+
}
|