Refactor all the things
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
// TODO: Figure out how to keep this up-to-date automatically
|
||||
export const builtinPlugNames = [
|
||||
"core",
|
||||
"editor",
|
||||
"index",
|
||||
"sync",
|
||||
"template",
|
||||
"plug-manager",
|
||||
"directive",
|
||||
"emoji",
|
||||
"markdown",
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
import { renderToText, replaceNodesMatching } from "$sb/lib/tree.ts";
|
||||
import { parseMarkdown } from "$sb/silverbullet-syscall/markdown.ts";
|
||||
import { FileMeta } from "$sb/types.ts";
|
||||
|
||||
export const cloudPrefix = "💭 ";
|
||||
|
||||
export async function readFileCloud(
|
||||
name: string,
|
||||
): Promise<{ data: Uint8Array; meta: FileMeta } | undefined> {
|
||||
const originalUrl = name.substring(
|
||||
cloudPrefix.length,
|
||||
name.length - ".md".length,
|
||||
);
|
||||
let url = originalUrl;
|
||||
if (!url.includes("/")) {
|
||||
url += "/index";
|
||||
}
|
||||
if (!url.startsWith("127.0.0.1")) {
|
||||
url = `https://${url}`;
|
||||
} else {
|
||||
url = `http://${url}`;
|
||||
}
|
||||
let text = "";
|
||||
|
||||
try {
|
||||
const r = await fetch(`${encodeURI(url)}.md`);
|
||||
text = await r.text();
|
||||
if (!r.ok) {
|
||||
text = `ERROR: ${text}`;
|
||||
}
|
||||
} catch (e: any) {
|
||||
console.error("ERROR thrown", e.message);
|
||||
text = `ERROR: ${e.message}`;
|
||||
}
|
||||
text = await translateLinksWithPrefix(
|
||||
text,
|
||||
`${cloudPrefix}${originalUrl.split("/")[0]}/`,
|
||||
);
|
||||
return {
|
||||
data: new TextEncoder().encode(text),
|
||||
meta: {
|
||||
name,
|
||||
contentType: "text/markdown",
|
||||
lastModified: 0,
|
||||
size: text.length,
|
||||
perm: "ro",
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function writeFileCloud(
|
||||
name: string,
|
||||
): Promise<FileMeta> {
|
||||
console.log("Writing cloud file", name);
|
||||
return getFileMetaCloud(name);
|
||||
}
|
||||
|
||||
async function translateLinksWithPrefix(
|
||||
text: string,
|
||||
prefix: string,
|
||||
): Promise<string> {
|
||||
const tree = await parseMarkdown(text);
|
||||
replaceNodesMatching(tree, (tree) => {
|
||||
if (tree.type === "WikiLinkPage") {
|
||||
// Add the prefix in the link text
|
||||
if (!tree.children![0].text!.startsWith(cloudPrefix)) {
|
||||
// Only for links that aren't already cloud links
|
||||
tree.children![0].text = prefix + tree.children![0].text;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
});
|
||||
text = renderToText(tree);
|
||||
return text;
|
||||
}
|
||||
|
||||
export function getFileMetaCloud(name: string): Promise<FileMeta> {
|
||||
return Promise.resolve({
|
||||
name,
|
||||
size: 0,
|
||||
contentType: "text/markdown",
|
||||
lastModified: 0,
|
||||
perm: "ro",
|
||||
});
|
||||
}
|
||||
@@ -1,515 +0,0 @@
|
||||
name: core
|
||||
requiredPermissions:
|
||||
- fetch
|
||||
syntax:
|
||||
Hashtag:
|
||||
firstCharacters:
|
||||
- "#"
|
||||
regex: "#[^#\\d\\s\\[\\]]+\\w+"
|
||||
className: sb-hashtag
|
||||
NakedURL:
|
||||
firstCharacters:
|
||||
- "h"
|
||||
regex: "https?:\\/\\/[-a-zA-Z0-9@:%._\\+~#=]{1,256}([-a-zA-Z0-9()@:%_\\+.~#?&=\\/]*)"
|
||||
className: sb-naked-url
|
||||
NamedAnchor:
|
||||
firstCharacters:
|
||||
- "$"
|
||||
regex: "\\$[a-zA-Z\\.\\-\\/]+[\\w\\.\\-\\/]*"
|
||||
className: sb-named-anchor
|
||||
functions:
|
||||
setEditorMode:
|
||||
path: "./editor.ts:setEditorMode"
|
||||
events:
|
||||
- editor:init
|
||||
toggleDarkMode:
|
||||
path: "./editor.ts:toggleDarkMode"
|
||||
command:
|
||||
name: "Editor: Toggle Dark Mode"
|
||||
centerCursor:
|
||||
path: "./editor.ts:centerCursorCommand"
|
||||
command:
|
||||
name: "Editor: Center Cursor"
|
||||
key: "Ctrl-Alt-l"
|
||||
moveToPos:
|
||||
path: "./editor.ts:moveToPosCommand"
|
||||
command:
|
||||
name: "Editor: Move Cursor to Position"
|
||||
clearPageIndex:
|
||||
path: "./page.ts:clearPageIndex"
|
||||
env: server
|
||||
events:
|
||||
- page:saved
|
||||
- page:deleted
|
||||
pageQueryProvider:
|
||||
path: ./page.ts:pageQueryProvider
|
||||
events:
|
||||
- query:page
|
||||
parseIndexTextRepublish:
|
||||
path: "./page.ts:parseIndexTextRepublish"
|
||||
env: server
|
||||
events:
|
||||
- page:index_text
|
||||
reindexSpaceCommand:
|
||||
path: "./page.ts:reindexCommand"
|
||||
command:
|
||||
name: "Space: Reindex"
|
||||
processIndexQueue:
|
||||
path: ./page.ts:processIndexQueue
|
||||
mqSubscriptions:
|
||||
- queue: indexQueue
|
||||
batchSize: 10
|
||||
autoAck: true
|
||||
reindexSpace:
|
||||
path: "./page.ts:reindexSpace"
|
||||
deletePage:
|
||||
path: "./page.ts:deletePage"
|
||||
command:
|
||||
name: "Page: Delete"
|
||||
copyPage:
|
||||
path: "./page.ts:copyPage"
|
||||
command:
|
||||
name: "Page: Copy"
|
||||
|
||||
syncSpaceCommand:
|
||||
path: "./sync.ts:syncSpaceCommand"
|
||||
command:
|
||||
name: "Sync: Now"
|
||||
key: "Alt-Shift-s"
|
||||
mac: "Cmd-Shift-s"
|
||||
|
||||
# Attachments
|
||||
attachmentQueryProvider:
|
||||
path: ./attachment.ts:attachmentQueryProvider
|
||||
events:
|
||||
- query:attachment
|
||||
|
||||
# Backlinks
|
||||
indexLinks:
|
||||
path: "./page_links.ts:indexLinks"
|
||||
events:
|
||||
- page:index
|
||||
linkQueryProvider:
|
||||
path: ./page_links.ts:linkQueryProvider
|
||||
events:
|
||||
- query:link
|
||||
|
||||
pageComplete:
|
||||
path: "./page.ts:pageComplete"
|
||||
events:
|
||||
- editor:complete
|
||||
|
||||
attributeComplete:
|
||||
path: "./attributes.ts:attributeComplete"
|
||||
events:
|
||||
- editor:complete
|
||||
|
||||
customAttributeCompleter:
|
||||
path: ./attributes.ts:customAttributeCompleter
|
||||
events:
|
||||
- attribute:complete:page
|
||||
- attribute:complete:task
|
||||
- attribute:complete:item
|
||||
- attribute:complete:*
|
||||
|
||||
builtinAttributeCompleter:
|
||||
path: ./attributes.ts:builtinAttributeCompleter
|
||||
events:
|
||||
- attribute:complete:page
|
||||
- attribute:complete:task
|
||||
- attribute:complete:item
|
||||
- attribute:complete:*
|
||||
|
||||
# Commands
|
||||
commandComplete:
|
||||
path: "./command.ts:commandComplete"
|
||||
events:
|
||||
- editor:complete
|
||||
|
||||
# Item indexing
|
||||
indexItem:
|
||||
path: "./item.ts:indexItems"
|
||||
events:
|
||||
- page:index
|
||||
itemQueryProvider:
|
||||
path: "./item.ts:queryProvider"
|
||||
events:
|
||||
- query:item
|
||||
|
||||
# Navigation
|
||||
linkNavigate:
|
||||
path: "./navigate.ts:linkNavigate"
|
||||
command:
|
||||
name: Navigate To page
|
||||
key: Ctrl-Enter
|
||||
mac: Cmd-Enter
|
||||
clickNavigate:
|
||||
path: "./navigate.ts:clickNavigate"
|
||||
events:
|
||||
- page:click
|
||||
navigateHome:
|
||||
path: "./navigate.ts:navigateCommand"
|
||||
command:
|
||||
name: "Navigate: Home"
|
||||
key: "Alt-h"
|
||||
page: ""
|
||||
|
||||
# Hashtags
|
||||
indexTags:
|
||||
path: "./tags.ts:indexTags"
|
||||
events:
|
||||
- page:index
|
||||
tagComplete:
|
||||
path: "./tags.ts:tagComplete"
|
||||
events:
|
||||
- editor:complete
|
||||
tagProvider:
|
||||
path: "./tags.ts:tagProvider"
|
||||
events:
|
||||
- query:tag
|
||||
|
||||
# Anchors
|
||||
indexAnchors:
|
||||
path: "./anchor.ts:indexAnchors"
|
||||
events:
|
||||
- page:index
|
||||
anchorComplete:
|
||||
path: "./anchor.ts:anchorComplete"
|
||||
events:
|
||||
- editor:complete
|
||||
|
||||
# Template commands
|
||||
insertTemplateText:
|
||||
path: "./template.ts:insertTemplateText"
|
||||
applyLineReplace:
|
||||
path: ./template.ts:applyLineReplace
|
||||
insertFrontMatter:
|
||||
redirect: insertTemplateText
|
||||
slashCommand:
|
||||
name: front-matter
|
||||
description: Insert page front matter
|
||||
value: |
|
||||
---
|
||||
|^|
|
||||
---
|
||||
makeH1:
|
||||
redirect: applyLineReplace
|
||||
slashCommand:
|
||||
name: h1
|
||||
description: Turn line into h1 header
|
||||
match: "^#*\\s*"
|
||||
replace: "# "
|
||||
makeH2:
|
||||
redirect: applyLineReplace
|
||||
slashCommand:
|
||||
name: h2
|
||||
description: Turn line into h2 header
|
||||
match: "^#*\\s*"
|
||||
replace: "## "
|
||||
makeH3:
|
||||
redirect: applyLineReplace
|
||||
slashCommand:
|
||||
name: h3
|
||||
description: Turn line into h3 header
|
||||
match: "^#*\\s*"
|
||||
replace: "### "
|
||||
makeH4:
|
||||
redirect: applyLineReplace
|
||||
slashCommand:
|
||||
name: h4
|
||||
description: Turn line into h4 header
|
||||
match: "^#*\\s*"
|
||||
replace: "#### "
|
||||
insertCodeBlock:
|
||||
redirect: insertTemplateText
|
||||
slashCommand:
|
||||
name: code
|
||||
description: Insert code block
|
||||
value: |
|
||||
```
|
||||
|^|
|
||||
```
|
||||
|
||||
newPage:
|
||||
path: ./page.ts:newPageCommand
|
||||
command:
|
||||
name: "Page: New"
|
||||
key: "Alt-Shift-n"
|
||||
|
||||
insertHRTemplate:
|
||||
redirect: insertTemplateText
|
||||
slashCommand:
|
||||
name: hr
|
||||
description: Insert a horizontal rule
|
||||
value: "---"
|
||||
insertTable:
|
||||
redirect: insertTemplateText
|
||||
slashCommand:
|
||||
name: table
|
||||
description: Insert a table
|
||||
boost: -1 # Low boost because it's likely not very commonly used
|
||||
value: |
|
||||
| Header A | Header B |
|
||||
|----------|----------|
|
||||
| Cell A|^| | Cell B |
|
||||
quickNoteCommand:
|
||||
path: ./template.ts:quickNoteCommand
|
||||
command:
|
||||
name: "Quick Note"
|
||||
key: "Alt-Shift-n"
|
||||
priority: 1
|
||||
dailyNoteCommand:
|
||||
path: ./template.ts:dailyNoteCommand
|
||||
command:
|
||||
name: "Open Daily Note"
|
||||
key: "Alt-Shift-d"
|
||||
weeklyNoteCommand:
|
||||
path: ./template.ts:weeklyNoteCommand
|
||||
command:
|
||||
name: "Open Weekly Note"
|
||||
key: "Alt-Shift-w"
|
||||
|
||||
instantiateTemplateCommand:
|
||||
path: ./template.ts:instantiateTemplateCommand
|
||||
command:
|
||||
name: "Template: Instantiate Page"
|
||||
insertSnippet:
|
||||
path: ./template.ts:insertSnippet
|
||||
command:
|
||||
name: "Template: Insert Snippet"
|
||||
slashCommand:
|
||||
name: snippet
|
||||
description: Insert a snippet
|
||||
applyPageTemplateCommand:
|
||||
path: ./template.ts:applyPageTemplateCommand
|
||||
slashCommand:
|
||||
name: page-template
|
||||
description: Apply a page template
|
||||
insertTodayCommand:
|
||||
path: "./template.ts:insertTemplateText"
|
||||
slashCommand:
|
||||
name: today
|
||||
description: Insert today's date
|
||||
value: "{{today}}"
|
||||
insertTomorrowCommand:
|
||||
path: "./template.ts:insertTemplateText"
|
||||
slashCommand:
|
||||
name: tomorrow
|
||||
description: Insert tomorrow's date
|
||||
value: "{{tomorrow}}"
|
||||
|
||||
# Text editing commands
|
||||
quoteSelectionCommand:
|
||||
path: ./text.ts:quoteSelection
|
||||
command:
|
||||
name: "Text: Quote Selection"
|
||||
key: "Ctrl-Shift-."
|
||||
mac: "Cmd-Shift-."
|
||||
listifySelection:
|
||||
path: ./text.ts:listifySelection
|
||||
command:
|
||||
name: "Text: Listify Selection"
|
||||
key: "Ctrl-Shift-8"
|
||||
mac: "Cmd-Shift-8"
|
||||
numberListifySelection:
|
||||
path: ./text.ts:numberListifySelection
|
||||
command:
|
||||
name: "Text: Number Listify Selection"
|
||||
linkSelection:
|
||||
path: ./text.ts:linkSelection
|
||||
command:
|
||||
name: "Text: Link Selection"
|
||||
key: "Ctrl-Shift-k"
|
||||
mac: "Cmd-Shift-k"
|
||||
bold:
|
||||
path: ./text.ts:wrapSelection
|
||||
command:
|
||||
name: "Text: Bold"
|
||||
key: "Ctrl-b"
|
||||
mac: "Cmd-b"
|
||||
wrapper: "**"
|
||||
italic:
|
||||
path: ./text.ts:wrapSelection
|
||||
command:
|
||||
name: "Text: Italic"
|
||||
key: "Ctrl-i"
|
||||
mac: "Cmd-i"
|
||||
wrapper: "_"
|
||||
strikethrough:
|
||||
path: ./text.ts:wrapSelection
|
||||
command:
|
||||
name: "Text: Strikethrough"
|
||||
key: "Ctrl-Shift-s"
|
||||
mac: "Cmd-Shift-s"
|
||||
wrapper: "~~"
|
||||
marker:
|
||||
path: ./text.ts:wrapSelection
|
||||
command:
|
||||
name: "Text: Marker"
|
||||
key: "Alt-m"
|
||||
wrapper: "=="
|
||||
|
||||
# Refactoring Commands
|
||||
extractToPageCommand:
|
||||
path: ./refactor.ts:extractToPageCommand
|
||||
command:
|
||||
name: "Page: Extract"
|
||||
renamePageCommand:
|
||||
path: "./refactor.ts:renamePageCommand"
|
||||
command:
|
||||
name: "Page: Rename"
|
||||
mac: Cmd-Alt-r
|
||||
key: Ctrl-Alt-r
|
||||
page: ""
|
||||
renamePrefixCommand:
|
||||
path: "./refactor.ts:renamePrefixCommand"
|
||||
command:
|
||||
name: "Page: Batch Rename Prefix"
|
||||
|
||||
# Plug manager
|
||||
updatePlugsCommand:
|
||||
path: ./plugmanager.ts:updatePlugsCommand
|
||||
command:
|
||||
name: "Plugs: Update"
|
||||
key: "Ctrl-Shift-p"
|
||||
mac: "Cmd-Shift-p"
|
||||
getPlugHTTPS:
|
||||
path: "./plugmanager.ts:getPlugHTTPS"
|
||||
events:
|
||||
- get-plug:https
|
||||
getPlugGithub:
|
||||
path: "./plugmanager.ts:getPlugGithub"
|
||||
events:
|
||||
- get-plug:github
|
||||
getPlugGithubRelease:
|
||||
path: "./plugmanager.ts:getPlugGithubRelease"
|
||||
events:
|
||||
- get-plug:ghr
|
||||
addPlugCommand:
|
||||
path: ./plugmanager.ts:addPlugCommand
|
||||
command:
|
||||
name: "Plugs: Add"
|
||||
|
||||
# Debug commands
|
||||
parseCommand:
|
||||
path: ./debug.ts:parsePageCommand
|
||||
command:
|
||||
name: "Debug: Parse Document"
|
||||
|
||||
reloadUICommand:
|
||||
path: ./debug.ts:reloadUICommand
|
||||
command:
|
||||
name: "Debug: Reload UI"
|
||||
|
||||
resetClientCommand:
|
||||
path: ./debug.ts:resetClientCommand
|
||||
command:
|
||||
name: "Debug: Reset Client"
|
||||
|
||||
versionCommand:
|
||||
path: ./help.ts:versionCommand
|
||||
command:
|
||||
name: "Help: Version"
|
||||
gettingStartedCommand:
|
||||
path: ./help.ts:gettingStartedCommand
|
||||
command:
|
||||
name: "Help: Getting Started"
|
||||
|
||||
accountLogoutCommand:
|
||||
path: ./account.ts:accountLogoutCommand
|
||||
command:
|
||||
name: "Account: Logout"
|
||||
|
||||
# Link unfurl infrastructure
|
||||
unfurlLink:
|
||||
path: ./link.ts:unfurlCommand
|
||||
command:
|
||||
name: "Link: Unfurl"
|
||||
key: "Ctrl-Shift-u"
|
||||
mac: "Cmd-Shift-u"
|
||||
contexts:
|
||||
- NakedURL
|
||||
|
||||
# Title-based link unfurl
|
||||
titleUnfurlOptions:
|
||||
path: ./link.ts:titleUnfurlOptions
|
||||
events:
|
||||
- unfurl:options
|
||||
titleUnfurl:
|
||||
path: ./link.ts:titleUnfurl
|
||||
events:
|
||||
- unfurl:title-unfurl
|
||||
|
||||
embedWidget:
|
||||
path: ./embed.ts:embedWidget
|
||||
codeWidget: embed
|
||||
|
||||
# Folding commands
|
||||
foldCommand:
|
||||
path: ./editor.ts:foldCommand
|
||||
command:
|
||||
name: "Fold: Fold"
|
||||
mac: "Cmd-Alt-["
|
||||
key: "Ctrl-Shift-["
|
||||
unfoldCommand:
|
||||
path: ./editor.ts:unfoldCommand
|
||||
command:
|
||||
name: "Fold: Unfold"
|
||||
mac: "Cmd-Alt-]"
|
||||
key: "Ctrl-Shift-]"
|
||||
toggleFoldCommand:
|
||||
path: ./editor.ts:toggleFoldCommand
|
||||
command:
|
||||
name: "Fold: Toggle Fold"
|
||||
mac: "Cmd-Alt-f"
|
||||
key: "Ctrl-Alt-f"
|
||||
foldAllCommand:
|
||||
path: ./editor.ts:foldAllCommand
|
||||
command:
|
||||
name: "Fold: Fold All"
|
||||
key: "Ctrl-Alt-["
|
||||
unfoldAllCommand:
|
||||
path: ./editor.ts:unfoldAllCommand
|
||||
command:
|
||||
name: "Fold: Unfold All"
|
||||
key: "Ctrl-Alt-]"
|
||||
|
||||
# Random stuff
|
||||
statsCommand:
|
||||
path: ./stats.ts:statsCommand
|
||||
command:
|
||||
name: "Stats: Show"
|
||||
|
||||
# Cloud pages
|
||||
readPageCloud:
|
||||
path: ./cloud.ts:readFileCloud
|
||||
pageNamespace:
|
||||
pattern: "💭 .+"
|
||||
operation: readFile
|
||||
writePageCloud:
|
||||
path: ./cloud.ts:writeFileCloud
|
||||
pageNamespace:
|
||||
pattern: "💭 .+"
|
||||
operation: writeFile
|
||||
getPageMetaCloud:
|
||||
path: ./cloud.ts:getFileMetaCloud
|
||||
pageNamespace:
|
||||
pattern: "💭 .+"
|
||||
operation: getFileMeta
|
||||
|
||||
# Vim
|
||||
toggleVimMode:
|
||||
path: "./vim.ts:toggleVimMode"
|
||||
command:
|
||||
name: "Editor: Toggle Vim Mode"
|
||||
loadVimRc:
|
||||
path: "./vim.ts:loadVimRc"
|
||||
command:
|
||||
name: "Editor: Vim: Load VIMRC"
|
||||
events:
|
||||
- editor:modeswitch
|
||||
|
||||
brokenLinksCommand:
|
||||
path: ./broken_links.ts:brokenLinksCommand
|
||||
command:
|
||||
name: "Broken Links: Show"
|
||||
@@ -1,4 +1,4 @@
|
||||
import { editor, markdown, space, sync } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor, markdown, mq, space, sync } from "$sb/syscalls.ts";
|
||||
import {
|
||||
ParseTree,
|
||||
removeParentPointers,
|
||||
@@ -7,10 +7,9 @@ import {
|
||||
} from "$sb/lib/tree.ts";
|
||||
import { renderDirectives } from "./directives.ts";
|
||||
import { extractFrontmatter } from "$sb/lib/frontmatter.ts";
|
||||
import { PageMeta } from "../../web/types.ts";
|
||||
import type { PageMeta } from "../../web/types.ts";
|
||||
import { isFederationPath } from "$sb/lib/resolve.ts";
|
||||
import { mq } from "$sb/plugos-syscall/mod.ts";
|
||||
import { Message } from "$sb/types.ts";
|
||||
import { MQMessage } from "$sb/types.ts";
|
||||
import { sleep } from "../../common/async_util.ts";
|
||||
|
||||
const directiveUpdateQueueName = "directiveUpdateQueue";
|
||||
@@ -92,7 +91,7 @@ export async function updateDirectivesInSpaceCommand() {
|
||||
await editor.flashNotification("Updating of all directives completed!");
|
||||
}
|
||||
|
||||
export async function processUpdateQueue(messages: Message[]) {
|
||||
export async function processUpdateQueue(messages: MQMessage[]) {
|
||||
for (const message of messages) {
|
||||
const pageName: string = message.body;
|
||||
console.log("Updating directives in page", pageName);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { events } from "$sb/plugos-syscall/mod.ts";
|
||||
import { events } from "$sb/syscalls.ts";
|
||||
import { CompleteEvent } from "$sb/app_event.ts";
|
||||
import { buildHandebarOptions } from "./util.ts";
|
||||
import type { PageMeta } from "../../web/types.ts";
|
||||
import {
|
||||
import type {
|
||||
AttributeCompleteEvent,
|
||||
AttributeCompletion,
|
||||
} from "../core/attributes.ts";
|
||||
} from "../index/attributes.ts";
|
||||
|
||||
export async function queryComplete(completeEvent: CompleteEvent) {
|
||||
const querySourceMatch = /#query\s+([\w\-_]*)$/.exec(
|
||||
|
||||
@@ -2,10 +2,9 @@
|
||||
// data:page@pos
|
||||
|
||||
import type { IndexTreeEvent, QueryProviderEvent } from "$sb/app_event.ts";
|
||||
import { index } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { index, YAML } from "$sb/syscalls.ts";
|
||||
import { collectNodesOfType, findNodeOfType } from "$sb/lib/tree.ts";
|
||||
import { applyQuery, removeQueries } from "$sb/lib/query.ts";
|
||||
import { YAML } from "$sb/plugos-syscall/mod.ts";
|
||||
|
||||
export async function indexData({ name, tree }: IndexTreeEvent) {
|
||||
const dataObjects: { key: string; value: any }[] = [];
|
||||
|
||||
@@ -39,7 +39,7 @@ functions:
|
||||
|
||||
# Templates
|
||||
insertQuery:
|
||||
redirect: core.insertTemplateText
|
||||
redirect: template.insertTemplateText
|
||||
slashCommand:
|
||||
name: query
|
||||
description: Insert a query
|
||||
@@ -48,7 +48,7 @@ functions:
|
||||
|
||||
<!-- /query -->
|
||||
insertInclude:
|
||||
redirect: core.insertTemplateText
|
||||
redirect: template.insertTemplateText
|
||||
slashCommand:
|
||||
name: include
|
||||
description: Include another page
|
||||
@@ -57,7 +57,7 @@ functions:
|
||||
|
||||
<!-- /include -->
|
||||
insertUseTemplate:
|
||||
redirect: core.insertTemplateText
|
||||
redirect: template.insertTemplateText
|
||||
slashCommand:
|
||||
name: use
|
||||
description: Use a template
|
||||
@@ -66,7 +66,7 @@ functions:
|
||||
|
||||
<!-- /use -->
|
||||
insertUseVerboseTemplate:
|
||||
redirect: core.insertTemplateText
|
||||
redirect: template.insertTemplateText
|
||||
slashCommand:
|
||||
name: use-verbose
|
||||
description: Use a template (verbose mode)
|
||||
@@ -75,7 +75,7 @@ functions:
|
||||
|
||||
<!-- /use-verbose -->
|
||||
insertEvalTemplate:
|
||||
redirect: core.insertTemplateText
|
||||
redirect: template.insertTemplateText
|
||||
slashCommand:
|
||||
name: eval
|
||||
description: Evaluate a JavaScript expression
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
// This is some shocking stuff. My profession would kill me for this.
|
||||
|
||||
import { YAML } from "$sb/plugos-syscall/mod.ts";
|
||||
import { YAML } from "$sb/syscalls.ts";
|
||||
import { ParseTree } from "$sb/lib/tree.ts";
|
||||
import { jsonToMDTable, renderTemplate } from "./util.ts";
|
||||
import { PageMeta } from "../../web/types.ts";
|
||||
import { replaceTemplateVars } from "../core/template.ts";
|
||||
import type { PageMeta } from "../../web/types.ts";
|
||||
import { replaceTemplateVars } from "../template/template.ts";
|
||||
|
||||
// Enables plugName.functionName(arg1, arg2) syntax in JS expressions
|
||||
function translateJs(js: string): string {
|
||||
@@ -44,7 +44,7 @@ export async function evalDirectiveRenderer(
|
||||
const result = await (0, eval)(
|
||||
`(async () => {
|
||||
function invokeFunction(name, ...args) {
|
||||
return syscall("system.invoke", name, ...args);
|
||||
return syscall("system.invokeFunction", name, ...args);
|
||||
}
|
||||
return ${replaceTemplateVars(translateJs(expression), pageMeta)};
|
||||
})()`,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { events } from "$sb/plugos-syscall/mod.ts";
|
||||
import { events } from "$sb/syscalls.ts";
|
||||
|
||||
import { replaceTemplateVars } from "../core/template.ts";
|
||||
import { replaceTemplateVars } from "../template/template.ts";
|
||||
import { renderTemplate } from "./util.ts";
|
||||
import { parseQuery } from "./parser.ts";
|
||||
import { jsonToMDTable } from "./util.ts";
|
||||
import { ParseTree } from "$sb/lib/tree.ts";
|
||||
import { PageMeta } from "../../web/types.ts";
|
||||
import type { PageMeta } from "../../web/types.ts";
|
||||
|
||||
export async function queryDirectiveRenderer(
|
||||
_directive: string,
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
import { queryRegex } from "$sb/lib/query.ts";
|
||||
import {
|
||||
findNodeOfType,
|
||||
ParseTree,
|
||||
renderToText,
|
||||
traverseTree,
|
||||
} from "$sb/lib/tree.ts";
|
||||
import { markdown, space } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { ParseTree, renderToText } from "$sb/lib/tree.ts";
|
||||
import { markdown, space } from "$sb/syscalls.ts";
|
||||
import Handlebars from "handlebars";
|
||||
|
||||
import { replaceTemplateVars } from "../core/template.ts";
|
||||
import { replaceTemplateVars } from "../template/template.ts";
|
||||
import { extractFrontmatter } from "$sb/lib/frontmatter.ts";
|
||||
import { directiveRegex } from "./directives.ts";
|
||||
import { updateDirectives } from "./command.ts";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import Handlebars from "handlebars";
|
||||
|
||||
import { space } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { PageMeta } from "../../web/types.ts";
|
||||
import { space } from "$sb/syscalls.ts";
|
||||
import type { PageMeta } from "../../web/types.ts";
|
||||
import { handlebarHelpers } from "./handlebar_helpers.ts";
|
||||
|
||||
const maxWidth = 70;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { editor } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor } from "$sb/syscalls.ts";
|
||||
|
||||
export async function accountLogoutCommand() {
|
||||
await editor.openUrl("/.client/logout.html", true);
|
||||
@@ -1,9 +1,5 @@
|
||||
import { traverseTree } from "../../plug-api/lib/tree.ts";
|
||||
import {
|
||||
editor,
|
||||
markdown,
|
||||
space,
|
||||
} from "../../plug-api/silverbullet-syscall/mod.ts";
|
||||
import { editor, markdown, space } from "$sb/syscalls.ts";
|
||||
|
||||
export async function brokenLinksCommand() {
|
||||
const pageName = "BROKEN LINKS";
|
||||
@@ -0,0 +1,7 @@
|
||||
import { editor } from "$sb/syscalls.ts";
|
||||
|
||||
export async function setThinClient(def: any) {
|
||||
console.log("Setting thin client to", def.value);
|
||||
await editor.setUiOption("thinClientMode", def.value);
|
||||
await editor.reloadUI();
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import { system } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { CompleteEvent } from "../../plug-api/app_event.ts";
|
||||
import { system } from "$sb/syscalls.ts";
|
||||
import { CompleteEvent } from "$sb/app_event.ts";
|
||||
|
||||
export async function commandComplete(completeEvent: CompleteEvent) {
|
||||
const match = /\{\[([^\]]*)$/.exec(completeEvent.linePrefix);
|
||||
@@ -1,4 +1,4 @@
|
||||
import { debug, editor, markdown } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { debug, editor, markdown } from "$sb/syscalls.ts";
|
||||
|
||||
export async function parsePageCommand() {
|
||||
console.log(
|
||||
@@ -0,0 +1,240 @@
|
||||
name: editor
|
||||
requiredPermissions:
|
||||
- fetch
|
||||
syntax:
|
||||
NakedURL:
|
||||
firstCharacters:
|
||||
- "h"
|
||||
regex: "https?:\\/\\/[-a-zA-Z0-9@:%._\\+~#=]{1,256}([-a-zA-Z0-9()@:%_\\+.~#?&=\\/]*)"
|
||||
className: sb-naked-url
|
||||
functions:
|
||||
setEditorMode:
|
||||
path: "./editor.ts:setEditorMode"
|
||||
events:
|
||||
- editor:init
|
||||
toggleDarkMode:
|
||||
path: "./editor.ts:toggleDarkMode"
|
||||
command:
|
||||
name: "Editor: Toggle Dark Mode"
|
||||
|
||||
# Page operations
|
||||
deletePage:
|
||||
path: "./page.ts:deletePage"
|
||||
command:
|
||||
name: "Page: Delete"
|
||||
copyPage:
|
||||
path: "./page.ts:copyPage"
|
||||
command:
|
||||
name: "Page: Copy"
|
||||
newPage:
|
||||
path: ./page.ts:newPageCommand
|
||||
command:
|
||||
name: "Page: New"
|
||||
key: "Alt-Shift-n"
|
||||
|
||||
# Completion
|
||||
pageComplete:
|
||||
path: "./page.ts:pageComplete"
|
||||
events:
|
||||
- editor:complete
|
||||
commandComplete:
|
||||
path: "./command.ts:commandComplete"
|
||||
events:
|
||||
- editor:complete
|
||||
|
||||
# Navigation
|
||||
linkNavigate:
|
||||
path: "./navigate.ts:linkNavigate"
|
||||
command:
|
||||
name: Navigate To page
|
||||
key: Ctrl-Enter
|
||||
mac: Cmd-Enter
|
||||
clickNavigate:
|
||||
path: "./navigate.ts:clickNavigate"
|
||||
events:
|
||||
- page:click
|
||||
navigateHome:
|
||||
path: "./navigate.ts:navigateCommand"
|
||||
command:
|
||||
name: "Navigate: Home"
|
||||
key: "Alt-h"
|
||||
page: ""
|
||||
|
||||
# Text editing commands
|
||||
quoteSelectionCommand:
|
||||
path: ./text.ts:quoteSelection
|
||||
command:
|
||||
name: "Text: Quote Selection"
|
||||
key: "Ctrl-Shift-."
|
||||
mac: "Cmd-Shift-."
|
||||
listifySelection:
|
||||
path: ./text.ts:listifySelection
|
||||
command:
|
||||
name: "Text: Listify Selection"
|
||||
key: "Ctrl-Shift-8"
|
||||
mac: "Cmd-Shift-8"
|
||||
numberListifySelection:
|
||||
path: ./text.ts:numberListifySelection
|
||||
command:
|
||||
name: "Text: Number Listify Selection"
|
||||
linkSelection:
|
||||
path: ./text.ts:linkSelection
|
||||
command:
|
||||
name: "Text: Link Selection"
|
||||
key: "Ctrl-Shift-k"
|
||||
mac: "Cmd-Shift-k"
|
||||
bold:
|
||||
path: ./text.ts:wrapSelection
|
||||
command:
|
||||
name: "Text: Bold"
|
||||
key: "Ctrl-b"
|
||||
mac: "Cmd-b"
|
||||
wrapper: "**"
|
||||
italic:
|
||||
path: ./text.ts:wrapSelection
|
||||
command:
|
||||
name: "Text: Italic"
|
||||
key: "Ctrl-i"
|
||||
mac: "Cmd-i"
|
||||
wrapper: "_"
|
||||
strikethrough:
|
||||
path: ./text.ts:wrapSelection
|
||||
command:
|
||||
name: "Text: Strikethrough"
|
||||
key: "Ctrl-Shift-s"
|
||||
mac: "Cmd-Shift-s"
|
||||
wrapper: "~~"
|
||||
marker:
|
||||
path: ./text.ts:wrapSelection
|
||||
command:
|
||||
name: "Text: Marker"
|
||||
key: "Alt-m"
|
||||
wrapper: "=="
|
||||
centerCursor:
|
||||
path: "./editor.ts:centerCursorCommand"
|
||||
command:
|
||||
name: "Editor: Center Cursor"
|
||||
key: "Ctrl-Alt-l"
|
||||
moveToPos:
|
||||
path: "./editor.ts:moveToPosCommand"
|
||||
command:
|
||||
name: "Editor: Move Cursor to Position"
|
||||
|
||||
# Debug commands
|
||||
parseCommand:
|
||||
path: ./debug.ts:parsePageCommand
|
||||
command:
|
||||
name: "Debug: Parse Document"
|
||||
|
||||
# Link unfurl infrastructure
|
||||
unfurlLink:
|
||||
path: ./link.ts:unfurlCommand
|
||||
command:
|
||||
name: "Link: Unfurl"
|
||||
key: "Ctrl-Shift-u"
|
||||
mac: "Cmd-Shift-u"
|
||||
contexts:
|
||||
- NakedURL
|
||||
|
||||
# Title-based link unfurl
|
||||
titleUnfurlOptions:
|
||||
path: ./link.ts:titleUnfurlOptions
|
||||
events:
|
||||
- unfurl:options
|
||||
titleUnfurl:
|
||||
path: ./link.ts:titleUnfurl
|
||||
events:
|
||||
- unfurl:title-unfurl
|
||||
|
||||
embedWidget:
|
||||
path: ./embed.ts:embedWidget
|
||||
codeWidget: embed
|
||||
|
||||
# Folding commands
|
||||
foldCommand:
|
||||
path: ./editor.ts:foldCommand
|
||||
command:
|
||||
name: "Fold: Fold"
|
||||
mac: "Cmd-Alt-["
|
||||
key: "Ctrl-Shift-["
|
||||
unfoldCommand:
|
||||
path: ./editor.ts:unfoldCommand
|
||||
command:
|
||||
name: "Fold: Unfold"
|
||||
mac: "Cmd-Alt-]"
|
||||
key: "Ctrl-Shift-]"
|
||||
toggleFoldCommand:
|
||||
path: ./editor.ts:toggleFoldCommand
|
||||
command:
|
||||
name: "Fold: Toggle Fold"
|
||||
mac: "Cmd-Alt-f"
|
||||
key: "Ctrl-Alt-f"
|
||||
foldAllCommand:
|
||||
path: ./editor.ts:foldAllCommand
|
||||
command:
|
||||
name: "Fold: Fold All"
|
||||
key: "Ctrl-Alt-["
|
||||
unfoldAllCommand:
|
||||
path: ./editor.ts:unfoldAllCommand
|
||||
command:
|
||||
name: "Fold: Unfold All"
|
||||
key: "Ctrl-Alt-]"
|
||||
|
||||
# Vim
|
||||
toggleVimMode:
|
||||
path: "./vim.ts:toggleVimMode"
|
||||
command:
|
||||
name: "Editor: Toggle Vim Mode"
|
||||
loadVimRc:
|
||||
path: "./vim.ts:loadVimRc"
|
||||
command:
|
||||
name: "Editor: Vim: Load VIMRC"
|
||||
events:
|
||||
- editor:modeswitch
|
||||
|
||||
brokenLinksCommand:
|
||||
path: ./broken_links.ts:brokenLinksCommand
|
||||
command:
|
||||
name: "Broken Links: Show"
|
||||
|
||||
# Client mode
|
||||
enableThinClient:
|
||||
path: ./client.ts:setThinClient
|
||||
command:
|
||||
name: "Client: Enable Thin Client"
|
||||
value: true
|
||||
disableThinClient:
|
||||
path: ./client.ts:setThinClient
|
||||
command:
|
||||
name: "Client: Disable Thin Client"
|
||||
value: false
|
||||
|
||||
# Random stuff
|
||||
statsCommand:
|
||||
path: ./stats.ts:statsCommand
|
||||
command:
|
||||
name: "Stats: Show"
|
||||
reloadUICommand:
|
||||
path: ./debug.ts:reloadUICommand
|
||||
command:
|
||||
name: "Debug: Reload UI"
|
||||
|
||||
resetClientCommand:
|
||||
path: ./debug.ts:resetClientCommand
|
||||
command:
|
||||
name: "Debug: Reset Client"
|
||||
|
||||
versionCommand:
|
||||
path: ./help.ts:versionCommand
|
||||
command:
|
||||
name: "Help: Version"
|
||||
gettingStartedCommand:
|
||||
path: ./help.ts:gettingStartedCommand
|
||||
command:
|
||||
name: "Help: Getting Started"
|
||||
|
||||
accountLogoutCommand:
|
||||
path: ./account.ts:accountLogoutCommand
|
||||
command:
|
||||
name: "Account: Logout"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { clientStore, editor } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { clientStore, editor } from "$sb/syscalls.ts";
|
||||
|
||||
// Run on "editor:init"
|
||||
export async function setEditorMode() {
|
||||
@@ -1,4 +1,4 @@
|
||||
import { YAML } from "$sb/plugos-syscall/mod.ts";
|
||||
import { YAML } from "$sb/syscalls.ts";
|
||||
import type { WidgetContent } from "$sb/app_event.ts";
|
||||
|
||||
type EmbedConfig = {
|
||||
@@ -1,4 +1,4 @@
|
||||
import { editor } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor } from "$sb/syscalls.ts";
|
||||
import { version } from "../../version.ts";
|
||||
|
||||
export async function versionCommand() {
|
||||
@@ -1,6 +1,5 @@
|
||||
import { nodeAtPos } from "$sb/lib/tree.ts";
|
||||
import { editor, markdown } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { events } from "$sb/plugos-syscall/mod.ts";
|
||||
import { editor, events, markdown } from "$sb/syscalls.ts";
|
||||
|
||||
type UnfurlOption = {
|
||||
id: string;
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { ClickEvent } from "$sb/app_event.ts";
|
||||
import { editor, markdown, system } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor, markdown, system } from "$sb/syscalls.ts";
|
||||
import {
|
||||
addParentPointers,
|
||||
findNodeOfType,
|
||||
@@ -1,33 +1,9 @@
|
||||
import type {
|
||||
CompleteEvent,
|
||||
IndexEvent,
|
||||
QueryProviderEvent,
|
||||
} from "$sb/app_event.ts";
|
||||
import {
|
||||
editor,
|
||||
index,
|
||||
markdown,
|
||||
space,
|
||||
} from "$sb/silverbullet-syscall/mod.ts";
|
||||
import type { CompleteEvent } from "$sb/app_event.ts";
|
||||
import { editor, space } from "$sb/syscalls.ts";
|
||||
|
||||
import { events, mq } from "$sb/plugos-syscall/mod.ts";
|
||||
|
||||
import { applyQuery } from "$sb/lib/query.ts";
|
||||
import { invoke } from "$sb/silverbullet-syscall/system.ts";
|
||||
import type { Message } from "$sb/types.ts";
|
||||
import { sleep } from "../../common/async_util.ts";
|
||||
import { cacheFileListing } from "../federation/federation.ts";
|
||||
import type { PageMeta } from "../../web/types.ts";
|
||||
|
||||
// Key space:
|
||||
// meta: => metaJson
|
||||
|
||||
export async function pageQueryProvider({
|
||||
query,
|
||||
}: QueryProviderEvent): Promise<any[]> {
|
||||
return applyQuery(query, await space.listPages());
|
||||
}
|
||||
|
||||
export async function deletePage() {
|
||||
const pageName = await editor.getCurrentPage();
|
||||
if (
|
||||
@@ -85,12 +61,6 @@ export async function newPageCommand() {
|
||||
await editor.navigate(pageName);
|
||||
}
|
||||
|
||||
export async function reindexCommand() {
|
||||
await editor.flashNotification("Performing full page reindex...");
|
||||
await reindexSpace();
|
||||
await editor.flashNotification("Done with page index!");
|
||||
}
|
||||
|
||||
// Completion
|
||||
export async function pageComplete(completeEvent: CompleteEvent) {
|
||||
const match = /\[\[([^\]@:\{}]*)$/.exec(completeEvent.linePrefix);
|
||||
@@ -130,51 +100,3 @@ export async function pageComplete(completeEvent: CompleteEvent) {
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
export async function reindexSpace() {
|
||||
console.log("Clearing page index...");
|
||||
await index.clearPageIndex();
|
||||
// Executed this way to not have to embed the search plug code here
|
||||
await invoke("search.clearIndex");
|
||||
const pages = await space.listPages();
|
||||
|
||||
// Queue all page names to be indexed
|
||||
await mq.batchSend("indexQueue", pages.map((page) => page.name));
|
||||
|
||||
// Now let's wait for the processing to finish
|
||||
let queueStats = await mq.getQueueStats("indexQueue");
|
||||
while (queueStats.queued > 0 || queueStats.processing > 0) {
|
||||
sleep(1000);
|
||||
queueStats = await mq.getQueueStats("indexQueue");
|
||||
}
|
||||
// And notify the user
|
||||
console.log("Indexing completed!");
|
||||
}
|
||||
|
||||
export async function processIndexQueue(messages: Message[]) {
|
||||
for (const message of messages) {
|
||||
const name: string = message.body;
|
||||
console.log(`Indexing page ${name}`);
|
||||
const text = await space.readPage(name);
|
||||
// console.log("Going to parse markdown");
|
||||
const parsed = await markdown.parseMarkdown(text);
|
||||
// console.log("Dispatching ;age:index");
|
||||
await events.dispatchEvent("page:index", {
|
||||
name,
|
||||
tree: parsed,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export async function clearPageIndex(page: string) {
|
||||
// console.log("Clearing page index for page", page);
|
||||
await index.clearPageIndexForPage(page);
|
||||
}
|
||||
|
||||
export async function parseIndexTextRepublish({ name, text }: IndexEvent) {
|
||||
console.log("Reindexing", name);
|
||||
await events.dispatchEvent("page:index", {
|
||||
name,
|
||||
tree: await markdown.parseMarkdown(text),
|
||||
});
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { editor, space } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor, space } from "$sb/syscalls.ts";
|
||||
|
||||
function countWords(str: string): number {
|
||||
const matches = str.match(/[\w\d\'-]+/gi);
|
||||
@@ -1,4 +1,4 @@
|
||||
import { editor } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor } from "$sb/syscalls.ts";
|
||||
|
||||
export async function quoteSelection() {
|
||||
let text = await editor.getText();
|
||||
@@ -1,6 +1,5 @@
|
||||
import { readCodeBlockPage } from "../../plug-api/lib/yaml_page.ts";
|
||||
import { editor } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { store } from "$sb/plugos-syscall/mod.ts";
|
||||
import { readCodeBlockPage } from "$sb/lib/yaml_page.ts";
|
||||
import { editor, store } from "$sb/syscalls.ts";
|
||||
|
||||
export async function toggleVimMode() {
|
||||
let vimMode = await store.get("vimMode");
|
||||
@@ -1,5 +1,5 @@
|
||||
import emojis from "./emoji.json" assert { type: "json" };
|
||||
import type { CompleteEvent } from "../../plug-api/app_event.ts";
|
||||
import type { CompleteEvent } from "$sb/app_event.ts";
|
||||
|
||||
export function emojiCompleter({ linePrefix, pos }: CompleteEvent) {
|
||||
const match = /:([\w]+)$/.exec(linePrefix);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import "$sb/lib/fetch.ts";
|
||||
import { federatedPathToUrl } from "$sb/lib/resolve.ts";
|
||||
import { readFederationConfigs } from "./config.ts";
|
||||
import { store } from "$sb/plugos-syscall/mod.ts";
|
||||
import { FileMeta } from "$sb/types.ts";
|
||||
import { store } from "$sb/syscalls.ts";
|
||||
import type { FileMeta } from "$sb/types.ts";
|
||||
|
||||
async function responseToFileMeta(
|
||||
r: Response,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { collectNodesOfType } from "$sb/lib/tree.ts";
|
||||
import { index } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { index } from "$sb/syscalls.ts";
|
||||
import type { CompleteEvent, IndexTreeEvent } from "$sb/app_event.ts";
|
||||
import { removeQueries } from "$sb/lib/query.ts";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { QueryProviderEvent } from "$sb/app_event.ts";
|
||||
import { applyQuery } from "$sb/lib/query.ts";
|
||||
import { space } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { space } from "$sb/syscalls.ts";
|
||||
|
||||
export async function attachmentQueryProvider({ query }: QueryProviderEvent) {
|
||||
return applyQuery(query, await space.listAttachments());
|
||||
@@ -1,6 +1,6 @@
|
||||
import { index } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import type { CompleteEvent } from "$sb/app_event.ts";
|
||||
import { events } from "$sb/plugos-syscall/mod.ts";
|
||||
import { events } from "$sb/syscalls.ts";
|
||||
|
||||
export type AttributeContext = "page" | "item" | "task";
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
name: index
|
||||
syntax:
|
||||
Hashtag:
|
||||
firstCharacters:
|
||||
- "#"
|
||||
regex: "#[^#\\d\\s\\[\\]]+\\w+"
|
||||
className: sb-hashtag
|
||||
NamedAnchor:
|
||||
firstCharacters:
|
||||
- "$"
|
||||
regex: "\\$[a-zA-Z\\.\\-\\/]+[\\w\\.\\-\\/]*"
|
||||
className: sb-named-anchor
|
||||
functions:
|
||||
clearPageIndex:
|
||||
path: "./page.ts:clearPageIndex"
|
||||
env: server
|
||||
events:
|
||||
- page:saved
|
||||
- page:deleted
|
||||
pageQueryProvider:
|
||||
path: ./page.ts:pageQueryProvider
|
||||
events:
|
||||
- query:page
|
||||
parseIndexTextRepublish:
|
||||
path: "./page.ts:parseIndexTextRepublish"
|
||||
env: server
|
||||
events:
|
||||
- page:index_text
|
||||
reindexSpaceCommand:
|
||||
path: "./page.ts:reindexCommand"
|
||||
command:
|
||||
name: "Space: Reindex"
|
||||
processIndexQueue:
|
||||
path: ./page.ts:processIndexQueue
|
||||
mqSubscriptions:
|
||||
- queue: indexQueue
|
||||
batchSize: 10
|
||||
autoAck: true
|
||||
reindexSpace:
|
||||
path: "./page.ts:reindexSpace"
|
||||
|
||||
# Attachments
|
||||
attachmentQueryProvider:
|
||||
path: ./attachment.ts:attachmentQueryProvider
|
||||
events:
|
||||
- query:attachment
|
||||
|
||||
# Backlinks
|
||||
indexLinks:
|
||||
path: "./page_links.ts:indexLinks"
|
||||
events:
|
||||
- page:index
|
||||
linkQueryProvider:
|
||||
path: ./page_links.ts:linkQueryProvider
|
||||
events:
|
||||
- query:link
|
||||
|
||||
attributeComplete:
|
||||
path: "./attributes.ts:attributeComplete"
|
||||
events:
|
||||
- editor:complete
|
||||
|
||||
customAttributeCompleter:
|
||||
path: ./attributes.ts:customAttributeCompleter
|
||||
events:
|
||||
- attribute:complete:page
|
||||
- attribute:complete:task
|
||||
- attribute:complete:item
|
||||
- attribute:complete:*
|
||||
|
||||
builtinAttributeCompleter:
|
||||
path: ./attributes.ts:builtinAttributeCompleter
|
||||
events:
|
||||
- attribute:complete:page
|
||||
- attribute:complete:task
|
||||
- attribute:complete:item
|
||||
- attribute:complete:*
|
||||
|
||||
# Item indexing
|
||||
indexItem:
|
||||
path: "./item.ts:indexItems"
|
||||
events:
|
||||
- page:index
|
||||
itemQueryProvider:
|
||||
path: "./item.ts:queryProvider"
|
||||
events:
|
||||
- query:item
|
||||
|
||||
# Anchors
|
||||
indexAnchors:
|
||||
path: "./anchor.ts:indexAnchors"
|
||||
events:
|
||||
- page:index
|
||||
anchorComplete:
|
||||
path: "./anchor.ts:anchorComplete"
|
||||
events:
|
||||
- editor:complete
|
||||
|
||||
|
||||
|
||||
# Hashtags
|
||||
indexTags:
|
||||
path: "./tags.ts:indexTags"
|
||||
events:
|
||||
- page:index
|
||||
tagComplete:
|
||||
path: "./tags.ts:tagComplete"
|
||||
events:
|
||||
- editor:complete
|
||||
tagProvider:
|
||||
path: "./tags.ts:tagProvider"
|
||||
events:
|
||||
- query:tag
|
||||
|
||||
renamePageCommand:
|
||||
path: "./refactor.ts:renamePageCommand"
|
||||
command:
|
||||
name: "Page: Rename"
|
||||
mac: Cmd-Alt-r
|
||||
key: Ctrl-Alt-r
|
||||
page: ""
|
||||
renamePrefixCommand:
|
||||
path: "./refactor.ts:renamePrefixCommand"
|
||||
command:
|
||||
name: "Page: Batch Rename Prefix"
|
||||
|
||||
# Refactoring Commands
|
||||
extractToPageCommand:
|
||||
path: ./refactor.ts:extractToPageCommand
|
||||
command:
|
||||
name: "Page: Extract"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { IndexTreeEvent, QueryProviderEvent } from "$sb/app_event.ts";
|
||||
|
||||
import { index } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { index } from "$sb/syscalls.ts";
|
||||
import { collectNodesOfType, ParseTree, renderToText } from "$sb/lib/tree.ts";
|
||||
import { applyQuery, removeQueries } from "$sb/lib/query.ts";
|
||||
import { extractAttributes } from "$sb/lib/attribute.ts";
|
||||
@@ -0,0 +1,77 @@
|
||||
import type { IndexEvent, QueryProviderEvent } from "$sb/app_event.ts";
|
||||
import {
|
||||
editor,
|
||||
events,
|
||||
index,
|
||||
markdown,
|
||||
mq,
|
||||
space,
|
||||
system,
|
||||
} from "$sb/syscalls.ts";
|
||||
|
||||
import { applyQuery } from "$sb/lib/query.ts";
|
||||
import type { MQMessage } from "$sb/types.ts";
|
||||
import { sleep } from "../../common/async_util.ts";
|
||||
|
||||
// Key space:
|
||||
// meta: => metaJson
|
||||
|
||||
export async function pageQueryProvider({
|
||||
query,
|
||||
}: QueryProviderEvent): Promise<any[]> {
|
||||
return applyQuery(query, await space.listPages());
|
||||
}
|
||||
|
||||
export async function reindexCommand() {
|
||||
await editor.flashNotification("Performing full page reindex...");
|
||||
await reindexSpace();
|
||||
await editor.flashNotification("Done with page index!");
|
||||
}
|
||||
|
||||
export async function reindexSpace() {
|
||||
console.log("Clearing page index...");
|
||||
await index.clearPageIndex();
|
||||
// Executed this way to not have to embed the search plug code here
|
||||
await system.invokeFunction("search.clearIndex");
|
||||
const pages = await space.listPages();
|
||||
|
||||
// Queue all page names to be indexed
|
||||
await mq.batchSend("indexQueue", pages.map((page) => page.name));
|
||||
|
||||
// Now let's wait for the processing to finish
|
||||
let queueStats = await mq.getQueueStats("indexQueue");
|
||||
while (queueStats.queued > 0 || queueStats.processing > 0) {
|
||||
sleep(1000);
|
||||
queueStats = await mq.getQueueStats("indexQueue");
|
||||
}
|
||||
// And notify the user
|
||||
console.log("Indexing completed!");
|
||||
}
|
||||
|
||||
export async function processIndexQueue(messages: MQMessage[]) {
|
||||
for (const message of messages) {
|
||||
const name: string = message.body;
|
||||
console.log(`Indexing page ${name}`);
|
||||
const text = await space.readPage(name);
|
||||
// console.log("Going to parse markdown");
|
||||
const parsed = await markdown.parseMarkdown(text);
|
||||
// console.log("Dispatching ;age:index");
|
||||
await events.dispatchEvent("page:index", {
|
||||
name,
|
||||
tree: parsed,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export async function clearPageIndex(page: string) {
|
||||
// console.log("Clearing page index for page", page);
|
||||
await index.clearPageIndexForPage(page);
|
||||
}
|
||||
|
||||
export async function parseIndexTextRepublish({ name, text }: IndexEvent) {
|
||||
console.log("Reindexing", name);
|
||||
await events.dispatchEvent("page:index", {
|
||||
name,
|
||||
tree: await markdown.parseMarkdown(text),
|
||||
});
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { index } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { index } from "$sb/syscalls.ts";
|
||||
import { findNodeOfType, traverseTree } from "$sb/lib/tree.ts";
|
||||
import { extractFrontmatter } from "$sb/lib/frontmatter.ts";
|
||||
import { extractAttributes } from "$sb/lib/attribute.ts";
|
||||
@@ -1,4 +1,4 @@
|
||||
import { editor, space } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor, space } from "$sb/syscalls.ts";
|
||||
import { validatePageName } from "$sb/lib/page.ts";
|
||||
import { getBackLinks } from "./page_links.ts";
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import { collectNodesOfType } from "$sb/lib/tree.ts";
|
||||
import { index } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { index } from "$sb/syscalls.ts";
|
||||
import type {
|
||||
CompleteEvent,
|
||||
IndexTreeEvent,
|
||||
QueryProviderEvent,
|
||||
} from "$sb/app_event.ts";
|
||||
import { applyQuery, removeQueries } from "$sb/lib/query.ts";
|
||||
import { extractFrontmatter } from "../../plug-api/lib/frontmatter.ts";
|
||||
import { extractFrontmatter } from "$sb/lib/frontmatter.ts";
|
||||
|
||||
// Key space
|
||||
// tag:TAG => true (for completion)
|
||||
@@ -1,7 +1,6 @@
|
||||
import { editor } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { clientStore, editor } from "$sb/syscalls.ts";
|
||||
import { readSettings } from "$sb/lib/settings_page.ts";
|
||||
import { updateMarkdownPreview } from "./preview.ts";
|
||||
import { clientStore } from "$sb/silverbullet-syscall/mod.ts";
|
||||
|
||||
export async function togglePreview() {
|
||||
const currentValue = !!(await clientStore.get("enableMarkdownPreview"));
|
||||
|
||||
@@ -10,7 +10,7 @@ import { assertEquals } from "../../test_deps.ts";
|
||||
Deno.test("Markdown render", async () => {
|
||||
const system = new System<any>("server");
|
||||
await system.load(
|
||||
new URL("../../dist_plug_bundle/_plug/core.plug.js", import.meta.url),
|
||||
new URL("../../dist_plug_bundle/_plug/editor.plug.js", import.meta.url),
|
||||
createSandbox,
|
||||
);
|
||||
await system.load(
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
import { clientStore, editor, system } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { asset } from "$sb/plugos-syscall/mod.ts";
|
||||
import { parseMarkdown } from "$sb/silverbullet-syscall/markdown.ts";
|
||||
import { asset, clientStore, editor, markdown, system } from "$sb/syscalls.ts";
|
||||
import { renderMarkdownToHtml } from "./markdown_render.ts";
|
||||
import { resolvePath } from "$sb/lib/resolve.ts";
|
||||
|
||||
@@ -10,7 +8,7 @@ export async function updateMarkdownPreview() {
|
||||
}
|
||||
const currentPage = await editor.getCurrentPage();
|
||||
const text = await editor.getText();
|
||||
const mdTree = await parseMarkdown(text);
|
||||
const mdTree = await markdown.parseMarkdown(text);
|
||||
// const cleanMd = await cleanMarkdown(text);
|
||||
const css = await asset.readAsset("assets/styles.css");
|
||||
const js = await asset.readAsset("assets/handler.js");
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
renderToText,
|
||||
replaceNodesMatching,
|
||||
} from "$sb/lib/tree.ts";
|
||||
import { markdown } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { markdown } from "$sb/syscalls.ts";
|
||||
|
||||
export function encodePageUrl(name: string): string {
|
||||
return name;
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import { parseMarkdown } from "$sb/silverbullet-syscall/markdown.ts";
|
||||
import { markdown } from "$sb/syscalls.ts";
|
||||
import type { WidgetContent } from "$sb/app_event.ts";
|
||||
import { renderMarkdownToHtml } from "./markdown_render.ts";
|
||||
|
||||
export async function markdownWidget(
|
||||
bodyText: string,
|
||||
): Promise<WidgetContent> {
|
||||
const mdTree = await parseMarkdown(bodyText);
|
||||
const mdTree = await markdown.parseMarkdown(bodyText);
|
||||
|
||||
const html = await renderMarkdownToHtml(mdTree, {
|
||||
const html = renderMarkdownToHtml(mdTree, {
|
||||
smartHardBreak: true,
|
||||
});
|
||||
return Promise.resolve({
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
name: plug-manager
|
||||
requiredPermissions:
|
||||
- fetch
|
||||
functions:
|
||||
updatePlugsCommand:
|
||||
path: ./plugmanager.ts:updatePlugsCommand
|
||||
command:
|
||||
name: "Plugs: Update"
|
||||
key: "Ctrl-Shift-p"
|
||||
mac: "Cmd-Shift-p"
|
||||
getPlugHTTPS:
|
||||
path: "./plugmanager.ts:getPlugHTTPS"
|
||||
events:
|
||||
- get-plug:https
|
||||
getPlugGithub:
|
||||
path: "./plugmanager.ts:getPlugGithub"
|
||||
events:
|
||||
- get-plug:github
|
||||
getPlugGithubRelease:
|
||||
path: "./plugmanager.ts:getPlugGithubRelease"
|
||||
events:
|
||||
- get-plug:ghr
|
||||
addPlugCommand:
|
||||
path: ./plugmanager.ts:addPlugCommand
|
||||
command:
|
||||
name: "Plugs: Add"
|
||||
@@ -1,5 +1,4 @@
|
||||
import { events } from "$sb/plugos-syscall/mod.ts";
|
||||
import { editor, space, system } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor, events, space, system } from "$sb/syscalls.ts";
|
||||
import { readYamlPage } from "$sb/lib/yaml_page.ts";
|
||||
import { builtinPlugNames } from "../builtin_plugs.ts";
|
||||
|
||||
@@ -58,7 +58,7 @@ export class SimpleSearchEngine {
|
||||
const uniqueStemmedWords = [...new Set(stemmedWords)];
|
||||
const currentIdsArray = await this.index.get(uniqueStemmedWords);
|
||||
|
||||
stemmedWords.forEach((stemmedWord, i) => {
|
||||
stemmedWords.forEach((stemmedWord) => {
|
||||
const currentIds =
|
||||
currentIdsArray[uniqueStemmedWords.indexOf(stemmedWord)] || [];
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ functions:
|
||||
indexPage:
|
||||
path: search.ts:indexPage
|
||||
# Only enable in client for now
|
||||
env: client
|
||||
# env: client
|
||||
events:
|
||||
- page:index
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { IndexTreeEvent, QueryProviderEvent } from "$sb/app_event.ts";
|
||||
import { renderToText } from "$sb/lib/tree.ts";
|
||||
import { store } from "$sb/plugos-syscall/mod.ts";
|
||||
import { applyQuery } from "$sb/lib/query.ts";
|
||||
import { editor, index } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor, index, store } from "$sb/syscalls.ts";
|
||||
import { BatchKVStore, SimpleSearchEngine } from "./engine.ts";
|
||||
import { FileMeta } from "$sb/types.ts";
|
||||
|
||||
@@ -26,10 +25,10 @@ class StoreKVStore implements BatchKVStore<string, string[]> {
|
||||
}
|
||||
}
|
||||
|
||||
const engine = new SimpleSearchEngine(
|
||||
new StoreKVStore("fts:"),
|
||||
new StoreKVStore("fts_rev:"),
|
||||
);
|
||||
const ftsKvStore = new StoreKVStore("fts:");
|
||||
const ftsRevKvStore = new StoreKVStore("fts_rev:");
|
||||
|
||||
const engine = new SimpleSearchEngine(ftsKvStore, ftsRevKvStore);
|
||||
|
||||
export async function indexPage({ name, tree }: IndexTreeEvent) {
|
||||
const text = renderToText(tree);
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { events } from "$sb/plugos-syscall/mod.ts";
|
||||
import { editor, markdown } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor, events, markdown } from "$sb/syscalls.ts";
|
||||
import { extractFrontmatter } from "$sb/lib/frontmatter.ts";
|
||||
import { PublishEvent } from "$sb/app_event.ts";
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
name: sync
|
||||
functions:
|
||||
syncSpaceCommand:
|
||||
path: "./sync.ts:syncSpaceCommand"
|
||||
command:
|
||||
name: "Sync: Now"
|
||||
key: "Alt-Shift-s"
|
||||
mac: "Cmd-Shift-s"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { editor, sync } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor, sync } from "$sb/syscalls.ts";
|
||||
|
||||
export async function syncSpaceCommand() {
|
||||
await editor.flashNotification("Syncing space...");
|
||||
+2
-8
@@ -4,13 +4,7 @@ import type {
|
||||
QueryProviderEvent,
|
||||
} from "$sb/app_event.ts";
|
||||
|
||||
import {
|
||||
editor,
|
||||
index,
|
||||
markdown,
|
||||
space,
|
||||
sync,
|
||||
} from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor, index, markdown, space, sync } from "$sb/syscalls.ts";
|
||||
|
||||
import {
|
||||
addParentPointers,
|
||||
@@ -26,7 +20,7 @@ import { applyQuery, removeQueries } from "$sb/lib/query.ts";
|
||||
import { niceDate } from "$sb/lib/dates.ts";
|
||||
import { extractAttributes } from "$sb/lib/attribute.ts";
|
||||
import { rewritePageRefs } from "$sb/lib/resolve.ts";
|
||||
import { indexAttributes } from "../core/attributes.ts";
|
||||
import { indexAttributes } from "../index/attributes.ts";
|
||||
|
||||
export type Task = {
|
||||
name: string;
|
||||
|
||||
@@ -20,7 +20,7 @@ syntax:
|
||||
backgroundColor: "rgba(22,22,22,0.07)"
|
||||
functions:
|
||||
turnIntoTask:
|
||||
redirect: core.applyLineReplace
|
||||
redirect: template.applyLineReplace
|
||||
slashCommand:
|
||||
name: task
|
||||
description: Turn into task
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
name: template
|
||||
functions:
|
||||
# Template commands
|
||||
insertTemplateText:
|
||||
path: "./template.ts:insertTemplateText"
|
||||
applyLineReplace:
|
||||
path: ./template.ts:applyLineReplace
|
||||
insertFrontMatter:
|
||||
redirect: insertTemplateText
|
||||
slashCommand:
|
||||
name: front-matter
|
||||
description: Insert page front matter
|
||||
value: |
|
||||
---
|
||||
|^|
|
||||
---
|
||||
makeH1:
|
||||
redirect: applyLineReplace
|
||||
slashCommand:
|
||||
name: h1
|
||||
description: Turn line into h1 header
|
||||
match: "^#*\\s*"
|
||||
replace: "# "
|
||||
makeH2:
|
||||
redirect: applyLineReplace
|
||||
slashCommand:
|
||||
name: h2
|
||||
description: Turn line into h2 header
|
||||
match: "^#*\\s*"
|
||||
replace: "## "
|
||||
makeH3:
|
||||
redirect: applyLineReplace
|
||||
slashCommand:
|
||||
name: h3
|
||||
description: Turn line into h3 header
|
||||
match: "^#*\\s*"
|
||||
replace: "### "
|
||||
makeH4:
|
||||
redirect: applyLineReplace
|
||||
slashCommand:
|
||||
name: h4
|
||||
description: Turn line into h4 header
|
||||
match: "^#*\\s*"
|
||||
replace: "#### "
|
||||
insertCodeBlock:
|
||||
redirect: insertTemplateText
|
||||
slashCommand:
|
||||
name: code
|
||||
description: Insert code block
|
||||
value: |
|
||||
```
|
||||
|^|
|
||||
```
|
||||
|
||||
insertHRTemplate:
|
||||
redirect: insertTemplateText
|
||||
slashCommand:
|
||||
name: hr
|
||||
description: Insert a horizontal rule
|
||||
value: "---"
|
||||
insertTable:
|
||||
redirect: insertTemplateText
|
||||
slashCommand:
|
||||
name: table
|
||||
description: Insert a table
|
||||
boost: -1 # Low boost because it's likely not very commonly used
|
||||
value: |
|
||||
| Header A | Header B |
|
||||
|----------|----------|
|
||||
| Cell A|^| | Cell B |
|
||||
quickNoteCommand:
|
||||
path: ./template.ts:quickNoteCommand
|
||||
command:
|
||||
name: "Quick Note"
|
||||
key: "Alt-Shift-n"
|
||||
priority: 1
|
||||
dailyNoteCommand:
|
||||
path: ./template.ts:dailyNoteCommand
|
||||
command:
|
||||
name: "Open Daily Note"
|
||||
key: "Alt-Shift-d"
|
||||
weeklyNoteCommand:
|
||||
path: ./template.ts:weeklyNoteCommand
|
||||
command:
|
||||
name: "Open Weekly Note"
|
||||
key: "Alt-Shift-w"
|
||||
|
||||
instantiateTemplateCommand:
|
||||
path: ./template.ts:instantiateTemplateCommand
|
||||
command:
|
||||
name: "Template: Instantiate Page"
|
||||
insertSnippet:
|
||||
path: ./template.ts:insertSnippet
|
||||
command:
|
||||
name: "Template: Insert Snippet"
|
||||
slashCommand:
|
||||
name: snippet
|
||||
description: Insert a snippet
|
||||
applyPageTemplateCommand:
|
||||
path: ./template.ts:applyPageTemplateCommand
|
||||
slashCommand:
|
||||
name: page-template
|
||||
description: Apply a page template
|
||||
insertTodayCommand:
|
||||
path: "./template.ts:insertTemplateText"
|
||||
slashCommand:
|
||||
name: today
|
||||
description: Insert today's date
|
||||
value: "{{today}}"
|
||||
insertTomorrowCommand:
|
||||
path: "./template.ts:insertTemplateText"
|
||||
slashCommand:
|
||||
name: tomorrow
|
||||
description: Insert tomorrow's date
|
||||
value: "{{tomorrow}}"
|
||||
@@ -1,4 +1,4 @@
|
||||
import { editor, markdown, space } from "$sb/silverbullet-syscall/mod.ts";
|
||||
import { editor, markdown, space } from "$sb/syscalls.ts";
|
||||
import { extractFrontmatter } from "$sb/lib/frontmatter.ts";
|
||||
import { renderToText } from "$sb/lib/tree.ts";
|
||||
import { niceDate } from "$sb/lib/dates.ts";
|
||||
Reference in New Issue
Block a user