1
0
silverbullet/plugs/markdown/preview.ts

55 lines
1.8 KiB
TypeScript
Raw Normal View History

2023-08-28 15:12:15 +00:00
import { asset, clientStore, editor, markdown, system } from "$sb/syscalls.ts";
import { renderMarkdownToHtml } from "./markdown_render.ts";
2023-07-29 21:41:37 +00:00
import { resolvePath } from "$sb/lib/resolve.ts";
import { expandCodeWidgets } from "./api.ts";
2023-12-19 16:20:47 +00:00
import { folderName, resolve } from "../../common/path.ts";
export async function updateMarkdownPreview() {
2023-08-26 06:31:51 +00:00
if (!(await clientStore.get("enableMarkdownPreview"))) {
return;
}
2023-07-29 21:41:37 +00:00
const currentPage = await editor.getCurrentPage();
2022-10-14 13:11:33 +00:00
const text = await editor.getText();
2023-08-28 15:12:15 +00:00
const mdTree = await markdown.parseMarkdown(text);
// const cleanMd = await cleanMarkdown(text);
2023-10-29 09:02:50 +00:00
const css = await asset.readAsset("assets/preview.css");
const js = await asset.readAsset("assets/preview.js");
await expandCodeWidgets(mdTree, currentPage);
const html = renderMarkdownToHtml(mdTree, {
smartHardBreak: true,
annotationPositions: true,
2023-12-19 16:20:47 +00:00
translateUrls: (url, type) => {
2023-02-23 14:33:51 +00:00
if (!url.includes("://")) {
2023-12-19 16:20:47 +00:00
if (type === "image" && !url.startsWith("/")) {
// Make relative to current folder
url = resolve(folderName(currentPage), decodeURI(url));
} else if (type === "link") { // link
url = resolvePath(currentPage, decodeURI(url), true);
}
2023-02-23 14:33:51 +00:00
}
return url;
},
});
2022-10-14 13:11:33 +00:00
await editor.showPanel(
"rhs",
2,
`<html><head><style>${css}</style></head><body><div id="root">${html}</div></body></html>`,
js,
);
}
export async function previewClickHandler(e: any) {
const [eventName, arg] = JSON.parse(e);
// console.log("Got click", eventName, arg);
switch (eventName) {
case "pos":
// console.log("Moving cursor to", +arg);
await editor.moveCursor(+arg, true);
break;
case "command":
await system.invokeCommand(arg);
break;
}
}