From 68e3572278ff9d0b922f8bac4ec7d32632264dbd Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Wed, 6 Nov 2024 14:56:49 -0700 Subject: [PATCH] Fix inadvertently broken folding behavior --- src/theme/book.js | 11 ----- src/theme/index.hbs | 14 +++--- src/theme/toc.js.hbs | 98 +++++++++++++++++++++++----------------- tests/rendered_output.rs | 2 +- 4 files changed, 65 insertions(+), 60 deletions(-) diff --git a/src/theme/book.js b/src/theme/book.js index 02b1908ddc..178f1e902d 100644 --- a/src/theme/book.js +++ b/src/theme/book.js @@ -463,17 +463,6 @@ function playground_text(playground, hidden = true) { try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } } - - var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); - - function toggleSection(ev) { - ev.currentTarget.parentElement.classList.toggle('expanded'); - } - - Array.from(sidebarAnchorToggles).forEach(function (el) { - el.addEventListener('click', toggleSection); - }); - function hideSidebar() { body.classList.remove('sidebar-visible') body.classList.add('sidebar-hidden'); diff --git a/src/theme/index.hbs b/src/theme/index.hbs index b62b29e8f3..7775f262d6 100644 --- a/src/theme/index.hbs +++ b/src/theme/index.hbs @@ -52,15 +52,17 @@ {{/if}} - - -
+ - + + + + +
-
diff --git a/src/theme/toc.js.hbs b/src/theme/toc.js.hbs index eb48c8ba59..7adf0c2789 100644 --- a/src/theme/toc.js.hbs +++ b/src/theme/toc.js.hbs @@ -3,52 +3,68 @@ // This is a script, and not included directly in the page, to control the total size of the book. // The TOC contains an entry for each page, so if each page includes a copy of the TOC, // the total size of the page becomes O(n**2). -var sidebarScrollbox = document.querySelector("#sidebar .sidebar-scrollbox"); -sidebarScrollbox.innerHTML = '{{#toc}}{{/toc}}'; -(function() { - let current_page = document.location.href.toString(); - if (current_page.endsWith("/")) { - current_page += "index.html"; +class MDBookSidebarScrollbox extends HTMLElement { + constructor() { + super(); } - var links = sidebarScrollbox.querySelectorAll("a"); - var l = links.length; - for (var i = 0; i < l; ++i) { - var link = links[i]; - var href = link.getAttribute("href"); - if (href && !href.startsWith("#") && !/^(?:[a-z+]+:)?\/\//.test(href)) { - link.href = path_to_root + href; + connectedCallback() { + this.innerHTML = '{{#toc}}{{/toc}}'; + // Set the current, active page, and reveal it if it's hidden + let current_page = document.location.href.toString(); + if (current_page.endsWith("/")) { + current_page += "index.html"; } - // The "index" page is supposed to alias the first chapter in the book. - if (link.href === current_page || (i === 0 && path_to_root === "" && current_page.endsWith("/index.html"))) { - link.classList.add("active"); - var parent = link.parentElement; - while (parent) { - if (parent.tagName === "LI" && parent.previousElementSibling) { - if (parent.previousElementSibling.classList.contains("chapter-item")) { - parent.previousElementSibling.classList.add("expanded"); + var links = Array.prototype.slice.call(this.querySelectorAll("a")); + var l = links.length; + for (var i = 0; i < l; ++i) { + var link = links[i]; + var href = link.getAttribute("href"); + if (href && !href.startsWith("#") && !/^(?:[a-z+]+:)?\/\//.test(href)) { + link.href = path_to_root + href; + } + // The "index" page is supposed to alias the first chapter in the book. + if (link.href === current_page || (i === 0 && path_to_root === "" && current_page.endsWith("/index.html"))) { + link.classList.add("active"); + var parent = link.parentElement; + if (parent && parent.classList.contains("chapter-item")) { + parent.classList.add("expanded"); + } + while (parent) { + if (parent.tagName === "LI" && parent.previousElementSibling) { + if (parent.previousElementSibling.classList.contains("chapter-item")) { + parent.previousElementSibling.classList.add("expanded"); + } } + parent = parent.parentElement; } - parent = parent.parentElement; } } - } -})(); - -// Track and set sidebar scroll position -sidebarScrollbox.addEventListener('click', function(e) { - if (e.target.tagName === 'A') { - sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop); - } -}, { passive: true }); -var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll'); -sessionStorage.removeItem('sidebar-scroll'); -if (sidebarScrollTop) { - // preserve sidebar scroll position when navigating via links within sidebar - sidebarScrollbox.scrollTop = sidebarScrollTop; -} else { - // scroll sidebar to current active section when navigating via "next/previous chapter" buttons - var activeSection = document.querySelector('#sidebar .active'); - if (activeSection) { - activeSection.scrollIntoView({ block: 'center' }); + // Track and set sidebar scroll position + this.addEventListener('click', function(e) { + if (e.target.tagName === 'A') { + sessionStorage.setItem('sidebar-scroll', this.scrollTop); + } + }, { passive: true }); + var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll'); + sessionStorage.removeItem('sidebar-scroll'); + if (sidebarScrollTop) { + // preserve sidebar scroll position when navigating via links within sidebar + this.scrollTop = sidebarScrollTop; + } else { + // scroll sidebar to current active section when navigating via "next/previous chapter" buttons + var activeSection = document.querySelector('#sidebar .active'); + if (activeSection) { + activeSection.scrollIntoView({ block: 'center' }); + } + } + // Toggle buttons + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); } } +window.customElements.define("mdbook-sidebar-scrollbox", MDBookSidebarScrollbox); diff --git a/tests/rendered_output.rs b/tests/rendered_output.rs index f5078a70c3..707b997db6 100644 --- a/tests/rendered_output.rs +++ b/tests/rendered_output.rs @@ -243,7 +243,7 @@ fn toc_js_html() -> Result { let toc_path = temp.path().join("book").join("toc.js"); let html = fs::read_to_string(toc_path).with_context(|| "Unable to read index.html")?; for line in html.lines() { - if let Some(left) = line.strip_prefix("sidebarScrollbox.innerHTML = '") { + if let Some(left) = line.strip_prefix(" this.innerHTML = '") { if let Some(html) = left.strip_suffix("';") { return Ok(Document::from(html)); }