1
0
silverbullet/plugs/core/template.ts

77 lines
2.4 KiB
TypeScript

import { listPages, readPage, writePage } from "plugos-silverbullet-syscall/space";
import { filterBox, getCurrentPage, getText, navigate, prompt } from "plugos-silverbullet-syscall/editor";
import { parseMarkdown } from "plugos-silverbullet-syscall/markdown";
import { extractMeta } from "../query/data";
import { renderToText } from "../../common/tree";
import { niceDate } from "./dates";
import { invokeFunction } from "plugos-silverbullet-syscall/system";
const pageTemplatePrefix = `template/page/`;
export async function instantiateTemplateCommand() {
let allPages = await listPages();
let allPageTemplates = allPages.filter((pageMeta) =>
pageMeta.name.startsWith(pageTemplatePrefix)
);
let selectedTemplate = await filterBox(
"Template",
allPageTemplates,
"Select the template to create a new page from"
);
if (!selectedTemplate) {
return;
}
console.log("Selected template", selectedTemplate);
let { text } = await readPage(selectedTemplate.name);
let parseTree = await parseMarkdown(text);
let additionalPageMeta = extractMeta(parseTree, true);
console.log("Page meta", additionalPageMeta);
let pageName = await prompt("Name of new page", additionalPageMeta.name);
if (!pageName) {
return;
}
await invokeFunction(
"server",
"instantiateTemplate",
pageName,
renderToText(parseTree)
);
// let pageText = replaceTemplateVars(, pageName);
// await writePage(pageName, pageText);
await navigate(pageName);
}
export async function instantiateTemplate(pageName: string, text: string) {
let pageText = replaceTemplateVars(text, pageName);
await writePage(pageName, pageText);
}
export async function replaceTemplateVarsCommand() {
let currentPage = await getCurrentPage();
let text = await getText();
await invokeFunction("server", "instantiateTemplate", currentPage, text);
}
export function replaceTemplateVars(s: string, pageName: string): string {
return s.replaceAll(/\{\{([^\}]+)\}\}/g, (match, v) => {
switch (v) {
case "today":
return niceDate(new Date());
case "yesterday":
let yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
return niceDate(yesterday);
case "lastWeek":
let lastWeek = new Date();
lastWeek.setDate(lastWeek.getDate() - 7);
return niceDate(lastWeek);
}
return match;
});
}