1
0
silverbullet/plugs/index/anchor.ts

52 lines
1.4 KiB
TypeScript
Raw Normal View History

2022-10-14 13:11:33 +00:00
import { collectNodesOfType } from "$sb/lib/tree.ts";
import type { CompleteEvent, IndexTreeEvent } from "$sb/app_event.ts";
2022-10-14 13:11:33 +00:00
import { removeQueries } from "$sb/lib/query.ts";
import { ObjectValue } from "$sb/types.ts";
import { indexObjects, queryObjects } from "./api.ts";
2022-08-30 08:44:20 +00:00
type AnchorObject = ObjectValue<{
name: string;
page: string;
pos: number;
}>;
2022-08-30 08:44:20 +00:00
export async function indexAnchors({ name: pageName, tree }: IndexTreeEvent) {
removeQueries(tree);
const anchors: ObjectValue<AnchorObject>[] = [];
2022-08-30 08:44:20 +00:00
collectNodesOfType(tree, "NamedAnchor").forEach((n) => {
2022-10-24 17:40:52 +00:00
const aName = n.children![0].text!.substring(1);
2022-08-30 08:44:20 +00:00
anchors.push({
ref: `${pageName}@${aName}`,
tags: ["anchor"],
name: aName,
page: pageName,
pos: n.from!,
2022-08-30 08:44:20 +00:00
});
});
// console.log("Found", anchors.length, "anchors(s)");
await indexObjects(pageName, anchors);
2022-08-30 08:44:20 +00:00
}
export async function anchorComplete(completeEvent: CompleteEvent) {
const match = /\[\[([^\]@:]*@[\w\.\-\/]*)$/.exec(completeEvent.linePrefix);
if (!match) {
2022-08-30 08:44:20 +00:00
return null;
}
let [pageRef, anchorRef] = match[1].split("@");
2022-08-30 08:44:20 +00:00
if (!pageRef) {
pageRef = completeEvent.pageName;
2022-08-30 08:44:20 +00:00
}
const allAnchors = await queryObjects<AnchorObject>("anchor", {
filter: ["=", ["attr", "page"], ["string", pageRef]],
});
2022-08-30 08:44:20 +00:00
return {
from: completeEvent.pos - anchorRef.length,
2022-08-30 08:44:20 +00:00
options: allAnchors.map((a) => ({
label: a.name,
2022-08-30 08:44:20 +00:00
type: "anchor",
})),
};
}