Moved bold and italics to plug, new file: plug protocol

This commit is contained in:
Zef Hemel
2022-06-23 17:08:42 +02:00
parent 94d0e31b30
commit b22775fcc4
10 changed files with 162 additions and 17 deletions
+19
View File
@@ -132,3 +132,22 @@ functions:
path: ./template.ts:instantiateTemplateCommand
command:
name: "Template: Instantiate for Page"
quoteSelection:
path: ./text.ts:quoteSelection
command:
name: "Text: Quote Selection"
key: "Ctrl->"
mac: "Cmd-Shift-."
bold:
path: ./text.ts:boldCommand
command:
name: "Text: Bold"
key: "Ctrl-b"
mac: "Cmd-b"
italic:
path: ./text.ts:italicCommand
command:
name: "Text: Italic"
key: "Ctrl-i"
mac: "Cmd-i"
+91
View File
@@ -0,0 +1,91 @@
import {
getSelection,
getText,
insertAtCursor,
moveCursor,
replaceRange,
setSelection,
} from "@silverbulletmd/plugos-silverbullet-syscall/editor";
export async function quoteSelection() {
let text = await getText();
const selection = await getSelection();
let from = selection.from;
while (from >= 0 && text[from] !== "\n") {
from--;
}
from++;
if (text[from] === ">" && text[from + 1] === " ") {
// Already quoted, we have to unquote
text = text.slice(from + 2, selection.to);
text = text.replaceAll("\n> ", "\n");
} else {
text = text.slice(from, selection.to);
text = `> ${text.replaceAll("\n", "\n> ")}`;
}
await replaceRange(from, selection.to, text);
}
export function boldCommand() {
return insertMarker("**");
}
export function italicCommand() {
return insertMarker("_");
}
async function insertMarker(marker: string) {
let text = await getText();
const selection = await getSelection();
if (selection.from === selection.to) {
// empty selection
if (markerAt(selection.from)) {
// Already there, skipping ahead
await moveCursor(selection.from + marker.length);
} else {
// Not there, inserting
await insertAtCursor(marker + marker);
await moveCursor(selection.from + marker.length);
}
} else {
let from = selection.from;
let to = selection.to;
let hasMarker = markerAt(from);
if (!markerAt(from)) {
// Maybe just before the cursor? We'll accept that
from = selection.from - marker.length;
to = selection.to + marker.length;
hasMarker = markerAt(from);
}
if (!hasMarker) {
// Adding
await replaceRange(
selection.from,
selection.to,
marker + text.slice(selection.from, selection.to) + marker
);
await setSelection(
selection.from + marker.length,
selection.to + marker.length
);
} else {
// Removing
await replaceRange(
from,
to,
text.substring(from + marker.length, to - marker.length)
);
await setSelection(from, to - marker.length * 2);
}
}
function markerAt(pos: number) {
for (var i = 0; i < marker.length; i++) {
if (text[pos + i] !== marker[i]) {
return false;
}
}
return true;
}
}