@incremark/vue 0.0.5 → 0.1.0
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/index.css +11 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +207 -34
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/components/IncremarkInline.vue +82 -12
- package/src/composables/index.ts +1 -1
- package/src/composables/useIncremark.ts +239 -27
- package/src/index.ts +2 -0
package/dist/index.css
CHANGED
|
@@ -48,6 +48,17 @@
|
|
|
48
48
|
monospace;
|
|
49
49
|
font-size: 0.9em;
|
|
50
50
|
}
|
|
51
|
+
.incremark-fade-in {
|
|
52
|
+
animation: incremark-fade-in 0.4s ease-out;
|
|
53
|
+
}
|
|
54
|
+
@keyframes incremark-fade-in {
|
|
55
|
+
from {
|
|
56
|
+
opacity: 0;
|
|
57
|
+
}
|
|
58
|
+
to {
|
|
59
|
+
opacity: 1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
51
62
|
|
|
52
63
|
/* sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=style&index=0 */
|
|
53
64
|
.incremark-heading[data-v-56c8779f] {
|
package/dist/index.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=style&index=0"],"sourcesContent":["\n.incremark-math-inline[data-v-6146c361] {\n display: inline;\n}\n.incremark-math-block[data-v-6146c361] {\n margin: 1em 0;\n padding: 1em;\n overflow-x: auto;\n text-align: center;\n}\n.math-source[data-v-6146c361] {\n background: #f3f4f6;\n padding: 0.1em 0.3em;\n border-radius: 3px;\n font-size: 0.9em;\n color: #6b7280;\n}\n.math-source-block[data-v-6146c361] {\n margin: 0;\n padding: 1em;\n background: #f3f4f6;\n border-radius: 6px;\n text-align: left;\n}\n.math-source-block code[data-v-6146c361] {\n font-family: 'Fira Code', monospace;\n font-size: 0.9em;\n color: #374151;\n}\n.math-rendered[data-v-6146c361] .katex {\n font-size: 1.1em;\n}\n.math-rendered[data-v-6146c361] .katex-display {\n margin: 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n","\n.incremark-inline-code {\n padding: 0.2em 0.4em;\n background: rgba(0, 0, 0, 0.06);\n border-radius: 4px;\n font-family: 'Fira Code', 'SF Mono', Consolas, monospace;\n font-size: 0.9em;\n}\n","\n.incremark-heading[data-v-56c8779f] {\n margin: 0.5em 0;\n font-weight: 600;\n line-height: 1.3;\n}\nh1[data-v-56c8779f] { font-size: 2em; border-bottom: 1px solid #eee; padding-bottom: 0.3em;\n}\nh2[data-v-56c8779f] { font-size: 1.5em;\n}\nh3[data-v-56c8779f] { font-size: 1.25em;\n}\nh4[data-v-56c8779f] { font-size: 1em;\n}\nh5[data-v-56c8779f] { font-size: 0.875em;\n}\nh6[data-v-56c8779f] { font-size: 0.85em; color: #666;\n}\n","\n.incremark-paragraph[data-v-6fa83031] {\n margin: 0.75em 0;\n line-height: 1.6;\n}\n","\n/* Mermaid 样式 */\n.incremark-mermaid[data-v-c48b1022] {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #1a1a2e;\n}\n.mermaid-header[data-v-c48b1022] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: #16213e;\n border-bottom: 1px solid #0f3460;\n font-size: 12px;\n}\n.mermaid-actions[data-v-c48b1022] {\n display: flex;\n gap: 8px;\n}\n.view-toggle[data-v-c48b1022] {\n padding: 4px 10px;\n border: 1px solid #0f3460;\n border-radius: 6px;\n background: transparent;\n color: #8b949e;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n.view-toggle[data-v-c48b1022]:hover:not(:disabled) {\n background: #0f3460;\n color: #e0e0e0;\n}\n.view-toggle[data-v-c48b1022]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.mermaid-content[data-v-c48b1022] {\n padding: 16px;\n min-height: 100px;\n}\n.mermaid-loading[data-v-c48b1022] {\n color: #8b949e;\n font-size: 14px;\n}\n.mermaid-source-code[data-v-c48b1022] {\n margin: 0;\n padding: 12px;\n background: #0d1117;\n border-radius: 6px;\n color: #c9d1d9;\n font-family: 'Fira Code', 'SF Mono', monospace;\n font-size: 13px;\n line-height: 1.5;\n white-space: pre-wrap;\n overflow-x: auto;\n}\n.mermaid-svg[data-v-c48b1022] {\n overflow-x: auto;\n}\n.mermaid-svg[data-v-c48b1022] svg {\n max-width: 100%;\n height: auto;\n}\n\n/* 代码块样式 */\n.incremark-code[data-v-c48b1022] {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #24292e;\n}\n.code-header[data-v-c48b1022] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: #1f2428;\n border-bottom: 1px solid #30363d;\n font-size: 12px;\n}\n.language[data-v-c48b1022] {\n color: #8b949e;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n}\n.copy-btn[data-v-c48b1022] {\n padding: 4px 12px;\n border: 1px solid #30363d;\n border-radius: 6px;\n background: transparent;\n color: #8b949e;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n.copy-btn[data-v-c48b1022]:hover {\n background: #30363d;\n color: #c9d1d9;\n}\n.code-content[data-v-c48b1022] {\n overflow-x: auto;\n}\n.code-loading[data-v-c48b1022] {\n opacity: 0.7;\n}\n\n/* Shiki 生成的代码样式 */\n.shiki-wrapper[data-v-c48b1022] pre {\n margin: 0;\n padding: 16px;\n background: transparent !important;\n overflow-x: auto;\n}\n.shiki-wrapper[data-v-c48b1022] code {\n font-family: 'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 14px;\n line-height: 1.6;\n}\n\n/* 回退样式 */\n.code-fallback[data-v-c48b1022],\n.code-loading pre[data-v-c48b1022] {\n margin: 0;\n padding: 16px;\n overflow-x: auto;\n background: transparent;\n}\n.code-fallback code[data-v-c48b1022],\n.code-loading code[data-v-c48b1022] {\n font-family: 'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 14px;\n line-height: 1.6;\n color: #c9d1d9;\n}\n","\n.incremark-list[data-v-0778ccea] {\n margin: 0.75em 0;\n padding-left: 2em;\n}\n.incremark-list.task-list[data-v-0778ccea] {\n list-style: none;\n padding-left: 0;\n}\n.incremark-list-item[data-v-0778ccea] {\n margin: 0.25em 0;\n line-height: 1.6;\n}\n.task-item[data-v-0778ccea] {\n list-style: none;\n}\n.task-label[data-v-0778ccea] {\n display: flex;\n align-items: flex-start;\n gap: 0.5em;\n cursor: default;\n}\n.checkbox[data-v-0778ccea] {\n margin-top: 0.3em;\n flex-shrink: 0;\n}\n.task-content[data-v-0778ccea] {\n flex: 1;\n}\n","\n.incremark-table-wrapper[data-v-7aea7ba6] {\n overflow-x: auto;\n margin: 1em 0;\n}\n.incremark-table[data-v-7aea7ba6] {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n}\n.incremark-table th[data-v-7aea7ba6],\n.incremark-table td[data-v-7aea7ba6] {\n border: 1px solid #ddd;\n padding: 10px 14px;\n}\n.incremark-table th[data-v-7aea7ba6] {\n background: #f8f9fa;\n font-weight: 600;\n}\n.incremark-table tr[data-v-7aea7ba6]:nth-child(even) {\n background: #fafafa;\n}\n.incremark-table tr[data-v-7aea7ba6]:hover {\n background: #f0f0f0;\n}\n","\n.incremark-blockquote[data-v-67363f13] {\n margin: 1em 0;\n padding: 0.5em 1em;\n border-left: 4px solid #3b82f6;\n background: #f0f7ff;\n border-radius: 0 4px 4px 0;\n}\n.incremark-blockquote[data-v-67363f13] p {\n margin: 0.5em 0;\n}\n.incremark-blockquote[data-v-67363f13] p:first-child {\n margin-top: 0;\n}\n.incremark-blockquote[data-v-67363f13] p:last-child {\n margin-bottom: 0;\n}\n","\n.incremark-hr[data-v-cb316429] {\n margin: 2em 0;\n border: none;\n border-top: 2px solid #e5e5e5;\n}\n","\n.incremark-default[data-v-5542d517] {\n margin: 0.5em 0;\n padding: 10px;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 4px;\n font-size: 12px;\n}\n.type-badge[data-v-5542d517] {\n display: inline-block;\n padding: 2px 8px;\n background: #ffc107;\n border-radius: 4px;\n font-weight: 600;\n margin-bottom: 8px;\n}\npre[data-v-5542d517] {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n font-size: 11px;\n}\n","\n.incremark-block.incremark-show-status.incremark-pending[data-v-5966b843] {\n border-left: 3px solid #a855f7;\n padding-left: 12px;\n opacity: 0.8;\n}\n.incremark-fade-enter-active[data-v-5966b843] {\n transition: opacity 0.2s ease-out;\n}\n.incremark-fade-enter-from[data-v-5966b843] {\n opacity: 0;\n}\n","\n.auto-scroll-container[data-v-e0d180b8] {\n overflow-y: auto;\n height: 100%;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=style&index=0","sfc-style:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=style&index=0"],"sourcesContent":["\n.incremark-math-inline[data-v-6146c361] {\n display: inline;\n}\n.incremark-math-block[data-v-6146c361] {\n margin: 1em 0;\n padding: 1em;\n overflow-x: auto;\n text-align: center;\n}\n.math-source[data-v-6146c361] {\n background: #f3f4f6;\n padding: 0.1em 0.3em;\n border-radius: 3px;\n font-size: 0.9em;\n color: #6b7280;\n}\n.math-source-block[data-v-6146c361] {\n margin: 0;\n padding: 1em;\n background: #f3f4f6;\n border-radius: 6px;\n text-align: left;\n}\n.math-source-block code[data-v-6146c361] {\n font-family: 'Fira Code', monospace;\n font-size: 0.9em;\n color: #374151;\n}\n.math-rendered[data-v-6146c361] .katex {\n font-size: 1.1em;\n}\n.math-rendered[data-v-6146c361] .katex-display {\n margin: 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n","\n.incremark-inline-code {\n padding: 0.2em 0.4em;\n background: rgba(0, 0, 0, 0.06);\n border-radius: 4px;\n font-family: 'Fira Code', 'SF Mono', Consolas, monospace;\n font-size: 0.9em;\n}\n\n/* 渐入动画 */\n.incremark-fade-in {\n animation: incremark-fade-in 0.4s ease-out;\n}\n@keyframes incremark-fade-in {\nfrom { \n opacity: 0;\n}\nto { \n opacity: 1;\n}\n}\n","\n.incremark-heading[data-v-56c8779f] {\n margin: 0.5em 0;\n font-weight: 600;\n line-height: 1.3;\n}\nh1[data-v-56c8779f] { font-size: 2em; border-bottom: 1px solid #eee; padding-bottom: 0.3em;\n}\nh2[data-v-56c8779f] { font-size: 1.5em;\n}\nh3[data-v-56c8779f] { font-size: 1.25em;\n}\nh4[data-v-56c8779f] { font-size: 1em;\n}\nh5[data-v-56c8779f] { font-size: 0.875em;\n}\nh6[data-v-56c8779f] { font-size: 0.85em; color: #666;\n}\n","\n.incremark-paragraph[data-v-6fa83031] {\n margin: 0.75em 0;\n line-height: 1.6;\n}\n","\n/* Mermaid 样式 */\n.incremark-mermaid[data-v-c48b1022] {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #1a1a2e;\n}\n.mermaid-header[data-v-c48b1022] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: #16213e;\n border-bottom: 1px solid #0f3460;\n font-size: 12px;\n}\n.mermaid-actions[data-v-c48b1022] {\n display: flex;\n gap: 8px;\n}\n.view-toggle[data-v-c48b1022] {\n padding: 4px 10px;\n border: 1px solid #0f3460;\n border-radius: 6px;\n background: transparent;\n color: #8b949e;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n.view-toggle[data-v-c48b1022]:hover:not(:disabled) {\n background: #0f3460;\n color: #e0e0e0;\n}\n.view-toggle[data-v-c48b1022]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.mermaid-content[data-v-c48b1022] {\n padding: 16px;\n min-height: 100px;\n}\n.mermaid-loading[data-v-c48b1022] {\n color: #8b949e;\n font-size: 14px;\n}\n.mermaid-source-code[data-v-c48b1022] {\n margin: 0;\n padding: 12px;\n background: #0d1117;\n border-radius: 6px;\n color: #c9d1d9;\n font-family: 'Fira Code', 'SF Mono', monospace;\n font-size: 13px;\n line-height: 1.5;\n white-space: pre-wrap;\n overflow-x: auto;\n}\n.mermaid-svg[data-v-c48b1022] {\n overflow-x: auto;\n}\n.mermaid-svg[data-v-c48b1022] svg {\n max-width: 100%;\n height: auto;\n}\n\n/* 代码块样式 */\n.incremark-code[data-v-c48b1022] {\n margin: 1em 0;\n border-radius: 8px;\n overflow: hidden;\n background: #24292e;\n}\n.code-header[data-v-c48b1022] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: #1f2428;\n border-bottom: 1px solid #30363d;\n font-size: 12px;\n}\n.language[data-v-c48b1022] {\n color: #8b949e;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n}\n.copy-btn[data-v-c48b1022] {\n padding: 4px 12px;\n border: 1px solid #30363d;\n border-radius: 6px;\n background: transparent;\n color: #8b949e;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n.copy-btn[data-v-c48b1022]:hover {\n background: #30363d;\n color: #c9d1d9;\n}\n.code-content[data-v-c48b1022] {\n overflow-x: auto;\n}\n.code-loading[data-v-c48b1022] {\n opacity: 0.7;\n}\n\n/* Shiki 生成的代码样式 */\n.shiki-wrapper[data-v-c48b1022] pre {\n margin: 0;\n padding: 16px;\n background: transparent !important;\n overflow-x: auto;\n}\n.shiki-wrapper[data-v-c48b1022] code {\n font-family: 'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 14px;\n line-height: 1.6;\n}\n\n/* 回退样式 */\n.code-fallback[data-v-c48b1022],\n.code-loading pre[data-v-c48b1022] {\n margin: 0;\n padding: 16px;\n overflow-x: auto;\n background: transparent;\n}\n.code-fallback code[data-v-c48b1022],\n.code-loading code[data-v-c48b1022] {\n font-family: 'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 14px;\n line-height: 1.6;\n color: #c9d1d9;\n}\n","\n.incremark-list[data-v-0778ccea] {\n margin: 0.75em 0;\n padding-left: 2em;\n}\n.incremark-list.task-list[data-v-0778ccea] {\n list-style: none;\n padding-left: 0;\n}\n.incremark-list-item[data-v-0778ccea] {\n margin: 0.25em 0;\n line-height: 1.6;\n}\n.task-item[data-v-0778ccea] {\n list-style: none;\n}\n.task-label[data-v-0778ccea] {\n display: flex;\n align-items: flex-start;\n gap: 0.5em;\n cursor: default;\n}\n.checkbox[data-v-0778ccea] {\n margin-top: 0.3em;\n flex-shrink: 0;\n}\n.task-content[data-v-0778ccea] {\n flex: 1;\n}\n","\n.incremark-table-wrapper[data-v-7aea7ba6] {\n overflow-x: auto;\n margin: 1em 0;\n}\n.incremark-table[data-v-7aea7ba6] {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n}\n.incremark-table th[data-v-7aea7ba6],\n.incremark-table td[data-v-7aea7ba6] {\n border: 1px solid #ddd;\n padding: 10px 14px;\n}\n.incremark-table th[data-v-7aea7ba6] {\n background: #f8f9fa;\n font-weight: 600;\n}\n.incremark-table tr[data-v-7aea7ba6]:nth-child(even) {\n background: #fafafa;\n}\n.incremark-table tr[data-v-7aea7ba6]:hover {\n background: #f0f0f0;\n}\n","\n.incremark-blockquote[data-v-67363f13] {\n margin: 1em 0;\n padding: 0.5em 1em;\n border-left: 4px solid #3b82f6;\n background: #f0f7ff;\n border-radius: 0 4px 4px 0;\n}\n.incremark-blockquote[data-v-67363f13] p {\n margin: 0.5em 0;\n}\n.incremark-blockquote[data-v-67363f13] p:first-child {\n margin-top: 0;\n}\n.incremark-blockquote[data-v-67363f13] p:last-child {\n margin-bottom: 0;\n}\n","\n.incremark-hr[data-v-cb316429] {\n margin: 2em 0;\n border: none;\n border-top: 2px solid #e5e5e5;\n}\n","\n.incremark-default[data-v-5542d517] {\n margin: 0.5em 0;\n padding: 10px;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 4px;\n font-size: 12px;\n}\n.type-badge[data-v-5542d517] {\n display: inline-block;\n padding: 2px 8px;\n background: #ffc107;\n border-radius: 4px;\n font-weight: 600;\n margin-bottom: 8px;\n}\npre[data-v-5542d517] {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n font-size: 11px;\n}\n","\n.incremark-block.incremark-show-status.incremark-pending[data-v-5966b843] {\n border-left: 3px solid #a855f7;\n padding-left: 12px;\n opacity: 0.8;\n}\n.incremark-fade-enter-active[data-v-5966b843] {\n transition: opacity 0.2s ease-out;\n}\n.incremark-fade-enter-from[data-v-5966b843] {\n opacity: 0;\n}\n","\n.auto-scroll-container[data-v-e0d180b8] {\n overflow-y: auto;\n height: 100%;\n}\n"],"mappings":";AACA,CAAC,qBAAqB,CAAC;AACrB,WAAS;AACX;AACA,CAAC,oBAAoB,CAAC;AACpB,UAAQ,IAAI;AACZ,WAAS;AACT,cAAY;AACZ,cAAY;AACd;AACA,CAAC,WAAW,CAAC;AACX,cAAY;AACZ,WAAS,MAAM;AACf,iBAAe;AACf,aAAW;AACX,SAAO;AACT;AACA,CAAC,iBAAiB,CAAC;AACjB,UAAQ;AACR,WAAS;AACT,cAAY;AACZ,iBAAe;AACf,cAAY;AACd;AACA,CAPC,kBAOkB,IAAI,CAAC;AACtB,eAAa,WAAW,EAAE;AAC1B,aAAW;AACX,SAAO;AACT;AACA,CAAC,aAAa,CAAC,iBAAiB,CAAC;AAC/B,aAAW;AACb;AACA,CAHC,aAGa,CAAC,iBAAiB,CAAC;AAC/B,UAAQ;AACR,cAAY;AACZ,cAAY;AACd;;;ACnCA,CAAC;AACC,WAAS,MAAM;AACf,cAAY,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC1B,iBAAe;AACf;AAAA,IAAa,WAAW;AAAA,IAAE,SAAS;AAAA,IAAE,QAAQ;AAAA,IAAE;AAC/C,aAAW;AACb;AAGA,CAAC;AACC,aAAW,kBAAkB,KAAK;AACpC;AACA,WAHC;AAID;AACI,aAAS;AACb;AACA;AACI,aAAS;AACb;AACA;;;ACnBA,CAAC,iBAAiB,CAAC;AACjB,UAAQ,MAAM;AACd,eAAa;AACb,eAAa;AACf;AACA,EAAE,CAAC;AAAmB,aAAW;AAAK,iBAAe,IAAI,MAAM;AAAM,kBAAgB;AACrF;AACA,EAAE,CAAC;AAAmB,aAAW;AACjC;AACA,EAAE,CAAC;AAAmB,aAAW;AACjC;AACA,EAAE,CAAC;AAAmB,aAAW;AACjC;AACA,EAAE,CAAC;AAAmB,aAAW;AACjC;AACA,EAAE,CAAC;AAAmB,aAAW;AAAQ,SAAO;AAChD;;;AChBA,CAAC,mBAAmB,CAAC;AACnB,UAAQ,OAAO;AACf,eAAa;AACf;;;ACFA,CAAC,iBAAiB,CAAC;AACjB,UAAQ,IAAI;AACZ,iBAAe;AACf,YAAU;AACV,cAAY;AACd;AACA,CAAC,cAAc,CAAC;AACd,WAAS;AACT,mBAAiB;AACjB,eAAa;AACb,WAAS,IAAI;AACb,cAAY;AACZ,iBAAe,IAAI,MAAM;AACzB,aAAW;AACb;AACA,CAAC,eAAe,CAAC;AACf,WAAS;AACT,OAAK;AACP;AACA,CAAC,WAAW,CAAC;AACX,WAAS,IAAI;AACb,UAAQ,IAAI,MAAM;AAClB,iBAAe;AACf,cAAY;AACZ,SAAO;AACP,aAAW;AACX,UAAQ;AACR,cAAY,IAAI;AAClB;AACA,CAVC,WAUW,CAAC,gBAAgB,MAAM,KAAK;AACtC,cAAY;AACZ,SAAO;AACT;AACA,CAdC,WAcW,CAAC,gBAAgB;AAC3B,WAAS;AACT,UAAQ;AACV;AACA,CAAC,eAAe,CAAC;AACf,WAAS;AACT,cAAY;AACd;AACA,CAAC,eAAe,CAAC;AACf,SAAO;AACP,aAAW;AACb;AACA,CAAC,mBAAmB,CAAC;AACnB,UAAQ;AACR,WAAS;AACT,cAAY;AACZ,iBAAe;AACf,SAAO;AACP;AAAA,IAAa,WAAW;AAAA,IAAE,SAAS;AAAA,IAAE;AACrC,aAAW;AACX,eAAa;AACb,eAAa;AACb,cAAY;AACd;AACA,CAAC,WAAW,CAAC;AACX,cAAY;AACd;AACA,CAHC,WAGW,CAAC,iBAAiB;AAC5B,aAAW;AACX,UAAQ;AACV;AAGA,CAAC,cAAc,CAAC;AACd,UAAQ,IAAI;AACZ,iBAAe;AACf,YAAU;AACV,cAAY;AACd;AACA,CAAC,WAAW,CAAC;AACX,WAAS;AACT,mBAAiB;AACjB,eAAa;AACb,WAAS,IAAI;AACb,cAAY;AACZ,iBAAe,IAAI,MAAM;AACzB,aAAW;AACb;AACA,CAAC,QAAQ,CAAC;AACR,SAAO;AACP,kBAAgB;AAChB,eAAa;AACb,kBAAgB;AAClB;AACA,CAAC,QAAQ,CAAC;AACR,WAAS,IAAI;AACb,UAAQ,IAAI,MAAM;AAClB,iBAAe;AACf,cAAY;AACZ,SAAO;AACP,aAAW;AACX,UAAQ;AACR,cAAY,IAAI;AAClB;AACA,CAVC,QAUQ,CAAC,gBAAgB;AACxB,cAAY;AACZ,SAAO;AACT;AACA,CAAC,YAAY,CAAC;AACZ,cAAY;AACd;AACA,CAAC,YAAY,CAAC;AACZ,WAAS;AACX;AAGA,CAAC,aAAa,CAAC,iBAAiB;AAC9B,UAAQ;AACR,WAAS;AACT,cAAY;AACZ,cAAY;AACd;AACA,CANC,aAMa,CAAC,iBAAiB;AAC9B;AAAA,IAAa,WAAW;AAAA,IAAE,SAAS;AAAA,IAAE,QAAQ;AAAA,IAAE,UAAU;AAAA,IAAE;AAC3D,aAAW;AACX,eAAa;AACf;AAGA,CAAC,aAAa,CAAC;AACf,CAnBC,aAmBa,GAAG,CAAC;AAChB,UAAQ;AACR,WAAS;AACT,cAAY;AACZ,cAAY;AACd;AACA,CAPC,cAOc,IAAI,CAAC;AACpB,CA1BC,aA0Ba,IAAI,CAAC;AACjB;AAAA,IAAa,WAAW;AAAA,IAAE,SAAS;AAAA,IAAE,QAAQ;AAAA,IAAE,UAAU;AAAA,IAAE;AAC3D,aAAW;AACX,eAAa;AACb,SAAO;AACT;;;ACxIA,CAAC,cAAc,CAAC;AACd,UAAQ,OAAO;AACf,gBAAc;AAChB;AACA,CAJC,cAIc,CAAC,SAAS,CAAC;AACxB,cAAY;AACZ,gBAAc;AAChB;AACA,CAAC,mBAAmB,CAAC;AACnB,UAAQ,OAAO;AACf,eAAa;AACf;AACA,CAAC,SAAS,CAAC;AACT,cAAY;AACd;AACA,CAAC,UAAU,CAAC;AACV,WAAS;AACT,eAAa;AACb,OAAK;AACL,UAAQ;AACV;AACA,CAAC,QAAQ,CAAC;AACR,cAAY;AACZ,eAAa;AACf;AACA,CAAC,YAAY,CAAC;AACZ,QAAM;AACR;;;AC3BA,CAAC,uBAAuB,CAAC;AACvB,cAAY;AACZ,UAAQ,IAAI;AACd;AACA,CAAC,eAAe,CAAC;AACf,SAAO;AACP,mBAAiB;AACjB,aAAW;AACb;AACA,CALC,gBAKgB,EAAE,CAAC;AACpB,CANC,gBAMgB,EAAE,CAAC;AAClB,UAAQ,IAAI,MAAM;AAClB,WAAS,KAAK;AAChB;AACA,CAVC,gBAUgB,EAAE,CAAC;AAClB,cAAY;AACZ,eAAa;AACf;AACA,CAdC,gBAcgB,EAAE,CAAC,gBAAgB;AAClC,cAAY;AACd;AACA,CAjBC,gBAiBgB,EAAE,CAAC,gBAAgB;AAClC,cAAY;AACd;;;ACvBA,CAAC,oBAAoB,CAAC;AACpB,UAAQ,IAAI;AACZ,WAAS,MAAM;AACf,eAAa,IAAI,MAAM;AACvB,cAAY;AACZ,iBAAe,EAAE,IAAI,IAAI;AAC3B;AACA,CAPC,oBAOoB,CAAC,iBAAiB;AACrC,UAAQ,MAAM;AAChB;AACA,CAVC,oBAUoB,CAAC,iBAAiB,CAAC;AACtC,cAAY;AACd;AACA,CAbC,oBAaoB,CAAC,iBAAiB,CAAC;AACtC,iBAAe;AACjB;;;ACfA,CAAC,YAAY,CAAC;AACZ,UAAQ,IAAI;AACZ,UAAQ;AACR,cAAY,IAAI,MAAM;AACxB;;;ACJA,CAAC,iBAAiB,CAAC;AACjB,UAAQ,MAAM;AACd,WAAS;AACT,cAAY;AACZ,UAAQ,IAAI,MAAM;AAClB,iBAAe;AACf,aAAW;AACb;AACA,CAAC,UAAU,CAAC;AACV,WAAS;AACT,WAAS,IAAI;AACb,cAAY;AACZ,iBAAe;AACf,eAAa;AACb,iBAAe;AACjB;AACA,GAAG,CAAC;AACF,UAAQ;AACR,eAAa;AACb,cAAY;AACZ,aAAW;AACb;;;ACrBA,CAAC,eAAe,CAAC,qBAAqB,CAAC,iBAAiB,CAAC;AACvD,eAAa,IAAI,MAAM;AACvB,gBAAc;AACd,WAAS;AACX;AACA,CAAC,2BAA2B,CAAC;AAC3B,cAAY,QAAQ,KAAK;AAC3B;AACA,CAAC,yBAAyB,CAAC;AACzB,WAAS;AACX;;;ACVA,CAAC,qBAAqB,CAAC;AACrB,cAAY;AACZ,UAAQ;AACV;","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// src/composables/useIncremark.ts
|
|
2
|
-
import { ref, shallowRef, computed, markRaw } from "vue";
|
|
2
|
+
import { ref, shallowRef, computed, markRaw, watch, onUnmounted } from "vue";
|
|
3
3
|
import {
|
|
4
|
-
createIncremarkParser
|
|
4
|
+
createIncremarkParser,
|
|
5
|
+
createBlockTransformer,
|
|
6
|
+
defaultPlugins
|
|
5
7
|
} from "@incremark/core";
|
|
6
8
|
function useIncremark(options = {}) {
|
|
7
9
|
const parser = createIncremarkParser(options);
|
|
@@ -9,6 +11,28 @@ function useIncremark(options = {}) {
|
|
|
9
11
|
const pendingBlocks = shallowRef([]);
|
|
10
12
|
const isLoading = ref(false);
|
|
11
13
|
const markdown = ref("");
|
|
14
|
+
const typewriterEnabled = ref(options.typewriter?.enabled ?? !!options.typewriter);
|
|
15
|
+
const displayBlocksRef = shallowRef([]);
|
|
16
|
+
const isTypewriterProcessing = ref(false);
|
|
17
|
+
const isTypewriterPaused = ref(false);
|
|
18
|
+
const typewriterEffect = ref(options.typewriter?.effect ?? "none");
|
|
19
|
+
const typewriterCursor = ref(options.typewriter?.cursor ?? "|");
|
|
20
|
+
let transformer = null;
|
|
21
|
+
if (options.typewriter) {
|
|
22
|
+
const twOptions = options.typewriter;
|
|
23
|
+
transformer = createBlockTransformer({
|
|
24
|
+
charsPerTick: twOptions.charsPerTick ?? [1, 3],
|
|
25
|
+
tickInterval: twOptions.tickInterval ?? 30,
|
|
26
|
+
effect: twOptions.effect ?? "none",
|
|
27
|
+
pauseOnHidden: twOptions.pauseOnHidden ?? true,
|
|
28
|
+
plugins: twOptions.plugins ?? defaultPlugins,
|
|
29
|
+
onChange: (blocks2) => {
|
|
30
|
+
displayBlocksRef.value = blocks2;
|
|
31
|
+
isTypewriterProcessing.value = transformer?.isProcessing() ?? false;
|
|
32
|
+
isTypewriterPaused.value = transformer?.isPausedState() ?? false;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
12
36
|
const ast = computed(() => ({
|
|
13
37
|
type: "root",
|
|
14
38
|
children: [
|
|
@@ -16,7 +40,55 @@ function useIncremark(options = {}) {
|
|
|
16
40
|
...pendingBlocks.value.map((b) => b.node)
|
|
17
41
|
]
|
|
18
42
|
}));
|
|
19
|
-
const
|
|
43
|
+
const sourceBlocks = computed(() => {
|
|
44
|
+
return completedBlocks.value.map((block) => ({
|
|
45
|
+
id: block.id,
|
|
46
|
+
node: block.node,
|
|
47
|
+
status: block.status
|
|
48
|
+
}));
|
|
49
|
+
});
|
|
50
|
+
if (transformer) {
|
|
51
|
+
watch(
|
|
52
|
+
sourceBlocks,
|
|
53
|
+
(blocks2) => {
|
|
54
|
+
transformer.push(blocks2);
|
|
55
|
+
const currentDisplaying = displayBlocksRef.value.find((b) => !b.isDisplayComplete);
|
|
56
|
+
if (currentDisplaying) {
|
|
57
|
+
const updated = blocks2.find((b) => b.id === currentDisplaying.id);
|
|
58
|
+
if (updated) {
|
|
59
|
+
transformer.update(updated);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
{ immediate: true, deep: true }
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
function addCursorToNode(node, cursor) {
|
|
67
|
+
const cloned = JSON.parse(JSON.stringify(node));
|
|
68
|
+
function addToLast(n) {
|
|
69
|
+
if (n.children && n.children.length > 0) {
|
|
70
|
+
for (let i = n.children.length - 1; i >= 0; i--) {
|
|
71
|
+
if (addToLast(n.children[i])) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
n.children.push({ type: "text", value: cursor });
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
if (n.type === "text" && typeof n.value === "string") {
|
|
79
|
+
n.value += cursor;
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (typeof n.value === "string") {
|
|
83
|
+
n.value += cursor;
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
addToLast(cloned);
|
|
89
|
+
return cloned;
|
|
90
|
+
}
|
|
91
|
+
const rawBlocks = computed(() => {
|
|
20
92
|
const result = [];
|
|
21
93
|
for (const block of completedBlocks.value) {
|
|
22
94
|
result.push({ ...block, stableId: block.id });
|
|
@@ -29,6 +101,29 @@ function useIncremark(options = {}) {
|
|
|
29
101
|
}
|
|
30
102
|
return result;
|
|
31
103
|
});
|
|
104
|
+
const blocks = computed(() => {
|
|
105
|
+
if (!typewriterEnabled.value || !transformer) {
|
|
106
|
+
return rawBlocks.value;
|
|
107
|
+
}
|
|
108
|
+
return displayBlocksRef.value.map((db, index) => {
|
|
109
|
+
const isPending = !db.isDisplayComplete;
|
|
110
|
+
const isLastPending = isPending && index === displayBlocksRef.value.length - 1;
|
|
111
|
+
let node = db.displayNode;
|
|
112
|
+
if (typewriterEffect.value === "typing" && isLastPending) {
|
|
113
|
+
node = addCursorToNode(db.displayNode, typewriterCursor.value);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
id: db.id,
|
|
117
|
+
stableId: db.id,
|
|
118
|
+
status: db.isDisplayComplete ? "completed" : "pending",
|
|
119
|
+
isLastPending,
|
|
120
|
+
node,
|
|
121
|
+
startOffset: 0,
|
|
122
|
+
endOffset: 0,
|
|
123
|
+
rawText: ""
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
});
|
|
32
127
|
function append(chunk) {
|
|
33
128
|
isLoading.value = true;
|
|
34
129
|
const update = parser.append(chunk);
|
|
@@ -64,6 +159,7 @@ function useIncremark(options = {}) {
|
|
|
64
159
|
pendingBlocks.value = [];
|
|
65
160
|
markdown.value = "";
|
|
66
161
|
isLoading.value = false;
|
|
162
|
+
transformer?.reset();
|
|
67
163
|
}
|
|
68
164
|
function render14(content) {
|
|
69
165
|
const update = parser.render(content);
|
|
@@ -73,6 +169,43 @@ function useIncremark(options = {}) {
|
|
|
73
169
|
isLoading.value = false;
|
|
74
170
|
return update;
|
|
75
171
|
}
|
|
172
|
+
const typewriter = {
|
|
173
|
+
enabled: typewriterEnabled,
|
|
174
|
+
isProcessing: computed(() => isTypewriterProcessing.value),
|
|
175
|
+
isPaused: computed(() => isTypewriterPaused.value),
|
|
176
|
+
effect: computed(() => typewriterEffect.value),
|
|
177
|
+
skip: () => transformer?.skip(),
|
|
178
|
+
pause: () => {
|
|
179
|
+
transformer?.pause();
|
|
180
|
+
isTypewriterPaused.value = true;
|
|
181
|
+
},
|
|
182
|
+
resume: () => {
|
|
183
|
+
transformer?.resume();
|
|
184
|
+
isTypewriterPaused.value = false;
|
|
185
|
+
},
|
|
186
|
+
setOptions: (opts) => {
|
|
187
|
+
if (opts.enabled !== void 0) {
|
|
188
|
+
typewriterEnabled.value = opts.enabled;
|
|
189
|
+
}
|
|
190
|
+
if (opts.charsPerTick !== void 0 || opts.tickInterval !== void 0 || opts.effect !== void 0 || opts.pauseOnHidden !== void 0) {
|
|
191
|
+
transformer?.setOptions({
|
|
192
|
+
charsPerTick: opts.charsPerTick,
|
|
193
|
+
tickInterval: opts.tickInterval,
|
|
194
|
+
effect: opts.effect,
|
|
195
|
+
pauseOnHidden: opts.pauseOnHidden
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (opts.effect !== void 0) {
|
|
199
|
+
typewriterEffect.value = opts.effect;
|
|
200
|
+
}
|
|
201
|
+
if (opts.cursor !== void 0) {
|
|
202
|
+
typewriterCursor.value = opts.cursor;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
onUnmounted(() => {
|
|
207
|
+
transformer?.destroy();
|
|
208
|
+
});
|
|
76
209
|
return {
|
|
77
210
|
/** 已收集的完整 Markdown 字符串 */
|
|
78
211
|
markdown,
|
|
@@ -82,7 +215,7 @@ function useIncremark(options = {}) {
|
|
|
82
215
|
pendingBlocks,
|
|
83
216
|
/** 当前完整的 AST */
|
|
84
217
|
ast,
|
|
85
|
-
/**
|
|
218
|
+
/** 用于渲染的 blocks(根据打字机设置自动处理) */
|
|
86
219
|
blocks,
|
|
87
220
|
/** 是否正在加载 */
|
|
88
221
|
isLoading,
|
|
@@ -92,12 +225,14 @@ function useIncremark(options = {}) {
|
|
|
92
225
|
finalize,
|
|
93
226
|
/** 强制中断 */
|
|
94
227
|
abort,
|
|
95
|
-
/**
|
|
228
|
+
/** 重置解析器和打字机 */
|
|
96
229
|
reset,
|
|
97
230
|
/** 一次性渲染(reset + append + finalize) */
|
|
98
231
|
render: render14,
|
|
99
232
|
/** 解析器实例 */
|
|
100
|
-
parser
|
|
233
|
+
parser,
|
|
234
|
+
/** 打字机控制 */
|
|
235
|
+
typewriter
|
|
101
236
|
};
|
|
102
237
|
}
|
|
103
238
|
|
|
@@ -126,7 +261,7 @@ function useStreamRenderer(options) {
|
|
|
126
261
|
}
|
|
127
262
|
|
|
128
263
|
// src/composables/useDevTools.ts
|
|
129
|
-
import { onMounted, onUnmounted } from "vue";
|
|
264
|
+
import { onMounted, onUnmounted as onUnmounted2 } from "vue";
|
|
130
265
|
import { createDevTools } from "@incremark/devtools";
|
|
131
266
|
function useDevTools(incremark, options = {}) {
|
|
132
267
|
const devtools = createDevTools(options);
|
|
@@ -147,7 +282,7 @@ function useDevTools(incremark, options = {}) {
|
|
|
147
282
|
onMounted(() => {
|
|
148
283
|
devtools.mount();
|
|
149
284
|
});
|
|
150
|
-
|
|
285
|
+
onUnmounted2(() => {
|
|
151
286
|
devtools.unmount();
|
|
152
287
|
incremark.parser.setOnChange(void 0);
|
|
153
288
|
});
|
|
@@ -155,16 +290,16 @@ function useDevTools(incremark, options = {}) {
|
|
|
155
290
|
}
|
|
156
291
|
|
|
157
292
|
// src/composables/useBlockTransformer.ts
|
|
158
|
-
import { ref as ref3, watch, computed as computed3, onUnmounted as
|
|
293
|
+
import { ref as ref3, watch as watch2, computed as computed3, onUnmounted as onUnmounted3 } from "vue";
|
|
159
294
|
import {
|
|
160
|
-
createBlockTransformer
|
|
295
|
+
createBlockTransformer as createBlockTransformer2
|
|
161
296
|
} from "@incremark/core";
|
|
162
297
|
function useBlockTransformer(sourceBlocks, options = {}) {
|
|
163
298
|
const displayBlocksRef = ref3([]);
|
|
164
299
|
const isProcessingRef = ref3(false);
|
|
165
300
|
const isPausedRef = ref3(false);
|
|
166
301
|
const effectRef = ref3(options.effect ?? "none");
|
|
167
|
-
const transformer =
|
|
302
|
+
const transformer = createBlockTransformer2({
|
|
168
303
|
...options,
|
|
169
304
|
onChange: (blocks) => {
|
|
170
305
|
displayBlocksRef.value = blocks;
|
|
@@ -172,7 +307,7 @@ function useBlockTransformer(sourceBlocks, options = {}) {
|
|
|
172
307
|
isPausedRef.value = transformer.isPausedState();
|
|
173
308
|
}
|
|
174
309
|
});
|
|
175
|
-
|
|
310
|
+
watch2(
|
|
176
311
|
sourceBlocks,
|
|
177
312
|
(blocks) => {
|
|
178
313
|
transformer.push(blocks);
|
|
@@ -186,7 +321,7 @@ function useBlockTransformer(sourceBlocks, options = {}) {
|
|
|
186
321
|
},
|
|
187
322
|
{ immediate: true, deep: true }
|
|
188
323
|
);
|
|
189
|
-
|
|
324
|
+
onUnmounted3(() => {
|
|
190
325
|
transformer.destroy();
|
|
191
326
|
});
|
|
192
327
|
return {
|
|
@@ -227,7 +362,7 @@ import { defineComponent as _defineComponent2 } from "vue";
|
|
|
227
362
|
|
|
228
363
|
// sfc-script:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=script
|
|
229
364
|
import { defineComponent as _defineComponent } from "vue";
|
|
230
|
-
import { computed as computed4, ref as ref4, watch as
|
|
365
|
+
import { computed as computed4, ref as ref4, watch as watch3, shallowRef as shallowRef2, onUnmounted as onUnmounted4 } from "vue";
|
|
231
366
|
var IncremarkMath_default = /* @__PURE__ */ _defineComponent({
|
|
232
367
|
__name: "IncremarkMath",
|
|
233
368
|
props: {
|
|
@@ -278,12 +413,12 @@ var IncremarkMath_default = /* @__PURE__ */ _defineComponent({
|
|
|
278
413
|
isLoading.value = false;
|
|
279
414
|
}
|
|
280
415
|
}
|
|
281
|
-
|
|
416
|
+
onUnmounted4(() => {
|
|
282
417
|
if (renderTimer) {
|
|
283
418
|
clearTimeout(renderTimer);
|
|
284
419
|
}
|
|
285
420
|
});
|
|
286
|
-
|
|
421
|
+
watch3(formula, scheduleRender, { immediate: true });
|
|
287
422
|
const __returned__ = { props, renderedHtml, renderError, isLoading, katexRef, get renderTimer() {
|
|
288
423
|
return renderTimer;
|
|
289
424
|
}, set renderTimer(v) {
|
|
@@ -386,10 +521,28 @@ var IncremarkInline_default = /* @__PURE__ */ _defineComponent2({
|
|
|
386
521
|
},
|
|
387
522
|
setup(__props, { expose: __expose }) {
|
|
388
523
|
__expose();
|
|
389
|
-
function
|
|
390
|
-
|
|
524
|
+
function getStableText(node) {
|
|
525
|
+
if (!node.chunks || node.chunks.length === 0) {
|
|
526
|
+
return node.value;
|
|
527
|
+
}
|
|
528
|
+
return node.value.slice(0, node.stableLength ?? 0);
|
|
529
|
+
}
|
|
530
|
+
function hasChunks(node) {
|
|
531
|
+
return node.type === "text" && "chunks" in node && Array.isArray(node.chunks);
|
|
532
|
+
}
|
|
533
|
+
function getChunks(node) {
|
|
534
|
+
if (hasChunks(node)) {
|
|
535
|
+
return node.chunks;
|
|
536
|
+
}
|
|
537
|
+
return void 0;
|
|
538
|
+
}
|
|
539
|
+
function isHtmlNode(node) {
|
|
540
|
+
return node.type === "html";
|
|
391
541
|
}
|
|
392
|
-
|
|
542
|
+
function isInlineMath(node) {
|
|
543
|
+
return node.type === "inlineMath";
|
|
544
|
+
}
|
|
545
|
+
const __returned__ = { getStableText, hasChunks, getChunks, isHtmlNode, isInlineMath, IncremarkMath: IncremarkMath_default2 };
|
|
393
546
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
394
547
|
return __returned__;
|
|
395
548
|
}
|
|
@@ -411,20 +564,40 @@ function render2(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
411
564
|
_Fragment2,
|
|
412
565
|
{ key: idx },
|
|
413
566
|
[
|
|
414
|
-
_createCommentVNode2(" \u6587\u672C "),
|
|
567
|
+
_createCommentVNode2(" \u6587\u672C\uFF08\u652F\u6301 chunks \u6E10\u5165\u52A8\u753B\uFF09 "),
|
|
415
568
|
node.type === "text" ? (_openBlock2(), _createElementBlock2(
|
|
416
569
|
_Fragment2,
|
|
417
570
|
{ key: 0 },
|
|
418
571
|
[
|
|
572
|
+
_createCommentVNode2(" \u7A33\u5B9A\u6587\u672C\uFF08\u5DF2\u7ECF\u663E\u793A\u8FC7\u7684\u90E8\u5206\uFF0C\u65E0\u52A8\u753B\uFF09 "),
|
|
419
573
|
_createTextVNode(
|
|
420
|
-
_toDisplayString2(node
|
|
574
|
+
" " + _toDisplayString2($setup.getStableText(node)) + " ",
|
|
421
575
|
1
|
|
422
576
|
/* TEXT */
|
|
423
|
-
)
|
|
577
|
+
),
|
|
578
|
+
_createCommentVNode2(" \u65B0\u589E\u7684 chunk \u90E8\u5206\uFF08\u5E26\u6E10\u5165\u52A8\u753B\uFF09 "),
|
|
579
|
+
(_openBlock2(true), _createElementBlock2(
|
|
580
|
+
_Fragment2,
|
|
581
|
+
null,
|
|
582
|
+
_renderList($setup.getChunks(node), (chunk) => {
|
|
583
|
+
return _openBlock2(), _createElementBlock2(
|
|
584
|
+
"span",
|
|
585
|
+
{
|
|
586
|
+
key: chunk.createdAt,
|
|
587
|
+
class: "incremark-fade-in"
|
|
588
|
+
},
|
|
589
|
+
_toDisplayString2(chunk.text),
|
|
590
|
+
1
|
|
591
|
+
/* TEXT */
|
|
592
|
+
);
|
|
593
|
+
}),
|
|
594
|
+
128
|
|
595
|
+
/* KEYED_FRAGMENT */
|
|
596
|
+
))
|
|
424
597
|
],
|
|
425
598
|
64
|
|
426
599
|
/* STABLE_FRAGMENT */
|
|
427
|
-
)) : node
|
|
600
|
+
)) : $setup.isInlineMath(node) ? (_openBlock2(), _createElementBlock2(
|
|
428
601
|
_Fragment2,
|
|
429
602
|
{ key: 1 },
|
|
430
603
|
[
|
|
@@ -534,11 +707,11 @@ function render2(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
534
707
|
],
|
|
535
708
|
2112
|
|
536
709
|
/* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
|
|
537
|
-
)) : node
|
|
710
|
+
)) : $setup.isHtmlNode(node) ? (_openBlock2(), _createElementBlock2(
|
|
538
711
|
_Fragment2,
|
|
539
712
|
{ key: 9 },
|
|
540
713
|
[
|
|
541
|
-
_createCommentVNode2(" \u539F\u59CB HTML
|
|
714
|
+
_createCommentVNode2(" \u539F\u59CB HTML "),
|
|
542
715
|
_createElementVNode2("span", {
|
|
543
716
|
innerHTML: node.value
|
|
544
717
|
}, null, 8, _hoisted_42)
|
|
@@ -631,7 +804,7 @@ var IncremarkParagraph_default2 = IncremarkParagraph_default;
|
|
|
631
804
|
|
|
632
805
|
// sfc-script:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=script
|
|
633
806
|
import { defineComponent as _defineComponent5 } from "vue";
|
|
634
|
-
import { computed as computed6, ref as ref5, watch as
|
|
807
|
+
import { computed as computed6, ref as ref5, watch as watch4, shallowRef as shallowRef3, onUnmounted as onUnmounted5 } from "vue";
|
|
635
808
|
var IncremarkCode_default = /* @__PURE__ */ _defineComponent5({
|
|
636
809
|
__name: "IncremarkCode",
|
|
637
810
|
props: {
|
|
@@ -696,7 +869,7 @@ var IncremarkCode_default = /* @__PURE__ */ _defineComponent5({
|
|
|
696
869
|
mermaidLoading.value = false;
|
|
697
870
|
}
|
|
698
871
|
}
|
|
699
|
-
|
|
872
|
+
onUnmounted5(() => {
|
|
700
873
|
if (mermaidTimer) {
|
|
701
874
|
clearTimeout(mermaidTimer);
|
|
702
875
|
}
|
|
@@ -749,7 +922,7 @@ var IncremarkCode_default = /* @__PURE__ */ _defineComponent5({
|
|
|
749
922
|
isHighlighting.value = false;
|
|
750
923
|
}
|
|
751
924
|
}
|
|
752
|
-
|
|
925
|
+
watch4([code, () => props.theme, isMermaid], highlight, { immediate: true });
|
|
753
926
|
async function copyCode() {
|
|
754
927
|
try {
|
|
755
928
|
await navigator.clipboard.writeText(code.value);
|
|
@@ -1408,7 +1581,7 @@ var IncremarkRenderer_default2 = IncremarkRenderer_default;
|
|
|
1408
1581
|
|
|
1409
1582
|
// sfc-script:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=script
|
|
1410
1583
|
import { defineComponent as _defineComponent13 } from "vue";
|
|
1411
|
-
import { ref as ref6, onMounted as onMounted2, onUnmounted as
|
|
1584
|
+
import { ref as ref6, onMounted as onMounted2, onUnmounted as onUnmounted6, nextTick } from "vue";
|
|
1412
1585
|
var AutoScrollContainer_default = /* @__PURE__ */ _defineComponent13({
|
|
1413
1586
|
__name: "AutoScrollContainer",
|
|
1414
1587
|
props: {
|
|
@@ -1487,7 +1660,7 @@ var AutoScrollContainer_default = /* @__PURE__ */ _defineComponent13({
|
|
|
1487
1660
|
characterData: true
|
|
1488
1661
|
});
|
|
1489
1662
|
});
|
|
1490
|
-
|
|
1663
|
+
onUnmounted6(() => {
|
|
1491
1664
|
observer?.disconnect();
|
|
1492
1665
|
});
|
|
1493
1666
|
__expose({
|
|
@@ -1543,7 +1716,7 @@ var AutoScrollContainer_default2 = AutoScrollContainer_default;
|
|
|
1543
1716
|
// src/index.ts
|
|
1544
1717
|
import {
|
|
1545
1718
|
BlockTransformer as BlockTransformer2,
|
|
1546
|
-
createBlockTransformer as
|
|
1719
|
+
createBlockTransformer as createBlockTransformer3,
|
|
1547
1720
|
countChars,
|
|
1548
1721
|
sliceAst,
|
|
1549
1722
|
cloneNode,
|
|
@@ -1552,7 +1725,7 @@ import {
|
|
|
1552
1725
|
imagePlugin,
|
|
1553
1726
|
mathPlugin,
|
|
1554
1727
|
thematicBreakPlugin,
|
|
1555
|
-
defaultPlugins,
|
|
1728
|
+
defaultPlugins as defaultPlugins2,
|
|
1556
1729
|
allPlugins,
|
|
1557
1730
|
createPlugin
|
|
1558
1731
|
} from "@incremark/core";
|
|
@@ -1575,9 +1748,9 @@ export {
|
|
|
1575
1748
|
cloneNode,
|
|
1576
1749
|
codeBlockPlugin,
|
|
1577
1750
|
countChars,
|
|
1578
|
-
|
|
1751
|
+
createBlockTransformer3 as createBlockTransformer,
|
|
1579
1752
|
createPlugin,
|
|
1580
|
-
defaultPlugins,
|
|
1753
|
+
defaultPlugins2 as defaultPlugins,
|
|
1581
1754
|
imagePlugin,
|
|
1582
1755
|
mathPlugin,
|
|
1583
1756
|
mermaidPlugin,
|