2023-10-03 12:16:33 +00:00
|
|
|
async function init() {
|
|
|
|
// Make edit button send the "blur" API call so that the MD code is visible
|
|
|
|
document.getElementById("edit-button").addEventListener("click", () => {
|
|
|
|
api({ type: "blur" });
|
|
|
|
});
|
|
|
|
document.getElementById("reload-button").addEventListener("click", () => {
|
|
|
|
api({ type: "reload" });
|
|
|
|
});
|
2023-10-29 09:14:18 +00:00
|
|
|
document.getElementById("source-button").addEventListener("click", () => {
|
|
|
|
document.getElementById("body-content").innerText = originalMarkdown;
|
|
|
|
});
|
2023-10-03 12:16:33 +00:00
|
|
|
|
|
|
|
document.querySelectorAll("a[data-ref]").forEach((el) => {
|
|
|
|
el.addEventListener("click", (e) => {
|
|
|
|
e.preventDefault();
|
|
|
|
syscall("editor.navigate", el.dataset.ref);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
// Find all fenced code blocks and replace them with iframes (if a code widget is defined for them)
|
|
|
|
const allWidgets = document.querySelectorAll("pre[data-lang]");
|
|
|
|
for (const widget of allWidgets) {
|
|
|
|
const lang = widget.getAttribute("data-lang");
|
|
|
|
const body = widget.innerText;
|
|
|
|
|
|
|
|
try {
|
2023-10-31 09:33:38 +00:00
|
|
|
const result = await syscall("codeWidget.render", lang, body, pageName);
|
2023-10-03 12:16:33 +00:00
|
|
|
const iframe = document.createElement("iframe");
|
2023-10-09 19:02:57 +00:00
|
|
|
iframe.src = "about:blank";
|
|
|
|
|
2023-10-03 12:16:33 +00:00
|
|
|
iframe.onload = () => {
|
2023-10-09 19:02:57 +00:00
|
|
|
iframe.contentDocument.write(panelHtml);
|
2023-10-03 12:16:33 +00:00
|
|
|
iframe.contentWindow.postMessage({
|
|
|
|
type: "html",
|
|
|
|
theme: document.getElementsByTagName("html")[0].getAttribute(
|
|
|
|
"data-theme",
|
|
|
|
),
|
|
|
|
...result,
|
|
|
|
}, "*");
|
|
|
|
};
|
|
|
|
widget.parentNode.replaceChild(iframe, widget);
|
|
|
|
|
|
|
|
globalThis.addEventListener("message", (e) => {
|
|
|
|
if (e.source !== iframe.contentWindow) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const messageData = e.data;
|
|
|
|
switch (messageData.type) {
|
|
|
|
case "setHeight":
|
2023-11-16 08:59:37 +00:00
|
|
|
iframe.height = messageData.height + "px";
|
2023-10-03 12:16:33 +00:00
|
|
|
// Propagate height setting to parent
|
|
|
|
updateHeight();
|
|
|
|
break;
|
|
|
|
case "syscall": {
|
|
|
|
// Intercept syscall messages and send them to the parent
|
|
|
|
const { id, name, args } = messageData;
|
|
|
|
syscall(name, ...args).then((result) => {
|
|
|
|
iframe.contentWindow.postMessage(
|
|
|
|
{ id, type: "syscall-response", result },
|
|
|
|
"*",
|
|
|
|
);
|
|
|
|
}).catch((error) => {
|
|
|
|
iframe.contentWindow.postMessage({
|
|
|
|
id,
|
|
|
|
type: "syscall-response",
|
|
|
|
error,
|
|
|
|
}, "*");
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
// Bubble up any other messages to parent iframe
|
|
|
|
window.parent.postMessage(messageData, "*");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
if (e.message.includes("not found")) {
|
|
|
|
// Not a code widget, ignore
|
|
|
|
} else {
|
|
|
|
console.error("Error rendering widget", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Find all task toggles and propagate their state
|
|
|
|
document.querySelectorAll("span[data-external-task-ref]").forEach((el) => {
|
|
|
|
const taskRef = el.dataset.externalTaskRef;
|
|
|
|
el.querySelector("input[type=checkbox]").addEventListener("change", (e) => {
|
|
|
|
const oldState = e.target.dataset.state;
|
|
|
|
const newState = oldState === " " ? "x" : " ";
|
|
|
|
// Update state in DOM as well for future toggles
|
|
|
|
e.target.dataset.state = newState;
|
|
|
|
console.log("Toggling task", taskRef);
|
|
|
|
syscall(
|
|
|
|
"system.invokeFunction",
|
|
|
|
"tasks.updateTaskState",
|
|
|
|
taskRef,
|
|
|
|
oldState,
|
|
|
|
newState,
|
|
|
|
).catch(
|
|
|
|
console.error,
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
init().catch(console.error);
|