diff --git a/packages/core/src/components/Bubble/index.vue b/packages/core/src/components/Bubble/index.vue index 969c3ba8..60448e63 100644 --- a/packages/core/src/components/Bubble/index.vue +++ b/packages/core/src/components/Bubble/index.vue @@ -18,7 +18,8 @@ const props = withDefaults(defineProps(), { avatarSrcSet: '', avatarAlt: '', avatarFit: 'cover', - noStyle: false + noStyle: false, + renderer: undefined }); const emits = defineEmits(); @@ -191,8 +192,7 @@ defineExpose(instance); ref="typewriterRef" :typing="_typing" :content="content" - :is-markdown="isMarkdown" - :is-fog="props.isFog" + :renderer="renderer" @start="onStart" @writing="onWriting" @finish="onFinish" diff --git a/packages/core/src/components/Bubble/types.d.ts b/packages/core/src/components/Bubble/types.d.ts index cffc76f2..afcc42ea 100644 --- a/packages/core/src/components/Bubble/types.d.ts +++ b/packages/core/src/components/Bubble/types.d.ts @@ -2,7 +2,7 @@ import type { TypewriterProps } from '../Typewriter/types'; export type BubbleProps = Pick< TypewriterProps, - 'isFog' | 'typing' | 'content' | 'isMarkdown' + 'renderer' | 'typing' | 'content' > & { placement?: 'start' | 'end'; avatar?: string; diff --git a/packages/core/src/components/BubbleList/index.vue b/packages/core/src/components/BubbleList/index.vue index 0f319a30..0c15fe7f 100644 --- a/packages/core/src/components/BubbleList/index.vue +++ b/packages/core/src/components/BubbleList/index.vue @@ -239,8 +239,7 @@ defineExpose({ :loading="item.loading" :shape="item.shape" :variant="item.variant" - :is-markdown="item.isMarkdown" - :is-fog="item.isFog" + :renderer="item.renderer" :typing="item.typing" :max-width="item.maxWidth" :avatar="item.avatar" diff --git a/packages/core/src/components/Typewriter/index.vue b/packages/core/src/components/Typewriter/index.vue index 4bc5ab8a..22c18b79 100644 --- a/packages/core/src/components/Typewriter/index.vue +++ b/packages/core/src/components/Typewriter/index.vue @@ -6,37 +6,15 @@ import type { TypewriterProps, TypingConfig } from './types.d.ts'; -import DOMPurify from 'dompurify'; // 新增安全过滤 -import { useConfigProvider } from '../ConfigProvider/hooks.ts'; const props = withDefaults(defineProps(), { content: '', - isMarkdown: false, typing: false, - isFog: false + renderer: undefined }); const emits = defineEmits(); - -const configProvider = useConfigProvider(); -const { md } = configProvider; - -const markdownContentRef = ref(null); const typeWriterRef = ref(null); -function initMarkdownPlugins() { - if (configProvider.mdPlugins?.length) { - configProvider.mdPlugins.forEach(plugin => { - md?.use(plugin); - }); - } - if (props.mdPlugins?.length) { - props.mdPlugins.forEach(plugin => { - md?.use(plugin); - }); - } -} -initMarkdownPlugins(); - const typingIndex = ref(0); const isTyping = ref(false); let timer: ReturnType | null = null; @@ -49,11 +27,8 @@ const mergedConfig: ComputedRef = computed(() => { interval: typeof props.typing === 'object' ? (props.typing.interval ?? 50) : 50, // 根据条件动态设置后缀 - suffix: props.isMarkdown - ? '' - : typeof props.typing === 'object' - ? (props.typing.suffix ?? '|') - : '|' + suffix: + typeof props.typing === 'object' ? (props.typing.suffix ?? '|') : '|' }; // 处理打字配置 @@ -68,7 +43,7 @@ const mergedConfig: ComputedRef = computed(() => { ...defaultConfig, ...props.typing, // 强制覆盖后缀设置 - suffix: props.isMarkdown ? '' : (props.typing.suffix ?? '|') + suffix: props.typing.suffix ?? '|' }; } @@ -95,12 +70,7 @@ const typingProgress = computed(() => { }); // 修改渲染内容计算属性 const renderedContent = computed(() => { - // 非Markdown模式直接返回 - if (!props.isMarkdown) { - return processedContent.value; - } - // Markdown模式添加安全过滤和样式类 - return DOMPurify.sanitize(md?.render(processedContent.value ?? '') ?? ''); + return processedContent.value; }); const instance: TypewriterInstance = { @@ -203,35 +173,32 @@ defineExpose(instance); diff --git a/packages/core/src/components/Typewriter/types.d.ts b/packages/core/src/components/Typewriter/types.d.ts index e4fc74c7..fd6c9892 100644 --- a/packages/core/src/components/Typewriter/types.d.ts +++ b/packages/core/src/components/Typewriter/types.d.ts @@ -1,5 +1,4 @@ -import type MarkdownIt from 'markdown-it'; -import type { ComputedRef, Ref } from 'vue'; +import type { Component, ComputedRef, Ref } from 'vue'; export interface TypingConfig { step?: number; @@ -12,15 +11,10 @@ export interface TypingFogfig { width?: string; } -type MarkdownItPlugin = (md: MarkdownIt) => void; - export interface TypewriterProps { + renderer?: Component; content?: string; - isMarkdown?: boolean; typing?: boolean | TypingConfig; - isFog?: boolean | TypingFogfig; - highlight?: (code: string, language: string) => string; - mdPlugins?: MarkdownItPlugin[]; } export interface TypewriterEmits { diff --git a/packages/core/src/stories/Bubble/Bubble.stories.ts b/packages/core/src/stories/Bubble/Bubble.stories.ts index 84b34954..576543e3 100644 --- a/packages/core/src/stories/Bubble/Bubble.stories.ts +++ b/packages/core/src/stories/Bubble/Bubble.stories.ts @@ -1,6 +1,7 @@ import type BubbleSource from '@components/Bubble/index.vue'; import type { Meta, StoryObj } from '@storybook/vue3'; import { avatar1, mdContent } from '@assets/mock'; +import { XMarkdown } from '../../components'; import CustomSolt from './CustomSolt.vue'; import Bubble from './index.vue'; @@ -10,9 +11,9 @@ const meta = { tags: ['autodocs'], argTypes: { content: { control: 'text' }, - isMarkdown: { control: 'boolean' }, + // isMarkdown: { control: 'boolean' }, typing: { control: 'object' }, - isFog: { control: 'boolean' }, + // isFog: { control: 'boolean' }, // 气泡属性 placement: { control: 'radio', options: ['start', 'end'] }, avatar: { control: 'text' }, @@ -38,14 +39,15 @@ const meta = { avatar: avatar1, loading: false, content: mdContent, - isMarkdown: true, + renderer: markRaw(XMarkdown), + // isMarkdown: true, typing: { step: 2, suffix: '💗', interval: 100, isRequestEnd: true }, - isFog: true, + // isFog: true, placement: 'start', shape: 'round', variant: 'filled', @@ -71,8 +73,8 @@ export const BubbleDemo: Story = { export const SoltDemo: Story = { args: { ...BubbleDemo.args, - content: '欢迎使用 Element Plus X', - ismarkdown: false + content: '欢迎使用 Element Plus X' + // ismarkdown: false } as Story['args'], render: (args: any) => ({ components: { diff --git a/packages/core/src/stories/Bubble/index.vue b/packages/core/src/stories/Bubble/index.vue index c6306052..d2e63391 100644 --- a/packages/core/src/stories/Bubble/index.vue +++ b/packages/core/src/stories/Bubble/index.vue @@ -1,35 +1,36 @@