pd-markdown 2.0.3 → 2.0.4-1

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.
Files changed (66) hide show
  1. package/README.md +36 -0
  2. package/package.json +11 -4
  3. package/packages/parser/dist/index.cjs +1 -1
  4. package/packages/parser/dist/index.mjs +4 -184
  5. package/packages/parser/dist/index.mjs.map +1 -1
  6. package/packages/parser/dist/plugins/transform/heading.mjs +39 -0
  7. package/packages/parser/dist/plugins/transform/heading.mjs.map +1 -0
  8. package/packages/parser/dist/plugins/transform/list.mjs +21 -0
  9. package/packages/parser/dist/plugins/transform/list.mjs.map +1 -0
  10. package/packages/parser/dist/plugins/transform/table.mjs +40 -0
  11. package/packages/parser/dist/plugins/transform/table.mjs.map +1 -0
  12. package/packages/parser/dist/processor.mjs +100 -0
  13. package/packages/parser/dist/processor.mjs.map +1 -0
  14. package/packages/web/dist/MarkdownRenderer-CflS5zy_.js +43 -0
  15. package/packages/web/dist/MarkdownRenderer-CflS5zy_.js.map +1 -0
  16. package/packages/web/dist/NodeRenderer-DTR-8m1G.js +225 -0
  17. package/packages/web/dist/NodeRenderer-DTR-8m1G.js.map +1 -0
  18. package/packages/web/dist/client.cjs +16 -0
  19. package/packages/web/dist/client.cjs.map +1 -0
  20. package/packages/web/dist/client.mjs +5 -0
  21. package/packages/web/dist/client.mjs.map +1 -0
  22. package/packages/web/dist/components/MarkdownRenderer.mjs +41 -0
  23. package/packages/web/dist/components/MarkdownRenderer.mjs.map +1 -0
  24. package/packages/web/dist/components/NodeRenderer.mjs +131 -0
  25. package/packages/web/dist/components/NodeRenderer.mjs.map +1 -0
  26. package/packages/web/dist/components/StreamMarkdownRenderer.mjs +145 -0
  27. package/packages/web/dist/components/StreamMarkdownRenderer.mjs.map +1 -0
  28. package/packages/web/dist/components/context.mjs +17 -0
  29. package/packages/web/dist/components/context.mjs.map +1 -0
  30. package/packages/web/dist/components/defaults/Blockquote.mjs +8 -0
  31. package/packages/web/dist/components/defaults/Blockquote.mjs.map +1 -0
  32. package/packages/web/dist/components/defaults/Code.mjs +12 -0
  33. package/packages/web/dist/components/defaults/Code.mjs.map +1 -0
  34. package/packages/web/dist/components/defaults/Heading.mjs +10 -0
  35. package/packages/web/dist/components/defaults/Heading.mjs.map +1 -0
  36. package/packages/web/dist/components/defaults/Image.mjs +8 -0
  37. package/packages/web/dist/components/defaults/Image.mjs.map +1 -0
  38. package/packages/web/dist/components/defaults/Link.mjs +10 -0
  39. package/packages/web/dist/components/defaults/Link.mjs.map +1 -0
  40. package/packages/web/dist/components/defaults/List.mjs +17 -0
  41. package/packages/web/dist/components/defaults/List.mjs.map +1 -0
  42. package/packages/web/dist/components/defaults/Paragraph.mjs +8 -0
  43. package/packages/web/dist/components/defaults/Paragraph.mjs.map +1 -0
  44. package/packages/web/dist/components/defaults/Table.mjs +21 -0
  45. package/packages/web/dist/components/defaults/Table.mjs.map +1 -0
  46. package/packages/web/dist/components/defaults/index.mjs +29 -0
  47. package/packages/web/dist/components/defaults/index.mjs.map +1 -0
  48. package/packages/web/dist/context-DR5sJXYw.js +86 -0
  49. package/packages/web/dist/context-DR5sJXYw.js.map +1 -0
  50. package/packages/web/dist/hooks/useMarkdown.mjs +31 -0
  51. package/packages/web/dist/hooks/useMarkdown.mjs.map +1 -0
  52. package/packages/web/dist/hooks/useStreamMarkdown.mjs +274 -0
  53. package/packages/web/dist/hooks/useStreamMarkdown.mjs.map +1 -0
  54. package/packages/web/dist/index.cjs +29 -712
  55. package/packages/web/dist/index.cjs.map +1 -1
  56. package/packages/web/dist/index.d.ts +28 -26
  57. package/packages/web/dist/index.mjs +15 -693
  58. package/packages/web/dist/index.mjs.map +1 -1
  59. package/packages/web/dist/server.cjs +25 -0
  60. package/packages/web/dist/server.cjs.map +1 -0
  61. package/packages/web/dist/server.mjs +12 -0
  62. package/packages/web/dist/server.mjs.map +1 -0
  63. package/packages/web/dist/useStreamMarkdown-CXM4Hrzx.js +417 -0
  64. package/packages/web/dist/useStreamMarkdown-CXM4Hrzx.js.map +1 -0
  65. package/packages/web/dist/useStreamMarkdown-DEOfH8Ve.js +459 -0
  66. package/packages/web/dist/useStreamMarkdown-DEOfH8Ve.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Blockquote.mjs","sources":["../../../src/components/defaults/Blockquote.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;MAQa,UAAU,GAAwB,CAAC,EAAE,QAAQ,EAAE,KAAI;IAC9D,OAAOA,GAAA,CAAA,YAAA,EAAA,EAAA,QAAA,EAAa,QAAQ,EAAA,CAAc;AAC5C;;;;"}
