@@ -29,14 +29,9 @@ class MDBookSidebarScrollbox extends HTMLElement {
2929 && current_page.endsWith('/index.html')) {
3030 link.classList.add('active');
3131 let parent = link.parentElement;
32- if (parent && parent.classList.contains('chapter-item')) {
33- parent.classList.add('expanded');
34- }
3532 while (parent) {
36- if (parent.tagName === 'LI' && parent.previousElementSibling) {
37- if (parent.previousElementSibling.classList.contains('chapter-item')) {
38- parent.previousElementSibling.classList.add('expanded');
39- }
33+ if (parent.tagName === 'LI' && parent.classList.contains('chapter-item')) {
34+ parent.classList.add('expanded');
4035 }
4136 parent = parent.parentElement;
4237 }
@@ -62,9 +57,9 @@ class MDBookSidebarScrollbox extends HTMLElement {
6257 }
6358 }
6459 // Toggle buttons
65- const sidebarAnchorToggles = document.querySelectorAll('#mdbook-sidebar a. toggle');
60+ const sidebarAnchorToggles = document.querySelectorAll('.chapter-fold- toggle');
6661 function toggleSection(ev) {
67- ev.currentTarget.parentElement.classList.toggle('expanded');
62+ ev.currentTarget.parentElement.parentElement. classList.toggle('expanded');
6863 }
6964 Array.from(sidebarAnchorToggles).forEach(el => {
7065 el.addEventListener('click', toggleSection);
@@ -237,17 +232,12 @@ window.customElements.define('mdbook-sidebar-scrollbox', MDBookSidebarScrollbox)
237232 // be expanded.
238233 function updateHeaderExpanded(currentA) {
239234 // Add expanded to all header-item li ancestors.
240- let current = currentA.parentElement.parentElement.parentElement;
241- while (current.tagName === 'LI') {
242- const prevSibling = current.previousElementSibling;
243- if (prevSibling !== null
244- && prevSibling.tagName === 'LI'
245- && prevSibling.classList.contains('header-item')) {
246- prevSibling.classList.add('expanded');
247- current = prevSibling.parentElement.parentElement;
248- } else {
249- break;
235+ let current = currentA.parentElement;
236+ while (current) {
237+ if (current.tagName === 'LI' && current.classList.contains('header-item')) {
238+ current.classList.add('expanded');
250239 }
240+ current = current.parentElement;
251241 }
252242 }
253243
@@ -343,19 +333,6 @@ window.customElements.define('mdbook-sidebar-scrollbox', MDBookSidebarScrollbox)
343333 if (activeSection === null) {
344334 return;
345335 }
346- const activeItem = activeSection.parentElement;
347- const activeList = activeItem.parentElement;
348-
349- // Build a tree of headers in the sidebar.
350- const rootLi = document.createElement('li');
351- rootLi.classList.add('header-item');
352- rootLi.classList.add('expanded');
353- const rootOl = document.createElement('ol');
354- rootOl.classList.add('section');
355- rootLi.appendChild(rootOl);
356- const stack = [{ level: 0, ol: rootOl }];
357- // The level where it will start folding deeply nested headers.
358- const foldLevel = 3;
359336
360337 const main = document.getElementsByTagName('main')[0];
361338 headers = Array.from(main.querySelectorAll('h2, h3, h4, h5, h6'))
@@ -365,57 +342,90 @@ window.customElements.define('mdbook-sidebar-scrollbox', MDBookSidebarScrollbox)
365342 return;
366343 }
367344
345+ // Build a tree of headers in the sidebar.
346+
347+ const stack = [];
348+
349+ const firstLevel = parseInt(headers[0].tagName.charAt(1));
350+ for (let i = 1; i < firstLevel; i++) {
351+ const ol = document.createElement('ol');
352+ ol.classList.add('section');
353+ if (stack.length > 0) {
354+ stack[stack.length - 1].ol.appendChild(ol);
355+ }
356+ stack.push({level: i + 1, ol: ol});
357+ }
358+
359+ // The level where it will start folding deeply nested headers.
360+ const foldLevel = 3;
361+
368362 for (let i = 0; i < headers.length; i++) {
369363 const header = headers[i];
370364 const level = parseInt(header.tagName.charAt(1));
365+
366+ const currentLevel = stack[stack.length - 1].level;
367+ if (level > currentLevel) {
368+ // Begin nesting to this level.
369+ for (let nextLevel = currentLevel + 1; nextLevel <= level; nextLevel++) {
370+ const ol = document.createElement('ol');
371+ ol.classList.add('section');
372+ const last = stack[stack.length - 1];
373+ const lastChild = last.ol.lastChild;
374+ // Handle the case where jumping more than one nesting
375+ // level, which doesn't have a list item to place this new
376+ // list inside of.
377+ if (lastChild) {
378+ lastChild.appendChild(ol);
379+ } else {
380+ last.ol.appendChild(ol);
381+ }
382+ stack.push({level: nextLevel, ol: ol});
383+ }
384+ } else if (level < currentLevel) {
385+ while (stack.length > 1 && stack[stack.length - 1].level >= level) {
386+ stack.pop();
387+ }
388+ }
389+
371390 const li = document.createElement('li');
372391 li.classList.add('header-item');
373392 li.classList.add('expanded');
374393 if (level < foldLevel) {
375394 li.classList.add('expanded');
376395 }
396+ const span = document.createElement('span');
397+ span.classList.add('chapter-link-wrapper');
377398 const a = document.createElement('a');
399+ span.appendChild(a);
378400 a.href = '#' + header.id;
379401 a.classList.add('header-in-summary');
380402 a.innerHTML = header.children[0].innerHTML;
381403 a.addEventListener('click', headerThresholdClick);
382- li.appendChild(a);
383404 const nextHeader = headers[i + 1];
384405 if (nextHeader !== undefined) {
385406 const nextLevel = parseInt(nextHeader.tagName.charAt(1));
386407 if (nextLevel > level && level >= foldLevel) {
387- const div = document.createElement('div');
388- div.textContent = '❱';
389408 const toggle = document.createElement('a');
390- toggle.classList.add('toggle');
409+ toggle.classList.add('chapter-fold- toggle');
391410 toggle.classList.add('header-toggle');
392- toggle.appendChild(div);
393411 toggle.addEventListener('click', () => {
394412 li.classList.toggle('expanded');
395413 });
396- li.appendChild(toggle);
414+ const toggleDiv = document.createElement('div');
415+ toggleDiv.textContent = '❱';
416+ toggle.appendChild(toggleDiv);
417+ span.appendChild(toggle);
397418 headerToggles.push(li);
398419 }
399420 }
400-
401- // Find the appropriate parent level.
402- while (stack.length > 1 && stack[stack.length - 1].level >= level) {
403- stack.pop();
404- }
421+ li.appendChild(span);
405422
406423 const currentParent = stack[stack.length - 1];
407424 currentParent.ol.appendChild(li);
408-
409- // Create new nested ol for potential children.
410- const nestedOl = document.createElement('ol');
411- nestedOl.classList.add('section');
412- const nestedLi = document.createElement('li');
413- nestedLi.appendChild(nestedOl);
414- currentParent.ol.appendChild(nestedLi);
415- stack.push({ level: level, ol: nestedOl });
416425 }
417426
418- activeList.insertBefore(rootLi, activeItem.nextSibling);
427+ const activeItemSpan = activeSection.parentElement;
428+ activeItemSpan.after(stack[0].ol);
419429 });
420430
421431 document.addEventListener('DOMContentLoaded', reloadCurrentHeader);
0 commit comments