mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-03-29 04:23:34 +01:00
Refactored js
This commit is contained in:
parent
858b906722
commit
4cde1ed9e4
97
sphinx/_static/current-nav.js
Normal file
97
sphinx/_static/current-nav.js
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
|
// Initialization: wait for window load and then trigger current nav detection.
|
||||||
|
window.addEventListener("load", function() {
|
||||||
|
console.log("Window loaded, initializing current nav...");
|
||||||
|
initCurrentNav();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Re-trigger when the hash changes.
|
||||||
|
window.addEventListener("hashchange", function() {
|
||||||
|
console.log("Hash changed, reinitializing current nav...");
|
||||||
|
initCurrentNav();
|
||||||
|
});
|
||||||
|
|
||||||
|
function initCurrentNav() {
|
||||||
|
// If Alpine.js is available and provides nextTick, use it.
|
||||||
|
if (window.Alpine && typeof window.Alpine.nextTick === 'function') {
|
||||||
|
window.Alpine.nextTick(processNav);
|
||||||
|
} else {
|
||||||
|
processNav();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function processNav() {
|
||||||
|
var currentHash = window.location.hash;
|
||||||
|
console.log("initCurrentNav: Current hash:", currentHash);
|
||||||
|
if (!currentHash) return;
|
||||||
|
|
||||||
|
// Select all internal links within the .current-index container.
|
||||||
|
var links = document.querySelectorAll('.current-index a.reference.internal');
|
||||||
|
links.forEach(function(link) {
|
||||||
|
var href = link.getAttribute("href");
|
||||||
|
console.log("initCurrentNav: Checking link:", href);
|
||||||
|
// If the link is hash-only (e.g. "#setup-guide")
|
||||||
|
if (href && href.trim().startsWith("#")) {
|
||||||
|
if (href.trim() === currentHash.trim()) {
|
||||||
|
console.log("initCurrentNav: Match found for hash-only link:", href);
|
||||||
|
markAsCurrent(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Otherwise, if the link includes a file and a hash, compare the hash part.
|
||||||
|
else if (href && href.indexOf('#') !== -1) {
|
||||||
|
var parts = href.split('#');
|
||||||
|
var linkHash = "#" + parts[1].trim();
|
||||||
|
console.log("initCurrentNav: Extracted link hash:", linkHash);
|
||||||
|
if (linkHash === currentHash.trim()) {
|
||||||
|
console.log("initCurrentNav: Match found for link with file and hash:", href);
|
||||||
|
markAsCurrent(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.log("initCurrentNav: No match for link:", href);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// After processing links, open submenus only for those li elements marked as current.
|
||||||
|
openCurrentSubmenus();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark the link's parent li and all its ancestor li elements as current.
|
||||||
|
function markAsCurrent(link) {
|
||||||
|
var li = link.closest("li");
|
||||||
|
if (!li) {
|
||||||
|
console.log("markAsCurrent: No parent li found for link:", link);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
li.classList.add("current");
|
||||||
|
console.log("markAsCurrent: Marked li as current:", li);
|
||||||
|
// If Alpine.js is used, set its "expanded" property to true.
|
||||||
|
if (li.__x && li.__x.$data) {
|
||||||
|
li.__x.$data.expanded = true;
|
||||||
|
console.log("markAsCurrent: Set Alpine expanded on li:", li);
|
||||||
|
}
|
||||||
|
// Propagate upward: mark all ancestor li elements as current.
|
||||||
|
var parentLi = li.parentElement.closest("li");
|
||||||
|
while (parentLi) {
|
||||||
|
parentLi.classList.add("current");
|
||||||
|
if (parentLi.__x && parentLi.__x.$data) {
|
||||||
|
parentLi.__x.$data.expanded = true;
|
||||||
|
}
|
||||||
|
console.log("markAsCurrent: Propagated current to ancestor li:", parentLi);
|
||||||
|
parentLi = parentLi.parentElement.closest("li");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open immediate submenu elements (the direct children with x-show) of li.current.
|
||||||
|
function openCurrentSubmenus() {
|
||||||
|
document.querySelectorAll('.current-index li.current').forEach(function(li) {
|
||||||
|
// Only target immediate child elements that have x-show.
|
||||||
|
li.querySelectorAll(":scope > [x-show]").forEach(function(elem) {
|
||||||
|
if (elem.style.display === "none" || elem.style.display === "") {
|
||||||
|
elem.style.display = "block";
|
||||||
|
console.log("openCurrentSubmenus: Opened submenu element:", elem);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
@ -22,7 +22,7 @@ exclude_patterns = ['docs', 'venv', 'venv/**']
|
|||||||
|
|
||||||
# -- Options for HTML output -------------------------------------------------
|
# -- Options for HTML output -------------------------------------------------
|
||||||
html_theme = 'sphinxawesome_theme'
|
html_theme = 'sphinxawesome_theme'
|
||||||
html_static_path = ['static']
|
html_static_path = ['_static']
|
||||||
|
|
||||||
html_sidebars = {
|
html_sidebars = {
|
||||||
'**': [
|
'**': [
|
||||||
|
@ -61,105 +61,5 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<script src="{{ pathto('_static/current-nav.js', 1) }}"></script>
|
||||||
<script>
|
|
||||||
document.addEventListener("DOMContentLoaded", function() {
|
|
||||||
// Initialization: wait for window load and then trigger current nav detection.
|
|
||||||
window.addEventListener("load", function() {
|
|
||||||
console.log("Window loaded, initializing current nav...");
|
|
||||||
initCurrentNav();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Re-trigger when the hash changes.
|
|
||||||
window.addEventListener("hashchange", function() {
|
|
||||||
console.log("Hash changed, reinitializing current nav...");
|
|
||||||
initCurrentNav();
|
|
||||||
});
|
|
||||||
|
|
||||||
function initCurrentNav() {
|
|
||||||
// If Alpine.js is available and provides nextTick, use it.
|
|
||||||
if (window.Alpine && typeof window.Alpine.nextTick === 'function') {
|
|
||||||
window.Alpine.nextTick(processNav);
|
|
||||||
} else {
|
|
||||||
processNav();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function processNav() {
|
|
||||||
var currentHash = window.location.hash;
|
|
||||||
console.log("initCurrentNav: Current hash:", currentHash);
|
|
||||||
if (!currentHash) return;
|
|
||||||
|
|
||||||
// Select all internal links within the .current-index container.
|
|
||||||
var links = document.querySelectorAll('.current-index a.reference.internal');
|
|
||||||
links.forEach(function(link) {
|
|
||||||
var href = link.getAttribute("href");
|
|
||||||
console.log("initCurrentNav: Checking link:", href);
|
|
||||||
// If the link is hash-only (e.g. "#setup-guide")
|
|
||||||
if (href && href.trim().startsWith("#")) {
|
|
||||||
if (href.trim() === currentHash.trim()) {
|
|
||||||
console.log("initCurrentNav: Match found for hash-only link:", href);
|
|
||||||
markAsCurrent(link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Otherwise, if the link includes a file and a hash, compare the hash part.
|
|
||||||
else if (href && href.indexOf('#') !== -1) {
|
|
||||||
var parts = href.split('#');
|
|
||||||
var linkHash = "#" + parts[1].trim();
|
|
||||||
console.log("initCurrentNav: Extracted link hash:", linkHash);
|
|
||||||
if (linkHash === currentHash.trim()) {
|
|
||||||
console.log("initCurrentNav: Match found for link with file and hash:", href);
|
|
||||||
markAsCurrent(link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.log("initCurrentNav: No match for link:", href);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// After processing links, open submenus only for those li elements marked as current.
|
|
||||||
openCurrentSubmenus();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark the link's parent li and all its ancestor li elements as current.
|
|
||||||
function markAsCurrent(link) {
|
|
||||||
var li = link.closest("li");
|
|
||||||
if (!li) {
|
|
||||||
console.log("markAsCurrent: No parent li found for link:", link);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
li.classList.add("current");
|
|
||||||
console.log("markAsCurrent: Marked li as current:", li);
|
|
||||||
// If Alpine.js is used, set its "expanded" property to true.
|
|
||||||
if (li.__x && li.__x.$data) {
|
|
||||||
li.__x.$data.expanded = true;
|
|
||||||
console.log("markAsCurrent: Set Alpine expanded on li:", li);
|
|
||||||
}
|
|
||||||
// Propagate upward: mark all ancestor li elements as current.
|
|
||||||
var parentLi = li.parentElement.closest("li");
|
|
||||||
while (parentLi) {
|
|
||||||
parentLi.classList.add("current");
|
|
||||||
if (parentLi.__x && parentLi.__x.$data) {
|
|
||||||
parentLi.__x.$data.expanded = true;
|
|
||||||
}
|
|
||||||
console.log("markAsCurrent: Propagated current to ancestor li:", parentLi);
|
|
||||||
parentLi = parentLi.parentElement.closest("li");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open immediate submenu elements (the direct children with x-show) of li.current.
|
|
||||||
function openCurrentSubmenus() {
|
|
||||||
document.querySelectorAll('.current-index li.current').forEach(function(li) {
|
|
||||||
// Only target immediate child elements that have x-show.
|
|
||||||
li.querySelectorAll(":scope > [x-show]").forEach(function(elem) {
|
|
||||||
if (elem.style.display === "none" || elem.style.display === "") {
|
|
||||||
elem.style.display = "block";
|
|
||||||
console.log("openCurrentSubmenus: Opened submenu element:", elem);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user