feat: add markdown word editor for knowledge workspace

This commit is contained in:
Administrator committed 2026-08-18 00:44:29 +08:00
1 parent 68c4896088
commit 64a5305bbf
8 files changed
+297 -28

No files matched your search

@@ -1,6 +1,11 @@
"use client";
import { markdown, markdownLanguage } from "@codemirror/lang-markdown";
import { languages } from "@codemirror/language-data";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { basicLightInit } from "@uiw/codemirror-theme-basic";
import { monokaiInit } from "@uiw/codemirror-theme-monokai";
import CodeMirror from "@uiw/react-codemirror";
import {
BookOpen,
Check,
@@ -39,7 +44,6 @@ import {
} from "@/components/ui/dialog";
import { ScrollArea } from "@/components/ui/scroll-area";
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Textarea } from "@/components/ui/textarea";
import {
Tooltip,
TooltipContent,
@@ -55,6 +59,7 @@ import { downloadMarkdownAsDocx } from "@/core/scheduled-tasks/markdown-docx";
import { reasoningPlugins } from "@/core/streamdown";
import { createMarkdownAnchorResolver } from "@/core/utils/markdown";
import { cn } from "@/lib/utils";
import { useTheme } from "next-themes";
type PublicTask = {
task_id: string;
@@ -903,6 +908,58 @@ function PublicFullscreenPreviewContent({ preview }: { preview: PublicFullscreen
return <pre className="whitespace-pre-wrap break-words text-sm">{preview.content || "无正文内容"}</pre>;
}
const markdownEditorDarkTheme = monokaiInit({
settings: {
background: "transparent",
gutterBackground: "transparent",
fontSize: "14px",
},
});
const markdownEditorLightTheme = basicLightInit({
settings: {
background: "transparent",
fontSize: "14px",
},
});
function PublicMarkdownEditor({
value,
onChange,
}: {
value: string;
onChange: (value: string) => void;
}) {
const { resolvedTheme } = useTheme();
const extensions = useMemo(
() => [
markdown({
base: markdownLanguage,
codeLanguages: languages,
}),
],
[],
);
return (
<div className="min-h-0 flex-1 overflow-hidden rounded-md border bg-background">
<CodeMirror
value={value}
onChange={onChange}
theme={resolvedTheme === "dark" ? markdownEditorDarkTheme : markdownEditorLightTheme}
extensions={extensions}
basicSetup={{
foldGutter: true,
highlightActiveLine: true,
highlightActiveLineGutter: false,
lineNumbers: true,
}}
className="h-full overflow-auto font-mono [&_.cm-editor]:h-full [&_.cm-focused]:outline-none!"
/>
</div>
);
}
function publicFullscreenHref(taskId: string, runId: string, tab: ContentTab): string {
const params = new URLSearchParams();
params.set("tab", tab.kind);
@@ -1320,12 +1377,7 @@ function RunDetailPane({ run, taskId }: { run: PublicRun; taskId: string }) {
正在加载文件内容...
</div>
) : isEditing ? (
<Textarea
value={draft}
onChange={(event) => setDraft(event.target.value)}
className="min-h-0 flex-1 resize-none font-mono text-sm"
spellCheck={false}
/>
<PublicMarkdownEditor value={draft} onChange={setDraft} />
) : (
<ScrollArea className="min-h-0 flex-1">
{showEmptyHint ? (