1
0
mirror of https://github.com/google/comprehensive-rust.git synced 2025-04-02 17:48:47 +02:00

Saving playground code state (#1917)

The embedded Playground's code reset when you navigate between slides.
This has caused problems: if people navigate away from a slide to look
something up, they've suddenly lost their work.
This commit is contained in:
Manichand Kondapaka 2024-03-22 21:45:54 +05:30 committed by GitHub
parent 6b3eb83bff
commit b7a6e3b46d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 140 additions and 23 deletions

View File

@ -46,7 +46,12 @@ urlcolor = "red"
[output.html]
curly-quotes = true
additional-js = ["theme/speaker-notes.js", "theme/redbox.js"]
additional-js = [
"theme/speaker-notes.js",
"theme/redbox.js",
"theme/save-playgrounds.js",
"theme/instructor-menu.js",
]
additional-css = [
"theme/css/svgbob.css",
"theme/css/redbox.css",

View File

@ -18,3 +18,7 @@ div#aspect-ratio-helper div {
of vertical space to borders. */
aspect-ratio: 16/8.5;
}
#instructor-menu-list {
margin-left: 55px;
}

71
theme/instructor-menu.js Normal file
View File

@ -0,0 +1,71 @@
(function handleInstructor() {
function handleInstructorMenu() {
let leftButtons = document.getElementsByClassName("left-buttons")[0];
let instructorMenu = document.createElement("button");
let instructorMenuList = document.createElement("ul");
let redBoxItem = document.createElement("li");
let redBoxButton = document.createElement("button");
let playgroundStateItem = document.createElement("li");
let playgroundStateButton = document.createElement("button");
leftButtons.insertBefore(instructorMenu, leftButtons.lastChild);
leftButtons.insertBefore(instructorMenuList, leftButtons.lastChild);
instructorMenuList.insertBefore(redBoxItem, instructorMenuList.lastChild);
instructorMenuList.insertBefore(
playgroundStateItem,
instructorMenuList.lastChild
);
redBoxItem.insertBefore(redBoxButton, redBoxItem.lastChild);
playgroundStateItem.insertBefore(
playgroundStateButton,
playgroundStateItem.lastChild
);
instructorMenu.title = "Utilities for course instructors";
instructorMenu.innerHTML =
'<i class="fa fa-ellipsis-v" aria-hidden="true"></i>';
redBoxButton.innerHTML = "aspect-ratio box";
redBoxButton.title =
"Outline the area that fits on one screen while teaching the course.";
playgroundStateButton.innerHTML = "reset all playgrounds";
playgroundStateButton.title =
"Reset code in all playgrounds to its original value.";
instructorMenu.className = "icon-button";
instructorMenuList.className = "theme-popup";
redBoxButton.className = "theme";
playgroundStateButton.className = "theme";
instructorMenuList.style.display = "none";
instructorMenuList.role = "menu";
redBoxItem.role = "none";
playgroundStateItem.role = "none";
redBoxButton.role = "menuitem";
playgroundStateButton.role = "menuitem";
redBoxButton.id = "redbox";
instructorMenuList.id = "instructor-menu-list";
playgroundStateButton.id = "playground-state";
instructorMenu.addEventListener("click", () => {
if (instructorMenuList.style.display === "none") {
instructorMenuList.style.display = "block";
} else {
instructorMenuList.style.display = "none";
}
});
document.addEventListener("click", (e) => {
if (!instructorMenu.contains(e.target)) {
instructorMenuList.style.display = "none";
}
});
}
handleInstructorMenu();
var redBoxButton = document.getElementById("redbox");
var playgroundStateButton = document.getElementById("playground-state");
redBoxButton.addEventListener("click", () => window.redboxButtonClicked());
playgroundStateButton.addEventListener("click", () =>
window.resetPlaygroundsClicked()
);
})();

View File

@ -11,28 +11,19 @@
var parentElement = document.body; // Change this to your desired parent element
// Append the new div to the parent element
parentElement.insertBefore(newDiv, parentElement.firstChild);
// Create the button element
var hideShowButton = document.createElement("button");
hideShowButton.innerHTML = '<i class="fa fa-square-o"></i>';
hideShowButton.className = "icon-button";
hideShowButton.type = "button";
hideShowButton.title =
"Outline the area that fits on one screen while teaching the course.";
hideShowButton.id = "Dev";
var navbarButtons = document.getElementsByClassName("left-buttons");
navbarButtons[0].insertBefore(hideShowButton, navbarButtons.firstChild);
//Default hiding the redbox
document.getElementById("aspect-ratio-helper").style.display = "none";
//Add Event listener to button to perform on click action.
hideShowButton.addEventListener("click", function () {
if (
document.getElementById("aspect-ratio-helper").style.display === "none"
) {
document.getElementById("aspect-ratio-helper").style.display = "block";
hideShowButton.innerHTML = '<i class="fa fa-square"></i>';
} else {
document.getElementById("aspect-ratio-helper").style.display = "none";
hideShowButton.innerHTML = '<i class="fa fa-square-o"></i>';
}
});
})();
//Create a function to button to perform on click action.
function redboxButtonClicked() {
var hideShowButton = document.getElementById("redbox");
if (document.getElementById("aspect-ratio-helper").style.display === "none") {
document.getElementById("aspect-ratio-helper").style.display = "block";
hideShowButton.innerHTML = "aspect-ratio box";
} else {
document.getElementById("aspect-ratio-helper").style.display = "none";
hideShowButton.innerHTML = "aspect-ratio box";
}
}
window.redboxButtonClicked = redboxButtonClicked;

46
theme/save-playgrounds.js Normal file
View File

@ -0,0 +1,46 @@
(function savePlaygrounds() {
function setCodeToPlayground() {
var codes = JSON.parse(
localStorage.getItem(`${window.location.href}₹code`)
);
if (codes) {
var i = 0;
Array.from(document.querySelectorAll(".playground")).forEach(function (
pre_block
) {
let code_block = pre_block.querySelector("code");
let editor = window.ace.edit(code_block);
editor.setValue(codes[i]);
editor.clearSelection();
i += 1;
});
}
}
function getCodeFromPlayground() {
var codes = [];
Array.from(document.querySelectorAll(".playground")).forEach(function (
pre_block
) {
let code_block = pre_block.querySelector("code");
let editor = window.ace.edit(code_block);
let code = editor.getValue();
codes.push(code);
});
localStorage.setItem(`${window.location.href}₹code`, JSON.stringify(codes));
}
setCodeToPlayground();
addEventListener("pagehide", getCodeFromPlayground);
})();
function resetPlaygroundsClicked() {
let keys = [];
for (var i = 0, len = localStorage.length; i < len; i++) {
if (localStorage.key(i).includes("₹code")) {
keys.push(localStorage.key(i));
}
}
for (let j = 0; j < keys.length; j++) {
localStorage.removeItem(keys[j]);
}
}
window.resetPlaygroundsClicked = resetPlaygroundsClicked;