Skip to content

Commit

Permalink
Expose index.extractFrontmatter as syscall
Browse files Browse the repository at this point in the history
  • Loading branch information
zefhemel committed Feb 7, 2025
1 parent 44a1ce6 commit 8eebb8d
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 2 deletions.
21 changes: 20 additions & 1 deletion plugs/index/api.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import { datastore, system } from "@silverbulletmd/silverbullet/syscalls";
import {
datastore,
markdown,
system,
} from "@silverbulletmd/silverbullet/syscalls";
import type {
KV,
KvKey,
Expand All @@ -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";
Expand Down Expand Up @@ -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) };
}
6 changes: 6 additions & 0 deletions plugs/index/index.plug.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion web/hooks/syscall.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
]);
};
Expand Down
22 changes: 22 additions & 0 deletions website/API/index.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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}

0 comments on commit 8eebb8d

Please sign in to comment.