fix(hololake): ship dynamic persona routes and coherent workspace
This commit is contained in:
parent
5105ec5e32
commit
787ba2ad3f
21 changed files with 1111 additions and 326 deletions
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue