a711f98703
Zweiter Notiz-Typ neben Markdown. Beide tragen dieselben Angaben, nur an ihrer jeweils üblichen Stelle: Markdown im Frontmatter, HTML in <title> und <meta name=…>. - domain/archive_html.rs: Gerüst, Metadaten, Titel setzen, Rumpf lesen und ersetzen, Text ohne Markup für den Suchindex. - Der Scan nimmt .html auf; Doc und WikiDocEntry führen `kind` (md|html). doc_path, set_title, write_body, ensure_ids und die Knotentext-Regel arbeiten typbewusst; ein Knotentext darf .md oder .html sein. - archive_create_html legt eine leere HTML-Notiz an; Anlegen schreibt nicht mehr in den Entwurfs-Puffer, sondern liefert die ID der neuen Notiz — die Ansicht wählt sie aus und öffnet den Editor. - Anzeige: HTML-Notizen erscheinen als Markup statt durch den Markdown-Renderer, mit klickbaren Wikilinks; eigenes Symbol im Baum. - Editor: html-editor.ts auf ProseMirror (MIT, ohne Anbieter-Stufe). DOMParser liest den Rumpf, DOMSerializer schreibt ihn zurück — gespeichert wird, was der Editor zeigt. Werkzeugleiste mit Überschriften, Auszeichnung, Listen, Ein-/Ausrücken, Tabellen und Links; Tastenkürzel für fett, kursiv, Rückgängig und Zellenwechsel. Markdown behält den Rohtext-Editor mit Live-Vorschau. - CSP: style-src erlaubt 'unsafe-inline', sonst blockiert die Richtlinie die Stil-Attribute in HTML-Notizen und alles erscheint unformatiert. script-src bleibt streng.
89 lines
3.5 KiB
TypeScript
89 lines
3.5 KiB
TypeScript
import { invoke } from "@tauri-apps/api/core";
|
|
import { initSearchView } from "../search-view";
|
|
import { initWikiView } from "../wiki-view";
|
|
import type { PanelTab } from "./index";
|
|
|
|
/// Suchtreffer-Sprung ins Archiv: der Treffer merkt den relpath vor, lädt die
|
|
/// Übersicht neu (wiki-update wechselt den Tab), und die Archiv-Ansicht holt
|
|
/// die Vormerkung beim nächsten set() ab.
|
|
let pendingSelect: string | null = null;
|
|
|
|
export const wikiTab: PanelTab = {
|
|
mode: "wiki",
|
|
module: "archive",
|
|
buffer: "wiki",
|
|
popupOnly: true,
|
|
labelKey: "panel.tabWiki",
|
|
titleKey: "panel.tabWikiTitle",
|
|
// Dokument-/Ordner-Operationen laufen als Commands; der neue Stand kommt
|
|
// über den Wiki-Puffer (wiki-update) zurück, Fehler als Toast. Der
|
|
// Notiz-Inhalt kommt pro Auswahl über archive_read; Bearbeiten lädt wie
|
|
// bisher in den Dokument-Tab.
|
|
init: (container, ctx) => {
|
|
const run = (cmd: string, args: Record<string, string>) =>
|
|
void invoke(cmd, { project: ctx.project, ...args }).catch((e) =>
|
|
ctx.toast(String(e)),
|
|
);
|
|
// Anlegen liefert die ID der neuen Notiz zurück.
|
|
const create = (cmd: string, args: Record<string, string>) =>
|
|
invoke<string>(cmd, { project: ctx.project, ...args }).catch((e) => {
|
|
ctx.toast(String(e));
|
|
throw e;
|
|
});
|
|
return initWikiView(container, {
|
|
autoStart: ctx.standalone,
|
|
readDoc: (id) => invoke("archive_read", { project: ctx.project, id }),
|
|
writeDoc: (id, text) => invoke("archive_write", { project: ctx.project, id, text }),
|
|
setTitle: (id, title) => run("archive_set_title", { id, title }),
|
|
openWiki: ctx.openWiki,
|
|
takePending: () => {
|
|
const p = pendingSelect;
|
|
pendingSelect = null;
|
|
return p;
|
|
},
|
|
actions: {
|
|
remove: (id) => run("archive_delete", { id }),
|
|
createFolder: (parent, name) => run("archive_create_folder", { parent, name }),
|
|
createDoc: (parent, name) => create("archive_create_doc", { parent, name }),
|
|
createHtml: (parent, name) => create("archive_create_html", { parent, name }),
|
|
},
|
|
});
|
|
},
|
|
// Beim Aktivieren die Übersicht frisch laden: das Anlegen eines Dokuments
|
|
// öffnet den Dokument-Tab, ohne den Wiki-Puffer anzufassen — und auch
|
|
// direkt archivierte oder von Hand abgelegte Dateien erscheinen so.
|
|
// Die Fenstergröße setzt allein open_panel_window beim Öffnen des Popups.
|
|
onActivate: (_view, ctx) => ctx.openWiki("tag:"),
|
|
};
|
|
|
|
export const searchTab: PanelTab = {
|
|
mode: "search",
|
|
module: "archive",
|
|
buffer: "search",
|
|
popupOnly: true,
|
|
labelKey: "panel.tabSearch",
|
|
titleKey: "panel.tabSearchTitle",
|
|
// Trenner: Archiv-Fenster-Tabs (Archiv, Suche) links, Session-Tabs rechts.
|
|
sepAfter: true,
|
|
// Treffer-Klick öffnet die Notiz im Archiv-Tab: relpath vormerken, die
|
|
// Übersicht frisch laden — das wiki-update wechselt den Tab und die
|
|
// Ansicht wählt die vorgemerkte Notiz aus.
|
|
init: (container, ctx) =>
|
|
initSearchView(
|
|
container,
|
|
(_path, _relpath, id) => {
|
|
pendingSelect = id;
|
|
ctx.openWiki("tag:");
|
|
},
|
|
(raw) => {
|
|
// `#tag`-Tokens filtern aufs Schlagwort, der Rest ist die Volltext-Query.
|
|
const words = raw.split(/\s+/).filter(Boolean);
|
|
const tag = words.find((w) => w.startsWith("#"))?.slice(1) ?? null;
|
|
const query = words.filter((w) => !w.startsWith("#")).join(" ");
|
|
void invoke("search_run", { project: ctx.project, query, tag }).catch((e) =>
|
|
ctx.toast(`Suche fehlgeschlagen: ${e}`),
|
|
);
|
|
},
|
|
),
|
|
};
|