@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.
Files changed (37) hide show
  1. package/dist/components/AutoScrollContainer.svelte +18 -18
  2. package/dist/components/Incremark.svelte +37 -74
  3. package/dist/components/Incremark.svelte.d.ts +9 -2
  4. package/dist/components/Incremark.svelte.d.ts.map +1 -1
  5. package/dist/components/IncremarkBlockquote.svelte +3 -7
  6. package/dist/components/IncremarkBlockquote.svelte.d.ts.map +1 -1
  7. package/dist/components/IncremarkCode.svelte +44 -124
  8. package/dist/components/IncremarkCode.svelte.d.ts +6 -0
  9. package/dist/components/IncremarkCode.svelte.d.ts.map +1 -1
  10. package/dist/components/IncremarkContent.svelte +114 -0
  11. package/dist/components/IncremarkContent.svelte.d.ts +6 -0
  12. package/dist/components/IncremarkContent.svelte.d.ts.map +1 -0
  13. package/dist/components/IncremarkList.svelte +10 -12
  14. package/dist/components/IncremarkList.svelte.d.ts +0 -1
  15. package/dist/components/IncremarkList.svelte.d.ts.map +1 -1
  16. package/dist/components/IncremarkRenderer.svelte +18 -16
  17. package/dist/components/IncremarkRenderer.svelte.d.ts +3 -0
  18. package/dist/components/IncremarkRenderer.svelte.d.ts.map +1 -1
  19. package/dist/components/index.d.ts +2 -1
  20. package/dist/components/index.d.ts.map +1 -1
  21. package/dist/components/index.js +1 -0
  22. package/dist/components/types.d.ts +29 -3
  23. package/dist/components/types.d.ts.map +1 -1
  24. package/dist/index.d.ts +1 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +1 -1
  27. package/dist/stores/useDevTools.js +2 -2
  28. package/dist/stores/useIncremark.d.ts +4 -3
  29. package/dist/stores/useIncremark.d.ts.map +1 -1
  30. package/dist/stores/useIncremark.js +34 -27
  31. package/dist/stores/useShiki.svelte.d.ts +9 -0
  32. package/dist/stores/useShiki.svelte.d.ts.map +1 -0
  33. package/dist/stores/useShiki.svelte.js +98 -0
  34. package/dist/stores/useTypewriter.d.ts +1 -1
  35. package/dist/stores/useTypewriter.d.ts.map +1 -1
  36. package/dist/stores/useTypewriter.js +3 -3
  37. 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, PhrasingContent, BlockContent } from 'mdast'
7
+ import type { List, ListItem, RootContent } from 'mdast'
8
8
  import IncremarkInline from './IncremarkInline.svelte'
9
- import IncremarkList from './IncremarkList.svelte';
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): PhrasingContent[] {
39
+ function getItemInlineContent(item: ListItem) {
40
40
  const firstChild = item.children[0]
41
41
  if (firstChild?.type === 'paragraph') {
42
- return firstChild.children as PhrasingContent[]
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): BlockContent[] {
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
- }) as BlockContent[]
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
- {#if child.type === 'list'}
102
- <IncremarkList node={child} />
103
- {/if}
104
- <!-- 其他块级内容可以在这里扩展 -->
102
+ <IncremarkRenderer node={child} />
105
103
  {/each}
106
104
  {/if}
107
105
  </li>
@@ -1,5 +1,4 @@
1
1
  import type { List } from 'mdast';
2
- import IncremarkList from './IncremarkList.svelte';
3
2
  /**
4
3
  * 组件 Props
5
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"IncremarkList.svelte.d.ts","sourceRoot":"","sources":["../../src/components/IncremarkList.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAA2C,MAAM,OAAO,CAAA;AAE1E,OAAO,aAAa,MAAM,wBAAwB,CAAC;AAGjD;;GAEG;AACH,UAAU,KAAK;IACb,WAAW;IACX,IAAI,EAAE,IAAI,CAAA;CACX;AA4FH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
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 componentMap: Record<string, any> = {
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 componentMap[type] || IncremarkDefault
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
- {@const Component = getComponent('code')}
90
- {#if Component}
91
- <Component
92
- node={node}
93
- customCodeBlocks={customCodeBlocks}
94
- blockStatus={blockStatus}
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, BlockWithStableId } from './types';
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,iBAAiB,EAAE,MAAM,SAAS,CAAA"}
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"}
@@ -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
- * 带稳定 ID 的块类型
14
+ * 可渲染的块类型(带 isLastPending 字段用于打字机光标)
13
15
  */
14
- export interface BlockWithStableId extends ParsedBlock {
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;AAElD;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;AAEvD;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB"}
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 BlockWithStableId } from './components';
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';
@@ -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,iBAAiB,EACvB,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"}
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.map((b) => ({ ...b, stableId: b.id })),
33
- ...state.pendingBlocks.map((b, i) => ({ ...b, stableId: `pending-${i}` }))
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<ParsedBlock & {
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":"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"}
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]) => $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
- markdown.set(parser.getBuffer());
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
- markdown.set(parser.getBuffer());
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"}