feat: 品牌裁剪弹窗/Markdown 行内短代码与详情视频块等
新增: - BrandCropModal 品牌图裁剪弹窗 + cropImage 工具 - Markdown 行内短代码(inlineShortcodes + remark 插件) - MdDetails 折叠块、MdVideo 视频块组件 - directiveBlocks/inlineShortcodes 测试 其它: - 聊天后端(handler/service chat)调整 - Markdown 渲染链路、编辑器、全局样式与品牌相关面板更新
This commit is contained in:
@@ -3,11 +3,14 @@
|
||||
import ReactMarkdown, { type Components } from "react-markdown";
|
||||
import remarkGfm from "remark-gfm";
|
||||
import { mergeMarkdownComponents } from "@/components/markdown/mergeComponents";
|
||||
import { remarkInlineShortcodes } from "@/components/markdown/remarkInlineShortcodes";
|
||||
import { splitContentSegments } from "@/lib/directiveBlocks";
|
||||
import { expandDyEmojiShortcodes } from "@/lib/dyEmoji";
|
||||
import type { HideKind } from "@/lib/hideBlocks";
|
||||
import MdHideBlock from "@/components/markdown/MdHideBlock";
|
||||
import MdTimeline from "@/components/markdown/MdTimeline";
|
||||
import MdDetails from "@/components/markdown/MdDetails";
|
||||
import MdVideo from "@/components/markdown/MdVideo";
|
||||
import { MdEntriesView } from "@/components/markdown/MdEntries";
|
||||
|
||||
type MarkdownBodyClientProps = {
|
||||
@@ -49,7 +52,11 @@ export default function MarkdownBodyClient({
|
||||
if (seg.type === "md") {
|
||||
if (!seg.text.trim()) return null;
|
||||
return (
|
||||
<ReactMarkdown key={`md-${i}`} remarkPlugins={[remarkGfm]} components={mdComponents}>
|
||||
<ReactMarkdown
|
||||
key={`md-${i}`}
|
||||
remarkPlugins={[remarkGfm, remarkInlineShortcodes]}
|
||||
components={mdComponents}
|
||||
>
|
||||
{seg.text}
|
||||
</ReactMarkdown>
|
||||
);
|
||||
@@ -61,7 +68,10 @@ export default function MarkdownBodyClient({
|
||||
items={seg.items}
|
||||
renderBody={(it) =>
|
||||
it.body.trim() ? (
|
||||
<ReactMarkdown remarkPlugins={[remarkGfm]} components={nestedMd}>
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm, remarkInlineShortcodes]}
|
||||
components={nestedMd}
|
||||
>
|
||||
{expandDyEmojiShortcodes(it.body)}
|
||||
</ReactMarkdown>
|
||||
) : null
|
||||
@@ -76,13 +86,33 @@ export default function MarkdownBodyClient({
|
||||
items={seg.items}
|
||||
titleIds={entriesTitleIds?.[i]}
|
||||
renderMd={(t) => (
|
||||
<ReactMarkdown remarkPlugins={[remarkGfm]} components={nestedMd}>
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm, remarkInlineShortcodes]}
|
||||
components={nestedMd}
|
||||
>
|
||||
{expandDyEmojiShortcodes(t)}
|
||||
</ReactMarkdown>
|
||||
)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
if (seg.type === "details") {
|
||||
return (
|
||||
<MdDetails key={`details-${i}`} title={seg.title}>
|
||||
{seg.body.trim() ? (
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm, remarkInlineShortcodes]}
|
||||
components={nestedMd}
|
||||
>
|
||||
{expandDyEmojiShortcodes(seg.body)}
|
||||
</ReactMarkdown>
|
||||
) : null}
|
||||
</MdDetails>
|
||||
);
|
||||
}
|
||||
if (seg.type === "video") {
|
||||
return <MdVideo key={`video-${i}`} provider={seg.provider} id={seg.id} />;
|
||||
}
|
||||
const kind = seg.kind as HideKind;
|
||||
if (seg.locked) {
|
||||
return (
|
||||
@@ -100,7 +130,10 @@ export default function MarkdownBodyClient({
|
||||
return (
|
||||
<MdHideBlock key={`hide-${i}`} kind={kind} points={seg.points}>
|
||||
{seg.body.trim() ? (
|
||||
<ReactMarkdown remarkPlugins={[remarkGfm]} components={nestedMd}>
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm, remarkInlineShortcodes]}
|
||||
components={nestedMd}
|
||||
>
|
||||
{expandDyEmojiShortcodes(seg.body)}
|
||||
</ReactMarkdown>
|
||||
) : null}
|
||||
|
||||
Reference in New Issue
Block a user