Factored out materialized query providers

This commit is contained in:
Zef Hemel
2022-04-19 16:54:47 +02:00
parent 31254d15e6
commit c7176b00fa
31 changed files with 437 additions and 187 deletions
+25 -1
View File
@@ -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
View File
@@ -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");
}
+27
View File
@@ -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
View File
@@ -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;
});