fix(hololake): ship dynamic persona routes and coherent workspace

This commit is contained in:
冰朔 2026-08-09 10:43:56 +08:00
commit 787ba2ad3f
21 changed files with 1111 additions and 326 deletions

View file

@ -1,14 +1,15 @@
import { useState, useEffect, useMemo } from 'react';
import { DocContent } from '../api';
import { marked } from 'marked';
import { cleanDisplayText } from '../presentation';
import { renderKnowledgeMarkdown } from '../markdown';
interface Props {
doc: DocContent;
onSave: (title: string, body: string) => void;
onWikiSelect?: (target: string) => void;
}
export function Editor({ doc, onSave }: Props) {
export function Editor({ doc, onSave, onWikiSelect }: Props) {
const [editing, setEditing] = useState(false);
const [title, setTitle] = useState(doc.meta.title);
const [body, setBody] = useState(doc.body);
@ -22,7 +23,7 @@ export function Editor({ doc, onSave }: Props) {
const rendered = useMemo(() => {
try {
return marked(body, { async: false }) as string;
return renderKnowledgeMarkdown(body);
} catch {
return '<p>渲染失败</p>';
}
@ -40,6 +41,15 @@ export function Editor({ doc, onSave }: Props) {
};
const displayPath = doc.meta.id.split('/').map(cleanDisplayText).join(' / ');
const handleRenderedClick = (event: React.MouseEvent<HTMLDivElement>) => {
const anchor = (event.target as HTMLElement).closest<HTMLAnchorElement>('a[data-hololake-wiki="true"]');
if (!anchor) return;
event.preventDefault();
const prefix = 'hololake://knowledge/';
const rawTarget = anchor.href.startsWith(prefix) ? anchor.href.slice(prefix.length) : anchor.title;
if (rawTarget) onWikiSelect?.(decodeURIComponent(rawTarget));
};
return (
<div className="kb-editor">
<div className="kb-page-symbol" aria-hidden="true"></div>
@ -91,6 +101,7 @@ export function Editor({ doc, onSave }: Props) {
<div className="kb-editor-preview-pane">
<div
className="kb-markdown-render"
onClick={handleRenderedClick}
dangerouslySetInnerHTML={{ __html: rendered }}
/>
</div>
@ -99,6 +110,7 @@ export function Editor({ doc, onSave }: Props) {
<div className="kb-editor-read-pane">
<div
className="kb-markdown-render"
onClick={handleRenderedClick}
dangerouslySetInnerHTML={{ __html: rendered }}
/>
</div>