Last active
February 28, 2023 09:14
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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