@@ -0,0 +1,12 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const Code = ({ node }) => {
4
+ const className = node.lang ? `language-${node.lang}` : undefined;
5
+ return (jsx("pre", { children: jsx("code", { className: className, children: node.value }) }));
6
+ };
7
+ const InlineCodeComponent = ({ node }) => {
8
+ return jsx("code", { children: node.value });
9
+ };
10
+
11
+ export { Code, InlineCodeComponent };
12
+ //# sourceMappingURL=Code.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Code.mjs","sources":["../../../src/components/defaults/Code.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;MAQa,IAAI,GAAkB,CAAC,EAAE,IAAI,EAAE,KAAI;AAC9C,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,CAAA,SAAA,EAAY,IAAI,CAAC,IAAI,CAAA,CAAE,GAAG,SAAS;AAEjE,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EACEA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,SAAS,EAAA,QAAA,EAAG,IAAI,CAAC,KAAK,EAAA,CAAQ,EAAA,CAC3C;AAEV;MAOa,mBAAmB,GAAwB,CAAC,EAAE,IAAI,EAAE,KAAI;AACnE,IAAA,OAAOA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,IAAI,CAAC,KAAK,GAAQ;AAClC;;;;"}
@@ -0,0 +1,10 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const Heading = ({ node, children }) => {
4
+ const Tag = `h${node.depth}`;
5
+ const id = node.data && 'id' in node.data ? node.data.id : undefined;
6
+ return jsx(Tag, { id: id, children: children });
7
+ };
8
+
9
+ export { Heading };
10
+ //# sourceMappingURL=Heading.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Heading.mjs","sources":["../../../src/components/defaults/Heading.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;AAQO,MAAM,OAAO,GAAqB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAI;AAC9D,IAAA,MAAM,GAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,EAAW;IACrC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,GAAI,IAAI,CAAC,IAAI,CAAC,EAAa,GAAG,SAAS;IAEhF,OAAOA,GAAA,CAAC,GAAG,EAAA,EAAC,EAAE,EAAE,EAAE,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAO;AACtC;;;;"}
@@ -0,0 +1,8 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const Image = ({ node }) => {
4
+ return jsx("img", { src: node.url, alt: node.alt || '', title: node.title || undefined });
5
+ };
6
+
7
+ export { Image };
8
+ //# sourceMappingURL=Image.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Image.mjs","sources":["../../../src/components/defaults/Image.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;MAOa,KAAK,GAAmB,CAAC,EAAE,IAAI,EAAE,KAAI;IAChD,OAAOA,GAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS,EAAA,CAAI;AACpF;;;;"}
@@ -0,0 +1,10 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const Link = ({ node, children }) => {
4
+ // Basic security: prevent javascript: URLs
5
+ const href = node.url?.startsWith('javascript:') ? '#' : node.url;
6
+ return (jsx("a", { href: href, title: node.title || undefined, children: children }));
7
+ };
8
+
9
+ export { Link };
10
+ //# sourceMappingURL=Link.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Link.mjs","sources":["../../../src/components/defaults/Link.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;AAQO,MAAM,IAAI,GAAkB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAI;;IAExD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG;AAEjE,IAAA,QACEA,GAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS,YAC1C,QAAQ,EAAA,CACP;AAER;;;;"}
@@ -0,0 +1,17 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+
3
+ const List = ({ node, children }) => {
4
+ const Tag = node.ordered ? 'ol' : 'ul';
5
+ const start = node.ordered && node.start != null && node.start !== 1 ? node.start : undefined;
6
+ return jsx(Tag, { start: start, children: children });
7
+ };
8
+ const ListItem = ({ node, children }) => {
9
+ // Handle task list items
10
+ if (typeof node.checked === 'boolean') {
11
+ return (jsxs("li", { className: "task-list-item", children: [jsx("input", { type: "checkbox", checked: node.checked, readOnly: true }), jsx("span", { children: children })] }));
12
+ }
13
+ return jsx("li", { children: children });
14
+ };
15
+
16
+ export { List, ListItem };
17
+ //# sourceMappingURL=List.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"List.mjs","sources":["../../../src/components/defaults/List.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":";;AAQO,MAAM,IAAI,GAAkB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAI;AACxD,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS;IAE7F,OAAOA,GAAA,CAAC,GAAG,EAAA,EAAC,KAAK,EAAE,KAAK,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAO;AAC5C;AAOO,MAAM,QAAQ,GAAsB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAI;;AAEhE,IAAA,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;QACrC,QACEC,IAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,gBAAgB,aAC5BD,GAAA,CAAA,OAAA,EAAA,EAAO,IAAI,EAAC,UAAU,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAA,IAAA,EAAA,CAAG,EACzDA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,QAAQ,EAAA,CAAQ,CAAA,EAAA,CACpB;IAET;IAEA,OAAOA,GAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAK,QAAQ,EAAA,CAAM;AAC5B;;;;"}
@@ -0,0 +1,8 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const Paragraph = ({ children }) => {
4
+ return jsx("p", { children: children });
5
+ };
6
+
7
+ export { Paragraph };
8
+ //# sourceMappingURL=Paragraph.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Paragraph.mjs","sources":["../../../src/components/defaults/Paragraph.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;MAQa,SAAS,GAAuB,CAAC,EAAE,QAAQ,EAAE,KAAI;IAC5D,OAAOA,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAI,QAAQ,EAAA,CAAK;AAC1B;;;;"}
@@ -0,0 +1,21 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const Table = ({ children }) => {
4
+ return (jsx("table", { children: children }));
5
+ };
6
+ const TableRow = ({ children, isHeader }) => {
7
+ if (isHeader) {
8
+ return (jsx("thead", { children: jsx("tr", { children: children }) }));
9
+ }
10
+ return jsx("tr", { children: children });
11
+ };
12
+ const TableCell = ({ node, children }) => {
13
+ const isHeader = node.data?.isHeader;
14
+ const align = node.data?.align;
15
+ const Tag = isHeader ? 'th' : 'td';
16
+ const style = align ? { textAlign: align } : undefined;
17
+ return jsx(Tag, { style: style, children: children });
18
+ };
19
+
20
+ export { Table, TableCell, TableRow };
21
+ //# sourceMappingURL=Table.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.mjs","sources":["../../../src/components/defaults/Table.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;MAYa,KAAK,GAAmB,CAAC,EAAE,QAAQ,EAAE,KAAI;AACpD,IAAA,QACEA,GAAA,CAAA,OAAA,EAAA,EAAA,QAAA,EACG,QAAQ,EAAA,CACH;AAEZ;AAQO,MAAM,QAAQ,GAAsB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAI;IACpE,IAAI,QAAQ,EAAE;AACZ,QAAA,QACEA,GAAA,CAAA,OAAA,EAAA,EAAA,QAAA,EACEA,GAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAK,QAAQ,EAAA,CAAM,EAAA,CACb;IAEZ;IACA,OAAOA,GAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAK,QAAQ,EAAA,CAAM;AAC5B;AAOO,MAAM,SAAS,GAAuB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAI;AAClE,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ;AACpC,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAA2C;IACpE,MAAM,GAAG,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI;AAClC,IAAA,MAAM,KAAK,GAAG,KAAK,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,SAAS;IAEtD,OAAOA,GAAA,CAAC,GAAG,EAAA,EAAC,KAAK,EAAE,KAAK,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAO;AAC5C;;;;"}
@@ -0,0 +1,29 @@
1
+ import { Heading } from './Heading.mjs';
2
+ import { Paragraph } from './Paragraph.mjs';
3
+ import { ListItem, List } from './List.mjs';
4
+ import { TableCell, TableRow, Table } from './Table.mjs';
5
+ import { InlineCodeComponent, Code } from './Code.mjs';
6
+ import { Link } from './Link.mjs';
7
+ import { Image } from './Image.mjs';
8
+ import { Blockquote } from './Blockquote.mjs';
9
+
10
+ /**
11
+ * Default component map
12
+ */
13
+ const defaultComponents = {
14
+ heading: Heading,
15
+ paragraph: Paragraph,
16
+ list: List,
17
+ listItem: ListItem,
18
+ table: Table,
19
+ tableRow: TableRow,
20
+ tableCell: TableCell,
21
+ code: Code,
22
+ inlineCode: InlineCodeComponent,
23
+ link: Link,
24
+ image: Image,
25
+ blockquote: Blockquote,
26
+ };
27
+
28
+ export { Blockquote, Code, Heading, Image, InlineCodeComponent, Link, List, ListItem, Paragraph, Table, TableCell, TableRow, defaultComponents };
29
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/components/defaults/index.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;AAuEA;;AAEG;AACI,MAAM,iBAAiB,GAAiB;AAC7C,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,UAAU,EAAE,mBAAmB;AAC/B,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,UAAU,EAAE,UAAU;;;;;"}
@@ -0,0 +1,86 @@
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
+ var react = require('react');
7
+
8
+ // Singleton parser for client-side use
9
+ let defaultParser = null;
10
+ function getParser$1(options) {
11
+ if (options) {
12
+ return pdMarkdownParser.createParser(options);
13
+ }
14
+ if (!defaultParser) {
15
+ defaultParser = pdMarkdownParser.createParser();
16
+ }
17
+ return defaultParser;
18
+ }
19
+ /**
20
+ * Main markdown renderer component
21
+ *
22
+ * Supports both client-side and server-side rendering:
23
+ * - Pass `source` for automatic parsing
24
+ * - Pass `ast` for pre-parsed content (SSR optimization)
25
+ */
26
+ const MarkdownRenderer = ({ source, ast, components = {}, className, style, parserOptions, }) => {
27
+ // Use provided AST or parse source
28
+ let tree;
29
+ if (ast) {
30
+ tree = ast;
31
+ }
32
+ else if (source) {
33
+ const parser = getParser$1(parserOptions);
34
+ tree = parser.parse(source);
35
+ }
36
+ else {
37
+ // No content provided
38
+ return null;
39
+ }
40
+ return (jsxRuntime.jsx("div", { className: className, style: style, children: jsxRuntime.jsx(NodeRenderer.NodeRenderer, { node: tree, components: components }) }));
41
+ };
42
+
43
+ // Cached parser instance
44
+ let cachedParser = null;
45
+ function getParser(options) {
46
+ if (options) {
47
+ return pdMarkdownParser.createParser(options);
48
+ }
49
+ if (!cachedParser) {
50
+ cachedParser = pdMarkdownParser.createParser();
51
+ }
52
+ return cachedParser;
53
+ }
54
+ /**
55
+ * Hook for parsing markdown on the client side
56
+ *
57
+ * @param source - Markdown source string
58
+ * @param options - Parser options
59
+ * @returns Parsed AST
60
+ */
61
+ function useMarkdown(source, options) {
62
+ const ast = react.useMemo(() => {
63
+ const parser = getParser(options);
64
+ return parser.parse(source);
65
+ }, [source, options]);
66
+ return ast;
67
+ }
68
+
69
+ /**
70
+ * Context for passing configuration down the component tree
71
+ */
72
+ const MarkdownContext = react.createContext({
73
+ components: {},
74
+ });
75
+ /**
76
+ * Hook to access markdown context
77
+ */
78
+ function useMarkdownContext() {
79
+ return react.useContext(MarkdownContext);
80
+ }
81
+
82
+ exports.MarkdownContext = MarkdownContext;
83
+ exports.MarkdownRenderer = MarkdownRenderer;
84
+ exports.useMarkdown = useMarkdown;
85
+ exports.useMarkdownContext = useMarkdownContext;
86
+ //# sourceMappingURL=context-DR5sJXYw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-DR5sJXYw.js","sources":["../src/components/MarkdownRenderer.tsx","../src/hooks/useMarkdown.ts","../src/components/context.ts"],"sourcesContent":[null,null,null],"names":["getParser","createParser","_jsx","NodeRenderer","useMemo","createContext","useContext"],"mappings":";;;;;;;AAqBA;AACA,IAAI,aAAa,GAA2C,IAAI;AAEhE,SAASA,WAAS,CAAC,OAAuB,EAAA;IACxC,IAAI,OAAO,EAAE;AACX,QAAA,OAAOC,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,GAAGD,WAAS,CAAC,aAAa,CAAC;AACvC,QAAA,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B;SAAO;;AAEL,QAAA,OAAO,IAAI;IACb;IAEA,QACEE,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;;AC9DA;AACA,IAAI,YAAY,GAA2C,IAAI;AAE/D,SAAS,SAAS,CAAC,OAAuB,EAAA;IACxC,IAAI,OAAO,EAAE;AACX,QAAA,OAAOF,6BAAY,CAAC,OAAO,CAAC;IAC9B;IACA,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAGA,6BAAY,EAAE;IAC/B;AACA,IAAA,OAAO,YAAY;AACrB;AAEA;;;;;;AAMG;AACG,SAAU,WAAW,CAAC,MAAc,EAAE,OAAuB,EAAA;AACjE,IAAA,MAAM,GAAG,GAAGG,aAAO,CAAC,MAAK;AACvB,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;AACjC,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;AAC7B,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErB,IAAA,OAAO,GAAG;AACZ;;ACpBA;;AAEG;AACI,MAAM,eAAe,GAAGC,mBAAa,CAAuB;AACjE,IAAA,UAAU,EAAE,EAAE;AACf,CAAA;AAED;;AAEG;SACa,kBAAkB,GAAA;AAChC,IAAA,OAAOC,gBAAU,CAAC,eAAe,CAAC;AACpC;;;;;;;"}
@@ -0,0 +1,31 @@
1
+ import { useMemo } from 'react';
2
+ import { createParser } from 'pd-markdown-parser';
3
+
4
+ // Cached parser instance
5
+ let cachedParser = null;
6
+ function getParser(options) {
7
+ if (options) {
8
+ return createParser(options);
9
+ }
10
+ if (!cachedParser) {
11
+ cachedParser = createParser();
12
+ }
13
+ return cachedParser;
14
+ }
15
+ /**
16
+ * Hook for parsing markdown on the client side
17
+ *
18
+ * @param source - Markdown source string
19
+ * @param options - Parser options
20
+ * @returns Parsed AST
21
+ */
22
+ function useMarkdown(source, options) {
23
+ const ast = useMemo(() => {
24
+ const parser = getParser(options);
25
+ return parser.parse(source);
26
+ }, [source, options]);
27
+ return ast;
28
+ }
29
+
30
+ export { useMarkdown };
31
+ //# sourceMappingURL=useMarkdown.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMarkdown.mjs","sources":["../../src/hooks/useMarkdown.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAIA;AACA,IAAI,YAAY,GAA2C,IAAI;AAE/D,SAAS,SAAS,CAAC,OAAuB,EAAA;IACxC,IAAI,OAAO,EAAE;AACX,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B;IACA,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,YAAY,EAAE;IAC/B;AACA,IAAA,OAAO,YAAY;AACrB;AAEA;;;;;;AAMG;AACG,SAAU,WAAW,CAAC,MAAc,EAAE,OAAuB,EAAA;AACjE,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,MAAK;AACvB,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;AACjC,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;AAC7B,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErB,IAAA,OAAO,GAAG;AACZ;;;;"}
@@ -0,0 +1,274 @@
1
+ import { useState, useRef, useCallback, useEffect } from 'react';
2
+ import { createParser } from 'pd-markdown-parser';
3
+
4
+ // Singleton parser cache
5
+ let cachedParser = null;
6
+ let cachedParserOptions;
7
+ function getParser(options) {
8
+ if (options !== cachedParserOptions ||
9
+ (options && JSON.stringify(options) !== JSON.stringify(cachedParserOptions))) {
10
+ cachedParser = createParser(options);
11
+ cachedParserOptions = options;
12
+ }
13
+ if (!cachedParser) {
14
+ cachedParser = createParser(options);
15
+ cachedParserOptions = options;
16
+ }
17
+ return cachedParser;
18
+ }
19
+ const EMPTY_AST = { type: 'root', children: [] };
20
+ /**
21
+ * Hook for streaming markdown rendering.
22
+ *
23
+ * Provides a simple API to progressively append markdown text,
24
+ * automatically re-parsing into an AST that can be rendered
25
+ * by the MarkdownRenderer.
26
+ *
27
+ * Supports multiple consumption methods:
28
+ * - Manual `append()` + `done()` calls
29
+ * - `consume(readableStream)` for ReadableStream<string>
30
+ * - `consumeIterator(asyncIterable)` for async iterators
31
+ * - `consumeResponse(response)` for SSE/fetch responses
32
+ */
33
+ function useStreamMarkdown(options = {}) {
34
+ const { parserOptions, onStart, onChunk, onDone, onError, parseDebounceMs = 50, } = options;
35
+ const [state, setState] = useState({
36
+ source: '',
37
+ ast: EMPTY_AST,
38
+ isStreaming: false,
39
+ isDone: false,
40
+ error: null,
41
+ });
42
+ const sourceRef = useRef('');
43
+ const isStreamingRef = useRef(false);
44
+ const parseTimerRef = useRef(null);
45
+ const abortControllerRef = useRef(null);
46
+ // Parse the current source and update AST
47
+ const parseSource = useCallback((source) => {
48
+ try {
49
+ const parser = getParser(parserOptions);
50
+ const ast = parser.parse(source);
51
+ setState((prev) => ({ ...prev, source, ast }));
52
+ }
53
+ catch {
54
+ // If parsing fails (e.g., incomplete markdown), keep previous AST
55
+ setState((prev) => ({ ...prev, source }));
56
+ }
57
+ }, [parserOptions]);
58
+ // Debounced parse
59
+ const debouncedParse = useCallback((source) => {
60
+ if (parseTimerRef.current) {
61
+ clearTimeout(parseTimerRef.current);
62
+ }
63
+ parseTimerRef.current = setTimeout(() => {
64
+ parseSource(source);
65
+ }, parseDebounceMs);
66
+ }, [parseSource, parseDebounceMs]);
67
+ // Append a chunk
68
+ const append = useCallback((chunk) => {
69
+ if (!isStreamingRef.current) {
70
+ isStreamingRef.current = true;
71
+ setState((prev) => ({
72
+ ...prev,
73
+ isStreaming: true,
74
+ isDone: false,
75
+ error: null,
76
+ }));
77
+ onStart?.();
78
+ }
79
+ sourceRef.current += chunk;
80
+ const currentSource = sourceRef.current;
81
+ onChunk?.(chunk, currentSource);
82
+ debouncedParse(currentSource);
83
+ }, [debouncedParse, onStart, onChunk]);
84
+ // Signal completion
85
+ const done = useCallback(() => {
86
+ if (parseTimerRef.current) {
87
+ clearTimeout(parseTimerRef.current);
88
+ }
89
+ // Final parse with complete source
90
+ const finalSource = sourceRef.current;
91
+ parseSource(finalSource);
92
+ isStreamingRef.current = false;
93
+ setState((prev) => ({
94
+ ...prev,
95
+ isStreaming: false,
96
+ isDone: true,
97
+ }));
98
+ onDone?.(finalSource);
99
+ }, [parseSource, onDone]);
100
+ // Reset state
101
+ const reset = useCallback(() => {
102
+ if (parseTimerRef.current) {
103
+ clearTimeout(parseTimerRef.current);
104
+ }
105
+ if (abortControllerRef.current) {
106
+ abortControllerRef.current.abort();
107
+ }
108
+ sourceRef.current = '';
109
+ isStreamingRef.current = false;
110
+ setState({
111
+ source: '',
112
+ ast: EMPTY_AST,
113
+ isStreaming: false,
114
+ isDone: false,
115
+ error: null,
116
+ });
117
+ }, []);
118
+ // Consume a ReadableStream<string>
119
+ const consume = useCallback(async (stream) => {
120
+ reset();
121
+ const reader = stream.getReader();
122
+ const controller = new AbortController();
123
+ abortControllerRef.current = controller;
124
+ try {
125
+ while (true) {
126
+ if (controller.signal.aborted)
127
+ break;
128
+ const { done: readerDone, value } = await reader.read();
129
+ if (readerDone)
130
+ break;
131
+ if (value)
132
+ append(value);
133
+ }
134
+ if (!controller.signal.aborted)
135
+ done();
136
+ }
137
+ catch (err) {
138
+ const error = err instanceof Error ? err : new Error(String(err));
139
+ setState((prev) => ({ ...prev, error, isStreaming: false }));
140
+ onError?.(error);
141
+ }
142
+ finally {
143
+ reader.releaseLock();
144
+ }
145
+ }, [reset, append, done, onError]);
146
+ // Consume an async iterator
147
+ const consumeIterator = useCallback(async (iterator) => {
148
+ reset();
149
+ const controller = new AbortController();
150
+ abortControllerRef.current = controller;
151
+ try {
152
+ for await (const chunk of iterator) {
153
+ if (controller.signal.aborted)
154
+ break;
155
+ append(chunk);
156
+ }
157
+ if (!controller.signal.aborted)
158
+ done();
159
+ }
160
+ catch (err) {
161
+ const error = err instanceof Error ? err : new Error(String(err));
162
+ setState((prev) => ({ ...prev, error, isStreaming: false }));
163
+ onError?.(error);
164
+ }
165
+ }, [reset, append, done, onError]);
166
+ // Consume a fetch Response (SSE format)
167
+ const consumeResponse = useCallback(async (response, opts) => {
168
+ if (!response.body) {
169
+ throw new Error('Response has no body');
170
+ }
171
+ if (!response.ok) {
172
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
173
+ }
174
+ reset();
175
+ const controller = new AbortController();
176
+ abortControllerRef.current = controller;
177
+ const reader = response.body.getReader();
178
+ const decoder = new TextDecoder();
179
+ const extractContent = opts?.extractContent ??
180
+ ((data) => {
181
+ // Default: try to extract from SSE "data: ..." lines
182
+ // or OpenAI-style streaming content
183
+ try {
184
+ const parsed = JSON.parse(data);
185
+ // OpenAI format
186
+ if (parsed.choices?.[0]?.delta?.content !== undefined) {
187
+ return parsed.choices[0].delta.content;
188
+ }
189
+ // Generic content field
190
+ if (typeof parsed.content === 'string') {
191
+ return parsed.content;
192
+ }
193
+ if (typeof parsed.text === 'string') {
194
+ return parsed.text;
195
+ }
196
+ }
197
+ catch {
198
+ // Not JSON, return as-is
199
+ }
200
+ return data;
201
+ });
202
+ try {
203
+ let buffer = '';
204
+ while (true) {
205
+ if (controller.signal.aborted)
206
+ break;
207
+ const { done: readerDone, value } = await reader.read();
208
+ if (readerDone)
209
+ break;
210
+ buffer += decoder.decode(value, { stream: true });
211
+ const lines = buffer.split('\n');
212
+ buffer = lines.pop() || ''; // Keep incomplete line in buffer
213
+ for (const line of lines) {
214
+ const trimmed = line.trim();
215
+ if (!trimmed)
216
+ continue;
217
+ if (trimmed === 'data: [DONE]')
218
+ continue;
219
+ let data = trimmed;
220
+ if (trimmed.startsWith('data: ')) {
221
+ data = trimmed.slice(6);
222
+ }
223
+ const content = extractContent(data);
224
+ if (content !== null && content !== '') {
225
+ append(content);
226
+ }
227
+ }
228
+ }
229
+ // Process remaining buffer
230
+ if (buffer.trim()) {
231
+ const data = buffer.trim().startsWith('data: ')
232
+ ? buffer.trim().slice(6)
233
+ : buffer.trim();
234
+ const content = extractContent(data);
235
+ if (content !== null && content !== '') {
236
+ append(content);
237
+ }
238
+ }
239
+ if (!controller.signal.aborted)
240
+ done();
241
+ }
242
+ catch (err) {
243
+ const error = err instanceof Error ? err : new Error(String(err));
244
+ setState((prev) => ({ ...prev, error, isStreaming: false }));
245
+ onError?.(error);
246
+ }
247
+ finally {
248
+ reader.releaseLock();
249
+ }
250
+ }, [reset, append, done, onError]);
251
+ // Cleanup on unmount
252
+ useEffect(() => {
253
+ return () => {
254
+ if (parseTimerRef.current) {
255
+ clearTimeout(parseTimerRef.current);
256
+ }
257
+ if (abortControllerRef.current) {
258
+ abortControllerRef.current.abort();
259
+ }
260
+ };
261
+ }, []);
262
+ return {
263
+ ...state,
264
+ append,
265
+ done,
266
+ reset,
267
+ consume,
268
+ consumeIterator,
269
+ consumeResponse,
270
+ };
271
+ }
272
+
273
+ export { useStreamMarkdown };
274
+ //# sourceMappingURL=useStreamMarkdown.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStreamMarkdown.mjs","sources":["../../src/hooks/useStreamMarkdown.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}