markstream-svelte 0.0.1-beta.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.
- package/README.md +77 -0
- package/dist/components/AdmonitionNode.svelte +8 -0
- package/dist/components/AdmonitionNode.svelte.d.ts +23 -0
- package/dist/components/AdmonitionNode.svelte.d.ts.map +1 -0
- package/dist/components/BlockquoteNode.svelte +10 -0
- package/dist/components/BlockquoteNode.svelte.d.ts +24 -0
- package/dist/components/BlockquoteNode.svelte.d.ts.map +1 -0
- package/dist/components/CheckboxNode.svelte +5 -0
- package/dist/components/CheckboxNode.svelte.d.ts +22 -0
- package/dist/components/CheckboxNode.svelte.d.ts.map +1 -0
- package/dist/components/CodeBlockNode.svelte +944 -0
- package/dist/components/CodeBlockNode.svelte.d.ts +43 -0
- package/dist/components/CodeBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/D2BlockNode.svelte +272 -0
- package/dist/components/D2BlockNode.svelte.d.ts +33 -0
- package/dist/components/D2BlockNode.svelte.d.ts.map +1 -0
- package/dist/components/DefinitionListNode.svelte +8 -0
- package/dist/components/DefinitionListNode.svelte.d.ts +23 -0
- package/dist/components/DefinitionListNode.svelte.d.ts.map +1 -0
- package/dist/components/EmojiNode.svelte +7 -0
- package/dist/components/EmojiNode.svelte.d.ts +22 -0
- package/dist/components/EmojiNode.svelte.d.ts.map +1 -0
- package/dist/components/EmphasisNode.svelte +8 -0
- package/dist/components/EmphasisNode.svelte.d.ts +24 -0
- package/dist/components/EmphasisNode.svelte.d.ts.map +1 -0
- package/dist/components/FallbackComponent.svelte +8 -0
- package/dist/components/FallbackComponent.svelte.d.ts +23 -0
- package/dist/components/FallbackComponent.svelte.d.ts.map +1 -0
- package/dist/components/FootnoteAnchorNode.svelte +21 -0
- package/dist/components/FootnoteAnchorNode.svelte.d.ts +22 -0
- package/dist/components/FootnoteAnchorNode.svelte.d.ts.map +1 -0
- package/dist/components/FootnoteNode.svelte +19 -0
- package/dist/components/FootnoteNode.svelte.d.ts +24 -0
- package/dist/components/FootnoteNode.svelte.d.ts.map +1 -0
- package/dist/components/FootnoteReferenceNode.svelte +26 -0
- package/dist/components/FootnoteReferenceNode.svelte.d.ts +22 -0
- package/dist/components/FootnoteReferenceNode.svelte.d.ts.map +1 -0
- package/dist/components/HardBreakNode.svelte +1 -0
- package/dist/components/HardBreakNode.svelte.d.ts +27 -0
- package/dist/components/HardBreakNode.svelte.d.ts.map +1 -0
- package/dist/components/HeadingNode.svelte +15 -0
- package/dist/components/HeadingNode.svelte.d.ts +24 -0
- package/dist/components/HeadingNode.svelte.d.ts.map +1 -0
- package/dist/components/HighlightNode.svelte +8 -0
- package/dist/components/HighlightNode.svelte.d.ts +24 -0
- package/dist/components/HighlightNode.svelte.d.ts.map +1 -0
- package/dist/components/HtmlBlockNode.svelte +8 -0
- package/dist/components/HtmlBlockNode.svelte.d.ts +23 -0
- package/dist/components/HtmlBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/HtmlInlineNode.svelte +8 -0
- package/dist/components/HtmlInlineNode.svelte.d.ts +23 -0
- package/dist/components/HtmlInlineNode.svelte.d.ts.map +1 -0
- package/dist/components/HtmlPreviewFrame.svelte +13 -0
- package/dist/components/HtmlPreviewFrame.svelte.d.ts +26 -0
- package/dist/components/HtmlPreviewFrame.svelte.d.ts.map +1 -0
- package/dist/components/ImageNode.svelte +86 -0
- package/dist/components/ImageNode.svelte.d.ts +25 -0
- package/dist/components/ImageNode.svelte.d.ts.map +1 -0
- package/dist/components/InfographicBlockNode.svelte +429 -0
- package/dist/components/InfographicBlockNode.svelte.d.ts +34 -0
- package/dist/components/InfographicBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/InlineCodeNode.svelte +7 -0
- package/dist/components/InlineCodeNode.svelte.d.ts +22 -0
- package/dist/components/InlineCodeNode.svelte.d.ts.map +1 -0
- package/dist/components/InlineWrapNode.svelte +10 -0
- package/dist/components/InlineWrapNode.svelte.d.ts +25 -0
- package/dist/components/InlineWrapNode.svelte.d.ts.map +1 -0
- package/dist/components/InsertNode.svelte +8 -0
- package/dist/components/InsertNode.svelte.d.ts +24 -0
- package/dist/components/InsertNode.svelte.d.ts.map +1 -0
- package/dist/components/LinkNode.svelte +41 -0
- package/dist/components/LinkNode.svelte.d.ts +25 -0
- package/dist/components/LinkNode.svelte.d.ts.map +1 -0
- package/dist/components/ListItemNode.svelte +9 -0
- package/dist/components/ListItemNode.svelte.d.ts +24 -0
- package/dist/components/ListItemNode.svelte.d.ts.map +1 -0
- package/dist/components/ListNode.svelte +16 -0
- package/dist/components/ListNode.svelte.d.ts +24 -0
- package/dist/components/ListNode.svelte.d.ts.map +1 -0
- package/dist/components/MarkdownCodeBlockNode.svelte +7 -0
- package/dist/components/MarkdownCodeBlockNode.svelte.d.ts +23 -0
- package/dist/components/MarkdownCodeBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/MathBlockNode.svelte +96 -0
- package/dist/components/MathBlockNode.svelte.d.ts +22 -0
- package/dist/components/MathBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/MathInlineNode.svelte +103 -0
- package/dist/components/MathInlineNode.svelte.d.ts +22 -0
- package/dist/components/MathInlineNode.svelte.d.ts.map +1 -0
- package/dist/components/MermaidBlockNode.svelte +557 -0
- package/dist/components/MermaidBlockNode.svelte.d.ts +40 -0
- package/dist/components/MermaidBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/NodeOutlet.svelte +192 -0
- package/dist/components/NodeOutlet.svelte.d.ts +24 -0
- package/dist/components/NodeOutlet.svelte.d.ts.map +1 -0
- package/dist/components/NodeRenderer.svelte +349 -0
- package/dist/components/NodeRenderer.svelte.d.ts +64 -0
- package/dist/components/NodeRenderer.svelte.d.ts.map +1 -0
- package/dist/components/ParagraphNode.svelte +21 -0
- package/dist/components/ParagraphNode.svelte.d.ts +24 -0
- package/dist/components/ParagraphNode.svelte.d.ts.map +1 -0
- package/dist/components/PreCodeNode.svelte +13 -0
- package/dist/components/PreCodeNode.svelte.d.ts +22 -0
- package/dist/components/PreCodeNode.svelte.d.ts.map +1 -0
- package/dist/components/ReferenceNode.svelte +8 -0
- package/dist/components/ReferenceNode.svelte.d.ts +23 -0
- package/dist/components/ReferenceNode.svelte.d.ts.map +1 -0
- package/dist/components/RenderChildren.svelte +12 -0
- package/dist/components/RenderChildren.svelte.d.ts +24 -0
- package/dist/components/RenderChildren.svelte.d.ts.map +1 -0
- package/dist/components/StrikethroughNode.svelte +8 -0
- package/dist/components/StrikethroughNode.svelte.d.ts +24 -0
- package/dist/components/StrikethroughNode.svelte.d.ts.map +1 -0
- package/dist/components/StrongNode.svelte +8 -0
- package/dist/components/StrongNode.svelte.d.ts +24 -0
- package/dist/components/StrongNode.svelte.d.ts.map +1 -0
- package/dist/components/SubscriptNode.svelte +8 -0
- package/dist/components/SubscriptNode.svelte.d.ts +24 -0
- package/dist/components/SubscriptNode.svelte.d.ts.map +1 -0
- package/dist/components/SuperscriptNode.svelte +8 -0
- package/dist/components/SuperscriptNode.svelte.d.ts +24 -0
- package/dist/components/SuperscriptNode.svelte.d.ts.map +1 -0
- package/dist/components/TableNode.svelte +8 -0
- package/dist/components/TableNode.svelte.d.ts +23 -0
- package/dist/components/TableNode.svelte.d.ts.map +1 -0
- package/dist/components/TextNode.svelte +37 -0
- package/dist/components/TextNode.svelte.d.ts +25 -0
- package/dist/components/TextNode.svelte.d.ts.map +1 -0
- package/dist/components/ThematicBreakNode.svelte +1 -0
- package/dist/components/ThematicBreakNode.svelte.d.ts +27 -0
- package/dist/components/ThematicBreakNode.svelte.d.ts.map +1 -0
- package/dist/components/Tooltip.svelte +4 -0
- package/dist/components/Tooltip.svelte.d.ts +21 -0
- package/dist/components/Tooltip.svelte.d.ts.map +1 -0
- package/dist/components/VmrContainerNode.svelte +8 -0
- package/dist/components/VmrContainerNode.svelte.d.ts +23 -0
- package/dist/components/VmrContainerNode.svelte.d.ts.map +1 -0
- package/dist/components/shared/diagram-height.d.ts +10 -0
- package/dist/components/shared/diagram-height.d.ts.map +1 -0
- package/dist/components/shared/diagram-height.js +52 -0
- package/dist/components/shared/node-helpers.d.ts +108 -0
- package/dist/components/shared/node-helpers.d.ts.map +1 -0
- package/dist/components/shared/node-helpers.js +220 -0
- package/dist/components/shared/node-outlet-helpers.d.ts +9 -0
- package/dist/components/shared/node-outlet-helpers.d.ts.map +1 -0
- package/dist/components/shared/node-outlet-helpers.js +92 -0
- package/dist/components/shared/render-window.d.ts +19 -0
- package/dist/components/shared/render-window.d.ts.map +1 -0
- package/dist/components/shared/render-window.js +63 -0
- package/dist/components/shared/renderNodeHtml.d.ts +4 -0
- package/dist/components/shared/renderNodeHtml.d.ts.map +1 -0
- package/dist/components/shared/renderNodeHtml.js +19 -0
- package/dist/components/shared/rich-block-helpers.d.ts +7 -0
- package/dist/components/shared/rich-block-helpers.d.ts.map +1 -0
- package/dist/components/shared/rich-block-helpers.js +76 -0
- package/dist/customComponents.d.ts +10 -0
- package/dist/customComponents.d.ts.map +1 -0
- package/dist/customComponents.js +66 -0
- package/dist/enhanceRenderedHtml.d.ts +21 -0
- package/dist/enhanceRenderedHtml.d.ts.map +1 -0
- package/dist/enhanceRenderedHtml.js +768 -0
- package/dist/hydrateCustomTagContent.d.ts +3 -0
- package/dist/hydrateCustomTagContent.d.ts.map +1 -0
- package/dist/hydrateCustomTagContent.js +130 -0
- package/dist/i18n/useSafeI18n.d.ts +5 -0
- package/dist/i18n/useSafeI18n.d.ts.map +1 -0
- package/dist/i18n/useSafeI18n.js +42 -0
- package/dist/index.css +2009 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.px.css +2009 -0
- package/dist/index.tailwind.css +2009 -0
- package/dist/optional/d2.d.ts +7 -0
- package/dist/optional/d2.d.ts.map +1 -0
- package/dist/optional/d2.js +67 -0
- package/dist/optional/infographic.d.ts +2 -0
- package/dist/optional/infographic.d.ts.map +1 -0
- package/dist/optional/infographic.js +29 -0
- package/dist/optional/katex.d.ts +7 -0
- package/dist/optional/katex.d.ts.map +1 -0
- package/dist/optional/katex.js +93 -0
- package/dist/optional/mermaid.d.ts +7 -0
- package/dist/optional/mermaid.d.ts.map +1 -0
- package/dist/optional/mermaid.js +171 -0
- package/dist/optional/monaco.d.ts +5 -0
- package/dist/optional/monaco.d.ts.map +1 -0
- package/dist/optional/monaco.js +70 -0
- package/dist/parseNestedMarkdownToNodes.d.ts +15 -0
- package/dist/parseNestedMarkdownToNodes.d.ts.map +1 -0
- package/dist/parseNestedMarkdownToNodes.js +66 -0
- package/dist/renderMarkdownHtml.d.ts +31 -0
- package/dist/renderMarkdownHtml.d.ts.map +1 -0
- package/dist/renderMarkdownHtml.js +465 -0
- package/dist/sanitizeHtmlContent.d.ts +3 -0
- package/dist/sanitizeHtmlContent.d.ts.map +1 -0
- package/dist/sanitizeHtmlContent.js +175 -0
- package/dist/sanitizeSvg.d.ts +3 -0
- package/dist/sanitizeSvg.d.ts.map +1 -0
- package/dist/sanitizeSvg.js +76 -0
- package/dist/tailwind-entry.d.ts +2 -0
- package/dist/tailwind-entry.d.ts.map +1 -0
- package/dist/tailwind-entry.js +1 -0
- package/dist/tooltip/singletonTooltip.d.ts +8 -0
- package/dist/tooltip/singletonTooltip.d.ts.map +1 -0
- package/dist/tooltip/singletonTooltip.js +124 -0
- package/dist/types/monaco.d.ts +66 -0
- package/dist/types/monaco.d.ts.map +1 -0
- package/dist/types/monaco.js +1 -0
- package/dist/utils/languageIcon.d.ts +8 -0
- package/dist/utils/languageIcon.d.ts.map +1 -0
- package/dist/utils/languageIcon.js +182 -0
- package/dist/utils/normalizeKaTeXRenderInput.d.ts +2 -0
- package/dist/utils/normalizeKaTeXRenderInput.d.ts.map +1 -0
- package/dist/utils/normalizeKaTeXRenderInput.js +7 -0
- package/dist/workers/katexCdnWorker.d.ts +21 -0
- package/dist/workers/katexCdnWorker.d.ts.map +1 -0
- package/dist/workers/katexCdnWorker.js +193 -0
- package/dist/workers/katexRenderer.worker.d.ts +2 -0
- package/dist/workers/katexRenderer.worker.d.ts.map +1 -0
- package/dist/workers/katexRenderer.worker.js +55 -0
- package/dist/workers/katexWorkerClient.d.ts +36 -0
- package/dist/workers/katexWorkerClient.d.ts.map +1 -0
- package/dist/workers/katexWorkerClient.js +270 -0
- package/dist/workers/mermaidCdnWorker.d.ts +16 -0
- package/dist/workers/mermaidCdnWorker.d.ts.map +1 -0
- package/dist/workers/mermaidCdnWorker.js +235 -0
- package/dist/workers/mermaidParser.worker.d.ts +2 -0
- package/dist/workers/mermaidParser.worker.d.ts.map +1 -0
- package/dist/workers/mermaidParser.worker.js +85 -0
- package/dist/workers/mermaidWorkerClient.d.ts +16 -0
- package/dist/workers/mermaidWorkerClient.d.ts.map +1 -0
- package/dist/workers/mermaidWorkerClient.js +170 -0
- package/package.json +95 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { SvelteRenderableNode, SvelteRenderContext } from './shared/node-helpers'
|
|
3
|
+
import { STANDARD_HTML_TAGS } from 'stream-markdown-parser'
|
|
4
|
+
import { getCustomNodeComponents } from '../customComponents'
|
|
5
|
+
import AdmonitionNode from './AdmonitionNode.svelte'
|
|
6
|
+
import BlockquoteNode from './BlockquoteNode.svelte'
|
|
7
|
+
import CheckboxNode from './CheckboxNode.svelte'
|
|
8
|
+
import CodeBlockNode from './CodeBlockNode.svelte'
|
|
9
|
+
import D2BlockNode from './D2BlockNode.svelte'
|
|
10
|
+
import DefinitionListNode from './DefinitionListNode.svelte'
|
|
11
|
+
import EmojiNode from './EmojiNode.svelte'
|
|
12
|
+
import EmphasisNode from './EmphasisNode.svelte'
|
|
13
|
+
import FallbackComponent from './FallbackComponent.svelte'
|
|
14
|
+
import FootnoteAnchorNode from './FootnoteAnchorNode.svelte'
|
|
15
|
+
import FootnoteNode from './FootnoteNode.svelte'
|
|
16
|
+
import FootnoteReferenceNode from './FootnoteReferenceNode.svelte'
|
|
17
|
+
import HardBreakNode from './HardBreakNode.svelte'
|
|
18
|
+
import HeadingNode from './HeadingNode.svelte'
|
|
19
|
+
import HighlightNode from './HighlightNode.svelte'
|
|
20
|
+
import HtmlBlockNode from './HtmlBlockNode.svelte'
|
|
21
|
+
import HtmlInlineNode from './HtmlInlineNode.svelte'
|
|
22
|
+
import ImageNode from './ImageNode.svelte'
|
|
23
|
+
import InfographicBlockNode from './InfographicBlockNode.svelte'
|
|
24
|
+
import InlineCodeNode from './InlineCodeNode.svelte'
|
|
25
|
+
import InsertNode from './InsertNode.svelte'
|
|
26
|
+
import LinkNode from './LinkNode.svelte'
|
|
27
|
+
import ListItemNode from './ListItemNode.svelte'
|
|
28
|
+
import ListNode from './ListNode.svelte'
|
|
29
|
+
import MathBlockNode from './MathBlockNode.svelte'
|
|
30
|
+
import MathInlineNode from './MathInlineNode.svelte'
|
|
31
|
+
import MermaidBlockNode from './MermaidBlockNode.svelte'
|
|
32
|
+
import ParagraphNode from './ParagraphNode.svelte'
|
|
33
|
+
import PreCodeNode from './PreCodeNode.svelte'
|
|
34
|
+
import ReferenceNode from './ReferenceNode.svelte'
|
|
35
|
+
import StrikethroughNode from './StrikethroughNode.svelte'
|
|
36
|
+
import StrongNode from './StrongNode.svelte'
|
|
37
|
+
import SubscriptNode from './SubscriptNode.svelte'
|
|
38
|
+
import SuperscriptNode from './SuperscriptNode.svelte'
|
|
39
|
+
import TableNode from './TableNode.svelte'
|
|
40
|
+
import TextNode from './TextNode.svelte'
|
|
41
|
+
import ThematicBreakNode from './ThematicBreakNode.svelte'
|
|
42
|
+
import VmrContainerNode from './VmrContainerNode.svelte'
|
|
43
|
+
import { hasCompleteHtmlTagContent } from './shared/node-helpers'
|
|
44
|
+
import {
|
|
45
|
+
coerceBuiltinHtmlNode,
|
|
46
|
+
coerceCustomHtmlNode,
|
|
47
|
+
resolveHtmlTag,
|
|
48
|
+
resolveNodeOutletCodeMode,
|
|
49
|
+
resolveNodeOutletCustomComponent,
|
|
50
|
+
resolveNodeOutletCustomInputs,
|
|
51
|
+
} from './shared/node-outlet-helpers'
|
|
52
|
+
|
|
53
|
+
export let node: SvelteRenderableNode
|
|
54
|
+
export let context: SvelteRenderContext | undefined = undefined
|
|
55
|
+
export let indexKey: string | number | undefined = undefined
|
|
56
|
+
|
|
57
|
+
$: resolvedType = String((node as any)?.type || '')
|
|
58
|
+
$: customComponentMap = context?.customComponents || getCustomNodeComponents(context?.customId)
|
|
59
|
+
$: CustomComponent = resolveNodeOutletCustomComponent(node, context, customComponentMap)
|
|
60
|
+
$: customNode = coerceCustomHtmlNode(node)
|
|
61
|
+
$: customInputs = resolveNodeOutletCustomInputs(node, context) || {}
|
|
62
|
+
$: codeMode = resolveNodeOutletCodeMode(node, context)
|
|
63
|
+
$: htmlTag = resolveHtmlTag(node)
|
|
64
|
+
$: shouldEscapeHtmlTag = resolveShouldEscapeHtmlTag()
|
|
65
|
+
$: htmlRenderNode = coerceBuiltinHtmlNode(node, resolvedType)
|
|
66
|
+
$: codeBlockInstanceKey = `${String(indexKey ?? 'code-block')}:${String((node as any)?.language ?? '')}:${(node as any)?.diff ? 'diff' : 'code'}`
|
|
67
|
+
$: escapedTextNode = {
|
|
68
|
+
type: 'text',
|
|
69
|
+
content: String((node as any)?.content ?? (node as any)?.raw ?? ''),
|
|
70
|
+
raw: String((node as any)?.content ?? (node as any)?.raw ?? ''),
|
|
71
|
+
} as SvelteRenderableNode
|
|
72
|
+
|
|
73
|
+
function resolveShouldEscapeHtmlTag() {
|
|
74
|
+
if (resolvedType !== 'html_block' && resolvedType !== 'html_inline')
|
|
75
|
+
return false
|
|
76
|
+
if (context?.htmlPolicy === 'escape')
|
|
77
|
+
return true
|
|
78
|
+
if (!htmlTag)
|
|
79
|
+
return false
|
|
80
|
+
const customHtmlTags = context?.customHtmlTags ?? []
|
|
81
|
+
const isWhitelisted = customHtmlTags.some(t => String(t).toLowerCase() === htmlTag)
|
|
82
|
+
if (isWhitelisted)
|
|
83
|
+
return false
|
|
84
|
+
if (STANDARD_HTML_TAGS.has(htmlTag))
|
|
85
|
+
return false
|
|
86
|
+
return !hasCompleteHtmlTagContent((node as any)?.content ?? (node as any)?.raw, htmlTag)
|
|
87
|
+
}
|
|
88
|
+
</script>
|
|
89
|
+
|
|
90
|
+
{#if CustomComponent}
|
|
91
|
+
<svelte:component
|
|
92
|
+
this={CustomComponent}
|
|
93
|
+
node={customNode}
|
|
94
|
+
context={context}
|
|
95
|
+
ctx={context}
|
|
96
|
+
customId={context?.customId}
|
|
97
|
+
isDark={context?.isDark}
|
|
98
|
+
indexKey={indexKey}
|
|
99
|
+
typewriter={context?.typewriter}
|
|
100
|
+
{...customInputs}
|
|
101
|
+
/>
|
|
102
|
+
{:else if resolvedType === 'text' || resolvedType === 'text_special'}
|
|
103
|
+
<TextNode {node} {context} {indexKey} typewriter={context?.typewriter} />
|
|
104
|
+
{:else if resolvedType === 'paragraph'}
|
|
105
|
+
<ParagraphNode {node} {context} {indexKey} />
|
|
106
|
+
{:else if resolvedType === 'heading'}
|
|
107
|
+
<HeadingNode {node} {context} {indexKey} />
|
|
108
|
+
{:else if resolvedType === 'blockquote'}
|
|
109
|
+
<BlockquoteNode {node} {context} {indexKey} />
|
|
110
|
+
{:else if resolvedType === 'list'}
|
|
111
|
+
<ListNode {node} {context} {indexKey} />
|
|
112
|
+
{:else if resolvedType === 'list_item'}
|
|
113
|
+
<ListItemNode {node} {context} {indexKey} />
|
|
114
|
+
{:else if resolvedType === 'table'}
|
|
115
|
+
<TableNode {node} {context} />
|
|
116
|
+
{:else if resolvedType === 'definition_list'}
|
|
117
|
+
<DefinitionListNode {node} {context} />
|
|
118
|
+
{:else if resolvedType === 'footnote'}
|
|
119
|
+
<FootnoteNode {node} {context} />
|
|
120
|
+
{:else if resolvedType === 'footnote_reference'}
|
|
121
|
+
<FootnoteReferenceNode {node} />
|
|
122
|
+
{:else if resolvedType === 'footnote_anchor'}
|
|
123
|
+
<FootnoteAnchorNode {node} />
|
|
124
|
+
{:else if resolvedType === 'admonition'}
|
|
125
|
+
<AdmonitionNode {node} {context} />
|
|
126
|
+
{:else if resolvedType === 'hardbreak'}
|
|
127
|
+
<HardBreakNode />
|
|
128
|
+
{:else if resolvedType === 'link'}
|
|
129
|
+
<LinkNode {node} {context} {indexKey} showTooltip={typeof context?.showTooltips === 'boolean' ? context?.showTooltips : undefined} />
|
|
130
|
+
{:else if resolvedType === 'image'}
|
|
131
|
+
<ImageNode {node} />
|
|
132
|
+
{:else if resolvedType === 'inline_code'}
|
|
133
|
+
<InlineCodeNode {node} />
|
|
134
|
+
{:else if resolvedType === 'strong'}
|
|
135
|
+
<StrongNode {node} {context} {indexKey} />
|
|
136
|
+
{:else if resolvedType === 'emphasis'}
|
|
137
|
+
<EmphasisNode {node} {context} {indexKey} />
|
|
138
|
+
{:else if resolvedType === 'strikethrough'}
|
|
139
|
+
<StrikethroughNode {node} {context} {indexKey} />
|
|
140
|
+
{:else if resolvedType === 'highlight'}
|
|
141
|
+
<HighlightNode {node} {context} {indexKey} />
|
|
142
|
+
{:else if resolvedType === 'insert'}
|
|
143
|
+
<InsertNode {node} {context} {indexKey} />
|
|
144
|
+
{:else if resolvedType === 'subscript'}
|
|
145
|
+
<SubscriptNode {node} {context} {indexKey} />
|
|
146
|
+
{:else if resolvedType === 'superscript'}
|
|
147
|
+
<SuperscriptNode {node} {context} {indexKey} />
|
|
148
|
+
{:else if resolvedType === 'checkbox' || resolvedType === 'checkbox_input'}
|
|
149
|
+
<CheckboxNode {node} />
|
|
150
|
+
{:else if resolvedType === 'emoji'}
|
|
151
|
+
<EmojiNode {node} />
|
|
152
|
+
{:else if resolvedType === 'reference'}
|
|
153
|
+
<ReferenceNode {node} {context} />
|
|
154
|
+
{:else if resolvedType === 'html_block'}
|
|
155
|
+
{#if shouldEscapeHtmlTag}
|
|
156
|
+
<TextNode node={escapedTextNode} {context} {indexKey} />
|
|
157
|
+
{:else}
|
|
158
|
+
<HtmlBlockNode node={htmlRenderNode} {context} />
|
|
159
|
+
{/if}
|
|
160
|
+
{:else if resolvedType === 'html_inline'}
|
|
161
|
+
{#if shouldEscapeHtmlTag}
|
|
162
|
+
<TextNode node={escapedTextNode} {context} {indexKey} />
|
|
163
|
+
{:else}
|
|
164
|
+
<HtmlInlineNode node={htmlRenderNode} {context} />
|
|
165
|
+
{/if}
|
|
166
|
+
{:else if resolvedType === 'vmr_container'}
|
|
167
|
+
<VmrContainerNode {node} {context} />
|
|
168
|
+
{:else if resolvedType === 'thematic_break'}
|
|
169
|
+
<ThematicBreakNode />
|
|
170
|
+
{:else if resolvedType === 'math_inline'}
|
|
171
|
+
<MathInlineNode {node} />
|
|
172
|
+
{:else if resolvedType === 'math_block'}
|
|
173
|
+
<MathBlockNode {node} />
|
|
174
|
+
{:else if resolvedType === 'code_block'}
|
|
175
|
+
{#if codeMode === 'mermaid'}
|
|
176
|
+
<MermaidBlockNode {node} {context} {...customInputs} />
|
|
177
|
+
{:else if codeMode === 'd2'}
|
|
178
|
+
<D2BlockNode {node} {context} {...customInputs} />
|
|
179
|
+
{:else if codeMode === 'infographic'}
|
|
180
|
+
<InfographicBlockNode {node} {context} {...customInputs} />
|
|
181
|
+
{:else if codeMode === 'pre'}
|
|
182
|
+
<PreCodeNode {node} />
|
|
183
|
+
{:else}
|
|
184
|
+
{#key codeBlockInstanceKey}
|
|
185
|
+
<CodeBlockNode {node} {context} {...customInputs} />
|
|
186
|
+
{/key}
|
|
187
|
+
{/if}
|
|
188
|
+
{:else if resolvedType === 'label_open' || resolvedType === 'label_close'}
|
|
189
|
+
<span hidden></span>
|
|
190
|
+
{:else}
|
|
191
|
+
<FallbackComponent {node} {context} />
|
|
192
|
+
{/if}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SvelteRenderableNode, SvelteRenderContext } from './shared/node-helpers';
|
|
2
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
3
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
4
|
+
$$bindings?: Bindings;
|
|
5
|
+
} & Exports;
|
|
6
|
+
(internal: unknown, props: Props & {
|
|
7
|
+
$$events?: Events;
|
|
8
|
+
$$slots?: Slots;
|
|
9
|
+
}): Exports & {
|
|
10
|
+
$set?: any;
|
|
11
|
+
$on?: any;
|
|
12
|
+
};
|
|
13
|
+
z_$$bindings?: Bindings;
|
|
14
|
+
}
|
|
15
|
+
declare const NodeOutlet: $$__sveltets_2_IsomorphicComponent<{
|
|
16
|
+
node: SvelteRenderableNode;
|
|
17
|
+
context?: SvelteRenderContext | undefined;
|
|
18
|
+
indexKey?: string | number | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
[evt: string]: CustomEvent<any>;
|
|
21
|
+
}, {}, {}, string>;
|
|
22
|
+
type NodeOutlet = InstanceType<typeof NodeOutlet>;
|
|
23
|
+
export default NodeOutlet;
|
|
24
|
+
//# sourceMappingURL=NodeOutlet.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeOutlet.svelte.d.ts","sourceRoot":"","sources":["../../src/components/NodeOutlet.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAqOtF,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,UAAU;UAV+D,oBAAoB;cAAY,mBAAmB,GAAG,SAAS;eAAa,MAAM,GAAG,MAAM,GAAG,SAAS;;;kBAUvF,CAAC;AAC9E,KAAK,UAAU,GAAG,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;AACpD,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type {
|
|
3
|
+
NodeRendererEvents,
|
|
4
|
+
NodeRendererProps,
|
|
5
|
+
SvelteRenderableNode,
|
|
6
|
+
SvelteRenderContext,
|
|
7
|
+
} from './shared/node-helpers'
|
|
8
|
+
import { afterUpdate, onDestroy, onMount, tick } from 'svelte'
|
|
9
|
+
import { getCustomNodeComponents, subscribeCustomComponents } from '../customComponents'
|
|
10
|
+
import { disposeRenderedHtmlEnhancements, enhanceRenderedHtml } from '../enhanceRenderedHtml'
|
|
11
|
+
import NodeOutlet from './NodeOutlet.svelte'
|
|
12
|
+
import { buildRenderContext, resolveParsedNodes } from './shared/node-helpers'
|
|
13
|
+
|
|
14
|
+
export let content: NodeRendererProps['content'] = ''
|
|
15
|
+
export let nodes: NodeRendererProps['nodes'] = null
|
|
16
|
+
export let final: NodeRendererProps['final'] = undefined
|
|
17
|
+
export let parseOptions: NodeRendererProps['parseOptions'] = undefined
|
|
18
|
+
export let customMarkdownIt: NodeRendererProps['customMarkdownIt'] = undefined
|
|
19
|
+
export let debugPerformance = false
|
|
20
|
+
export let customHtmlTags: NodeRendererProps['customHtmlTags'] = undefined
|
|
21
|
+
export let htmlPolicy: NodeRendererProps['htmlPolicy'] = 'safe'
|
|
22
|
+
export let viewportPriority: NodeRendererProps['viewportPriority'] = true
|
|
23
|
+
export let codeBlockStream = true
|
|
24
|
+
export let codeBlockDarkTheme: NodeRendererProps['codeBlockDarkTheme'] = undefined
|
|
25
|
+
export let codeBlockLightTheme: NodeRendererProps['codeBlockLightTheme'] = undefined
|
|
26
|
+
export let codeBlockMonacoOptions: NodeRendererProps['codeBlockMonacoOptions'] = undefined
|
|
27
|
+
export let renderCodeBlocksAsPre = false
|
|
28
|
+
export let codeBlockMinWidth: NodeRendererProps['codeBlockMinWidth'] = undefined
|
|
29
|
+
export let codeBlockMaxWidth: NodeRendererProps['codeBlockMaxWidth'] = undefined
|
|
30
|
+
export let codeBlockProps: NodeRendererProps['codeBlockProps'] = undefined
|
|
31
|
+
export let mermaidProps: NodeRendererProps['mermaidProps'] = undefined
|
|
32
|
+
export let d2Props: NodeRendererProps['d2Props'] = undefined
|
|
33
|
+
export let infographicProps: NodeRendererProps['infographicProps'] = undefined
|
|
34
|
+
export let customComponents: NodeRendererProps['customComponents'] = undefined
|
|
35
|
+
export let showTooltips = true
|
|
36
|
+
export let themes: NodeRendererProps['themes'] = undefined
|
|
37
|
+
export let isDark = false
|
|
38
|
+
export let customId: NodeRendererProps['customId'] = undefined
|
|
39
|
+
export let indexKey: NodeRendererProps['indexKey'] = undefined
|
|
40
|
+
export let typewriter = true
|
|
41
|
+
export let batchRendering = true
|
|
42
|
+
export let initialRenderBatchSize = 40
|
|
43
|
+
export let renderBatchSize = 80
|
|
44
|
+
export let renderBatchDelay = 16
|
|
45
|
+
export let renderBatchBudgetMs = 6
|
|
46
|
+
export let renderBatchIdleTimeoutMs = 120
|
|
47
|
+
export let deferNodesUntilVisible = true
|
|
48
|
+
export let maxLiveNodes = 320
|
|
49
|
+
export let liveNodeBuffer = 60
|
|
50
|
+
export let allowHtml = true
|
|
51
|
+
export let className = ''
|
|
52
|
+
export let onCopy: NodeRendererEvents['onCopy'] = undefined
|
|
53
|
+
export let onHandleArtifactClick: NodeRendererEvents['onHandleArtifactClick'] = undefined
|
|
54
|
+
export let onClick: ((event: MouseEvent) => void) | undefined = undefined
|
|
55
|
+
export let onMouseover: ((event: MouseEvent) => void) | undefined = undefined
|
|
56
|
+
export let onMouseout: ((event: MouseEvent) => void) | undefined = undefined
|
|
57
|
+
|
|
58
|
+
let rootEl: HTMLDivElement | null = null
|
|
59
|
+
let parsedNodes: SvelteRenderableNode[] = []
|
|
60
|
+
let renderContext: SvelteRenderContext = { events: {} }
|
|
61
|
+
let customComponentsRevision = 0
|
|
62
|
+
let streamRenderVersion = 0
|
|
63
|
+
let previousContent: typeof content = undefined
|
|
64
|
+
let previousNodes: typeof nodes = undefined
|
|
65
|
+
let enhancementToken = 0
|
|
66
|
+
let enhancementHandle: { dispose: () => void } | null = null
|
|
67
|
+
let renderedNodeCount = 0
|
|
68
|
+
let renderBatchTimer: ReturnType<typeof setTimeout> | null = null
|
|
69
|
+
let renderBatchFrame: number | null = null
|
|
70
|
+
let renderBatchIdle: number | null = null
|
|
71
|
+
let renderBatchToken = 0
|
|
72
|
+
const textStreamState = new Map<string, string>()
|
|
73
|
+
|
|
74
|
+
$: props = {
|
|
75
|
+
content,
|
|
76
|
+
nodes,
|
|
77
|
+
final,
|
|
78
|
+
parseOptions,
|
|
79
|
+
customMarkdownIt,
|
|
80
|
+
debugPerformance,
|
|
81
|
+
customHtmlTags,
|
|
82
|
+
htmlPolicy,
|
|
83
|
+
viewportPriority,
|
|
84
|
+
codeBlockStream,
|
|
85
|
+
codeBlockDarkTheme,
|
|
86
|
+
codeBlockLightTheme,
|
|
87
|
+
codeBlockMonacoOptions,
|
|
88
|
+
renderCodeBlocksAsPre,
|
|
89
|
+
codeBlockMinWidth,
|
|
90
|
+
codeBlockMaxWidth,
|
|
91
|
+
codeBlockProps,
|
|
92
|
+
mermaidProps,
|
|
93
|
+
d2Props,
|
|
94
|
+
infographicProps,
|
|
95
|
+
customComponents,
|
|
96
|
+
showTooltips,
|
|
97
|
+
themes,
|
|
98
|
+
isDark,
|
|
99
|
+
customId,
|
|
100
|
+
indexKey,
|
|
101
|
+
typewriter,
|
|
102
|
+
batchRendering,
|
|
103
|
+
initialRenderBatchSize,
|
|
104
|
+
renderBatchSize,
|
|
105
|
+
renderBatchDelay,
|
|
106
|
+
renderBatchBudgetMs,
|
|
107
|
+
renderBatchIdleTimeoutMs,
|
|
108
|
+
deferNodesUntilVisible,
|
|
109
|
+
maxLiveNodes,
|
|
110
|
+
liveNodeBuffer,
|
|
111
|
+
allowHtml,
|
|
112
|
+
} satisfies NodeRendererProps
|
|
113
|
+
|
|
114
|
+
$: {
|
|
115
|
+
if (previousContent !== content || previousNodes !== nodes) {
|
|
116
|
+
streamRenderVersion += 1
|
|
117
|
+
previousContent = content
|
|
118
|
+
previousNodes = nodes
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
$: {
|
|
123
|
+
const start = debugPerformance && typeof performance !== 'undefined' ? performance.now() : 0
|
|
124
|
+
parsedNodes = resolveParsedNodes(props)
|
|
125
|
+
if (debugPerformance && typeof console !== 'undefined' && typeof performance !== 'undefined') {
|
|
126
|
+
console.info('[markstream-svelte][perf] parse(sync)', {
|
|
127
|
+
ms: Math.round(performance.now() - start),
|
|
128
|
+
nodes: parsedNodes.length,
|
|
129
|
+
contentLength: content?.length ?? 0,
|
|
130
|
+
})
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
$: {
|
|
135
|
+
void customComponentsRevision
|
|
136
|
+
const scopedCustomComponents = getCustomNodeComponents(customId)
|
|
137
|
+
const mergedCustomComponents = customComponents
|
|
138
|
+
? { ...scopedCustomComponents, ...customComponents }
|
|
139
|
+
: scopedCustomComponents
|
|
140
|
+
renderContext = buildRenderContext(
|
|
141
|
+
{
|
|
142
|
+
...props,
|
|
143
|
+
customComponents: mergedCustomComponents,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
onCopy,
|
|
147
|
+
onHandleArtifactClick,
|
|
148
|
+
},
|
|
149
|
+
textStreamState,
|
|
150
|
+
streamRenderVersion,
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
$: {
|
|
155
|
+
void parsedNodes.length
|
|
156
|
+
void batchRendering
|
|
157
|
+
void initialRenderBatchSize
|
|
158
|
+
void renderBatchSize
|
|
159
|
+
void renderBatchDelay
|
|
160
|
+
void renderBatchBudgetMs
|
|
161
|
+
void renderBatchIdleTimeoutMs
|
|
162
|
+
void final
|
|
163
|
+
void renderedNodeCount
|
|
164
|
+
syncRenderedNodeWindow()
|
|
165
|
+
}
|
|
166
|
+
$: renderedNodes = parsedNodes.slice(0, Math.min(renderedNodeCount, parsedNodes.length))
|
|
167
|
+
|
|
168
|
+
onMount(() => {
|
|
169
|
+
const unsubscribe = subscribeCustomComponents(() => {
|
|
170
|
+
customComponentsRevision += 1
|
|
171
|
+
})
|
|
172
|
+
scheduleEnhancement()
|
|
173
|
+
return unsubscribe
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
afterUpdate(() => {
|
|
177
|
+
scheduleEnhancement()
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
onDestroy(() => {
|
|
181
|
+
enhancementToken += 1
|
|
182
|
+
cancelRenderBatch()
|
|
183
|
+
enhancementHandle?.dispose()
|
|
184
|
+
enhancementHandle = null
|
|
185
|
+
disposeRenderedHtmlEnhancements(rootEl)
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
function toPositiveInteger(value: unknown, fallback: number) {
|
|
189
|
+
const numeric = Number(value)
|
|
190
|
+
return Number.isFinite(numeric) && numeric > 0 ? Math.floor(numeric) : fallback
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function syncRenderedNodeWindow() {
|
|
194
|
+
const total = parsedNodes.length
|
|
195
|
+
const initialCount = Math.min(total, toPositiveInteger(initialRenderBatchSize, 40))
|
|
196
|
+
const shouldBatch = final !== false && batchRendering !== false && total > initialCount
|
|
197
|
+
|
|
198
|
+
if (!shouldBatch) {
|
|
199
|
+
cancelRenderBatch()
|
|
200
|
+
if (renderedNodeCount !== total)
|
|
201
|
+
renderedNodeCount = total
|
|
202
|
+
return
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (renderedNodeCount <= 0 || renderedNodeCount > total)
|
|
206
|
+
renderedNodeCount = initialCount
|
|
207
|
+
else if (renderedNodeCount < initialCount)
|
|
208
|
+
renderedNodeCount = initialCount
|
|
209
|
+
|
|
210
|
+
scheduleRenderBatch()
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function scheduleRenderBatch() {
|
|
214
|
+
if (renderedNodeCount >= parsedNodes.length || renderBatchTimer || renderBatchFrame != null || renderBatchIdle != null)
|
|
215
|
+
return
|
|
216
|
+
const token = ++renderBatchToken
|
|
217
|
+
const delay = Math.max(0, Number(renderBatchDelay) || 0)
|
|
218
|
+
const run = (deadline?: { timeRemaining?: () => number }) => {
|
|
219
|
+
renderBatchTimer = null
|
|
220
|
+
renderBatchFrame = null
|
|
221
|
+
renderBatchIdle = null
|
|
222
|
+
if (token !== renderBatchToken)
|
|
223
|
+
return
|
|
224
|
+
const batchSize = toPositiveInteger(renderBatchSize, 80)
|
|
225
|
+
const budget = Math.max(2, toPositiveInteger(renderBatchBudgetMs, 6))
|
|
226
|
+
let nextCount = renderedNodeCount
|
|
227
|
+
do {
|
|
228
|
+
nextCount = Math.min(parsedNodes.length, nextCount + batchSize)
|
|
229
|
+
if (!deadline)
|
|
230
|
+
break
|
|
231
|
+
const remaining = typeof deadline.timeRemaining === 'function' ? deadline.timeRemaining() : 0
|
|
232
|
+
if (remaining <= budget * 0.5)
|
|
233
|
+
break
|
|
234
|
+
} while (nextCount < parsedNodes.length)
|
|
235
|
+
if (nextCount !== renderedNodeCount)
|
|
236
|
+
renderedNodeCount = nextCount
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const requestIdle = typeof window !== 'undefined' ? (window as any).requestIdleCallback as ((callback: (deadline: { timeRemaining?: () => number }) => void, options?: { timeout?: number }) => number) | undefined : undefined
|
|
240
|
+
if (requestIdle) {
|
|
241
|
+
renderBatchIdle = requestIdle(run, { timeout: Math.max(0, Number(renderBatchIdleTimeoutMs) || 120) })
|
|
242
|
+
return
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (typeof window !== 'undefined' && typeof window.requestAnimationFrame === 'function') {
|
|
246
|
+
renderBatchFrame = window.requestAnimationFrame(() => {
|
|
247
|
+
renderBatchFrame = null
|
|
248
|
+
if (delay > 0)
|
|
249
|
+
renderBatchTimer = setTimeout(run, delay)
|
|
250
|
+
else
|
|
251
|
+
run()
|
|
252
|
+
})
|
|
253
|
+
return
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
renderBatchTimer = setTimeout(run, delay)
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function cancelRenderBatch() {
|
|
260
|
+
renderBatchToken += 1
|
|
261
|
+
if (renderBatchTimer) {
|
|
262
|
+
clearTimeout(renderBatchTimer)
|
|
263
|
+
renderBatchTimer = null
|
|
264
|
+
}
|
|
265
|
+
if (renderBatchFrame != null && typeof window !== 'undefined') {
|
|
266
|
+
window.cancelAnimationFrame(renderBatchFrame)
|
|
267
|
+
renderBatchFrame = null
|
|
268
|
+
}
|
|
269
|
+
const cancelIdle = typeof window !== 'undefined' ? (window as any).cancelIdleCallback as ((id: number) => void) | undefined : undefined
|
|
270
|
+
if (renderBatchIdle != null) {
|
|
271
|
+
cancelIdle?.(renderBatchIdle)
|
|
272
|
+
renderBatchIdle = null
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
async function scheduleEnhancement() {
|
|
277
|
+
if (!rootEl || typeof window === 'undefined')
|
|
278
|
+
return
|
|
279
|
+
const enhancementFinal = typeof final === 'boolean' ? final : !hasLoadingNodes(parsedNodes)
|
|
280
|
+
if (!enhancementFinal) {
|
|
281
|
+
enhancementToken += 1
|
|
282
|
+
enhancementHandle?.dispose()
|
|
283
|
+
enhancementHandle = null
|
|
284
|
+
return
|
|
285
|
+
}
|
|
286
|
+
const token = ++enhancementToken
|
|
287
|
+
await tick()
|
|
288
|
+
if (token !== enhancementToken || !rootEl)
|
|
289
|
+
return
|
|
290
|
+
enhancementHandle?.dispose()
|
|
291
|
+
enhancementHandle = await enhanceRenderedHtml(rootEl, {
|
|
292
|
+
final: enhancementFinal,
|
|
293
|
+
isDark,
|
|
294
|
+
renderCodeBlocksAsPre,
|
|
295
|
+
monacoOptions: codeBlockMonacoOptions,
|
|
296
|
+
codeBlockProps,
|
|
297
|
+
mermaidProps,
|
|
298
|
+
d2Props,
|
|
299
|
+
infographicProps,
|
|
300
|
+
showTooltips,
|
|
301
|
+
onCopy,
|
|
302
|
+
isCancelled: () => token !== enhancementToken,
|
|
303
|
+
})
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function hasLoadingNodes(nodes: SvelteRenderableNode[]): boolean {
|
|
307
|
+
for (const node of nodes) {
|
|
308
|
+
if ((node as any)?.loading === true)
|
|
309
|
+
return true
|
|
310
|
+
if (hasLoadingNodes(((node as any)?.children || []) as SvelteRenderableNode[]))
|
|
311
|
+
return true
|
|
312
|
+
if (hasLoadingNodes(((node as any)?.items || []) as SvelteRenderableNode[]))
|
|
313
|
+
return true
|
|
314
|
+
}
|
|
315
|
+
return false
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function handleMouseover(event: MouseEvent) {
|
|
319
|
+
const target = event.target as HTMLElement | null
|
|
320
|
+
if (target?.closest('[data-node-index]'))
|
|
321
|
+
onMouseover?.(event)
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function handleMouseout(event: MouseEvent) {
|
|
325
|
+
const target = event.target as HTMLElement | null
|
|
326
|
+
if (target?.closest('[data-node-index]'))
|
|
327
|
+
onMouseout?.(event)
|
|
328
|
+
}
|
|
329
|
+
</script>
|
|
330
|
+
|
|
331
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
332
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
333
|
+
<!-- svelte-ignore a11y_mouse_events_have_key_events -->
|
|
334
|
+
<div
|
|
335
|
+
bind:this={rootEl}
|
|
336
|
+
class={'markstream-svelte markdown-renderer' + (isDark ? ' dark' : '') + (className ? ' ' + className : '')}
|
|
337
|
+
data-custom-id={customId}
|
|
338
|
+
onclick={onClick}
|
|
339
|
+
onmouseover={handleMouseover}
|
|
340
|
+
onmouseout={handleMouseout}
|
|
341
|
+
>
|
|
342
|
+
{#each renderedNodes as node, index ((indexKey != null ? String(indexKey) : 'markdown-renderer') + '-' + index)}
|
|
343
|
+
<div class="node-slot" data-node-index={index} data-node-type={(node as any)?.type}>
|
|
344
|
+
<div class:typewriter-node={typewriter !== false && String((node as any)?.type || '') !== 'code_block'} class="node-content" data-node-index={index}>
|
|
345
|
+
<NodeOutlet node={node} context={renderContext} indexKey={(indexKey != null ? String(indexKey) : 'markdown-renderer') + '-' + index} />
|
|
346
|
+
</div>
|
|
347
|
+
</div>
|
|
348
|
+
{/each}
|
|
349
|
+
</div>
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { NodeRendererEvents, NodeRendererProps } from './shared/node-helpers';
|
|
2
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
3
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
4
|
+
$$bindings?: Bindings;
|
|
5
|
+
} & Exports;
|
|
6
|
+
(internal: unknown, props: Props & {
|
|
7
|
+
$$events?: Events;
|
|
8
|
+
$$slots?: Slots;
|
|
9
|
+
}): Exports & {
|
|
10
|
+
$set?: any;
|
|
11
|
+
$on?: any;
|
|
12
|
+
};
|
|
13
|
+
z_$$bindings?: Bindings;
|
|
14
|
+
}
|
|
15
|
+
declare const NodeRenderer: $$__sveltets_2_IsomorphicComponent<{
|
|
16
|
+
content?: NodeRendererProps["content"];
|
|
17
|
+
nodes?: NodeRendererProps["nodes"];
|
|
18
|
+
final?: NodeRendererProps["final"];
|
|
19
|
+
parseOptions?: NodeRendererProps["parseOptions"];
|
|
20
|
+
customMarkdownIt?: NodeRendererProps["customMarkdownIt"];
|
|
21
|
+
debugPerformance?: boolean;
|
|
22
|
+
customHtmlTags?: NodeRendererProps["customHtmlTags"];
|
|
23
|
+
htmlPolicy?: NodeRendererProps["htmlPolicy"];
|
|
24
|
+
viewportPriority?: NodeRendererProps["viewportPriority"];
|
|
25
|
+
codeBlockStream?: boolean;
|
|
26
|
+
codeBlockDarkTheme?: NodeRendererProps["codeBlockDarkTheme"];
|
|
27
|
+
codeBlockLightTheme?: NodeRendererProps["codeBlockLightTheme"];
|
|
28
|
+
codeBlockMonacoOptions?: NodeRendererProps["codeBlockMonacoOptions"];
|
|
29
|
+
renderCodeBlocksAsPre?: boolean;
|
|
30
|
+
codeBlockMinWidth?: NodeRendererProps["codeBlockMinWidth"];
|
|
31
|
+
codeBlockMaxWidth?: NodeRendererProps["codeBlockMaxWidth"];
|
|
32
|
+
codeBlockProps?: NodeRendererProps["codeBlockProps"];
|
|
33
|
+
mermaidProps?: NodeRendererProps["mermaidProps"];
|
|
34
|
+
d2Props?: NodeRendererProps["d2Props"];
|
|
35
|
+
infographicProps?: NodeRendererProps["infographicProps"];
|
|
36
|
+
customComponents?: NodeRendererProps["customComponents"];
|
|
37
|
+
showTooltips?: boolean;
|
|
38
|
+
themes?: NodeRendererProps["themes"];
|
|
39
|
+
isDark?: boolean;
|
|
40
|
+
customId?: NodeRendererProps["customId"];
|
|
41
|
+
indexKey?: NodeRendererProps["indexKey"];
|
|
42
|
+
typewriter?: boolean;
|
|
43
|
+
batchRendering?: boolean;
|
|
44
|
+
initialRenderBatchSize?: number;
|
|
45
|
+
renderBatchSize?: number;
|
|
46
|
+
renderBatchDelay?: number;
|
|
47
|
+
renderBatchBudgetMs?: number;
|
|
48
|
+
renderBatchIdleTimeoutMs?: number;
|
|
49
|
+
deferNodesUntilVisible?: boolean;
|
|
50
|
+
maxLiveNodes?: number;
|
|
51
|
+
liveNodeBuffer?: number;
|
|
52
|
+
allowHtml?: boolean;
|
|
53
|
+
className?: string;
|
|
54
|
+
onCopy?: NodeRendererEvents["onCopy"];
|
|
55
|
+
onHandleArtifactClick?: NodeRendererEvents["onHandleArtifactClick"];
|
|
56
|
+
onClick?: ((event: MouseEvent) => void) | undefined;
|
|
57
|
+
onMouseover?: ((event: MouseEvent) => void) | undefined;
|
|
58
|
+
onMouseout?: ((event: MouseEvent) => void) | undefined;
|
|
59
|
+
}, {
|
|
60
|
+
[evt: string]: CustomEvent<any>;
|
|
61
|
+
}, {}, {}, string>;
|
|
62
|
+
type NodeRenderer = InstanceType<typeof NodeRenderer>;
|
|
63
|
+
export default NodeRenderer;
|
|
64
|
+
//# sourceMappingURL=NodeRenderer.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeRenderer.svelte.d.ts","sourceRoot":"","sources":["../../src/components/NodeRenderer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,kBAAkB,EAClB,iBAAiB,EAGlB,MAAM,uBAAuB,CAAA;AA2VhC,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,YAAY;cAVm2C,iBAAiB,CAAC,SAAS,CAAC;YAAU,iBAAiB,CAAC,OAAO,CAAC;YAAU,iBAAiB,CAAC,OAAO,CAAC;mBAAiB,iBAAiB,CAAC,cAAc,CAAC;uBAAqB,iBAAiB,CAAC,kBAAkB,CAAC;;qBAA+D,iBAAiB,CAAC,gBAAgB,CAAC;iBAAe,iBAAiB,CAAC,YAAY,CAAC;uBAAqB,iBAAiB,CAAC,kBAAkB,CAAC;;yBAAiE,iBAAiB,CAAC,oBAAoB,CAAC;0BAAwB,iBAAiB,CAAC,qBAAqB,CAAC;6BAA2B,iBAAiB,CAAC,wBAAwB,CAAC;;wBAA4E,iBAAiB,CAAC,mBAAmB,CAAC;wBAAsB,iBAAiB,CAAC,mBAAmB,CAAC;qBAAmB,iBAAiB,CAAC,gBAAgB,CAAC;mBAAiB,iBAAiB,CAAC,cAAc,CAAC;cAAY,iBAAiB,CAAC,SAAS,CAAC;uBAAqB,iBAAiB,CAAC,kBAAkB,CAAC;uBAAqB,iBAAiB,CAAC,kBAAkB,CAAC;;aAA+C,iBAAiB,CAAC,QAAQ,CAAC;;eAAqC,iBAAiB,CAAC,UAAU,CAAC;eAAa,iBAAiB,CAAC,UAAU,CAAC;;;;;;;;;;;;;aAA+gB,kBAAkB,CAAC,QAAQ,CAAC;4BAA0B,kBAAkB,CAAC,uBAAuB,CAAC;cAAY,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,SAAS;kBAAgB,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,SAAS;iBAAe,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,SAAS;;;kBAU1xG,CAAC;AAChF,KAAK,YAAY,GAAG,YAAY,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { SvelteRenderableNode, SvelteRenderContext } from './shared/node-helpers'
|
|
3
|
+
import RenderChildren from './RenderChildren.svelte'
|
|
4
|
+
import NodeOutlet from './NodeOutlet.svelte'
|
|
5
|
+
import { getNodeList, splitParagraphChildren } from './shared/node-helpers'
|
|
6
|
+
|
|
7
|
+
export let node: SvelteRenderableNode
|
|
8
|
+
export let context: SvelteRenderContext | undefined = undefined
|
|
9
|
+
export let indexKey: string | number | undefined = undefined
|
|
10
|
+
|
|
11
|
+
$: prefix = String(indexKey ?? 'p')
|
|
12
|
+
$: parts = splitParagraphChildren(getNodeList((node as any)?.children))
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
{#each parts as part, index (prefix + '-' + index)}
|
|
16
|
+
{#if part.kind === 'inline'}
|
|
17
|
+
<p class="paragraph-node"><RenderChildren nodes={part.nodes} context={context} prefix={prefix + '-' + index} /></p>
|
|
18
|
+
{:else}
|
|
19
|
+
<NodeOutlet node={part.node} context={context} indexKey={prefix + '-' + index} />
|
|
20
|
+
{/if}
|
|
21
|
+
{/each}
|