Factored out materialized query providers
This commit is contained in:
@@ -25,14 +25,26 @@ functions:
|
||||
events:
|
||||
- page:saved
|
||||
- page:deleted
|
||||
pageQueryProvider:
|
||||
path: ./page.ts:pageQueryProvider
|
||||
events:
|
||||
- query:page
|
||||
indexLinks:
|
||||
path: "./page.ts:indexLinks"
|
||||
events:
|
||||
- page:index
|
||||
linkQueryProvider:
|
||||
path: ./page.ts:linkQueryProvider
|
||||
events:
|
||||
- query:link
|
||||
indexItems:
|
||||
path: "./item.ts:indexItems"
|
||||
events:
|
||||
- page:index
|
||||
itemQueryProvider:
|
||||
path: ./item.ts:queryProvider
|
||||
events:
|
||||
- query:item
|
||||
deletePage:
|
||||
path: "./page.ts:deletePage"
|
||||
command:
|
||||
@@ -52,7 +64,8 @@ functions:
|
||||
key: Ctrl-Alt-r
|
||||
pageComplete:
|
||||
path: "./page.ts:pageComplete"
|
||||
isCompleter: true
|
||||
events:
|
||||
- page:complete
|
||||
linkNavigate:
|
||||
path: "./navigate.ts:linkNavigate"
|
||||
command:
|
||||
@@ -86,3 +99,14 @@ functions:
|
||||
path: ./template.ts:instantiateTemplateCommand
|
||||
command:
|
||||
name: "Template: Instantiate for Page"
|
||||
|
||||
instantiateTemplate:
|
||||
path: ./template.ts:instantiateTemplate
|
||||
env: server
|
||||
|
||||
|
||||
|
||||
replaceTemplateVarsCommand:
|
||||
path: ./template.ts:replaceTemplateVarsCommand
|
||||
command:
|
||||
name: "Template: Replace Variables"
|
||||
|
||||
+22
-1
@@ -1,9 +1,10 @@
|
||||
import { IndexEvent } from "../../webapp/app_event";
|
||||
|
||||
import { batchSet } from "plugos-silverbullet-syscall/index";
|
||||
import { batchSet, scanPrefixGlobal } from "plugos-silverbullet-syscall/index";
|
||||
import { parseMarkdown } from "plugos-silverbullet-syscall/markdown";
|
||||
import { collectNodesOfType, ParseTree, renderToText } from "../../common/tree";
|
||||
import { whiteOutQueries } from "../query/util";
|
||||
import { applyQuery, QueryProviderEvent } from "../query/engine";
|
||||
|
||||
export type Item = {
|
||||
name: string;
|
||||
@@ -50,3 +51,23 @@ export async function indexItems({ name, text }: IndexEvent) {
|
||||
console.log("Found", items.length, "item(s)");
|
||||
await batchSet(name, items);
|
||||
}
|
||||
|
||||
export async function queryProvider({
|
||||
query,
|
||||
}: QueryProviderEvent): Promise<string> {
|
||||
let allItems: Item[] = [];
|
||||
for (let { key, page, value } of await scanPrefixGlobal("it:")) {
|
||||
let [, pos] = key.split(":");
|
||||
allItems.push({
|
||||
...value,
|
||||
page: page,
|
||||
pos: +pos,
|
||||
});
|
||||
}
|
||||
let markdownItems = applyQuery(query, allItems).map(
|
||||
(item) =>
|
||||
`* [[${item.page}@${item.pos}]] ${item.name}` +
|
||||
(item.nested ? "\n " + item.nested : "")
|
||||
);
|
||||
return markdownItems.join("\n");
|
||||
}
|
||||
|
||||
@@ -25,6 +25,8 @@ import {
|
||||
renderToText,
|
||||
replaceNodesMatching
|
||||
} from "../../common/tree";
|
||||
import { applyQuery, QueryProviderEvent } from "../query/engine";
|
||||
import { PageMeta } from "../../common/types";
|
||||
|
||||
export async function indexLinks({ name, text }: IndexEvent) {
|
||||
let backLinks: { key: string; value: string }[] = [];
|
||||
@@ -47,6 +49,31 @@ export async function indexLinks({ name, text }: IndexEvent) {
|
||||
await batchSet(name, backLinks);
|
||||
}
|
||||
|
||||
export async function pageQueryProvider({
|
||||
query,
|
||||
}: QueryProviderEvent): Promise<string> {
|
||||
let allPages = await listPages();
|
||||
let markdownPages = applyQuery(query, allPages).map(
|
||||
(pageMeta: PageMeta) => `* [[${pageMeta.name}]]`
|
||||
);
|
||||
return markdownPages.join("\n");
|
||||
}
|
||||
|
||||
export async function linkQueryProvider({
|
||||
query,
|
||||
pageName,
|
||||
}: QueryProviderEvent): Promise<string> {
|
||||
let uniqueLinks = new Set<string>();
|
||||
for (let { value: name } of await scanPrefixGlobal(`pl:${pageName}:`)) {
|
||||
uniqueLinks.add(name);
|
||||
}
|
||||
let markdownLinks = applyQuery(
|
||||
query,
|
||||
[...uniqueLinks].map((l) => ({ name: l }))
|
||||
).map((pageMeta) => `* [[${pageMeta.name}]]`);
|
||||
return markdownLinks.join("\n");
|
||||
}
|
||||
|
||||
export async function deletePage() {
|
||||
let pageName = await getCurrentPage();
|
||||
console.log("Navigating to start page");
|
||||
|
||||
+35
-9
@@ -1,9 +1,11 @@
|
||||
import { listPages, readPage, writePage } from "plugos-silverbullet-syscall/space";
|
||||
import { filterBox, navigate, prompt } from "plugos-silverbullet-syscall/editor";
|
||||
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 { dispatch } from "plugos-syscall/event";
|
||||
import { invokeFunction } from "plugos-silverbullet-syscall/system";
|
||||
|
||||
const pageTemplatePrefix = `template/page/`;
|
||||
|
||||
@@ -34,17 +36,41 @@ export async function instantiateTemplateCommand() {
|
||||
if (!pageName) {
|
||||
return;
|
||||
}
|
||||
let pageText = replaceTemplateVars(renderToText(parseTree));
|
||||
await writePage(pageName, pageText);
|
||||
await invokeFunction(
|
||||
"server",
|
||||
"instantiateTemplate",
|
||||
pageName,
|
||||
renderToText(parseTree)
|
||||
);
|
||||
// let pageText = replaceTemplateVars(, pageName);
|
||||
// await writePage(pageName, pageText);
|
||||
await navigate(pageName);
|
||||
}
|
||||
|
||||
export function replaceTemplateVars(s: string): string {
|
||||
return s.replaceAll(/\{\{(\w+)\}\}/g, (match, v) => {
|
||||
switch (v) {
|
||||
case "today":
|
||||
return niceDate(new Date());
|
||||
break;
|
||||
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) => {
|
||||
if (v === "today") {
|
||||
return niceDate(new Date());
|
||||
}
|
||||
if (v.startsWith("placeholder:")) {
|
||||
// Dispatch event, to be replaced in the file async later
|
||||
dispatch(v, {
|
||||
pageName: pageName,
|
||||
placeholder: v,
|
||||
}).catch((e) => {
|
||||
console.error("Failed to dispatch placeholder event", e);
|
||||
});
|
||||
}
|
||||
return match;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user