Spaces:
Running
Running
| /** | |
| * Add attributes to Thebe blocks to initialize thebe properly | |
| */ | |
| var configureThebe = () => { | |
| // Load thebe config in case we want to update it as some point | |
| console.log("[sphinx-thebe]: Loading thebe config..."); | |
| thebe_config = document.querySelector("script[type=\"text/x-thebe-config\"]"); | |
| // If we already detect a Thebe cell, don't re-run | |
| if (document.querySelectorAll("div.thebe-cell").length > 0) { | |
| return; | |
| } | |
| // Update thebe buttons with loading message | |
| document.querySelectorAll(".thebe-launch-button").forEach((button) => { | |
| button.innerHTML = ` | |
| <div class="spinner"> | |
| <div class="rect1"></div> | |
| <div class="rect2"></div> | |
| <div class="rect3"></div> | |
| <div class="rect4"></div> | |
| </div> | |
| <span class="loading-text"></span>`; | |
| }); | |
| // Set thebe event hooks | |
| var thebeStatus; | |
| thebelab.on("status", function (evt, data) { | |
| console.log("Status changed:", data.status, data.message); | |
| const button = document.querySelector(".thebe-launch-button "); | |
| button.classList.replace( | |
| `thebe-status-${thebeStatus}`, | |
| `thebe-status-${data.status}` | |
| ) | |
| button.querySelector(".loading-text") | |
| .innerHTML = ( | |
| `<span class='launch_msg'>Launching from mybinder.org: </span> | |
| <span class='status'>${data.status}</span>` | |
| ); | |
| // Now update our thebe status | |
| thebeStatus = data.status; | |
| // Find any cells with an initialization tag and ask thebe to run them when ready | |
| if (data.status === "ready") { | |
| var thebeInitCells = document.querySelectorAll( | |
| ".thebe-init, .tag_thebe-init" | |
| ); | |
| thebeInitCells.forEach((cell) => { | |
| console.log("Initializing Thebe with cell: " + cell.id); | |
| cell.querySelector(".thebelab-run-button").click(); | |
| }); | |
| } | |
| }); | |
| }; | |
| /** | |
| * Update the page DOM to use Thebe elements | |
| */ | |
| var modifyDOMForThebe = () => { | |
| // Find all code cells, replace with Thebe interactive code cells | |
| const codeCells = document.querySelectorAll(thebe_selector); | |
| codeCells.forEach((codeCell, index) => { | |
| const codeCellId = (index) => `codecell${index}`; | |
| codeCell.id = codeCellId(index); | |
| codeCellText = codeCell.querySelector(thebe_selector_input); | |
| codeCellOutput = codeCell.querySelector(thebe_selector_output); | |
| // Clean up the language to make it work w/ CodeMirror and add it to the cell | |
| dataLanguage = detectLanguage(kernelName); | |
| // Re-arrange the cell and add metadata | |
| if (codeCellText) { | |
| codeCellText.setAttribute("data-language", dataLanguage); | |
| codeCellText.setAttribute("data-executable", "true"); | |
| // If we had an output, insert it just after the `pre` cell | |
| if (codeCellOutput) { | |
| codeCellOutput.setAttribute("data-output", ""); | |
| codeCellText.insertAdjacentElement('afterend', codeCellOutput); | |
| } | |
| } | |
| // Remove sphinx-copybutton blocks, which are common in Sphinx | |
| codeCell.querySelectorAll("button.copybtn").forEach((el) => { | |
| el.remove(); | |
| }); | |
| }); | |
| }; | |
| var initThebe = () => { | |
| // Load thebe dynamically if it's not already loaded | |
| if (typeof thebelab === "undefined") { | |
| console.log("[sphinx-thebe]: Loading thebe from CDN..."); | |
| document.querySelector(".thebe-launch-button ").innerText = "Loading thebe from CDN..."; | |
| const script = document.createElement("script"); | |
| script.src = `${THEBE_JS_URL}`; | |
| document.head.appendChild(script); | |
| // Runs once the script has finished loading | |
| script.addEventListener("load", () => { | |
| console.log("[sphinx-thebe]: Finished loading thebe from CDN..."); | |
| configureThebe(); | |
| modifyDOMForThebe(); | |
| thebelab.bootstrap(); | |
| }); | |
| } else { | |
| console.log( | |
| "[sphinx-thebe]: thebe already loaded, not loading from CDN..." | |
| ); | |
| configureThebe(); | |
| modifyDOMForThebe(); | |
| thebelab.bootstrap(); | |
| } | |
| }; | |
| // Helper function to munge the language name | |
| var detectLanguage = (language) => { | |
| if (language.indexOf("python") > -1) { | |
| language = "python"; | |
| } else if (language === "ir") { | |
| language = "r"; | |
| } | |
| return language; | |
| }; | |