import MarkdownIt from "markdown-it"; import { getText, hideRhs, showRhs } from "plugos-silverbullet-syscall/editor"; import * as clientStore from "plugos-silverbullet-syscall/clientStore"; import { parseMarkdown } from "plugos-silverbullet-syscall/markdown"; import { renderToText, replaceNodesMatching } from "../../common/tree"; const css = ` `; var taskLists = require("markdown-it-task-lists"); const md = new MarkdownIt({ linkify: true, html: false, typographer: true, }).use(taskLists); export async function togglePreview() { let currentValue = !!(await clientStore.get("enableMarkdownPreview")); await clientStore.set("enableMarkdownPreview", !currentValue); if (!currentValue) { updateMarkdownPreview(); } else { hideMarkdownPreview(); } } function encodePageUrl(name: string): string { return name.replaceAll(" ", "_"); } export async function cleanMarkdown(text: string) { let mdTree = await parseMarkdown(text); replaceNodesMatching(mdTree, (n) => { if (n.type === "WikiLink") { const page = n.children![1].children![0].text!; return { // HACK text: `[${page}](/${encodePageUrl(page)})`, }; } // Simply get rid of these if (n.type === "CommentBlock" || n.type === "Comment") { return null; } }); let html = md.render(renderToText(mdTree)); return html; } export async function updateMarkdownPreview() { if (!(await clientStore.get("enableMarkdownPreview"))) { return; } let text = await getText(); let html = await cleanMarkdown(text); await showRhs(`${css}${html}`, 2); } async function hideMarkdownPreview() { await hideRhs(); }