Expose index.extractFrontmatter as syscall

pull/1232/head
Zef Hemel 2025-02-07 15:39:51 +01:00
parent 44a1ce698e
commit 8eebb8dd67
4 changed files with 49 additions and 2 deletions

View File

@ -1,4 +1,8 @@
import { datastore, system } from "@silverbulletmd/silverbullet/syscalls";
import {
datastore,
markdown,
system,
} from "@silverbulletmd/silverbullet/syscalls";
import type {
KV,
KvKey,
@ -10,6 +14,12 @@ import type { QueryProviderEvent } from "../../plug-api/types.ts";
import { determineType, type SimpleJSONType } from "./attributes.ts";
import { ttlCache } from "$lib/memory_cache.ts";
import type { LuaCollectionQuery } from "$common/space_lua/query_collection.ts";
import {
extractFrontmatter as extractFrontmatterFromTree,
type FrontMatter,
type FrontmatterExtractOptions,
} from "../../plug-api/lib/frontmatter.ts";
import { renderToText } from "@silverbulletmd/silverbullet/lib/tree";
const indexKey = "idx";
const pageKey = "ridx";
@ -245,3 +255,12 @@ export async function discoverSources() {
// And concatenate all the tags from the schema
.concat(Object.keys(schema.tag));
}
export async function extractFrontmatter(
text: string,
extractOptions: FrontmatterExtractOptions = {},
): Promise<{ frontmatter: FrontMatter; text: string }> {
const tree = await markdown.parseMarkdown(text);
const frontmatter = await extractFrontmatterFromTree(tree, extractOptions);
return { frontmatter, text: renderToText(tree) };
}

View File

@ -23,6 +23,12 @@ functions:
path: api.ts:getObjectByRef
syscall: index.getObjectByRef
env: server
extractFrontmatter:
path: api.ts:extractFrontmatter
syscall: index.extractFrontmatter
# Event handlers
objectSourceProvider:
path: api.ts:objectSourceProvider
events:

View File

@ -32,7 +32,7 @@ export class SyscallHook implements Hook<SyscallHookT> {
syscalls[syscallName] = (ctx, ...args) => {
// Delegate to the system to invoke the function
return system.syscall(ctx, "system.invokeFunction", [
name,
`${plug.manifest!.name}.${name}`,
...args,
]);
};

View File

@ -1,3 +1,9 @@
---
testattribute: 10
---
#apidoc
The `index` API provides functions for interacting with SilverBullet's [[Objects]], allowing you to store and query page-associated data.
## Object Operations
@ -38,3 +44,19 @@ local task = index.getObjectByRef("my page", "mytask", "task1")
if task then
print("Found task: " .. task.content)
end
```
## index.extractFrontmatter(text, extractOptions)
Extracts frontmatter from a markdown document (whose text is provided as argument), possibly cleaning it up. It also parses top-level tags consistent with SilverBullet's tag indexing system.
It returns a table with two keys:
- `frontmatter`: A table containing the parsed frontmatter.
- `text`: The text of the document, with any changes applied requested with the `extractOptions`.
The `extractOptions` is an optional table that can contain the following keys (which will affect the returned `text`):
- `removeKeys`: An array of keys to remove from the frontmatter.
- `removeTags`: A boolean or array of tags to remove from the frontmatter.
- `removeFrontmatterSection`: A boolean to remove the frontmatter section from the document.
Example applied to this page:
${(index.extractFrontmatter(editor.getText())).frontmatter}