Skip to content

Instantly share code, notes, and snippets.

@Akjosch
Last active February 28, 2023 09:14
Show Gist options
  • Save Akjosch/456bbc8901adee19f99bc530f2898a2c to your computer and use it in GitHub Desktop.
Save Akjosch/456bbc8901adee19f99bc530f2898a2c to your computer and use it in GitHub Desktop.
Simple DiceRoller buttons via `<<dice spec>>` inside an ObsidianMD note. Requires Dice Roller and CustomJS plugins to work. Extendable for more `<<tag>>` types.
class Tools {
static Macros = {
dice(code) {
code = String(code);
var b = createEl("button");
b.replaceChildren(code);
b.addEventListener("click", () => {
app.commands.executeCommandById("obsidian-dice-roller:open-view");
app.plugins.getPlugin("obsidian-dice-roller")?.view.roll(code)
});
return b;
}
};
constructor() {
var tool = this;
class ProcessPlugin extends obsidian.Plugin {
constructor() {
super();
this.registerMarkdownPostProcessor((element, context) => {
tool.inject(element);
});
}
};
new ProcessPlugin();
this.inject(app?.workspace?.activeLeaf?.containerEl);
}
inject(element) {
var macro = new RegExp('<<(?<name>[A-Za-z][\\w-]*)\\s+(?<arg>\\S.*?)>>', 'gm');
if(!element) {
return;
}
var textNodes = [];
try {
var walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false);
} catch(e) {
console.log(e);
return;
}
var node;
/* filter out relevant nodes */
while(node = walker.nextNode()) {
macro.lastIndex = 0;
if(macro.exec(node.nodeValue)) {
textNodes.push(node);
}
}
for(node of textNodes) {
macro.lastIndex = 0;
var search;
var res = [];
var lastIndex = 0;
while(search = macro.exec(node.nodeValue)) {
if(search.index > lastIndex) {
res.push(document.createTextNode(node.nodeValue.substring(lastIndex, search.index)));
}
if(def.Macros[search.groups.name]) {
var el = def.Macros[search.groups.name](search.groups.arg);
res.push(el);
} else {
res.push(document.createTextNode(search[0]));
}
lastIndex = search.index + search[0].length;
}
res.push(document.createTextNode(node.nodeValue.substring(lastIndex)));
var n;
for(n of res) {
node.parentNode.insertBefore(n, node);
}
node.parentNode.removeChild(node);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment