Implementation of #117: sharing

This commit is contained in:
Zef Hemel
2022-11-24 16:08:51 +01:00
parent 5b1ec14891
commit b61e8ff681
12 changed files with 78 additions and 25 deletions
+26 -3
View File
@@ -4,7 +4,9 @@ import { replaceAsync } from "$sb/lib/util.ts";
import { directiveRegex, renderDirectives } from "./directives.ts";
import { extractFrontmatter } from "$sb/lib/frontmatter.ts";
export async function updateDirectivesOnPageCommand() {
export async function updateDirectivesOnPageCommand(arg: any) {
// If `arg` is a string, it's triggered automatically via an event, not explicitly via a command
const explicitCall = typeof arg !== "string";
const pageName = await editor.getCurrentPage();
const text = await editor.getText();
const tree = await markdown.parseMarkdown(text);
@@ -14,6 +16,22 @@ export async function updateDirectivesOnPageCommand() {
return;
}
// If this page is shared ($share) via collab: disable directives as well
// due to security concerns
if (metaData.$share) {
for (const uri of metaData.$share) {
if (uri.startsWith("collab:")) {
if (explicitCall) {
await editor.flashNotification(
"Directives are disabled for 'collab' pages (safety reasons).",
"error",
);
}
return;
}
}
}
// Collect all directives and their body replacements
const replacements: { fullMatch: string; text?: string }[] = [];
@@ -62,10 +80,15 @@ export async function updateDirectivesOnPageCommand() {
);
continue;
}
const from = index, to = index + replacement.fullMatch.length;
if (text.substring(from, to) === replacement.text) {
// No change, skip
continue;
}
await editor.dispatch({
changes: {
from: index,
to: index + replacement.fullMatch.length,
from,
to,
insert: replacement.text,
},
});
+1 -1
View File
@@ -15,7 +15,7 @@ export const directiveRegex =
/**
* Looks for directives in the text dispatches them based on name
*/
export async function directiveDispatcher(
export function directiveDispatcher(
pageName: string,
text: string,
tree: ParseTree,