@willwang-io/react-djot 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/index.cjs +44 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -3
- package/dist/index.d.ts +25 -3
- package/dist/index.js +44 -13
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -98,18 +98,20 @@ export function Example() {
|
|
|
98
98
|
### Supported node keys (current core set)
|
|
99
99
|
|
|
100
100
|
- `doc`
|
|
101
|
+
- `section`
|
|
101
102
|
- `para`
|
|
102
103
|
- `heading`
|
|
103
104
|
- `emph`
|
|
104
105
|
- `strong`
|
|
105
106
|
- `code`
|
|
107
|
+
- `verbatim`
|
|
106
108
|
- `code_block`
|
|
107
109
|
- `link`
|
|
108
110
|
- `image`
|
|
109
111
|
- `bullet_list`
|
|
110
112
|
- `ordered_list`
|
|
111
113
|
- `list_item`
|
|
112
|
-
- `blockquote`
|
|
114
|
+
- `blockquote` and `block_quote`
|
|
113
115
|
- `thematic_break`
|
|
114
116
|
- `str`
|
|
115
117
|
- `soft_break` and `softbreak`
|
package/dist/index.cjs
CHANGED
|
@@ -36,6 +36,7 @@ function toAltText(nodes) {
|
|
|
36
36
|
switch (node.tag) {
|
|
37
37
|
case "str":
|
|
38
38
|
case "code":
|
|
39
|
+
case "verbatim":
|
|
39
40
|
case "code_block":
|
|
40
41
|
output += node.text;
|
|
41
42
|
break;
|
|
@@ -96,6 +97,26 @@ function renderDoc(node, components, key) {
|
|
|
96
97
|
}
|
|
97
98
|
return react.createElement(react.Fragment, withKey({}, key), children);
|
|
98
99
|
}
|
|
100
|
+
function renderSection(node, components, key) {
|
|
101
|
+
const children = renderChildren(node.children, components);
|
|
102
|
+
const Component = pickComponent(components, "section");
|
|
103
|
+
if (Component) {
|
|
104
|
+
if (typeof Component === "string") {
|
|
105
|
+
return react.createElement(Component, withKey({}, key), children);
|
|
106
|
+
}
|
|
107
|
+
return react.createElement(
|
|
108
|
+
Component,
|
|
109
|
+
withKey(
|
|
110
|
+
{
|
|
111
|
+
node
|
|
112
|
+
},
|
|
113
|
+
key
|
|
114
|
+
),
|
|
115
|
+
children
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
return react.createElement(react.Fragment, withKey({}, key), children);
|
|
119
|
+
}
|
|
99
120
|
function renderHeading(node, components, key) {
|
|
100
121
|
const level = clampHeadingLevel(node.level);
|
|
101
122
|
const children = renderChildren(node.children, components);
|
|
@@ -111,10 +132,10 @@ function renderHeading(node, components, key) {
|
|
|
111
132
|
children
|
|
112
133
|
);
|
|
113
134
|
}
|
|
114
|
-
function renderCode(node, components, key) {
|
|
135
|
+
function renderCode(node, components, key, primary, alias) {
|
|
115
136
|
const value = node.text;
|
|
116
137
|
return renderWithOverride(
|
|
117
|
-
pickComponent(components,
|
|
138
|
+
pickComponent(components, primary, alias),
|
|
118
139
|
"code",
|
|
119
140
|
{},
|
|
120
141
|
{
|
|
@@ -197,6 +218,19 @@ function renderOrderedList(node, components, key) {
|
|
|
197
218
|
children
|
|
198
219
|
);
|
|
199
220
|
}
|
|
221
|
+
function renderBlockQuote(node, components, key, primary, alias) {
|
|
222
|
+
const children = renderChildren(node.children, components);
|
|
223
|
+
return renderWithOverride(
|
|
224
|
+
pickComponent(components, primary, alias),
|
|
225
|
+
"blockquote",
|
|
226
|
+
{},
|
|
227
|
+
{
|
|
228
|
+
node
|
|
229
|
+
},
|
|
230
|
+
key,
|
|
231
|
+
children
|
|
232
|
+
);
|
|
233
|
+
}
|
|
200
234
|
function renderStr(node, components, key) {
|
|
201
235
|
const value = node.text;
|
|
202
236
|
const Component = pickComponent(components, "str");
|
|
@@ -254,6 +288,8 @@ function renderNode(node, options = {}) {
|
|
|
254
288
|
switch (node.tag) {
|
|
255
289
|
case "doc":
|
|
256
290
|
return renderDoc(node, components, key);
|
|
291
|
+
case "section":
|
|
292
|
+
return renderSection(node, components, key);
|
|
257
293
|
case "para":
|
|
258
294
|
return renderWithOverride(
|
|
259
295
|
pickComponent(components, "para"),
|
|
@@ -290,7 +326,9 @@ function renderNode(node, options = {}) {
|
|
|
290
326
|
children
|
|
291
327
|
);
|
|
292
328
|
case "code":
|
|
293
|
-
return renderCode(node, components, key);
|
|
329
|
+
return renderCode(node, components, key, "code", "verbatim");
|
|
330
|
+
case "verbatim":
|
|
331
|
+
return renderCode(node, components, key, "verbatim", "code");
|
|
294
332
|
case "code_block":
|
|
295
333
|
return renderCodeBlock(node, components, key);
|
|
296
334
|
case "link":
|
|
@@ -322,16 +360,9 @@ function renderNode(node, options = {}) {
|
|
|
322
360
|
children
|
|
323
361
|
);
|
|
324
362
|
case "blockquote":
|
|
325
|
-
return
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
{},
|
|
329
|
-
{
|
|
330
|
-
node
|
|
331
|
-
},
|
|
332
|
-
key,
|
|
333
|
-
children
|
|
334
|
-
);
|
|
363
|
+
return renderBlockQuote(node, components, key, "blockquote", "block_quote");
|
|
364
|
+
case "block_quote":
|
|
365
|
+
return renderBlockQuote(node, components, key, "block_quote", "blockquote");
|
|
335
366
|
case "thematic_break":
|
|
336
367
|
return renderWithOverride(
|
|
337
368
|
pickComponent(components, "thematic_break"),
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/renderNode.tsx","../src/Djot.tsx"],"names":["createElement","Fragment","parse","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createElement, Fragment } from \"react\";\nimport type React from \"react\";\nimport type {\n DjotBaseNode,\n DjotCodeBlockNode,\n DjotCodeNode,\n DjotComponentPropsMap,\n DjotComponents,\n DjotDocNode,\n DjotHardBreakNode,\n DjotHeadingNode,\n DjotImageNode,\n DjotLinkNode,\n DjotNode,\n DjotOrderedListNode,\n DjotParentNode,\n DjotSoftBreakNode,\n DjotStrNode\n} from \"./types\";\n\nexport interface RenderNodeOptions {\n components?: DjotComponents | undefined;\n key?: React.Key;\n}\n\ntype ComponentKey = keyof DjotComponentPropsMap;\n\nfunction isParentNode(node: DjotBaseNode): node is DjotParentNode {\n return Array.isArray((node as DjotParentNode).children);\n}\n\nfunction isSoftBreakNode(node: DjotNode): node is DjotSoftBreakNode {\n return node.tag === \"soft_break\" || node.tag === \"softbreak\";\n}\n\nfunction isHardBreakNode(node: DjotNode): node is DjotHardBreakNode {\n return node.tag === \"hard_break\" || node.tag === \"hardbreak\";\n}\n\nfunction pickComponent(\n components: DjotComponents | undefined,\n primary: ComponentKey,\n alias?: ComponentKey\n): React.ElementType | undefined {\n if (!components) {\n return undefined;\n }\n\n return (components[primary] ?? (alias ? components[alias] : undefined)) as\n | React.ElementType\n | undefined;\n}\n\nfunction renderChildren(children: DjotNode[], components?: DjotComponents): React.ReactNode[] {\n return children.map((child, index) =>\n renderNode(child, {\n components,\n key: index\n })\n );\n}\n\nfunction toAltText(nodes: DjotNode[]): string {\n let output = \"\";\n\n for (const node of nodes) {\n switch (node.tag) {\n case \"str\":\n case \"code\":\n case \"code_block\":\n output += node.text;\n break;\n case \"soft_break\":\n case \"softbreak\":\n output += \" \";\n break;\n case \"hard_break\":\n case \"hardbreak\":\n output += \"\\n\";\n break;\n default:\n if (isParentNode(node)) {\n output += toAltText(node.children);\n }\n break;\n }\n }\n\n return output.trim();\n}\n\nfunction clampHeadingLevel(level: number): 1 | 2 | 3 | 4 | 5 | 6 {\n if (level <= 1) {\n return 1;\n }\n\n if (level >= 6) {\n return 6;\n }\n\n return level as 1 | 2 | 3 | 4 | 5 | 6;\n}\n\nfunction withKey<T extends Record<string, unknown>>(props: T, key?: React.Key): T & { key?: React.Key } {\n if (key === undefined) {\n return props;\n }\n\n return {\n ...props,\n key\n };\n}\n\nfunction renderWithOverride(\n override: React.ElementType | undefined,\n fallback: React.ElementType,\n domProps: Record<string, unknown>,\n customProps: Record<string, unknown>,\n key?: React.Key,\n children?: React.ReactNode\n): React.ReactNode {\n const Component = override ?? fallback;\n const props =\n typeof Component === \"string\"\n ? withKey(domProps, key)\n : withKey(\n {\n ...domProps,\n ...customProps\n },\n key\n );\n\n return createElement(Component, props, children);\n}\n\nfunction renderDoc(\n node: DjotDocNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n const Component = pickComponent(components, \"doc\");\n\n if (Component) {\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), children);\n }\n\n return createElement(Component, withKey({ node }, key), children);\n }\n\n return createElement(Fragment, withKey({}, key), children);\n}\n\nfunction renderHeading(\n node: DjotHeadingNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const level = clampHeadingLevel(node.level);\n const children = renderChildren(node.children, components);\n return renderWithOverride(\n pickComponent(components, \"heading\"),\n `h${level}`,\n {},\n {\n level,\n node\n },\n key,\n children\n );\n}\n\nfunction renderCode(\n node: DjotCodeNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const value = node.text;\n return renderWithOverride(\n pickComponent(components, \"code\"),\n \"code\",\n {},\n {\n node,\n value\n },\n key,\n value\n );\n}\n\nfunction renderCodeBlock(\n node: DjotCodeBlockNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const value = node.text;\n const language = node.lang;\n const fallbackChildren = createElement(\n \"code\",\n {\n className: language ? `language-${language}` : undefined\n },\n value\n );\n\n return renderWithOverride(\n pickComponent(components, \"code_block\"),\n \"pre\",\n {},\n {\n language,\n node,\n value\n },\n key,\n fallbackChildren\n );\n}\n\nfunction renderLink(\n node: DjotLinkNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n const href = node.destination;\n return renderWithOverride(\n pickComponent(components, \"link\"),\n \"a\",\n {\n href\n },\n {\n node\n },\n key,\n children\n );\n}\n\nfunction renderImage(\n node: DjotImageNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const alt = toAltText(node.children) || undefined;\n const src = node.destination;\n return renderWithOverride(\n pickComponent(components, \"image\"),\n \"img\",\n {\n alt,\n src\n },\n {\n alt,\n node\n },\n key\n );\n}\n\nfunction renderOrderedList(\n node: DjotOrderedListNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n return renderWithOverride(\n pickComponent(components, \"ordered_list\"),\n \"ol\",\n {\n start: node.start\n },\n {\n node,\n start: node.start\n },\n key,\n children\n );\n}\n\nfunction renderStr(\n node: DjotStrNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const value = node.text;\n const Component = pickComponent(components, \"str\");\n\n if (!Component) {\n return value;\n }\n\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), value);\n }\n\n return createElement(\n Component,\n withKey(\n {\n node,\n value\n },\n key\n ),\n value\n );\n}\n\nfunction renderSoftBreak(\n node: DjotSoftBreakNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const Component = pickComponent(components, \"soft_break\", \"softbreak\");\n\n if (!Component) {\n return \"\\n\";\n }\n\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), \"\\n\");\n }\n\n return createElement(\n Component,\n withKey(\n {\n node\n },\n key\n ),\n \"\\n\"\n );\n}\n\nfunction renderHardBreak(\n node: DjotHardBreakNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n return renderWithOverride(\n pickComponent(components, \"hard_break\", \"hardbreak\"),\n \"br\",\n {},\n {\n node\n },\n key\n );\n}\n\nexport function renderNode(node: DjotNode, options: RenderNodeOptions = {}): React.ReactNode {\n const { components, key } = options;\n const children = isParentNode(node) ? renderChildren(node.children, components) : undefined;\n\n switch (node.tag) {\n case \"doc\":\n return renderDoc(node, components, key);\n case \"para\":\n return renderWithOverride(\n pickComponent(components, \"para\"),\n \"p\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"heading\":\n return renderHeading(node, components, key);\n case \"emph\":\n return renderWithOverride(\n pickComponent(components, \"emph\"),\n \"em\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"strong\":\n return renderWithOverride(\n pickComponent(components, \"strong\"),\n \"strong\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"code\":\n return renderCode(node, components, key);\n case \"code_block\":\n return renderCodeBlock(node, components, key);\n case \"link\":\n return renderLink(node, components, key);\n case \"image\":\n return renderImage(node, components, key);\n case \"bullet_list\":\n return renderWithOverride(\n pickComponent(components, \"bullet_list\"),\n \"ul\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"ordered_list\":\n return renderOrderedList(node, components, key);\n case \"list_item\":\n return renderWithOverride(\n pickComponent(components, \"list_item\"),\n \"li\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"blockquote\":\n return renderWithOverride(\n pickComponent(components, \"blockquote\"),\n \"blockquote\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"thematic_break\":\n return renderWithOverride(\n pickComponent(components, \"thematic_break\"),\n \"hr\",\n {},\n {\n node\n },\n key\n );\n case \"str\":\n return renderStr(node, components, key);\n default:\n if (isSoftBreakNode(node)) {\n return renderSoftBreak(node, components, key);\n }\n\n if (isHardBreakNode(node)) {\n return renderHardBreak(node, components, key);\n }\n\n return null;\n }\n}\n","import { parse } from \"@djot/djot\";\nimport { Fragment } from \"react\";\nimport type React from \"react\";\nimport { renderNode } from \"./renderNode\";\nimport type { DjotNode, DjotProps } from \"./types\";\n\nexport function Djot({ children, components }: DjotProps): React.ReactElement | null {\n const source = children ?? \"\";\n\n if (source.length === 0) {\n return null;\n }\n\n const ast = parse(source) as DjotNode;\n return <Fragment>{renderNode(ast, { components })}</Fragment>;\n}\n\nexport default Djot;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/renderNode.tsx","../src/Djot.tsx"],"names":["createElement","Fragment","parse","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createElement, Fragment } from \"react\";\nimport type React from \"react\";\nimport type {\n DjotBaseNode,\n DjotBlockQuoteNode,\n DjotBlockquoteNode,\n DjotCodeBlockNode,\n DjotCodeNode,\n DjotComponentPropsMap,\n DjotComponents,\n DjotDocNode,\n DjotHardBreakNode,\n DjotHeadingNode,\n DjotImageNode,\n DjotLinkNode,\n DjotNode,\n DjotOrderedListNode,\n DjotParentNode,\n DjotSectionNode,\n DjotSoftBreakNode,\n DjotStrNode,\n DjotVerbatimNode\n} from \"./types\";\n\nexport interface RenderNodeOptions {\n components?: DjotComponents | undefined;\n key?: React.Key;\n}\n\ntype ComponentKey = keyof DjotComponentPropsMap;\n\nfunction isParentNode(node: DjotBaseNode): node is DjotParentNode {\n return Array.isArray((node as DjotParentNode).children);\n}\n\nfunction isSoftBreakNode(node: DjotNode): node is DjotSoftBreakNode {\n return node.tag === \"soft_break\" || node.tag === \"softbreak\";\n}\n\nfunction isHardBreakNode(node: DjotNode): node is DjotHardBreakNode {\n return node.tag === \"hard_break\" || node.tag === \"hardbreak\";\n}\n\nfunction pickComponent(\n components: DjotComponents | undefined,\n primary: ComponentKey,\n alias?: ComponentKey\n): React.ElementType | undefined {\n if (!components) {\n return undefined;\n }\n\n return (components[primary] ?? (alias ? components[alias] : undefined)) as\n | React.ElementType\n | undefined;\n}\n\nfunction renderChildren(children: DjotNode[], components?: DjotComponents): React.ReactNode[] {\n return children.map((child, index) =>\n renderNode(child, {\n components,\n key: index\n })\n );\n}\n\nfunction toAltText(nodes: DjotNode[]): string {\n let output = \"\";\n\n for (const node of nodes) {\n switch (node.tag) {\n case \"str\":\n case \"code\":\n case \"verbatim\":\n case \"code_block\":\n output += node.text;\n break;\n case \"soft_break\":\n case \"softbreak\":\n output += \" \";\n break;\n case \"hard_break\":\n case \"hardbreak\":\n output += \"\\n\";\n break;\n default:\n if (isParentNode(node)) {\n output += toAltText(node.children);\n }\n break;\n }\n }\n\n return output.trim();\n}\n\nfunction clampHeadingLevel(level: number): 1 | 2 | 3 | 4 | 5 | 6 {\n if (level <= 1) {\n return 1;\n }\n\n if (level >= 6) {\n return 6;\n }\n\n return level as 1 | 2 | 3 | 4 | 5 | 6;\n}\n\nfunction withKey<T extends Record<string, unknown>>(props: T, key?: React.Key): T & { key?: React.Key } {\n if (key === undefined) {\n return props;\n }\n\n return {\n ...props,\n key\n };\n}\n\nfunction renderWithOverride(\n override: React.ElementType | undefined,\n fallback: React.ElementType,\n domProps: Record<string, unknown>,\n customProps: Record<string, unknown>,\n key?: React.Key,\n children?: React.ReactNode\n): React.ReactNode {\n const Component = override ?? fallback;\n const props =\n typeof Component === \"string\"\n ? withKey(domProps, key)\n : withKey(\n {\n ...domProps,\n ...customProps\n },\n key\n );\n\n return createElement(Component, props, children);\n}\n\nfunction renderDoc(\n node: DjotDocNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n const Component = pickComponent(components, \"doc\");\n\n if (Component) {\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), children);\n }\n\n return createElement(Component, withKey({ node }, key), children);\n }\n\n return createElement(Fragment, withKey({}, key), children);\n}\n\nfunction renderSection(\n node: DjotSectionNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n const Component = pickComponent(components, \"section\");\n\n if (Component) {\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), children);\n }\n\n return createElement(\n Component,\n withKey(\n {\n node\n },\n key\n ),\n children\n );\n }\n\n return createElement(Fragment, withKey({}, key), children);\n}\n\nfunction renderHeading(\n node: DjotHeadingNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const level = clampHeadingLevel(node.level);\n const children = renderChildren(node.children, components);\n return renderWithOverride(\n pickComponent(components, \"heading\"),\n `h${level}`,\n {},\n {\n level,\n node\n },\n key,\n children\n );\n}\n\nfunction renderCode(\n node: DjotCodeNode | DjotVerbatimNode,\n components: DjotComponents | undefined,\n key: React.Key | undefined,\n primary: \"code\" | \"verbatim\",\n alias: \"code\" | \"verbatim\"\n): React.ReactNode {\n const value = node.text;\n return renderWithOverride(\n pickComponent(components, primary, alias),\n \"code\",\n {},\n {\n node,\n value\n },\n key,\n value\n );\n}\n\nfunction renderCodeBlock(\n node: DjotCodeBlockNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const value = node.text;\n const language = node.lang;\n const fallbackChildren = createElement(\n \"code\",\n {\n className: language ? `language-${language}` : undefined\n },\n value\n );\n\n return renderWithOverride(\n pickComponent(components, \"code_block\"),\n \"pre\",\n {},\n {\n language,\n node,\n value\n },\n key,\n fallbackChildren\n );\n}\n\nfunction renderLink(\n node: DjotLinkNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n const href = node.destination;\n return renderWithOverride(\n pickComponent(components, \"link\"),\n \"a\",\n {\n href\n },\n {\n node\n },\n key,\n children\n );\n}\n\nfunction renderImage(\n node: DjotImageNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const alt = toAltText(node.children) || undefined;\n const src = node.destination;\n return renderWithOverride(\n pickComponent(components, \"image\"),\n \"img\",\n {\n alt,\n src\n },\n {\n alt,\n node\n },\n key\n );\n}\n\nfunction renderOrderedList(\n node: DjotOrderedListNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n return renderWithOverride(\n pickComponent(components, \"ordered_list\"),\n \"ol\",\n {\n start: node.start\n },\n {\n node,\n start: node.start\n },\n key,\n children\n );\n}\n\nfunction renderBlockQuote(\n node: DjotBlockquoteNode | DjotBlockQuoteNode,\n components: DjotComponents | undefined,\n key: React.Key | undefined,\n primary: \"blockquote\" | \"block_quote\",\n alias: \"blockquote\" | \"block_quote\"\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n return renderWithOverride(\n pickComponent(components, primary, alias),\n \"blockquote\",\n {},\n {\n node\n },\n key,\n children\n );\n}\n\nfunction renderStr(\n node: DjotStrNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const value = node.text;\n const Component = pickComponent(components, \"str\");\n\n if (!Component) {\n return value;\n }\n\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), value);\n }\n\n return createElement(\n Component,\n withKey(\n {\n node,\n value\n },\n key\n ),\n value\n );\n}\n\nfunction renderSoftBreak(\n node: DjotSoftBreakNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const Component = pickComponent(components, \"soft_break\", \"softbreak\");\n\n if (!Component) {\n return \"\\n\";\n }\n\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), \"\\n\");\n }\n\n return createElement(\n Component,\n withKey(\n {\n node\n },\n key\n ),\n \"\\n\"\n );\n}\n\nfunction renderHardBreak(\n node: DjotHardBreakNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n return renderWithOverride(\n pickComponent(components, \"hard_break\", \"hardbreak\"),\n \"br\",\n {},\n {\n node\n },\n key\n );\n}\n\nexport function renderNode(node: DjotNode, options: RenderNodeOptions = {}): React.ReactNode {\n const { components, key } = options;\n const children = isParentNode(node) ? renderChildren(node.children, components) : undefined;\n\n switch (node.tag) {\n case \"doc\":\n return renderDoc(node, components, key);\n case \"section\":\n return renderSection(node, components, key);\n case \"para\":\n return renderWithOverride(\n pickComponent(components, \"para\"),\n \"p\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"heading\":\n return renderHeading(node, components, key);\n case \"emph\":\n return renderWithOverride(\n pickComponent(components, \"emph\"),\n \"em\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"strong\":\n return renderWithOverride(\n pickComponent(components, \"strong\"),\n \"strong\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"code\":\n return renderCode(node, components, key, \"code\", \"verbatim\");\n case \"verbatim\":\n return renderCode(node, components, key, \"verbatim\", \"code\");\n case \"code_block\":\n return renderCodeBlock(node, components, key);\n case \"link\":\n return renderLink(node, components, key);\n case \"image\":\n return renderImage(node, components, key);\n case \"bullet_list\":\n return renderWithOverride(\n pickComponent(components, \"bullet_list\"),\n \"ul\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"ordered_list\":\n return renderOrderedList(node, components, key);\n case \"list_item\":\n return renderWithOverride(\n pickComponent(components, \"list_item\"),\n \"li\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"blockquote\":\n return renderBlockQuote(node, components, key, \"blockquote\", \"block_quote\");\n case \"block_quote\":\n return renderBlockQuote(node, components, key, \"block_quote\", \"blockquote\");\n case \"thematic_break\":\n return renderWithOverride(\n pickComponent(components, \"thematic_break\"),\n \"hr\",\n {},\n {\n node\n },\n key\n );\n case \"str\":\n return renderStr(node, components, key);\n default:\n if (isSoftBreakNode(node)) {\n return renderSoftBreak(node, components, key);\n }\n\n if (isHardBreakNode(node)) {\n return renderHardBreak(node, components, key);\n }\n\n return null;\n }\n}\n","import { parse } from \"@djot/djot\";\nimport { Fragment } from \"react\";\nimport type React from \"react\";\nimport { renderNode } from \"./renderNode\";\nimport type { DjotNode, DjotProps } from \"./types\";\n\nexport function Djot({ children, components }: DjotProps): React.ReactElement | null {\n const source = children ?? \"\";\n\n if (source.length === 0) {\n return null;\n }\n\n const ast = parse(source) as DjotNode;\n return <Fragment>{renderNode(ast, { components })}</Fragment>;\n}\n\nexport default Djot;\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -11,6 +11,10 @@ interface DjotParentNode extends DjotBaseNode {
|
|
|
11
11
|
interface DjotDocNode extends DjotParentNode {
|
|
12
12
|
tag: "doc";
|
|
13
13
|
}
|
|
14
|
+
interface DjotSectionNode extends DjotParentNode {
|
|
15
|
+
autoAttributes?: DjotAttributes;
|
|
16
|
+
tag: "section";
|
|
17
|
+
}
|
|
14
18
|
interface DjotParaNode extends DjotParentNode {
|
|
15
19
|
tag: "para";
|
|
16
20
|
}
|
|
@@ -54,6 +58,9 @@ interface DjotListItemNode extends DjotParentNode {
|
|
|
54
58
|
interface DjotBlockquoteNode extends DjotParentNode {
|
|
55
59
|
tag: "blockquote";
|
|
56
60
|
}
|
|
61
|
+
interface DjotBlockQuoteNode extends DjotParentNode {
|
|
62
|
+
tag: "block_quote";
|
|
63
|
+
}
|
|
57
64
|
interface DjotThematicBreakNode extends DjotBaseNode {
|
|
58
65
|
tag: "thematic_break";
|
|
59
66
|
}
|
|
@@ -61,13 +68,17 @@ interface DjotStrNode extends DjotBaseNode {
|
|
|
61
68
|
tag: "str";
|
|
62
69
|
text: string;
|
|
63
70
|
}
|
|
71
|
+
interface DjotVerbatimNode extends DjotBaseNode {
|
|
72
|
+
tag: "verbatim";
|
|
73
|
+
text: string;
|
|
74
|
+
}
|
|
64
75
|
interface DjotSoftBreakNode extends DjotBaseNode {
|
|
65
76
|
tag: "soft_break" | "softbreak";
|
|
66
77
|
}
|
|
67
78
|
interface DjotHardBreakNode extends DjotBaseNode {
|
|
68
79
|
tag: "hard_break" | "hardbreak";
|
|
69
80
|
}
|
|
70
|
-
type DjotNode = DjotDocNode | DjotParaNode | DjotHeadingNode | DjotEmphNode | DjotStrongNode | DjotCodeNode | DjotCodeBlockNode | DjotLinkNode | DjotImageNode | DjotBulletListNode | DjotOrderedListNode | DjotListItemNode | DjotBlockquoteNode | DjotThematicBreakNode | DjotStrNode | DjotSoftBreakNode | DjotHardBreakNode;
|
|
81
|
+
type DjotNode = DjotDocNode | DjotSectionNode | DjotParaNode | DjotHeadingNode | DjotEmphNode | DjotStrongNode | DjotCodeNode | DjotCodeBlockNode | DjotLinkNode | DjotImageNode | DjotBulletListNode | DjotOrderedListNode | DjotListItemNode | DjotBlockquoteNode | DjotBlockQuoteNode | DjotThematicBreakNode | DjotStrNode | DjotVerbatimNode | DjotSoftBreakNode | DjotHardBreakNode;
|
|
71
82
|
type DjotNodeTag = DjotNode["tag"];
|
|
72
83
|
type DjotNodeByTag<Tag extends DjotNodeTag> = Extract<DjotNode, {
|
|
73
84
|
tag: Tag;
|
|
@@ -78,13 +89,19 @@ interface DjotNodePropsBase<Tag extends DjotNodeTag> {
|
|
|
78
89
|
}
|
|
79
90
|
interface DjotComponentPropsMap {
|
|
80
91
|
doc: DjotNodePropsBase<"doc">;
|
|
92
|
+
section: React.HTMLAttributes<HTMLElement> & DjotNodePropsBase<"section">;
|
|
81
93
|
para: React.HTMLAttributes<HTMLParagraphElement> & DjotNodePropsBase<"para">;
|
|
82
94
|
heading: React.HTMLAttributes<HTMLHeadingElement> & DjotNodePropsBase<"heading"> & {
|
|
83
95
|
level: number;
|
|
84
96
|
};
|
|
85
97
|
emph: React.HTMLAttributes<HTMLElement> & DjotNodePropsBase<"emph">;
|
|
86
98
|
strong: React.HTMLAttributes<HTMLElement> & DjotNodePropsBase<"strong">;
|
|
87
|
-
code: React.HTMLAttributes<HTMLElement> & DjotNodePropsBase<"code"> & {
|
|
99
|
+
code: React.HTMLAttributes<HTMLElement> & Omit<DjotNodePropsBase<"code">, "node"> & {
|
|
100
|
+
node: DjotCodeNode | DjotVerbatimNode;
|
|
101
|
+
value: string;
|
|
102
|
+
};
|
|
103
|
+
verbatim: React.HTMLAttributes<HTMLElement> & Omit<DjotNodePropsBase<"verbatim">, "node"> & {
|
|
104
|
+
node: DjotCodeNode | DjotVerbatimNode;
|
|
88
105
|
value: string;
|
|
89
106
|
};
|
|
90
107
|
code_block: React.HTMLAttributes<HTMLPreElement> & DjotNodePropsBase<"code_block"> & {
|
|
@@ -98,7 +115,12 @@ interface DjotComponentPropsMap {
|
|
|
98
115
|
bullet_list: React.HTMLAttributes<HTMLUListElement> & DjotNodePropsBase<"bullet_list">;
|
|
99
116
|
ordered_list: React.OlHTMLAttributes<HTMLOListElement> & DjotNodePropsBase<"ordered_list">;
|
|
100
117
|
list_item: React.LiHTMLAttributes<HTMLLIElement> & DjotNodePropsBase<"list_item">;
|
|
101
|
-
blockquote: React.BlockquoteHTMLAttributes<HTMLQuoteElement> & DjotNodePropsBase<"blockquote"
|
|
118
|
+
blockquote: React.BlockquoteHTMLAttributes<HTMLQuoteElement> & Omit<DjotNodePropsBase<"blockquote">, "node"> & {
|
|
119
|
+
node: DjotBlockquoteNode | DjotBlockQuoteNode;
|
|
120
|
+
};
|
|
121
|
+
block_quote: React.BlockquoteHTMLAttributes<HTMLQuoteElement> & Omit<DjotNodePropsBase<"block_quote">, "node"> & {
|
|
122
|
+
node: DjotBlockquoteNode | DjotBlockQuoteNode;
|
|
123
|
+
};
|
|
102
124
|
thematic_break: React.HTMLAttributes<HTMLHRElement> & DjotNodePropsBase<"thematic_break">;
|
|
103
125
|
str: DjotNodePropsBase<"str"> & {
|
|
104
126
|
value: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,10 @@ interface DjotParentNode extends DjotBaseNode {
|
|
|
11
11
|
interface DjotDocNode extends DjotParentNode {
|
|
12
12
|
tag: "doc";
|
|
13
13
|
}
|
|
14
|
+
interface DjotSectionNode extends DjotParentNode {
|
|
15
|
+
autoAttributes?: DjotAttributes;
|
|
16
|
+
tag: "section";
|
|
17
|
+
}
|
|
14
18
|
interface DjotParaNode extends DjotParentNode {
|
|
15
19
|
tag: "para";
|
|
16
20
|
}
|
|
@@ -54,6 +58,9 @@ interface DjotListItemNode extends DjotParentNode {
|
|
|
54
58
|
interface DjotBlockquoteNode extends DjotParentNode {
|
|
55
59
|
tag: "blockquote";
|
|
56
60
|
}
|
|
61
|
+
interface DjotBlockQuoteNode extends DjotParentNode {
|
|
62
|
+
tag: "block_quote";
|
|
63
|
+
}
|
|
57
64
|
interface DjotThematicBreakNode extends DjotBaseNode {
|
|
58
65
|
tag: "thematic_break";
|
|
59
66
|
}
|
|
@@ -61,13 +68,17 @@ interface DjotStrNode extends DjotBaseNode {
|
|
|
61
68
|
tag: "str";
|
|
62
69
|
text: string;
|
|
63
70
|
}
|
|
71
|
+
interface DjotVerbatimNode extends DjotBaseNode {
|
|
72
|
+
tag: "verbatim";
|
|
73
|
+
text: string;
|
|
74
|
+
}
|
|
64
75
|
interface DjotSoftBreakNode extends DjotBaseNode {
|
|
65
76
|
tag: "soft_break" | "softbreak";
|
|
66
77
|
}
|
|
67
78
|
interface DjotHardBreakNode extends DjotBaseNode {
|
|
68
79
|
tag: "hard_break" | "hardbreak";
|
|
69
80
|
}
|
|
70
|
-
type DjotNode = DjotDocNode | DjotParaNode | DjotHeadingNode | DjotEmphNode | DjotStrongNode | DjotCodeNode | DjotCodeBlockNode | DjotLinkNode | DjotImageNode | DjotBulletListNode | DjotOrderedListNode | DjotListItemNode | DjotBlockquoteNode | DjotThematicBreakNode | DjotStrNode | DjotSoftBreakNode | DjotHardBreakNode;
|
|
81
|
+
type DjotNode = DjotDocNode | DjotSectionNode | DjotParaNode | DjotHeadingNode | DjotEmphNode | DjotStrongNode | DjotCodeNode | DjotCodeBlockNode | DjotLinkNode | DjotImageNode | DjotBulletListNode | DjotOrderedListNode | DjotListItemNode | DjotBlockquoteNode | DjotBlockQuoteNode | DjotThematicBreakNode | DjotStrNode | DjotVerbatimNode | DjotSoftBreakNode | DjotHardBreakNode;
|
|
71
82
|
type DjotNodeTag = DjotNode["tag"];
|
|
72
83
|
type DjotNodeByTag<Tag extends DjotNodeTag> = Extract<DjotNode, {
|
|
73
84
|
tag: Tag;
|
|
@@ -78,13 +89,19 @@ interface DjotNodePropsBase<Tag extends DjotNodeTag> {
|
|
|
78
89
|
}
|
|
79
90
|
interface DjotComponentPropsMap {
|
|
80
91
|
doc: DjotNodePropsBase<"doc">;
|
|
92
|
+
section: React.HTMLAttributes<HTMLElement> & DjotNodePropsBase<"section">;
|
|
81
93
|
para: React.HTMLAttributes<HTMLParagraphElement> & DjotNodePropsBase<"para">;
|
|
82
94
|
heading: React.HTMLAttributes<HTMLHeadingElement> & DjotNodePropsBase<"heading"> & {
|
|
83
95
|
level: number;
|
|
84
96
|
};
|
|
85
97
|
emph: React.HTMLAttributes<HTMLElement> & DjotNodePropsBase<"emph">;
|
|
86
98
|
strong: React.HTMLAttributes<HTMLElement> & DjotNodePropsBase<"strong">;
|
|
87
|
-
code: React.HTMLAttributes<HTMLElement> & DjotNodePropsBase<"code"> & {
|
|
99
|
+
code: React.HTMLAttributes<HTMLElement> & Omit<DjotNodePropsBase<"code">, "node"> & {
|
|
100
|
+
node: DjotCodeNode | DjotVerbatimNode;
|
|
101
|
+
value: string;
|
|
102
|
+
};
|
|
103
|
+
verbatim: React.HTMLAttributes<HTMLElement> & Omit<DjotNodePropsBase<"verbatim">, "node"> & {
|
|
104
|
+
node: DjotCodeNode | DjotVerbatimNode;
|
|
88
105
|
value: string;
|
|
89
106
|
};
|
|
90
107
|
code_block: React.HTMLAttributes<HTMLPreElement> & DjotNodePropsBase<"code_block"> & {
|
|
@@ -98,7 +115,12 @@ interface DjotComponentPropsMap {
|
|
|
98
115
|
bullet_list: React.HTMLAttributes<HTMLUListElement> & DjotNodePropsBase<"bullet_list">;
|
|
99
116
|
ordered_list: React.OlHTMLAttributes<HTMLOListElement> & DjotNodePropsBase<"ordered_list">;
|
|
100
117
|
list_item: React.LiHTMLAttributes<HTMLLIElement> & DjotNodePropsBase<"list_item">;
|
|
101
|
-
blockquote: React.BlockquoteHTMLAttributes<HTMLQuoteElement> & DjotNodePropsBase<"blockquote"
|
|
118
|
+
blockquote: React.BlockquoteHTMLAttributes<HTMLQuoteElement> & Omit<DjotNodePropsBase<"blockquote">, "node"> & {
|
|
119
|
+
node: DjotBlockquoteNode | DjotBlockQuoteNode;
|
|
120
|
+
};
|
|
121
|
+
block_quote: React.BlockquoteHTMLAttributes<HTMLQuoteElement> & Omit<DjotNodePropsBase<"block_quote">, "node"> & {
|
|
122
|
+
node: DjotBlockquoteNode | DjotBlockQuoteNode;
|
|
123
|
+
};
|
|
102
124
|
thematic_break: React.HTMLAttributes<HTMLHRElement> & DjotNodePropsBase<"thematic_break">;
|
|
103
125
|
str: DjotNodePropsBase<"str"> & {
|
|
104
126
|
value: string;
|
package/dist/index.js
CHANGED
|
@@ -32,6 +32,7 @@ function toAltText(nodes) {
|
|
|
32
32
|
switch (node.tag) {
|
|
33
33
|
case "str":
|
|
34
34
|
case "code":
|
|
35
|
+
case "verbatim":
|
|
35
36
|
case "code_block":
|
|
36
37
|
output += node.text;
|
|
37
38
|
break;
|
|
@@ -92,6 +93,26 @@ function renderDoc(node, components, key) {
|
|
|
92
93
|
}
|
|
93
94
|
return createElement(Fragment, withKey({}, key), children);
|
|
94
95
|
}
|
|
96
|
+
function renderSection(node, components, key) {
|
|
97
|
+
const children = renderChildren(node.children, components);
|
|
98
|
+
const Component = pickComponent(components, "section");
|
|
99
|
+
if (Component) {
|
|
100
|
+
if (typeof Component === "string") {
|
|
101
|
+
return createElement(Component, withKey({}, key), children);
|
|
102
|
+
}
|
|
103
|
+
return createElement(
|
|
104
|
+
Component,
|
|
105
|
+
withKey(
|
|
106
|
+
{
|
|
107
|
+
node
|
|
108
|
+
},
|
|
109
|
+
key
|
|
110
|
+
),
|
|
111
|
+
children
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
return createElement(Fragment, withKey({}, key), children);
|
|
115
|
+
}
|
|
95
116
|
function renderHeading(node, components, key) {
|
|
96
117
|
const level = clampHeadingLevel(node.level);
|
|
97
118
|
const children = renderChildren(node.children, components);
|
|
@@ -107,10 +128,10 @@ function renderHeading(node, components, key) {
|
|
|
107
128
|
children
|
|
108
129
|
);
|
|
109
130
|
}
|
|
110
|
-
function renderCode(node, components, key) {
|
|
131
|
+
function renderCode(node, components, key, primary, alias) {
|
|
111
132
|
const value = node.text;
|
|
112
133
|
return renderWithOverride(
|
|
113
|
-
pickComponent(components,
|
|
134
|
+
pickComponent(components, primary, alias),
|
|
114
135
|
"code",
|
|
115
136
|
{},
|
|
116
137
|
{
|
|
@@ -193,6 +214,19 @@ function renderOrderedList(node, components, key) {
|
|
|
193
214
|
children
|
|
194
215
|
);
|
|
195
216
|
}
|
|
217
|
+
function renderBlockQuote(node, components, key, primary, alias) {
|
|
218
|
+
const children = renderChildren(node.children, components);
|
|
219
|
+
return renderWithOverride(
|
|
220
|
+
pickComponent(components, primary, alias),
|
|
221
|
+
"blockquote",
|
|
222
|
+
{},
|
|
223
|
+
{
|
|
224
|
+
node
|
|
225
|
+
},
|
|
226
|
+
key,
|
|
227
|
+
children
|
|
228
|
+
);
|
|
229
|
+
}
|
|
196
230
|
function renderStr(node, components, key) {
|
|
197
231
|
const value = node.text;
|
|
198
232
|
const Component = pickComponent(components, "str");
|
|
@@ -250,6 +284,8 @@ function renderNode(node, options = {}) {
|
|
|
250
284
|
switch (node.tag) {
|
|
251
285
|
case "doc":
|
|
252
286
|
return renderDoc(node, components, key);
|
|
287
|
+
case "section":
|
|
288
|
+
return renderSection(node, components, key);
|
|
253
289
|
case "para":
|
|
254
290
|
return renderWithOverride(
|
|
255
291
|
pickComponent(components, "para"),
|
|
@@ -286,7 +322,9 @@ function renderNode(node, options = {}) {
|
|
|
286
322
|
children
|
|
287
323
|
);
|
|
288
324
|
case "code":
|
|
289
|
-
return renderCode(node, components, key);
|
|
325
|
+
return renderCode(node, components, key, "code", "verbatim");
|
|
326
|
+
case "verbatim":
|
|
327
|
+
return renderCode(node, components, key, "verbatim", "code");
|
|
290
328
|
case "code_block":
|
|
291
329
|
return renderCodeBlock(node, components, key);
|
|
292
330
|
case "link":
|
|
@@ -318,16 +356,9 @@ function renderNode(node, options = {}) {
|
|
|
318
356
|
children
|
|
319
357
|
);
|
|
320
358
|
case "blockquote":
|
|
321
|
-
return
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
{},
|
|
325
|
-
{
|
|
326
|
-
node
|
|
327
|
-
},
|
|
328
|
-
key,
|
|
329
|
-
children
|
|
330
|
-
);
|
|
359
|
+
return renderBlockQuote(node, components, key, "blockquote", "block_quote");
|
|
360
|
+
case "block_quote":
|
|
361
|
+
return renderBlockQuote(node, components, key, "block_quote", "blockquote");
|
|
331
362
|
case "thematic_break":
|
|
332
363
|
return renderWithOverride(
|
|
333
364
|
pickComponent(components, "thematic_break"),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/renderNode.tsx","../src/Djot.tsx"],"names":["Fragment"],"mappings":";;;;;AA2BA,SAAS,aAAa,IAAA,EAA4C;AAChE,EAAA,OAAO,KAAA,CAAM,OAAA,CAAS,IAAA,CAAwB,QAAQ,CAAA;AACxD;AAEA,SAAS,gBAAgB,IAAA,EAA2C;AAClE,EAAA,OAAO,IAAA,CAAK,GAAA,KAAQ,YAAA,IAAgB,IAAA,CAAK,GAAA,KAAQ,WAAA;AACnD;AAEA,SAAS,gBAAgB,IAAA,EAA2C;AAClE,EAAA,OAAO,IAAA,CAAK,GAAA,KAAQ,YAAA,IAAgB,IAAA,CAAK,GAAA,KAAQ,WAAA;AACnD;AAEA,SAAS,aAAA,CACP,UAAA,EACA,OAAA,EACA,KAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAQ,WAAW,OAAO,CAAA,KAAM,KAAA,GAAQ,UAAA,CAAW,KAAK,CAAA,GAAI,MAAA,CAAA;AAG9D;AAEA,SAAS,cAAA,CAAe,UAAsB,UAAA,EAAgD;AAC5F,EAAA,OAAO,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,KAAA,EAAO,KAAA,KAC1B,UAAA,CAAW,KAAA,EAAO;AAAA,MAChB,UAAA;AAAA,MACA,GAAA,EAAK;AAAA,KACN;AAAA,GACH;AACF;AAEA,SAAS,UAAU,KAAA,EAA2B;AAC5C,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,QAAQ,KAAK,GAAA;AAAK,MAChB,KAAK,KAAA;AAAA,MACL,KAAK,MAAA;AAAA,MACL,KAAK,YAAA;AACH,QAAA,MAAA,IAAU,IAAA,CAAK,IAAA;AACf,QAAA;AAAA,MACF,KAAK,YAAA;AAAA,MACL,KAAK,WAAA;AACH,QAAA,MAAA,IAAU,GAAA;AACV,QAAA;AAAA,MACF,KAAK,YAAA;AAAA,MACL,KAAK,WAAA;AACH,QAAA,MAAA,IAAU,IAAA;AACV,QAAA;AAAA,MACF;AACE,QAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG;AACtB,UAAA,MAAA,IAAU,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,QACnC;AACA,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,OAAO,OAAO,IAAA,EAAK;AACrB;AAEA,SAAS,kBAAkB,KAAA,EAAsC;AAC/D,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,OAAA,CAA2C,OAAU,GAAA,EAA0C;AACtG,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH;AAAA,GACF;AACF;AAEA,SAAS,mBACP,QAAA,EACA,QAAA,EACA,QAAA,EACA,WAAA,EACA,KACA,QAAA,EACiB;AACjB,EAAA,MAAM,YAAY,QAAA,IAAY,QAAA;AAC9B,EAAA,MAAM,QACJ,OAAO,SAAA,KAAc,WACjB,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA,GACrB,OAAA;AAAA,IACE;AAAA,MACE,GAAG,QAAA;AAAA,MACH,GAAG;AAAA,KACL;AAAA,IACA;AAAA,GACF;AAEN,EAAA,OAAO,aAAA,CAAc,SAAA,EAAW,KAAA,EAAO,QAAQ,CAAA;AACjD;AAEA,SAAS,SAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,UAAA,EAAY,KAAK,CAAA;AAEjD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,OAAO,cAAc,SAAA,EAAW,OAAA,CAAQ,EAAC,EAAG,GAAG,GAAG,QAAQ,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,aAAA,CAAc,WAAW,OAAA,CAAQ,EAAE,MAAK,EAAG,GAAG,GAAG,QAAQ,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,cAAc,QAAA,EAAU,OAAA,CAAQ,EAAC,EAAG,GAAG,GAAG,QAAQ,CAAA;AAC3D;AAEA,SAAS,aAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,SAAS,CAAA;AAAA,IACnC,IAAI,KAAK,CAAA,CAAA;AAAA,IACT,EAAC;AAAA,IACD;AAAA,MACE,KAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,UAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA;AACnB,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,MAAM,CAAA;AAAA,IAChC,MAAA;AAAA,IACA,EAAC;AAAA,IACD;AAAA,MACE,IAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,eAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA;AACnB,EAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,EAAA,MAAM,gBAAA,GAAmB,aAAA;AAAA,IACvB,MAAA;AAAA,IACA;AAAA,MACE,SAAA,EAAW,QAAA,GAAW,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,GAAK;AAAA,KACjD;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,YAAY,CAAA;AAAA,IACtC,KAAA;AAAA,IACA,EAAC;AAAA,IACD;AAAA,MACE,QAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,UAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,MAAM,OAAO,IAAA,CAAK,WAAA;AAClB,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,MAAM,CAAA;AAAA,IAChC,GAAA;AAAA,IACA;AAAA,MACE;AAAA,KACF;AAAA,IACA;AAAA,MACE;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,WAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA,IAAK,MAAA;AACxC,EAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AACjB,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,OAAO,CAAA;AAAA,IACjC,KAAA;AAAA,IACA;AAAA,MACE,GAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,iBAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,cAAc,CAAA;AAAA,IACxC,IAAA;AAAA,IACA;AAAA,MACE,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,IACA;AAAA,MACE,IAAA;AAAA,MACA,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,SAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA;AACnB,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,UAAA,EAAY,KAAK,CAAA;AAEjD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,IAAA,OAAO,cAAc,SAAA,EAAW,OAAA,CAAQ,EAAC,EAAG,GAAG,GAAG,KAAK,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,aAAA;AAAA,IACL,SAAA;AAAA,IACA,OAAA;AAAA,MACE;AAAA,QACE,IAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,eAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,UAAA,EAAY,YAAA,EAAc,WAAW,CAAA;AAErE,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,IAAA,OAAO,cAAc,SAAA,EAAW,OAAA,CAAQ,EAAC,EAAG,GAAG,GAAG,IAAI,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,aAAA;AAAA,IACL,SAAA;AAAA,IACA,OAAA;AAAA,MACE;AAAA,QACE;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,eAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,UAAA,EAAY,YAAA,EAAc,WAAW,CAAA;AAAA,IACnD,IAAA;AAAA,IACA,EAAC;AAAA,IACD;AAAA,MACE;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,UAAA,CAAW,IAAA,EAAgB,OAAA,GAA6B,EAAC,EAAoB;AAC3F,EAAA,MAAM,EAAE,UAAA,EAAY,GAAA,EAAI,GAAI,OAAA;AAC5B,EAAA,MAAM,QAAA,GAAW,aAAa,IAAI,CAAA,GAAI,eAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA,GAAI,MAAA;AAElF,EAAA,QAAQ,KAAK,GAAA;AAAK,IAChB,KAAK,KAAA;AACH,MAAA,OAAO,SAAA,CAAU,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IACxC,KAAK,MAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,MAAM,CAAA;AAAA,QAChC,GAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAO,aAAA,CAAc,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IAC5C,KAAK,MAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,MAAM,CAAA;AAAA,QAChC,IAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,QAAQ,CAAA;AAAA,QAClC,QAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IACzC,KAAK,YAAA;AACH,MAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IAC9C,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IACzC,KAAK,OAAA;AACH,MAAA,OAAO,WAAA,CAAY,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IAC1C,KAAK,aAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,aAAa,CAAA;AAAA,QACvC,IAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,cAAA;AACH,MAAA,OAAO,iBAAA,CAAkB,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IAChD,KAAK,WAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,WAAW,CAAA;AAAA,QACrC,IAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,YAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,YAAY,CAAA;AAAA,QACtC,YAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,gBAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,gBAAgB,CAAA;AAAA,QAC1C,IAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,KAAA;AACH,MAAA,OAAO,SAAA,CAAU,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IACxC;AACE,MAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,QAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,MAC9C;AAEA,MAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,QAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,MAC9C;AAEA,MAAA,OAAO,IAAA;AAAA;AAEb;AC9cO,SAAS,IAAA,CAAK,EAAE,QAAA,EAAU,UAAA,EAAW,EAAyC;AACnF,EAAA,MAAM,SAAS,QAAA,IAAY,EAAA;AAE3B,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,MAAM,MAAM,CAAA;AACxB,EAAA,uBAAO,GAAA,CAACA,UAAA,EAAU,QAAA,EAAA,UAAA,CAAW,KAAK,EAAE,UAAA,EAAY,CAAA,EAAE,CAAA;AACpD;AAEA,IAAO,YAAA,GAAQ","file":"index.js","sourcesContent":["import { createElement, Fragment } from \"react\";\nimport type React from \"react\";\nimport type {\n DjotBaseNode,\n DjotCodeBlockNode,\n DjotCodeNode,\n DjotComponentPropsMap,\n DjotComponents,\n DjotDocNode,\n DjotHardBreakNode,\n DjotHeadingNode,\n DjotImageNode,\n DjotLinkNode,\n DjotNode,\n DjotOrderedListNode,\n DjotParentNode,\n DjotSoftBreakNode,\n DjotStrNode\n} from \"./types\";\n\nexport interface RenderNodeOptions {\n components?: DjotComponents | undefined;\n key?: React.Key;\n}\n\ntype ComponentKey = keyof DjotComponentPropsMap;\n\nfunction isParentNode(node: DjotBaseNode): node is DjotParentNode {\n return Array.isArray((node as DjotParentNode).children);\n}\n\nfunction isSoftBreakNode(node: DjotNode): node is DjotSoftBreakNode {\n return node.tag === \"soft_break\" || node.tag === \"softbreak\";\n}\n\nfunction isHardBreakNode(node: DjotNode): node is DjotHardBreakNode {\n return node.tag === \"hard_break\" || node.tag === \"hardbreak\";\n}\n\nfunction pickComponent(\n components: DjotComponents | undefined,\n primary: ComponentKey,\n alias?: ComponentKey\n): React.ElementType | undefined {\n if (!components) {\n return undefined;\n }\n\n return (components[primary] ?? (alias ? components[alias] : undefined)) as\n | React.ElementType\n | undefined;\n}\n\nfunction renderChildren(children: DjotNode[], components?: DjotComponents): React.ReactNode[] {\n return children.map((child, index) =>\n renderNode(child, {\n components,\n key: index\n })\n );\n}\n\nfunction toAltText(nodes: DjotNode[]): string {\n let output = \"\";\n\n for (const node of nodes) {\n switch (node.tag) {\n case \"str\":\n case \"code\":\n case \"code_block\":\n output += node.text;\n break;\n case \"soft_break\":\n case \"softbreak\":\n output += \" \";\n break;\n case \"hard_break\":\n case \"hardbreak\":\n output += \"\\n\";\n break;\n default:\n if (isParentNode(node)) {\n output += toAltText(node.children);\n }\n break;\n }\n }\n\n return output.trim();\n}\n\nfunction clampHeadingLevel(level: number): 1 | 2 | 3 | 4 | 5 | 6 {\n if (level <= 1) {\n return 1;\n }\n\n if (level >= 6) {\n return 6;\n }\n\n return level as 1 | 2 | 3 | 4 | 5 | 6;\n}\n\nfunction withKey<T extends Record<string, unknown>>(props: T, key?: React.Key): T & { key?: React.Key } {\n if (key === undefined) {\n return props;\n }\n\n return {\n ...props,\n key\n };\n}\n\nfunction renderWithOverride(\n override: React.ElementType | undefined,\n fallback: React.ElementType,\n domProps: Record<string, unknown>,\n customProps: Record<string, unknown>,\n key?: React.Key,\n children?: React.ReactNode\n): React.ReactNode {\n const Component = override ?? fallback;\n const props =\n typeof Component === \"string\"\n ? withKey(domProps, key)\n : withKey(\n {\n ...domProps,\n ...customProps\n },\n key\n );\n\n return createElement(Component, props, children);\n}\n\nfunction renderDoc(\n node: DjotDocNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n const Component = pickComponent(components, \"doc\");\n\n if (Component) {\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), children);\n }\n\n return createElement(Component, withKey({ node }, key), children);\n }\n\n return createElement(Fragment, withKey({}, key), children);\n}\n\nfunction renderHeading(\n node: DjotHeadingNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const level = clampHeadingLevel(node.level);\n const children = renderChildren(node.children, components);\n return renderWithOverride(\n pickComponent(components, \"heading\"),\n `h${level}`,\n {},\n {\n level,\n node\n },\n key,\n children\n );\n}\n\nfunction renderCode(\n node: DjotCodeNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const value = node.text;\n return renderWithOverride(\n pickComponent(components, \"code\"),\n \"code\",\n {},\n {\n node,\n value\n },\n key,\n value\n );\n}\n\nfunction renderCodeBlock(\n node: DjotCodeBlockNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const value = node.text;\n const language = node.lang;\n const fallbackChildren = createElement(\n \"code\",\n {\n className: language ? `language-${language}` : undefined\n },\n value\n );\n\n return renderWithOverride(\n pickComponent(components, \"code_block\"),\n \"pre\",\n {},\n {\n language,\n node,\n value\n },\n key,\n fallbackChildren\n );\n}\n\nfunction renderLink(\n node: DjotLinkNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n const href = node.destination;\n return renderWithOverride(\n pickComponent(components, \"link\"),\n \"a\",\n {\n href\n },\n {\n node\n },\n key,\n children\n );\n}\n\nfunction renderImage(\n node: DjotImageNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const alt = toAltText(node.children) || undefined;\n const src = node.destination;\n return renderWithOverride(\n pickComponent(components, \"image\"),\n \"img\",\n {\n alt,\n src\n },\n {\n alt,\n node\n },\n key\n );\n}\n\nfunction renderOrderedList(\n node: DjotOrderedListNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n return renderWithOverride(\n pickComponent(components, \"ordered_list\"),\n \"ol\",\n {\n start: node.start\n },\n {\n node,\n start: node.start\n },\n key,\n children\n );\n}\n\nfunction renderStr(\n node: DjotStrNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const value = node.text;\n const Component = pickComponent(components, \"str\");\n\n if (!Component) {\n return value;\n }\n\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), value);\n }\n\n return createElement(\n Component,\n withKey(\n {\n node,\n value\n },\n key\n ),\n value\n );\n}\n\nfunction renderSoftBreak(\n node: DjotSoftBreakNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const Component = pickComponent(components, \"soft_break\", \"softbreak\");\n\n if (!Component) {\n return \"\\n\";\n }\n\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), \"\\n\");\n }\n\n return createElement(\n Component,\n withKey(\n {\n node\n },\n key\n ),\n \"\\n\"\n );\n}\n\nfunction renderHardBreak(\n node: DjotHardBreakNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n return renderWithOverride(\n pickComponent(components, \"hard_break\", \"hardbreak\"),\n \"br\",\n {},\n {\n node\n },\n key\n );\n}\n\nexport function renderNode(node: DjotNode, options: RenderNodeOptions = {}): React.ReactNode {\n const { components, key } = options;\n const children = isParentNode(node) ? renderChildren(node.children, components) : undefined;\n\n switch (node.tag) {\n case \"doc\":\n return renderDoc(node, components, key);\n case \"para\":\n return renderWithOverride(\n pickComponent(components, \"para\"),\n \"p\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"heading\":\n return renderHeading(node, components, key);\n case \"emph\":\n return renderWithOverride(\n pickComponent(components, \"emph\"),\n \"em\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"strong\":\n return renderWithOverride(\n pickComponent(components, \"strong\"),\n \"strong\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"code\":\n return renderCode(node, components, key);\n case \"code_block\":\n return renderCodeBlock(node, components, key);\n case \"link\":\n return renderLink(node, components, key);\n case \"image\":\n return renderImage(node, components, key);\n case \"bullet_list\":\n return renderWithOverride(\n pickComponent(components, \"bullet_list\"),\n \"ul\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"ordered_list\":\n return renderOrderedList(node, components, key);\n case \"list_item\":\n return renderWithOverride(\n pickComponent(components, \"list_item\"),\n \"li\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"blockquote\":\n return renderWithOverride(\n pickComponent(components, \"blockquote\"),\n \"blockquote\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"thematic_break\":\n return renderWithOverride(\n pickComponent(components, \"thematic_break\"),\n \"hr\",\n {},\n {\n node\n },\n key\n );\n case \"str\":\n return renderStr(node, components, key);\n default:\n if (isSoftBreakNode(node)) {\n return renderSoftBreak(node, components, key);\n }\n\n if (isHardBreakNode(node)) {\n return renderHardBreak(node, components, key);\n }\n\n return null;\n }\n}\n","import { parse } from \"@djot/djot\";\nimport { Fragment } from \"react\";\nimport type React from \"react\";\nimport { renderNode } from \"./renderNode\";\nimport type { DjotNode, DjotProps } from \"./types\";\n\nexport function Djot({ children, components }: DjotProps): React.ReactElement | null {\n const source = children ?? \"\";\n\n if (source.length === 0) {\n return null;\n }\n\n const ast = parse(source) as DjotNode;\n return <Fragment>{renderNode(ast, { components })}</Fragment>;\n}\n\nexport default Djot;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/renderNode.tsx","../src/Djot.tsx"],"names":["Fragment"],"mappings":";;;;;AA+BA,SAAS,aAAa,IAAA,EAA4C;AAChE,EAAA,OAAO,KAAA,CAAM,OAAA,CAAS,IAAA,CAAwB,QAAQ,CAAA;AACxD;AAEA,SAAS,gBAAgB,IAAA,EAA2C;AAClE,EAAA,OAAO,IAAA,CAAK,GAAA,KAAQ,YAAA,IAAgB,IAAA,CAAK,GAAA,KAAQ,WAAA;AACnD;AAEA,SAAS,gBAAgB,IAAA,EAA2C;AAClE,EAAA,OAAO,IAAA,CAAK,GAAA,KAAQ,YAAA,IAAgB,IAAA,CAAK,GAAA,KAAQ,WAAA;AACnD;AAEA,SAAS,aAAA,CACP,UAAA,EACA,OAAA,EACA,KAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAQ,WAAW,OAAO,CAAA,KAAM,KAAA,GAAQ,UAAA,CAAW,KAAK,CAAA,GAAI,MAAA,CAAA;AAG9D;AAEA,SAAS,cAAA,CAAe,UAAsB,UAAA,EAAgD;AAC5F,EAAA,OAAO,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,KAAA,EAAO,KAAA,KAC1B,UAAA,CAAW,KAAA,EAAO;AAAA,MAChB,UAAA;AAAA,MACA,GAAA,EAAK;AAAA,KACN;AAAA,GACH;AACF;AAEA,SAAS,UAAU,KAAA,EAA2B;AAC5C,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,QAAQ,KAAK,GAAA;AAAK,MAChB,KAAK,KAAA;AAAA,MACL,KAAK,MAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,YAAA;AACH,QAAA,MAAA,IAAU,IAAA,CAAK,IAAA;AACf,QAAA;AAAA,MACF,KAAK,YAAA;AAAA,MACL,KAAK,WAAA;AACH,QAAA,MAAA,IAAU,GAAA;AACV,QAAA;AAAA,MACF,KAAK,YAAA;AAAA,MACL,KAAK,WAAA;AACH,QAAA,MAAA,IAAU,IAAA;AACV,QAAA;AAAA,MACF;AACE,QAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG;AACtB,UAAA,MAAA,IAAU,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,QACnC;AACA,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,OAAO,OAAO,IAAA,EAAK;AACrB;AAEA,SAAS,kBAAkB,KAAA,EAAsC;AAC/D,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,OAAA,CAA2C,OAAU,GAAA,EAA0C;AACtG,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH;AAAA,GACF;AACF;AAEA,SAAS,mBACP,QAAA,EACA,QAAA,EACA,QAAA,EACA,WAAA,EACA,KACA,QAAA,EACiB;AACjB,EAAA,MAAM,YAAY,QAAA,IAAY,QAAA;AAC9B,EAAA,MAAM,QACJ,OAAO,SAAA,KAAc,WACjB,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA,GACrB,OAAA;AAAA,IACE;AAAA,MACE,GAAG,QAAA;AAAA,MACH,GAAG;AAAA,KACL;AAAA,IACA;AAAA,GACF;AAEN,EAAA,OAAO,aAAA,CAAc,SAAA,EAAW,KAAA,EAAO,QAAQ,CAAA;AACjD;AAEA,SAAS,SAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,UAAA,EAAY,KAAK,CAAA;AAEjD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,OAAO,cAAc,SAAA,EAAW,OAAA,CAAQ,EAAC,EAAG,GAAG,GAAG,QAAQ,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,aAAA,CAAc,WAAW,OAAA,CAAQ,EAAE,MAAK,EAAG,GAAG,GAAG,QAAQ,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,cAAc,QAAA,EAAU,OAAA,CAAQ,EAAC,EAAG,GAAG,GAAG,QAAQ,CAAA;AAC3D;AAEA,SAAS,aAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,UAAA,EAAY,SAAS,CAAA;AAErD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,OAAO,cAAc,SAAA,EAAW,OAAA,CAAQ,EAAC,EAAG,GAAG,GAAG,QAAQ,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,aAAA;AAAA,MACL,SAAA;AAAA,MACA,OAAA;AAAA,QACE;AAAA,UACE;AAAA,SACF;AAAA,QACA;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,cAAc,QAAA,EAAU,OAAA,CAAQ,EAAC,EAAG,GAAG,GAAG,QAAQ,CAAA;AAC3D;AAEA,SAAS,aAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,SAAS,CAAA;AAAA,IACnC,IAAI,KAAK,CAAA,CAAA;AAAA,IACT,EAAC;AAAA,IACD;AAAA,MACE,KAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,UAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACA,SACA,KAAA,EACiB;AACjB,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA;AACnB,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,UAAA,EAAY,OAAA,EAAS,KAAK,CAAA;AAAA,IACxC,MAAA;AAAA,IACA,EAAC;AAAA,IACD;AAAA,MACE,IAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,eAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA;AACnB,EAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,EAAA,MAAM,gBAAA,GAAmB,aAAA;AAAA,IACvB,MAAA;AAAA,IACA;AAAA,MACE,SAAA,EAAW,QAAA,GAAW,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,GAAK;AAAA,KACjD;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,YAAY,CAAA;AAAA,IACtC,KAAA;AAAA,IACA,EAAC;AAAA,IACD;AAAA,MACE,QAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,UAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,MAAM,OAAO,IAAA,CAAK,WAAA;AAClB,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,MAAM,CAAA;AAAA,IAChC,GAAA;AAAA,IACA;AAAA,MACE;AAAA,KACF;AAAA,IACA;AAAA,MACE;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,WAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA,IAAK,MAAA;AACxC,EAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AACjB,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,OAAO,CAAA;AAAA,IACjC,KAAA;AAAA,IACA;AAAA,MACE,GAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,iBAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,YAAY,cAAc,CAAA;AAAA,IACxC,IAAA;AAAA,IACA;AAAA,MACE,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,IACA;AAAA,MACE,IAAA;AAAA,MACA,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,gBAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACA,SACA,KAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,UAAA,EAAY,OAAA,EAAS,KAAK,CAAA;AAAA,IACxC,YAAA;AAAA,IACA,EAAC;AAAA,IACD;AAAA,MACE;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,SAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA;AACnB,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,UAAA,EAAY,KAAK,CAAA;AAEjD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,IAAA,OAAO,cAAc,SAAA,EAAW,OAAA,CAAQ,EAAC,EAAG,GAAG,GAAG,KAAK,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,aAAA;AAAA,IACL,SAAA;AAAA,IACA,OAAA;AAAA,MACE;AAAA,QACE,IAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,eAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,UAAA,EAAY,YAAA,EAAc,WAAW,CAAA;AAErE,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,IAAA,OAAO,cAAc,SAAA,EAAW,OAAA,CAAQ,EAAC,EAAG,GAAG,GAAG,IAAI,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,aAAA;AAAA,IACL,SAAA;AAAA,IACA,OAAA;AAAA,MACE;AAAA,QACE;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,eAAA,CACP,IAAA,EACA,UAAA,EACA,GAAA,EACiB;AACjB,EAAA,OAAO,kBAAA;AAAA,IACL,aAAA,CAAc,UAAA,EAAY,YAAA,EAAc,WAAW,CAAA;AAAA,IACnD,IAAA;AAAA,IACA,EAAC;AAAA,IACD;AAAA,MACE;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,UAAA,CAAW,IAAA,EAAgB,OAAA,GAA6B,EAAC,EAAoB;AAC3F,EAAA,MAAM,EAAE,UAAA,EAAY,GAAA,EAAI,GAAI,OAAA;AAC5B,EAAA,MAAM,QAAA,GAAW,aAAa,IAAI,CAAA,GAAI,eAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA,GAAI,MAAA;AAElF,EAAA,QAAQ,KAAK,GAAA;AAAK,IAChB,KAAK,KAAA;AACH,MAAA,OAAO,SAAA,CAAU,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IACxC,KAAK,SAAA;AACH,MAAA,OAAO,aAAA,CAAc,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IAC5C,KAAK,MAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,MAAM,CAAA;AAAA,QAChC,GAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAO,aAAA,CAAc,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IAC5C,KAAK,MAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,MAAM,CAAA;AAAA,QAChC,IAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,QAAQ,CAAA;AAAA,QAClC,QAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,QAAQ,UAAU,CAAA;AAAA,IAC7D,KAAK,UAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,YAAY,MAAM,CAAA;AAAA,IAC7D,KAAK,YAAA;AACH,MAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IAC9C,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IACzC,KAAK,OAAA;AACH,MAAA,OAAO,WAAA,CAAY,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IAC1C,KAAK,aAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,aAAa,CAAA;AAAA,QACvC,IAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,cAAA;AACH,MAAA,OAAO,iBAAA,CAAkB,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IAChD,KAAK,WAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,WAAW,CAAA;AAAA,QACrC,IAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,YAAA;AACH,MAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,cAAc,aAAa,CAAA;AAAA,IAC5E,KAAK,aAAA;AACH,MAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,eAAe,YAAY,CAAA;AAAA,IAC5E,KAAK,gBAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,aAAA,CAAc,YAAY,gBAAgB,CAAA;AAAA,QAC1C,IAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,UACE;AAAA,SACF;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,KAAA;AACH,MAAA,OAAO,SAAA,CAAU,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,IACxC;AACE,MAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,QAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,MAC9C;AAEA,MAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,QAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAAA,MAC9C;AAEA,MAAA,OAAO,IAAA;AAAA;AAEb;AClgBO,SAAS,IAAA,CAAK,EAAE,QAAA,EAAU,UAAA,EAAW,EAAyC;AACnF,EAAA,MAAM,SAAS,QAAA,IAAY,EAAA;AAE3B,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,MAAM,MAAM,CAAA;AACxB,EAAA,uBAAO,GAAA,CAACA,UAAA,EAAU,QAAA,EAAA,UAAA,CAAW,KAAK,EAAE,UAAA,EAAY,CAAA,EAAE,CAAA;AACpD;AAEA,IAAO,YAAA,GAAQ","file":"index.js","sourcesContent":["import { createElement, Fragment } from \"react\";\nimport type React from \"react\";\nimport type {\n DjotBaseNode,\n DjotBlockQuoteNode,\n DjotBlockquoteNode,\n DjotCodeBlockNode,\n DjotCodeNode,\n DjotComponentPropsMap,\n DjotComponents,\n DjotDocNode,\n DjotHardBreakNode,\n DjotHeadingNode,\n DjotImageNode,\n DjotLinkNode,\n DjotNode,\n DjotOrderedListNode,\n DjotParentNode,\n DjotSectionNode,\n DjotSoftBreakNode,\n DjotStrNode,\n DjotVerbatimNode\n} from \"./types\";\n\nexport interface RenderNodeOptions {\n components?: DjotComponents | undefined;\n key?: React.Key;\n}\n\ntype ComponentKey = keyof DjotComponentPropsMap;\n\nfunction isParentNode(node: DjotBaseNode): node is DjotParentNode {\n return Array.isArray((node as DjotParentNode).children);\n}\n\nfunction isSoftBreakNode(node: DjotNode): node is DjotSoftBreakNode {\n return node.tag === \"soft_break\" || node.tag === \"softbreak\";\n}\n\nfunction isHardBreakNode(node: DjotNode): node is DjotHardBreakNode {\n return node.tag === \"hard_break\" || node.tag === \"hardbreak\";\n}\n\nfunction pickComponent(\n components: DjotComponents | undefined,\n primary: ComponentKey,\n alias?: ComponentKey\n): React.ElementType | undefined {\n if (!components) {\n return undefined;\n }\n\n return (components[primary] ?? (alias ? components[alias] : undefined)) as\n | React.ElementType\n | undefined;\n}\n\nfunction renderChildren(children: DjotNode[], components?: DjotComponents): React.ReactNode[] {\n return children.map((child, index) =>\n renderNode(child, {\n components,\n key: index\n })\n );\n}\n\nfunction toAltText(nodes: DjotNode[]): string {\n let output = \"\";\n\n for (const node of nodes) {\n switch (node.tag) {\n case \"str\":\n case \"code\":\n case \"verbatim\":\n case \"code_block\":\n output += node.text;\n break;\n case \"soft_break\":\n case \"softbreak\":\n output += \" \";\n break;\n case \"hard_break\":\n case \"hardbreak\":\n output += \"\\n\";\n break;\n default:\n if (isParentNode(node)) {\n output += toAltText(node.children);\n }\n break;\n }\n }\n\n return output.trim();\n}\n\nfunction clampHeadingLevel(level: number): 1 | 2 | 3 | 4 | 5 | 6 {\n if (level <= 1) {\n return 1;\n }\n\n if (level >= 6) {\n return 6;\n }\n\n return level as 1 | 2 | 3 | 4 | 5 | 6;\n}\n\nfunction withKey<T extends Record<string, unknown>>(props: T, key?: React.Key): T & { key?: React.Key } {\n if (key === undefined) {\n return props;\n }\n\n return {\n ...props,\n key\n };\n}\n\nfunction renderWithOverride(\n override: React.ElementType | undefined,\n fallback: React.ElementType,\n domProps: Record<string, unknown>,\n customProps: Record<string, unknown>,\n key?: React.Key,\n children?: React.ReactNode\n): React.ReactNode {\n const Component = override ?? fallback;\n const props =\n typeof Component === \"string\"\n ? withKey(domProps, key)\n : withKey(\n {\n ...domProps,\n ...customProps\n },\n key\n );\n\n return createElement(Component, props, children);\n}\n\nfunction renderDoc(\n node: DjotDocNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n const Component = pickComponent(components, \"doc\");\n\n if (Component) {\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), children);\n }\n\n return createElement(Component, withKey({ node }, key), children);\n }\n\n return createElement(Fragment, withKey({}, key), children);\n}\n\nfunction renderSection(\n node: DjotSectionNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n const Component = pickComponent(components, \"section\");\n\n if (Component) {\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), children);\n }\n\n return createElement(\n Component,\n withKey(\n {\n node\n },\n key\n ),\n children\n );\n }\n\n return createElement(Fragment, withKey({}, key), children);\n}\n\nfunction renderHeading(\n node: DjotHeadingNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const level = clampHeadingLevel(node.level);\n const children = renderChildren(node.children, components);\n return renderWithOverride(\n pickComponent(components, \"heading\"),\n `h${level}`,\n {},\n {\n level,\n node\n },\n key,\n children\n );\n}\n\nfunction renderCode(\n node: DjotCodeNode | DjotVerbatimNode,\n components: DjotComponents | undefined,\n key: React.Key | undefined,\n primary: \"code\" | \"verbatim\",\n alias: \"code\" | \"verbatim\"\n): React.ReactNode {\n const value = node.text;\n return renderWithOverride(\n pickComponent(components, primary, alias),\n \"code\",\n {},\n {\n node,\n value\n },\n key,\n value\n );\n}\n\nfunction renderCodeBlock(\n node: DjotCodeBlockNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const value = node.text;\n const language = node.lang;\n const fallbackChildren = createElement(\n \"code\",\n {\n className: language ? `language-${language}` : undefined\n },\n value\n );\n\n return renderWithOverride(\n pickComponent(components, \"code_block\"),\n \"pre\",\n {},\n {\n language,\n node,\n value\n },\n key,\n fallbackChildren\n );\n}\n\nfunction renderLink(\n node: DjotLinkNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n const href = node.destination;\n return renderWithOverride(\n pickComponent(components, \"link\"),\n \"a\",\n {\n href\n },\n {\n node\n },\n key,\n children\n );\n}\n\nfunction renderImage(\n node: DjotImageNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const alt = toAltText(node.children) || undefined;\n const src = node.destination;\n return renderWithOverride(\n pickComponent(components, \"image\"),\n \"img\",\n {\n alt,\n src\n },\n {\n alt,\n node\n },\n key\n );\n}\n\nfunction renderOrderedList(\n node: DjotOrderedListNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n return renderWithOverride(\n pickComponent(components, \"ordered_list\"),\n \"ol\",\n {\n start: node.start\n },\n {\n node,\n start: node.start\n },\n key,\n children\n );\n}\n\nfunction renderBlockQuote(\n node: DjotBlockquoteNode | DjotBlockQuoteNode,\n components: DjotComponents | undefined,\n key: React.Key | undefined,\n primary: \"blockquote\" | \"block_quote\",\n alias: \"blockquote\" | \"block_quote\"\n): React.ReactNode {\n const children = renderChildren(node.children, components);\n return renderWithOverride(\n pickComponent(components, primary, alias),\n \"blockquote\",\n {},\n {\n node\n },\n key,\n children\n );\n}\n\nfunction renderStr(\n node: DjotStrNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const value = node.text;\n const Component = pickComponent(components, \"str\");\n\n if (!Component) {\n return value;\n }\n\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), value);\n }\n\n return createElement(\n Component,\n withKey(\n {\n node,\n value\n },\n key\n ),\n value\n );\n}\n\nfunction renderSoftBreak(\n node: DjotSoftBreakNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n const Component = pickComponent(components, \"soft_break\", \"softbreak\");\n\n if (!Component) {\n return \"\\n\";\n }\n\n if (typeof Component === \"string\") {\n return createElement(Component, withKey({}, key), \"\\n\");\n }\n\n return createElement(\n Component,\n withKey(\n {\n node\n },\n key\n ),\n \"\\n\"\n );\n}\n\nfunction renderHardBreak(\n node: DjotHardBreakNode,\n components: DjotComponents | undefined,\n key?: React.Key\n): React.ReactNode {\n return renderWithOverride(\n pickComponent(components, \"hard_break\", \"hardbreak\"),\n \"br\",\n {},\n {\n node\n },\n key\n );\n}\n\nexport function renderNode(node: DjotNode, options: RenderNodeOptions = {}): React.ReactNode {\n const { components, key } = options;\n const children = isParentNode(node) ? renderChildren(node.children, components) : undefined;\n\n switch (node.tag) {\n case \"doc\":\n return renderDoc(node, components, key);\n case \"section\":\n return renderSection(node, components, key);\n case \"para\":\n return renderWithOverride(\n pickComponent(components, \"para\"),\n \"p\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"heading\":\n return renderHeading(node, components, key);\n case \"emph\":\n return renderWithOverride(\n pickComponent(components, \"emph\"),\n \"em\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"strong\":\n return renderWithOverride(\n pickComponent(components, \"strong\"),\n \"strong\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"code\":\n return renderCode(node, components, key, \"code\", \"verbatim\");\n case \"verbatim\":\n return renderCode(node, components, key, \"verbatim\", \"code\");\n case \"code_block\":\n return renderCodeBlock(node, components, key);\n case \"link\":\n return renderLink(node, components, key);\n case \"image\":\n return renderImage(node, components, key);\n case \"bullet_list\":\n return renderWithOverride(\n pickComponent(components, \"bullet_list\"),\n \"ul\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"ordered_list\":\n return renderOrderedList(node, components, key);\n case \"list_item\":\n return renderWithOverride(\n pickComponent(components, \"list_item\"),\n \"li\",\n {},\n {\n node\n },\n key,\n children\n );\n case \"blockquote\":\n return renderBlockQuote(node, components, key, \"blockquote\", \"block_quote\");\n case \"block_quote\":\n return renderBlockQuote(node, components, key, \"block_quote\", \"blockquote\");\n case \"thematic_break\":\n return renderWithOverride(\n pickComponent(components, \"thematic_break\"),\n \"hr\",\n {},\n {\n node\n },\n key\n );\n case \"str\":\n return renderStr(node, components, key);\n default:\n if (isSoftBreakNode(node)) {\n return renderSoftBreak(node, components, key);\n }\n\n if (isHardBreakNode(node)) {\n return renderHardBreak(node, components, key);\n }\n\n return null;\n }\n}\n","import { parse } from \"@djot/djot\";\nimport { Fragment } from \"react\";\nimport type React from \"react\";\nimport { renderNode } from \"./renderNode\";\nimport type { DjotNode, DjotProps } from \"./types\";\n\nexport function Djot({ children, components }: DjotProps): React.ReactElement | null {\n const source = children ?? \"\";\n\n if (source.length === 0) {\n return null;\n }\n\n const ast = parse(source) as DjotNode;\n return <Fragment>{renderNode(ast, { components })}</Fragment>;\n}\n\nexport default Djot;\n"]}
|