@incremark/svelte 0.2.5 → 0.2.7
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/dist/components/AutoScrollContainer.svelte +18 -18
- package/dist/components/Incremark.svelte +37 -74
- package/dist/components/Incremark.svelte.d.ts +9 -2
- package/dist/components/Incremark.svelte.d.ts.map +1 -1
- package/dist/components/IncremarkBlockquote.svelte +3 -7
- package/dist/components/IncremarkBlockquote.svelte.d.ts.map +1 -1
- package/dist/components/IncremarkCode.svelte +44 -124
- package/dist/components/IncremarkCode.svelte.d.ts +6 -0
- package/dist/components/IncremarkCode.svelte.d.ts.map +1 -1
- package/dist/components/IncremarkContent.svelte +114 -0
- package/dist/components/IncremarkContent.svelte.d.ts +6 -0
- package/dist/components/IncremarkContent.svelte.d.ts.map +1 -0
- package/dist/components/IncremarkList.svelte +10 -12
- package/dist/components/IncremarkList.svelte.d.ts +0 -1
- package/dist/components/IncremarkList.svelte.d.ts.map +1 -1
- package/dist/components/IncremarkRenderer.svelte +18 -16
- package/dist/components/IncremarkRenderer.svelte.d.ts +3 -0
- package/dist/components/IncremarkRenderer.svelte.d.ts.map +1 -1
- package/dist/components/index.d.ts +2 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/types.d.ts +29 -3
- package/dist/components/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/stores/useDevTools.js +2 -2
- package/dist/stores/useIncremark.d.ts +4 -3
- package/dist/stores/useIncremark.d.ts.map +1 -1
- package/dist/stores/useIncremark.js +34 -27
- package/dist/stores/useShiki.svelte.d.ts +9 -0
- package/dist/stores/useShiki.svelte.d.ts.map +1 -0
- package/dist/stores/useShiki.svelte.js +98 -0
- package/dist/stores/useTypewriter.d.ts +1 -1
- package/dist/stores/useTypewriter.d.ts.map +1 -1
- package/dist/stores/useTypewriter.js +3 -3
- package/package.json +5 -5
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@file IncremarkContent.svelte - 开箱即用的 Markdown 渲染组件
|
|
3
|
+
@description 自动处理流式内容和普通内容的高级组件
|
|
4
|
+
-->
|
|
5
|
+
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
import type { Component } from 'svelte'
|
|
8
|
+
import { useIncremark, type UseIncremarkOptions } from '../stores/useIncremark'
|
|
9
|
+
import type { ComponentMap, IncremarkContentProps } from './types'
|
|
10
|
+
import Incremark from './Incremark.svelte'
|
|
11
|
+
import { get } from 'svelte/store'
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
stream,
|
|
15
|
+
content,
|
|
16
|
+
components = {},
|
|
17
|
+
customContainers = {},
|
|
18
|
+
customCodeBlocks = {},
|
|
19
|
+
codeBlockConfigs = {},
|
|
20
|
+
isFinished = false,
|
|
21
|
+
incremarkOptions,
|
|
22
|
+
pendingClass = 'incremark-pending',
|
|
23
|
+
showBlockStatus = false
|
|
24
|
+
}: IncremarkContentProps = $props()
|
|
25
|
+
|
|
26
|
+
// 合并默认选项(初始化时使用)
|
|
27
|
+
const initialOptions: UseIncremarkOptions = {
|
|
28
|
+
gfm: true,
|
|
29
|
+
htmlTree: true,
|
|
30
|
+
containers: true,
|
|
31
|
+
math: true,
|
|
32
|
+
...incremarkOptions
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const { blocks, append, finalize, render, reset, isDisplayComplete, markdown, typewriter } = useIncremark(initialOptions)
|
|
36
|
+
|
|
37
|
+
// 监听 incremarkOptions 的变化,更新 typewriter 配置
|
|
38
|
+
$effect(() => {
|
|
39
|
+
if (incremarkOptions?.typewriter) {
|
|
40
|
+
typewriter.setOptions(incremarkOptions.typewriter)
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
// 派生状态
|
|
45
|
+
const isStreamMode = $derived(typeof stream === 'function')
|
|
46
|
+
|
|
47
|
+
// 保存前一个 content 值用于增量更新
|
|
48
|
+
let prevContent: string | undefined = $state(undefined)
|
|
49
|
+
let isStreaming = $state(false)
|
|
50
|
+
|
|
51
|
+
async function handleStreamInput() {
|
|
52
|
+
if (!stream || isStreaming) return
|
|
53
|
+
|
|
54
|
+
isStreaming = true
|
|
55
|
+
try {
|
|
56
|
+
const streamGen = stream()
|
|
57
|
+
|
|
58
|
+
for await (const chunk of streamGen) {
|
|
59
|
+
append(chunk)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
finalize()
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error('Stream error: ', error)
|
|
65
|
+
finalize()
|
|
66
|
+
} finally {
|
|
67
|
+
isStreaming = false
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function handleContentInput(newContent?: string, oldContent?: string) {
|
|
72
|
+
if (!newContent) {
|
|
73
|
+
if (oldContent) {
|
|
74
|
+
reset()
|
|
75
|
+
}
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (newContent?.startsWith(oldContent ?? '')) {
|
|
80
|
+
const delta = newContent.slice((oldContent || '').length)
|
|
81
|
+
append(delta)
|
|
82
|
+
} else {
|
|
83
|
+
render(newContent)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 监听 content 变化
|
|
88
|
+
$effect(() => {
|
|
89
|
+
if (isStreamMode) {
|
|
90
|
+
handleStreamInput()
|
|
91
|
+
} else {
|
|
92
|
+
handleContentInput(content, prevContent)
|
|
93
|
+
}
|
|
94
|
+
prevContent = content
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
// 监听 isFinished 变化
|
|
98
|
+
$effect(() => {
|
|
99
|
+
if (isFinished && content === get(markdown)) {
|
|
100
|
+
finalize()
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
</script>
|
|
104
|
+
|
|
105
|
+
<Incremark
|
|
106
|
+
blocks={$blocks}
|
|
107
|
+
isDisplayComplete={$isDisplayComplete}
|
|
108
|
+
{pendingClass}
|
|
109
|
+
{showBlockStatus}
|
|
110
|
+
{components}
|
|
111
|
+
{customContainers}
|
|
112
|
+
{customCodeBlocks}
|
|
113
|
+
{codeBlockConfigs}
|
|
114
|
+
/>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Component } from 'svelte';
|
|
2
|
+
import type { IncremarkContentProps } from './types';
|
|
3
|
+
declare const IncremarkContent: Component<IncremarkContentProps, {}, "">;
|
|
4
|
+
type IncremarkContent = ReturnType<typeof IncremarkContent>;
|
|
5
|
+
export default IncremarkContent;
|
|
6
|
+
//# sourceMappingURL=IncremarkContent.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncremarkContent.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkContent.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAEvC,OAAO,KAAK,EAAgB,qBAAqB,EAAE,MAAM,SAAS,CAAA;AA6GlE,QAAA,MAAM,gBAAgB,0CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@file IncremarkList.svelte - 列表组件
|
|
3
|
-
@description 渲染 Markdown
|
|
3
|
+
@description 渲染 Markdown 列表(有序列表和无序列表),支持任务列表和所有块级内容
|
|
4
4
|
-->
|
|
5
5
|
|
|
6
6
|
<script lang="ts">
|
|
7
|
-
import type { List, ListItem,
|
|
7
|
+
import type { List, ListItem, RootContent } from 'mdast'
|
|
8
8
|
import IncremarkInline from './IncremarkInline.svelte'
|
|
9
|
-
import
|
|
9
|
+
import IncremarkRenderer from './IncremarkRenderer.svelte'
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* 组件 Props
|
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
* @param item - 列表项节点
|
|
37
37
|
* @returns 行内内容数组
|
|
38
38
|
*/
|
|
39
|
-
function getItemInlineContent(item: ListItem)
|
|
39
|
+
function getItemInlineContent(item: ListItem) {
|
|
40
40
|
const firstChild = item.children[0]
|
|
41
41
|
if (firstChild?.type === 'paragraph') {
|
|
42
|
-
return firstChild.children
|
|
42
|
+
return firstChild.children
|
|
43
43
|
}
|
|
44
44
|
return []
|
|
45
45
|
}
|
|
@@ -51,14 +51,14 @@
|
|
|
51
51
|
* @param item - 列表项节点
|
|
52
52
|
* @returns 块级子节点数组
|
|
53
53
|
*/
|
|
54
|
-
function getItemBlockChildren(item: ListItem):
|
|
54
|
+
function getItemBlockChildren(item: ListItem): RootContent[] {
|
|
55
55
|
return item.children.filter((child, index) => {
|
|
56
56
|
// 第一个 paragraph 已经被处理为内联内容
|
|
57
57
|
if (index === 0 && child.type === 'paragraph') {
|
|
58
58
|
return false
|
|
59
59
|
}
|
|
60
60
|
return true
|
|
61
|
-
})
|
|
61
|
+
})
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
/**
|
|
@@ -76,6 +76,7 @@
|
|
|
76
76
|
this={tag}
|
|
77
77
|
class="incremark-list"
|
|
78
78
|
class:task-list={isTaskList}
|
|
79
|
+
start={node.start || undefined}
|
|
79
80
|
>
|
|
80
81
|
{#each node.children as item, index (index)}
|
|
81
82
|
<li
|
|
@@ -96,12 +97,9 @@
|
|
|
96
97
|
</label>
|
|
97
98
|
{:else}
|
|
98
99
|
<IncremarkInline nodes={getItemInlineContent(item)} />
|
|
99
|
-
<!--
|
|
100
|
+
<!-- 递归渲染所有块级内容(嵌套列表、heading、blockquote、code、table 等) -->
|
|
100
101
|
{#each getItemBlockChildren(item) as child, childIndex (childIndex)}
|
|
101
|
-
{
|
|
102
|
-
<IncremarkList node={child} />
|
|
103
|
-
{/if}
|
|
104
|
-
<!-- 其他块级内容可以在这里扩展 -->
|
|
102
|
+
<IncremarkRenderer node={child} />
|
|
105
103
|
{/each}
|
|
106
104
|
{/if}
|
|
107
105
|
</li>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncremarkList.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkList.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"IncremarkList.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkList.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAyB,MAAM,OAAO,CAAA;AAKtD;;GAEG;AACH,UAAU,KAAK;IACb,WAAW;IACX,IAAI,EAAE,IAAI,CAAA;CACX;AAyFH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
import type { RootContent, HTML } from 'mdast'
|
|
8
8
|
import IncremarkHeading from './IncremarkHeading.svelte'
|
|
9
9
|
import IncremarkParagraph from './IncremarkParagraph.svelte'
|
|
10
|
-
import IncremarkCode from './IncremarkCode.svelte'
|
|
11
10
|
import IncremarkList from './IncremarkList.svelte'
|
|
12
11
|
import IncremarkTable from './IncremarkTable.svelte'
|
|
13
12
|
import IncremarkBlockquote from './IncremarkBlockquote.svelte'
|
|
@@ -15,6 +14,7 @@
|
|
|
15
14
|
import IncremarkMath from './IncremarkMath.svelte'
|
|
16
15
|
import IncremarkHtmlElement from './IncremarkHtmlElement.svelte'
|
|
17
16
|
import IncremarkDefault from './IncremarkDefault.svelte'
|
|
17
|
+
import IncremarkCode from './IncremarkCode.svelte'
|
|
18
18
|
import IncremarkContainer, { type ContainerNode } from './IncremarkContainer.svelte'
|
|
19
19
|
|
|
20
20
|
/**
|
|
@@ -25,23 +25,24 @@
|
|
|
25
25
|
node: RootContent | ContainerNode
|
|
26
26
|
customContainers?: Record<string, any>
|
|
27
27
|
customCodeBlocks?: Record<string, any>
|
|
28
|
+
codeBlockConfigs?: Record<string, { takeOver?: boolean }>
|
|
28
29
|
blockStatus?: 'pending' | 'stable' | 'completed'
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
let {
|
|
32
|
-
node,
|
|
32
|
+
let {
|
|
33
|
+
node,
|
|
33
34
|
customContainers,
|
|
34
35
|
customCodeBlocks,
|
|
36
|
+
codeBlockConfigs,
|
|
35
37
|
blockStatus
|
|
36
38
|
}: Props = $props()
|
|
37
39
|
|
|
38
40
|
/**
|
|
39
|
-
*
|
|
41
|
+
* 默认组件映射
|
|
40
42
|
*/
|
|
41
|
-
const
|
|
43
|
+
const defaultComponentMap: Record<string, any> = {
|
|
42
44
|
heading: IncremarkHeading,
|
|
43
45
|
paragraph: IncremarkParagraph,
|
|
44
|
-
code: IncremarkCode,
|
|
45
46
|
list: IncremarkList,
|
|
46
47
|
table: IncremarkTable,
|
|
47
48
|
blockquote: IncremarkBlockquote,
|
|
@@ -49,13 +50,16 @@
|
|
|
49
50
|
math: IncremarkMath,
|
|
50
51
|
inlineMath: IncremarkMath,
|
|
51
52
|
htmlElement: IncremarkHtmlElement,
|
|
53
|
+
containerDirective: IncremarkContainer,
|
|
54
|
+
leafDirective: IncremarkContainer,
|
|
55
|
+
textDirective: IncremarkContainer,
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
/**
|
|
55
59
|
* 获取组件
|
|
56
60
|
*/
|
|
57
61
|
function getComponent(type: string): any {
|
|
58
|
-
return
|
|
62
|
+
return defaultComponentMap[type] || IncremarkDefault
|
|
59
63
|
}
|
|
60
64
|
|
|
61
65
|
/**
|
|
@@ -84,16 +88,14 @@
|
|
|
84
88
|
node={node}
|
|
85
89
|
customContainers={customContainers}
|
|
86
90
|
/>
|
|
87
|
-
<!-- 代码节点:特殊处理,传递 customCodeBlocks 和 blockStatus -->
|
|
91
|
+
<!-- 代码节点:特殊处理,传递 customCodeBlocks、codeBlockConfigs 和 blockStatus -->
|
|
88
92
|
{:else if node.type === 'code'}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
/>
|
|
96
|
-
{/if}
|
|
93
|
+
<IncremarkCode
|
|
94
|
+
node={node}
|
|
95
|
+
customCodeBlocks={customCodeBlocks}
|
|
96
|
+
codeBlockConfigs={codeBlockConfigs}
|
|
97
|
+
blockStatus={blockStatus}
|
|
98
|
+
/>
|
|
97
99
|
{:else}
|
|
98
100
|
<!-- 其他节点:使用对应组件 -->
|
|
99
101
|
{@const Component = getComponent(node.type)}
|
|
@@ -8,6 +8,9 @@ interface Props {
|
|
|
8
8
|
node: RootContent | ContainerNode;
|
|
9
9
|
customContainers?: Record<string, any>;
|
|
10
10
|
customCodeBlocks?: Record<string, any>;
|
|
11
|
+
codeBlockConfigs?: Record<string, {
|
|
12
|
+
takeOver?: boolean;
|
|
13
|
+
}>;
|
|
11
14
|
blockStatus?: 'pending' | 'stable' | 'completed';
|
|
12
15
|
}
|
|
13
16
|
declare const IncremarkRenderer: import("svelte").Component<Props, {}, "">;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncremarkRenderer.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkRenderer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAQ,MAAM,OAAO,CAAA;AAW9C,OAA2B,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGnF;;GAEG;AACH,UAAU,KAAK;IACb,aAAa;IACb,IAAI,EAAE,WAAW,GAAG,aAAa,CAAA;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACtC,WAAW,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAA;CACjD;AAwFH,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"IncremarkRenderer.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkRenderer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAQ,MAAM,OAAO,CAAA;AAW9C,OAA2B,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGnF;;GAEG;AACH,UAAU,KAAK;IACb,aAAa;IACb,IAAI,EAAE,WAAW,GAAG,aAAa,CAAA;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACzD,WAAW,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAA;CACjD;AAwFH,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @description 导出所有组件
|
|
4
4
|
*/
|
|
5
5
|
export { default as Incremark } from './Incremark.svelte';
|
|
6
|
+
export { default as IncremarkContent } from './IncremarkContent.svelte';
|
|
6
7
|
export { default as IncremarkParagraph } from './IncremarkParagraph.svelte';
|
|
7
8
|
export { default as IncremarkInline } from './IncremarkInline.svelte';
|
|
8
9
|
export { default as IncremarkHeading } from './IncremarkHeading.svelte';
|
|
@@ -17,5 +18,5 @@ export { default as IncremarkFootnotes } from './IncremarkFootnotes.svelte';
|
|
|
17
18
|
export { default as IncremarkDefault } from './IncremarkDefault.svelte';
|
|
18
19
|
export { default as IncremarkRenderer } from './IncremarkRenderer.svelte';
|
|
19
20
|
export { default as AutoScrollContainer } from './AutoScrollContainer.svelte';
|
|
20
|
-
export type { ComponentMap,
|
|
21
|
+
export type { ComponentMap, RenderableBlock, IncremarkContentProps, CodeBlockConfig } from './types';
|
|
21
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACnF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAC/E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAE7E,YAAY,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACnF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAC/E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAE7E,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA"}
|
package/dist/components/index.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @description 导出所有组件
|
|
4
4
|
*/
|
|
5
5
|
export { default as Incremark } from './Incremark.svelte';
|
|
6
|
+
export { default as IncremarkContent } from './IncremarkContent.svelte';
|
|
6
7
|
export { default as IncremarkParagraph } from './IncremarkParagraph.svelte';
|
|
7
8
|
export { default as IncremarkInline } from './IncremarkInline.svelte';
|
|
8
9
|
export { default as IncremarkHeading } from './IncremarkHeading.svelte';
|
|
@@ -2,17 +2,43 @@
|
|
|
2
2
|
* @file Component Types - 组件类型定义
|
|
3
3
|
* @description 定义组件相关的类型
|
|
4
4
|
*/
|
|
5
|
+
import type { Component } from 'svelte';
|
|
5
6
|
import type { ParsedBlock } from '@incremark/core';
|
|
7
|
+
import type { UseIncremarkOptions } from '../stores/useIncremark';
|
|
6
8
|
/**
|
|
7
9
|
* 组件映射类型
|
|
8
10
|
* 使用 any 以支持不同类型的组件
|
|
9
11
|
*/
|
|
10
12
|
export type ComponentMap = Partial<Record<string, any>>;
|
|
11
13
|
/**
|
|
12
|
-
*
|
|
14
|
+
* 可渲染的块类型(带 isLastPending 字段用于打字机光标)
|
|
13
15
|
*/
|
|
14
|
-
export
|
|
15
|
-
stableId: string;
|
|
16
|
+
export type RenderableBlock = ParsedBlock & {
|
|
16
17
|
isLastPending?: boolean;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* 代码块配置
|
|
21
|
+
*/
|
|
22
|
+
export interface CodeBlockConfig {
|
|
23
|
+
/** 是否从一开始就接管渲染,而不是等到 completed 状态 */
|
|
24
|
+
takeOver?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* IncremarkContent 组件 Props
|
|
28
|
+
*/
|
|
29
|
+
export interface IncremarkContentProps {
|
|
30
|
+
stream?: () => AsyncGenerator<string>;
|
|
31
|
+
content?: string;
|
|
32
|
+
components?: ComponentMap;
|
|
33
|
+
/** 自定义容器组件映射,key 为容器名称(如 'warning', 'info') */
|
|
34
|
+
customContainers?: Record<string, Component<any>>;
|
|
35
|
+
/** 自定义代码块组件映射,key 为代码语言名称(如 'echart', 'mermaid') */
|
|
36
|
+
customCodeBlocks?: Record<string, Component<any>>;
|
|
37
|
+
/** 代码块配置映射,key 为代码语言名称 */
|
|
38
|
+
codeBlockConfigs?: Record<string, CodeBlockConfig>;
|
|
39
|
+
isFinished?: boolean;
|
|
40
|
+
incremarkOptions?: UseIncremarkOptions;
|
|
41
|
+
pendingClass?: string;
|
|
42
|
+
showBlockStatus?: boolean;
|
|
17
43
|
}
|
|
18
44
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAEjE;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;AAEvD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEvE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,cAAc,CAAC,MAAM,CAAC,CAAA;IACrC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,YAAY,CAAA;IACzB,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;IACjD,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;IACjD,0BAA0B;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IAClD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,gBAAgB,CAAC,EAAE,mBAAmB,CAAA;IACtC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { useIncremark, type UseIncremarkOptions, type UseIncremarkReturn, type T
|
|
|
6
6
|
export { useDevTools, type UseDevToolsOptions } from './stores/useDevTools';
|
|
7
7
|
export { useBlockTransformer, type UseBlockTransformerOptions, type UseBlockTransformerReturn } from './stores/useBlockTransformer';
|
|
8
8
|
export { setDefinitionsContext, getDefinitionsContext, type DefinitionsContextValue } from './context/definitionsContext';
|
|
9
|
-
export { Incremark, IncremarkParagraph, IncremarkInline, IncremarkHeading, IncremarkCode, IncremarkList, IncremarkTable, IncremarkBlockquote, IncremarkThematicBreak, IncremarkMath, IncremarkHtmlElement, IncremarkFootnotes, IncremarkDefault, IncremarkRenderer, type ComponentMap, type
|
|
9
|
+
export { Incremark, IncremarkContent, IncremarkParagraph, IncremarkInline, IncremarkHeading, IncremarkCode, IncremarkList, IncremarkTable, IncremarkBlockquote, IncremarkThematicBreak, IncremarkMath, IncremarkHtmlElement, IncremarkFootnotes, IncremarkDefault, IncremarkRenderer, type ComponentMap, type RenderableBlock, type IncremarkContentProps, type CodeBlockConfig } from './components';
|
|
10
10
|
export { default as AutoScrollContainer } from './components/AutoScrollContainer.svelte';
|
|
11
11
|
export { default as ThemeProvider } from './ThemeProvider.svelte';
|
|
12
12
|
export type { ParsedBlock, IncrementalUpdate, ParserOptions, BlockStatus, Root, RootContent, SourceBlock, DisplayBlock, TransformerPlugin, TransformerOptions, TransformerState, AnimationEffect } from '@incremark/core';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACxJ,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC/B,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAGzH,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACxJ,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC/B,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAGzH,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACrB,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AACxF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAGjE,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,IAAI,EACJ,WAAW,EAEX,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EAChB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,UAAU,EACV,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,UAAU,EACV,YAAY,EACb,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,KAAK,YAAY,EACjB,YAAY,EACZ,SAAS,EACT,eAAe,EACf,UAAU,EACV,UAAU,EACX,MAAM,kBAAkB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ export { useBlockTransformer } from './stores/useBlockTransformer';
|
|
|
9
9
|
// Context
|
|
10
10
|
export { setDefinitionsContext, getDefinitionsContext } from './context/definitionsContext';
|
|
11
11
|
// Components
|
|
12
|
-
export { Incremark, IncremarkParagraph, IncremarkInline, IncremarkHeading, IncremarkCode, IncremarkList, IncremarkTable, IncremarkBlockquote, IncremarkThematicBreak, IncremarkMath, IncremarkHtmlElement, IncremarkFootnotes, IncremarkDefault, IncremarkRenderer } from './components';
|
|
12
|
+
export { Incremark, IncremarkContent, IncremarkParagraph, IncremarkInline, IncremarkHeading, IncremarkCode, IncremarkList, IncremarkTable, IncremarkBlockquote, IncremarkThematicBreak, IncremarkMath, IncremarkHtmlElement, IncremarkFootnotes, IncremarkDefault, IncremarkRenderer } from './components';
|
|
13
13
|
// Additional Components
|
|
14
14
|
export { default as AutoScrollContainer } from './components/AutoScrollContainer.svelte';
|
|
15
15
|
export { default as ThemeProvider } from './ThemeProvider.svelte';
|
|
@@ -29,8 +29,8 @@ export function useDevTools(incremark, options = {}) {
|
|
|
29
29
|
// 设置 parser 的 onChange 回调
|
|
30
30
|
incremark.parser.setOnChange((state) => {
|
|
31
31
|
const blocks = [
|
|
32
|
-
...state.completedBlocks
|
|
33
|
-
...state.pendingBlocks
|
|
32
|
+
...state.completedBlocks,
|
|
33
|
+
...state.pendingBlocks
|
|
34
34
|
];
|
|
35
35
|
devtools.update({
|
|
36
36
|
blocks,
|
|
@@ -30,6 +30,9 @@ export interface UseIncremarkOptions extends ParserOptions {
|
|
|
30
30
|
/** 打字机配置,传入即创建 transformer(可通过 enabled 控制是否启用) */
|
|
31
31
|
typewriter?: TypewriterOptions;
|
|
32
32
|
}
|
|
33
|
+
export type RenderableBlock = ParsedBlock & {
|
|
34
|
+
isLastPending?: boolean;
|
|
35
|
+
};
|
|
33
36
|
/**
|
|
34
37
|
* 打字机控制对象
|
|
35
38
|
*/
|
|
@@ -66,9 +69,7 @@ export interface UseIncremarkReturn {
|
|
|
66
69
|
/** 当前完整的 AST */
|
|
67
70
|
ast: Readable<Root>;
|
|
68
71
|
/** 用于渲染的 blocks(根据打字机设置自动处理) */
|
|
69
|
-
blocks: Readable<Array<
|
|
70
|
-
stableId: string;
|
|
71
|
-
}>>;
|
|
72
|
+
blocks: Readable<Array<RenderableBlock>>;
|
|
72
73
|
/** 是否正在加载 */
|
|
73
74
|
isLoading: Writable<boolean>;
|
|
74
75
|
/** 是否已完成(finalize) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIncremark.d.ts","sourceRoot":"","sources":["../../src/stores/useIncremark.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAqB,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,IAAI,EACT,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAA;AAIxB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,gBAAgB;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe;IACf,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,YAAY;IACZ,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,kDAAkD;IAClD,UAAU,CAAC,EAAE,iBAAiB,CAAA;CAC/B;
|
|
1
|
+
{"version":3,"file":"useIncremark.d.ts","sourceRoot":"","sources":["../../src/stores/useIncremark.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,6 +60,29 @@ export function useIncremark(options = {}) {
|
|
|
60
60
|
const markdown = writable('');
|
|
61
61
|
const isFinalized = writable(false);
|
|
62
62
|
const footnoteReferenceOrder = writable([]);
|
|
63
|
+
/**
|
|
64
|
+
* 处理解析器更新结果(统一 append 和 finalize 的更新逻辑)
|
|
65
|
+
*/
|
|
66
|
+
function handleUpdate(update, isFinalize) {
|
|
67
|
+
markdown.set(parser.getBuffer());
|
|
68
|
+
if (update.completed.length > 0) {
|
|
69
|
+
completedBlocks.update((blocks) => [
|
|
70
|
+
...blocks,
|
|
71
|
+
...update.completed
|
|
72
|
+
]);
|
|
73
|
+
}
|
|
74
|
+
pendingBlocks.set(update.pending);
|
|
75
|
+
if (isFinalize) {
|
|
76
|
+
isLoading.set(false);
|
|
77
|
+
isFinalized.set(true);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
isLoading.set(true);
|
|
81
|
+
}
|
|
82
|
+
// 更新脚注引用顺序
|
|
83
|
+
footnoteReferenceOrder.set(update.footnoteReferenceOrder);
|
|
84
|
+
setFootnoteReferenceOrder(update.footnoteReferenceOrder);
|
|
85
|
+
}
|
|
63
86
|
// 使用 useTypewriter store 管理打字机效果
|
|
64
87
|
const { blocks, typewriter, transformer, isAnimationComplete } = useTypewriter({
|
|
65
88
|
typewriter: options.typewriter,
|
|
@@ -67,9 +90,16 @@ export function useIncremark(options = {}) {
|
|
|
67
90
|
pendingBlocks
|
|
68
91
|
});
|
|
69
92
|
// 内容是否完全显示完成
|
|
70
|
-
//
|
|
93
|
+
// 如果没有配置打字机或未启用打字机:解析完成即显示完成
|
|
71
94
|
// 如果启用打字机:解析完成 + 动画完成
|
|
72
|
-
const isDisplayComplete = derived([isFinalized, isAnimationComplete], ([$isFinalized, $isAnimationComplete]) =>
|
|
95
|
+
const isDisplayComplete = derived([isFinalized, isAnimationComplete, typewriter.enabled], ([$isFinalized, $isAnimationComplete, $typewriterEnabled]) => {
|
|
96
|
+
// 没有配置打字机,或者打字机未启用:只需判断是否 finalized
|
|
97
|
+
if (!options.typewriter || !$typewriterEnabled) {
|
|
98
|
+
return $isFinalized;
|
|
99
|
+
}
|
|
100
|
+
// 启用了打字机:需要 finalize + 动画完成
|
|
101
|
+
return $isFinalized && $isAnimationComplete;
|
|
102
|
+
});
|
|
73
103
|
// AST
|
|
74
104
|
const ast = derived([completedBlocks, pendingBlocks], ([$completedBlocks, $pendingBlocks]) => ({
|
|
75
105
|
type: 'root',
|
|
@@ -85,19 +115,8 @@ export function useIncremark(options = {}) {
|
|
|
85
115
|
* @returns 增量更新结果
|
|
86
116
|
*/
|
|
87
117
|
function append(chunk) {
|
|
88
|
-
isLoading.set(true);
|
|
89
118
|
const update = parser.append(chunk);
|
|
90
|
-
|
|
91
|
-
if (update.completed.length > 0) {
|
|
92
|
-
completedBlocks.update((blocks) => [
|
|
93
|
-
...blocks,
|
|
94
|
-
...update.completed
|
|
95
|
-
]);
|
|
96
|
-
}
|
|
97
|
-
pendingBlocks.set(update.pending);
|
|
98
|
-
// 更新脚注引用顺序
|
|
99
|
-
footnoteReferenceOrder.set(update.footnoteReferenceOrder);
|
|
100
|
-
setFootnoteReferenceOrder(update.footnoteReferenceOrder);
|
|
119
|
+
handleUpdate(update, false);
|
|
101
120
|
return update;
|
|
102
121
|
}
|
|
103
122
|
/**
|
|
@@ -107,19 +126,7 @@ export function useIncremark(options = {}) {
|
|
|
107
126
|
*/
|
|
108
127
|
function finalize() {
|
|
109
128
|
const update = parser.finalize();
|
|
110
|
-
|
|
111
|
-
if (update.completed.length > 0) {
|
|
112
|
-
completedBlocks.update((blocks) => [
|
|
113
|
-
...blocks,
|
|
114
|
-
...update.completed
|
|
115
|
-
]);
|
|
116
|
-
}
|
|
117
|
-
pendingBlocks.set([]);
|
|
118
|
-
isLoading.set(false);
|
|
119
|
-
isFinalized.set(true);
|
|
120
|
-
// 更新脚注引用顺序
|
|
121
|
-
footnoteReferenceOrder.set(update.footnoteReferenceOrder);
|
|
122
|
-
setFootnoteReferenceOrder(update.footnoteReferenceOrder);
|
|
129
|
+
handleUpdate(update, true);
|
|
123
130
|
return update;
|
|
124
131
|
}
|
|
125
132
|
/**
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 使用 Shiki Highlighter
|
|
3
|
+
* @param themeGetter 传入一个返回主题字符串的函数,例如 () => theme
|
|
4
|
+
*/
|
|
5
|
+
export declare function useShiki(themeGetter: () => string): {
|
|
6
|
+
readonly isHighlighting: boolean;
|
|
7
|
+
highlight: (code: string, lang: string, fallbackTheme: string) => Promise<string>;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=useShiki.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useShiki.svelte.d.ts","sourceRoot":"","sources":["../../src/stores/useShiki.svelte.ts"],"names":[],"mappings":"AAkFA;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM;;sBAOjB,MAAM,QAAQ,MAAM,iBAAiB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;EA+B7F"}
|