1
0
silverbullet/plugs/query/template.ts

69 lines
2.0 KiB
TypeScript
Raw Normal View History

import { WidgetContent } from "$sb/app_event.ts";
2023-11-15 13:56:34 +00:00
import { markdown, space, system, YAML } from "$sb/syscalls.ts";
2023-11-06 08:14:16 +00:00
import { loadPageObject, replaceTemplateVars } from "../template/template.ts";
import { PageMeta } from "$sb/types.ts";
2023-11-15 13:56:34 +00:00
import { renderTemplate } from "../template/plug_api.ts";
import { renderToText } from "$sb/lib/tree.ts";
2023-11-16 12:55:02 +00:00
import { rewritePageRefs, rewritePageRefsInString } from "$sb/lib/resolve.ts";
type TemplateConfig = {
// Pull the template from a page
page?: string;
// Or use a string directly
template?: string;
// Optional argument to pass
value?: any;
// If true, don't render the template, just use it as-is
raw?: boolean;
};
2023-11-02 11:51:09 +00:00
export async function widget(
bodyText: string,
pageName: string,
): Promise<WidgetContent> {
2023-11-06 08:14:16 +00:00
const pageMeta: PageMeta = await loadPageObject(pageName);
try {
const config: TemplateConfig = await YAML.parse(bodyText);
let templateText = config.template || "";
2023-10-03 16:09:03 +00:00
let templatePage = config.page;
if (templatePage) {
2023-11-16 12:55:02 +00:00
// Rewrite federation page references
templatePage = rewritePageRefsInString(templatePage, pageName);
2023-10-03 16:09:03 +00:00
if (templatePage.startsWith("[[")) {
templatePage = templatePage.slice(2, -2);
}
2023-11-19 11:18:16 +00:00
if (!templatePage) {
throw new Error("No template page specified");
}
2023-10-03 16:09:03 +00:00
templateText = await space.readPage(templatePage);
}
const value = config.value
? JSON.parse(
await replaceTemplateVars(JSON.stringify(config.value), pageMeta),
)
: undefined;
2023-11-15 13:56:34 +00:00
let { text: rendered } = config.raw
? { text: templateText }
: await renderTemplate(
templateText,
pageMeta,
value,
);
2023-10-03 16:09:03 +00:00
if (templatePage) {
2023-10-29 09:02:50 +00:00
const parsedMarkdown = await markdown.parseMarkdown(rendered);
2023-10-03 16:09:03 +00:00
rewritePageRefs(parsedMarkdown, templatePage);
2023-10-29 09:02:50 +00:00
rendered = renderToText(parsedMarkdown);
2023-10-03 16:09:03 +00:00
}
2023-12-27 12:46:45 +00:00
return { markdown: rendered };
} catch (e: any) {
2023-12-27 12:46:45 +00:00
return {
markdown: `**Error:** ${e.message}`,
};
}
}