silverbullet/plugs/index/style.ts

74 lines
2.1 KiB
TypeScript
Raw Normal View History

2024-07-30 23:33:33 +08:00
import type { IndexTreeEvent } from "../../plug-api/types.ts";
import { collectNodesOfType, findNodeOfType } from "../../plug-api/lib/tree.ts";
2024-07-30 23:33:33 +08:00
import type { ObjectValue } from "../../plug-api/types.ts";
import { indexObjects } from "./api.ts";
import { cleanPageRef } from "@silverbulletmd/silverbullet/lib/resolve";
import { system } from "@silverbulletmd/silverbullet/syscalls";
export type StyleObject = ObjectValue<{
style: string;
origin: string;
}>;
let customStylePages: string[] = [];
let lastCustomStyleRead: number | null = null;
export async function indexSpaceStyle({ name, tree }: IndexTreeEvent) {
const allStyles: StyleObject[] = [];
// Cache the setting for 10s
if (
lastCustomStyleRead === null || Date.now() > lastCustomStyleRead + 10000
) {
customStylePages = await system.getSpaceConfig("customStyles", []);
lastCustomStyleRead = Date.now();
if (!Array.isArray(customStylePages)) {
customStylePages = [customStylePages];
}
customStylePages = customStylePages.map((page: string) =>
cleanPageRef(page)
);
}
// Also collect CSS from custom styles in config
collectNodesOfType(tree, "FencedCode").map((t) => {
const codeInfoNode = findNodeOfType(t, "CodeInfo");
if (!codeInfoNode) {
return;
}
const fenceType = codeInfoNode.children![0].text!;
if (fenceType !== "space-style") {
if (
!customStylePages.includes(name) || fenceType !== "css"
) {
return;
}
}
const codeTextNode = findNodeOfType(t, "CodeText");
if (!codeTextNode) {
// Honestly, this shouldn't happen
return;
}
const codeText = codeTextNode.children![0].text!;
let codeOrigin = "";
if (customStylePages.includes(name)) {
codeOrigin = "config";
} else if (name.startsWith("Library/")) {
codeOrigin = "library";
} else {
codeOrigin = "user";
}
allStyles.push({
ref: `${name}@${t.from!}`,
tag: "space-style",
style: codeText,
origin: codeOrigin,
});
});
await indexObjects<StyleObject>(name, allStyles);
}