Replaced #inst with #template and #include, made query parsing more robust
parent
f75915535f
commit
f9875e7e57
|
@ -184,6 +184,22 @@ functions:
|
||||||
<!-- #query |^| -->
|
<!-- #query |^| -->
|
||||||
|
|
||||||
<!-- /query -->
|
<!-- /query -->
|
||||||
|
insertInclude:
|
||||||
|
path: "./template.ts:insertTemplateText"
|
||||||
|
slashCommand:
|
||||||
|
name: include
|
||||||
|
value: |
|
||||||
|
<!-- #include "|^|" -->
|
||||||
|
|
||||||
|
<!-- /include -->
|
||||||
|
insertInlineTemplate:
|
||||||
|
path: "./template.ts:insertTemplateText"
|
||||||
|
slashCommand:
|
||||||
|
name: inline-template
|
||||||
|
value: |
|
||||||
|
<!-- #template "|^|" {} -->
|
||||||
|
|
||||||
|
<!-- /template -->
|
||||||
quickNoteCommand:
|
quickNoteCommand:
|
||||||
path: ./template.ts:quickNoteCommand
|
path: ./template.ts:quickNoteCommand
|
||||||
command:
|
command:
|
||||||
|
|
|
@ -30,11 +30,22 @@ export async function queryComplete() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
prefix = await matchBefore('#inst "[^"]*');
|
prefix = await matchBefore('#template "[^"]*');
|
||||||
if (prefix) {
|
if (prefix) {
|
||||||
let allPages = await listPages();
|
let allPages = await listPages();
|
||||||
return {
|
return {
|
||||||
from: prefix.from + '#inst "'.length,
|
from: prefix.from + '#template "'.length,
|
||||||
|
options: allPages.map((pageMeta) => ({
|
||||||
|
label: pageMeta.name,
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix = await matchBefore('#include "[^"]*');
|
||||||
|
if (prefix) {
|
||||||
|
let allPages = await listPages();
|
||||||
|
return {
|
||||||
|
from: prefix.from + '#include "'.length,
|
||||||
options: allPages.map((pageMeta) => ({
|
options: allPages.map((pageMeta) => ({
|
||||||
label: pageMeta.name,
|
label: pageMeta.name,
|
||||||
})),
|
})),
|
||||||
|
|
|
@ -16,6 +16,8 @@ import { replaceTemplateVars } from "../core/template";
|
||||||
import { jsonToMDTable, queryRegex } from "./util";
|
import { jsonToMDTable, queryRegex } from "./util";
|
||||||
import { dispatch } from "@plugos/plugos-syscall/event";
|
import { dispatch } from "@plugos/plugos-syscall/event";
|
||||||
import { replaceAsync } from "../lib/util";
|
import { replaceAsync } from "../lib/util";
|
||||||
|
import { parseMarkdown } from "@silverbulletmd/plugos-silverbullet-syscall/markdown";
|
||||||
|
import { nodeAtPos } from "@silverbulletmd/common/tree";
|
||||||
|
|
||||||
export async function updateMaterializedQueriesCommand() {
|
export async function updateMaterializedQueriesCommand() {
|
||||||
const currentPage = await getCurrentPage();
|
const currentPage = await getCurrentPage();
|
||||||
|
@ -32,7 +34,7 @@ export async function updateMaterializedQueriesCommand() {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const templateInstRegex =
|
export const templateInstRegex =
|
||||||
/(<!--\s*#inst\s+"([^"]+)"(.+?)-->)(.+?)(<!--\s*\/inst\s*-->)/gs;
|
/(<!--\s*#(template|include)\s+"([^"]+)"(.+?)-->)(.+?)(<!--\s*\/\2\s*-->)/gs;
|
||||||
|
|
||||||
async function updateTemplateInstantiations(
|
async function updateTemplateInstantiations(
|
||||||
text: string,
|
text: string,
|
||||||
|
@ -41,7 +43,7 @@ async function updateTemplateInstantiations(
|
||||||
return replaceAsync(
|
return replaceAsync(
|
||||||
text,
|
text,
|
||||||
templateInstRegex,
|
templateInstRegex,
|
||||||
async (fullMatch, startInst, template, args, body, endInst) => {
|
async (fullMatch, startInst, type, template, args, body, endInst) => {
|
||||||
args = args.trim();
|
args = args.trim();
|
||||||
let parsedArgs = {};
|
let parsedArgs = {};
|
||||||
if (args) {
|
if (args) {
|
||||||
|
@ -52,12 +54,26 @@ async function updateTemplateInstantiations(
|
||||||
return fullMatch;
|
return fullMatch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let { text: templateText } = await readPage(template);
|
let templateText = "";
|
||||||
let templateFn = Handlebars.compile(
|
if (template.startsWith("http://") || template.startsWith("https://")) {
|
||||||
replaceTemplateVars(templateText, pageName),
|
try {
|
||||||
{ noEscape: true }
|
let req = await fetch(template);
|
||||||
);
|
templateText = await req.text();
|
||||||
let newBody = templateFn(parsedArgs);
|
} catch (e: any) {
|
||||||
|
templateText = `ERROR: ${e.message}`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
templateText = (await readPage(template)).text;
|
||||||
|
}
|
||||||
|
let newBody = templateText;
|
||||||
|
// if it's a template (note a literal "include")
|
||||||
|
if (type === "template") {
|
||||||
|
let templateFn = Handlebars.compile(
|
||||||
|
replaceTemplateVars(templateText, pageName),
|
||||||
|
{ noEscape: true }
|
||||||
|
);
|
||||||
|
newBody = templateFn(parsedArgs);
|
||||||
|
}
|
||||||
return `${startInst}\n${newBody.trim()}\n${endInst}`;
|
return `${startInst}\n${newBody.trim()}\n${endInst}`;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -79,10 +95,19 @@ export async function updateMaterializedQueriesOnPage(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
let newText = await updateTemplateInstantiations(text, pageName);
|
let newText = await updateTemplateInstantiations(text, pageName);
|
||||||
|
let tree = await parseMarkdown(newText);
|
||||||
|
|
||||||
newText = await replaceAsync(
|
newText = await replaceAsync(
|
||||||
newText,
|
newText,
|
||||||
queryRegex,
|
queryRegex,
|
||||||
async (fullMatch, startQuery, query, body, endQuery) => {
|
async (fullMatch, startQuery, query, body, endQuery, index) => {
|
||||||
|
let currentNode = nodeAtPos(tree, index + 1);
|
||||||
|
if (currentNode?.type !== "CommentBlock") {
|
||||||
|
// If not a comment block, it's likely a code block, ignore
|
||||||
|
return fullMatch;
|
||||||
|
}
|
||||||
|
// console.log("Text slice", newText.substring(index, index + 100));
|
||||||
|
|
||||||
let parsedQuery = parseQuery(replaceTemplateVars(query, pageName));
|
let parsedQuery = parseQuery(replaceTemplateVars(query, pageName));
|
||||||
|
|
||||||
console.log("Parsed query", parsedQuery);
|
console.log("Parsed query", parsedQuery);
|
||||||
|
|
|
@ -5,6 +5,24 @@ repo: https://github.com/Willyfrog/silverbullet-backlinks
|
||||||
author: Guillermo Vayá
|
author: Guillermo Vayá
|
||||||
```
|
```
|
||||||
|
|
||||||
|
<!-- #include "https://raw.githubusercontent.com/Willyfrog/silverbullet-backlinks/main/README.md" -->
|
||||||
|
# SilverBullet plug for Backlinks
|
||||||
|
|
||||||
Provides access to pages that link to the one currently being edited.
|
Provides access to pages that link to the one currently being edited.
|
||||||
|
|
||||||
Use the `Show Backlinks for current page` command to toggle.
|
## Wait, SilverBullet?
|
||||||
|
|
||||||
|
If you don't know what it is, check its [webpage](https://silverbullet.md), but if
|
||||||
|
you want me to spoil the fun: it is an extensible note taking app with markdown and plain files at its core
|
||||||
|
(well... there is a bit of magic in there too, but what good it would be without a little magic?)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Open (`cmd+k`) your `PLUGS` note in SilverBullet and add this plug to the list:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- https://github.com/Willyfrog/silverbullet-backlinks/releases/download/v0.2/backlinks.plug.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run the `Plugs: Update` command and off you go!
|
||||||
|
<!-- /include -->
|
|
@ -4,10 +4,10 @@ uri: github:silverbulletmd/silverbullet-ghost/ghost.plug.json
|
||||||
repo: https://github.com/silverbulletmd/silverbullet-ghost
|
repo: https://github.com/silverbulletmd/silverbullet-ghost
|
||||||
author: Zef Hemel
|
author: Zef Hemel
|
||||||
```
|
```
|
||||||
|
<!-- #include "https://raw.githubusercontent.com/silverbulletmd/silverbullet-ghost/main/README.md" -->
|
||||||
|
# Ghost plug for Silver Bullet
|
||||||
|
|
||||||
Very basic plug to publish pages and posts onto the [Ghost](https://ghost.org) platform
|
Note: Still very basic, to use:
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
In your `SETTINGS` specify the following settings:
|
In your `SETTINGS` specify the following settings:
|
||||||
|
|
||||||
|
@ -25,4 +25,14 @@ And in your `SECRETS` file:
|
||||||
|
|
||||||
This will assume the naming pattern of `posts/my-post-slug` where the first top-level heading (`# Hello`) will be used as the post title.
|
This will assume the naming pattern of `posts/my-post-slug` where the first top-level heading (`# Hello`) will be used as the post title.
|
||||||
|
|
||||||
Commands to use `Ghost: Publish`
|
Commands to use `Ghost: Publish`
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
Open your `PLUGS` note in SilverBullet and add this plug to the list:
|
||||||
|
|
||||||
|
```
|
||||||
|
- github:silverbulletmd/silverbullet-ghost/ghost.plug.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run the `Plugs: Update` command and off you go!
|
||||||
|
<!-- /include -->
|
||||||
|
|
|
@ -4,15 +4,27 @@ uri: github:silverbulletmd/silverbullet-github/github.plug.json
|
||||||
repo: https://github.com/silverbulletmd/silverbullet-github
|
repo: https://github.com/silverbulletmd/silverbullet-github
|
||||||
author: Zef Hemel
|
author: Zef Hemel
|
||||||
```
|
```
|
||||||
|
<!-- #include "https://raw.githubusercontent.com/silverbulletmd/silverbullet-git/main/README.md" -->
|
||||||
|
# SilverBullet plug for Git
|
||||||
|
Very basic in functionality, it assumes you have git configured for push and pull in your space. What it does, roughly speaking:
|
||||||
|
|
||||||
The git plug provides very basic “git sync” functionality, it assumes you have git configured for push and pull in your space. It offers two commands:
|
`Git : Sync`:
|
||||||
|
* Adds all *.md files in your folder to git
|
||||||
|
* It commits them with a "Snapshot" commit message
|
||||||
|
* It `git pull`s changes from the remote server
|
||||||
|
* It `git push`es changes to the remote server
|
||||||
|
|
||||||
* `Git : Sync`:
|
`Git: Snapshot`:
|
||||||
* Adds all *.md files in your folder to git
|
* Asks you for a commit message
|
||||||
* It commits them with a "Snapshot" commit message
|
* Commits
|
||||||
* It `git pull`s changes from the remote server
|
|
||||||
* It `git push`es changes to the remote server
|
## Installation
|
||||||
|
Open your `PLUGS` note in SilverBullet and add this plug to the list:
|
||||||
|
|
||||||
|
```
|
||||||
|
- github:silverbulletmd/silverbullet-git/git.plug.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run the `Plugs: Update` command and off you go!
|
||||||
|
<!-- /include -->
|
||||||
|
|
||||||
* `Git: Snapshot`:
|
|
||||||
* Asks you for a commit message
|
|
||||||
* Commits
|
|
||||||
|
|
|
@ -4,9 +4,30 @@ uri: github:silverbulletmd/silverbullet-github/github.plug.json
|
||||||
repo: https://github.com/silverbulletmd/silverbullet-github
|
repo: https://github.com/silverbulletmd/silverbullet-github
|
||||||
author: Zef Hemel
|
author: Zef Hemel
|
||||||
```
|
```
|
||||||
|
<!-- #include "https://raw.githubusercontent.com/silverbulletmd/silverbullet-github/main/README.md" -->
|
||||||
|
# SilverBullet plug for Github
|
||||||
Provides Github events, notifications and pull requests as query sources using SB's query mechanism
|
Provides Github events, notifications and pull requests as query sources using SB's query mechanism
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
Open your `PLUGS` note in SilverBullet and add this plug to the list:
|
||||||
|
|
||||||
|
```
|
||||||
|
- github:silverbulletmd/silverbullet-github/github.plug.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run the `Plugs: Update` command and off you go!
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
This step is optional for anything but the `gh-notification` source, but without it you may be rate limited by the Github API,
|
||||||
|
|
||||||
|
To configure, add a `githubToken` key to your `SECRETS` page, this should be a [personal access token](https://github.com/settings/tokens):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
githubToken: your-github-token
|
||||||
|
```
|
||||||
|
|
||||||
|
## Query sources
|
||||||
|
|
||||||
* `gh-event` required filters in the `where` clause:
|
* `gh-event` required filters in the `where` clause:
|
||||||
* `username`: the user whose events to query
|
* `username`: the user whose events to query
|
||||||
* `gh-pull`
|
* `gh-pull`
|
||||||
|
@ -29,4 +50,5 @@ Example uses:
|
||||||
|
|
||||||
Where the `template/gh-pull` looks as follows:
|
Where the `template/gh-pull` looks as follows:
|
||||||
|
|
||||||
* ({{state}}) [{{title}}]({{html_url}})
|
* ({{state}}) [{{title}}]({{html_url}})
|
||||||
|
<!-- /include -->
|
||||||
|
|
|
@ -4,9 +4,19 @@ uri: github:silverbulletmd/silverbullet-mattermost/mattermost.plug.json
|
||||||
repo: https://github.com/silverbulletmd/silverbullet-mattermost
|
repo: https://github.com/silverbulletmd/silverbullet-mattermost
|
||||||
author: Zef Hemel
|
author: Zef Hemel
|
||||||
```
|
```
|
||||||
|
<!-- #include "https://raw.githubusercontent.com/silverbulletmd/silverbullet-mattermost/main/README.md" -->
|
||||||
|
# Mattermost plug for Silver Bullet
|
||||||
Provides a `mm-saved` query provider (and maybe more in the future). Please follow the installation, configuration sections, and have a look at the example.
|
Provides a `mm-saved` query provider (and maybe more in the future). Please follow the installation, configuration sections, and have a look at the example.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
Open your `PLUGS` note in SilverBullet and add this plug to the list:
|
||||||
|
|
||||||
|
```
|
||||||
|
- github:silverbulletmd/silverbullet-mattermost/mattermost.plug.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run the `Plugs: Update` command and off you go!
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
You need two bits of configuration to make this plug work. In `SETTINGS` provide the `mattermostUrl` and `mattermostDefaultTeam` settings, they default to the following:
|
You need two bits of configuration to make this plug work. In `SETTINGS` provide the `mattermostUrl` and `mattermostDefaultTeam` settings, they default to the following:
|
||||||
|
|
||||||
|
@ -40,31 +50,6 @@ Note that the `{[Unsaved]}` "button" when clicked, will unsave the post automati
|
||||||
Example uses (using the `template/mm-saved` template above):
|
Example uses (using the `template/mm-saved` template above):
|
||||||
|
|
||||||
<!-- #query mm-saved order by updatedAt desc limit 5 render "template/mm-saved" -->
|
<!-- #query mm-saved order by updatedAt desc limit 5 render "template/mm-saved" -->
|
||||||
[lindy.isherwood](mattermost://community.mattermost.com/private-core/pl/u8ospw14ptg47fystidzudigjw) in **R&D Meeting** at 2022-07-22 {[Unsave]}:
|
|
||||||
|
|
||||||
> #### [Meeting Recording](https://mattermost.zoom.us/rec/share/e0CmkZr_1xaW0Zd-7N-saD5fir9pmjJy6-xw4JZ7el7IMIUUUr99FiC2WePmBZDw.HRzSgvBjxhsPGQWo)
|
<!-- /query -->
|
||||||
>
|
<!-- /include -->
|
||||||
> Access Passcode: `wq$!BA6N`
|
|
||||||
|
|
||||||
---
|
|
||||||
[harrison](mattermost://community.mattermost.com/core/pl/akuzqwdm4if7fdmajjb94hpm5c) in **** at 2022-07-20 {[Unsave]}:
|
|
||||||
|
|
||||||
> Hey Zef. Can we chat about the Affirm issue a bit when I get back? From what I've gathered, Devin's told customer support that the issue in Chromium isn't something we can reasonably fix, and while I don't feel like that's anything I should be worried about since it's out of my area, I keep getting ... (More)
|
|
||||||
|
|
||||||
---
|
|
||||||
[zef.hemel](mattermost://community.mattermost.com/core/pl/k41cfgdbhfg5unm8yx1cjkh8ty) in **** at 2022-07-20 {[Unsave]}:
|
|
||||||
|
|
||||||
> I'll have to get back to this tomorrow. Filename says "arm64" though
|
|
||||||
|
|
||||||
---
|
|
||||||
[zef.hemel](mattermost://community.mattermost.com/core/pl/9e1ha9yzzpdm9ffhu4od65yykc) in **** at 2022-07-19 {[Unsave]}:
|
|
||||||
|
|
||||||
> Agreed. Thinking what are better indicators than what we already ask. I’ll reach out.
|
|
||||||
|
|
||||||
---
|
|
||||||
[zef.hemel](mattermost://community.mattermost.com/private-core/pl/hh79ikgfzb8zmb4ezjuow7a1mw) in **Team: Web Platform** at 2022-07-15 {[Unsave]}:
|
|
||||||
|
|
||||||
> @webplatform in yesterday’s 1:1 with @harrison we came up with the concept of “theme weeks” to solve our problem of scheduling _important but not urgent_ work. Examples are: looking at performance improvements, cleaning/fixing lingering bugs from our backlog, working on accessibility tickets, perfor ... (More)
|
|
||||||
|
|
||||||
---
|
|
||||||
<!-- /query -->
|
|
||||||
|
|
|
@ -4,8 +4,18 @@ uri: github:silverbulletmd/silverbullet-mount/mount.plug.json
|
||||||
repo: https://github.com/silverbulletmd/silverbullet-mount
|
repo: https://github.com/silverbulletmd/silverbullet-mount
|
||||||
author: Zef Hemel
|
author: Zef Hemel
|
||||||
```
|
```
|
||||||
|
<!-- #include "https://raw.githubusercontent.com/silverbulletmd/silverbullet-mount/main/README.md" -->
|
||||||
|
# Mounting of external systems into SB
|
||||||
|
Enables mounting of external folders or SB instances into your space.
|
||||||
|
|
||||||
Enables mounting of external folders or SB instances into your space mounted under a `🚪` prefix.
|
## Installation
|
||||||
|
Open your `PLUGS` note in SilverBullet and add this plug to the list:
|
||||||
|
|
||||||
|
```
|
||||||
|
- github:silverbulletmd/silverbullet-mount/mount.plug.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run the `Plugs: Update` command and off you go!
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
Create a `MOUNTS` page:
|
Create a `MOUNTS` page:
|
||||||
|
@ -19,15 +29,4 @@ Create a `MOUNTS` page:
|
||||||
path: http://some-ip:3000
|
path: http://some-ip:3000
|
||||||
password: mypassword
|
password: mypassword
|
||||||
```
|
```
|
||||||
|
<!-- /include -->
|
||||||
This will make these available under `🚪 docs/` and `🚪 remote/` respectively.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
* Auto translates internal wiki links (prefixes with prefix) and removes prefix upon save
|
|
||||||
|
|
||||||
## To do
|
|
||||||
* [ ] Handle queries
|
|
||||||
* `page` and `link` query needs to dynamically add/remove a `and name =~ /^🚪 PREFIX/` clause)
|
|
||||||
* `task` same but with `page` check
|
|
||||||
* [x] Add `file:` support
|
|
||||||
* [x] Add `http:`/`https:` support
|
|
||||||
|
|
|
@ -4,12 +4,12 @@ Plugs are an extension mechanism (implemented using a library called `plugos` th
|
||||||
|
|
||||||
## Directory
|
## Directory
|
||||||
<!-- #query page where type = “plug” render “template/plug” -->
|
<!-- #query page where type = “plug” render “template/plug” -->
|
||||||
* [[🔌 Git]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-github))
|
* [[🔌 Backlinks]] by **Guillermo Vayá** ([repo](https://github.com/Willyfrog/silverbullet-backlinks))
|
||||||
* [[🔌 Ghost]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-ghost))
|
* [[🔌 Ghost]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-ghost))
|
||||||
|
* [[🔌 Git]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-github))
|
||||||
* [[🔌 Github]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-github))
|
* [[🔌 Github]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-github))
|
||||||
* [[🔌 Mattermost]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-mattermost))
|
* [[🔌 Mattermost]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-mattermost))
|
||||||
* [[🔌 Mount]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-mount))
|
* [[🔌 Mount]] by **Zef Hemel** ([repo](https://github.com/silverbulletmd/silverbullet-mount))
|
||||||
* [[🔌 Backlinks]] by **Guillermo Vayá** ([repo](https://github.com/Willyfrog/silverbullet-backlinks))
|
|
||||||
<!-- /query -->
|
<!-- /query -->
|
||||||
|
|
||||||
## How to develop your own plug
|
## How to develop your own plug
|
||||||
|
|
Loading…
Reference in New Issue