/* Enhance the shared README without changing its GitHub presentation. */ (function () { function enhanceDirectory() { var article = document.querySelector(".md-content__inner"); if (!article || article.dataset.directoryReady) return; var contents = article.querySelector("#contents"); if (!contents) return; article.dataset.directoryReady = "true"; var toc = contents.nextElementSibling; var firstHeading = toc && toc.nextElementSibling; while (firstHeading && firstHeading.tagName !== "H2") { firstHeading = firstHeading.nextElementSibling; } if (!firstHeading) return; var controls = document.createElement("div"); controls.className = "awesome-django-controls"; controls.id = "contents"; controls.innerHTML = '
' + '
' + '
' + '
' + '
' + '

'; contents.replaceWith(controls); if (toc && toc.tagName === "UL") toc.remove(); new ResizeObserver(function () { article.style.setProperty("--directory-controls-height", controls.getBoundingClientRect().height + "px"); }).observe(controls); var contribution = document.createElement("p"); contribution.className = "awesome-django-contribute"; var link = document.createElement("a"); link.href = "https://github.com/wsvincent/awesome-django/blob/main/.github/pull_request_template.md"; link.textContent = "Suggest a project"; contribution.append(link, " — read the submission criteria before opening a pull request."); article.querySelector("blockquote").after(contribution); article.querySelectorAll(":scope > p").forEach(function (p) { if (!p.textContent.trim() && p.querySelector("br")) p.classList.add("awesome-django-spacer"); }); var results = document.createElement("div"); results.id = "directory-results"; firstHeading.before(results); var group; var section; var node = firstHeading; while (node) { var next = node.nextSibling; if (node.nodeType === 1 && node.tagName === "H2") { group = document.createElement("section"); group.className = "awesome-django-group"; group.setAttribute("aria-labelledby", node.id); results.append(group); section = group; } else if (node.nodeType === 1 && node.tagName === "H3") { section = document.createElement("section"); section.className = "awesome-django-category"; section.setAttribute("aria-labelledby", node.id); group.append(section); } section.append(node); node = next; } var entries = Array.from(results.querySelectorAll("li")); var categories = Array.from(results.querySelectorAll("section")); var select = controls.querySelector("select"); var counts = {}; results.querySelectorAll("h2, h3").forEach(function (heading) { var label = heading.cloneNode(true); label.querySelectorAll(".headerlink").forEach(function (a) { a.remove(); }); var count = heading.parentElement.querySelectorAll("li").length; counts[heading.id] = count; var option = document.createElement("option"); option.value = heading.id; option.textContent = (heading.tagName === "H3" ? " " : "") + label.textContent.trim() + " (" + count + ")"; select.append(option); }); var input = controls.querySelector("input"); var status = controls.querySelector("[role=status]"); var empty = document.createElement("p"); empty.textContent = "No matching entries. Try another term or clear the filter."; empty.hidden = true; results.after(empty); function filter() { var terms = input.value.trim().toLowerCase().split(/\s+/).filter(Boolean); var visible = 0; entries.forEach(function (entry) { var text = entry.textContent.toLowerCase(); entry.hidden = !terms.every(function (term) { return text.includes(term); }); if (!entry.hidden) visible++; }); categories.forEach(function (category) { category.hidden = !Array.from(category.querySelectorAll("li")).some(function (entry) { return !entry.hidden; }); }); status.textContent = terms.length ? visible + " of " + entries.length + " entries match" : entries.length + " packages and resources"; empty.hidden = visible !== 0; } input.addEventListener("input", filter); controls.querySelector("button").addEventListener("click", function () { input.value = ""; filter(); input.focus(); }); select.addEventListener("change", function () { if (!select.value) return; input.value = ""; filter(); var target = document.getElementById(select.value); window.location.hash = select.value; target.setAttribute("tabindex", "-1"); target.focus({ preventScroll: true }); target.scrollIntoView(); }); var disclosures = []; document.querySelectorAll('[data-md-component="toc"] a.md-nav__link').forEach(function (a) { var id = a.hash.slice(1); if (id === "contents") { a.closest("li").remove(); return; } if (counts[id] === undefined) return; var badge = document.createElement("span"); badge.className = "awesome-django-nav-count"; badge.textContent = counts[id]; badge.setAttribute("aria-label", counts[id] + " entries"); a.append(badge); var nav = a.parentElement.querySelector(":scope > nav"); if (!nav) return; var button = document.createElement("button"); button.type = "button"; button.className = "awesome-django-nav-toggle"; button.textContent = "⌄"; button.setAttribute("aria-label", "Toggle " + nav.getAttribute("aria-label") + " categories"); nav.id = "directory-nav-" + id; button.setAttribute("aria-controls", nav.id); function setExpanded(expanded) { nav.hidden = !expanded; button.setAttribute("aria-expanded", String(expanded)); } setExpanded(id === "third-party-packages"); button.addEventListener("click", function () { setExpanded(nav.hidden); }); a.after(button); a.parentElement.classList.add("awesome-django-nav-group"); disclosures.push({ nav: nav, expand: function () { setExpanded(true); } }); }); function revealAnchor() { var id; try { id = decodeURIComponent(window.location.hash.slice(1)); } catch (_) { return; } var target = document.getElementById(id); if (target && results.contains(target) && input.value) { input.value = ""; filter(); } disclosures.forEach(function (item) { if (Array.from(item.nav.querySelectorAll("a")).some(function (a) { return a.hash === "#" + id; })) item.expand(); }); } window.addEventListener("hashchange", revealAnchor); filter(); revealAnchor(); var picture = article.querySelector("picture"); if (picture) { var logo = picture.querySelector("img"); var source = picture.querySelector("source"); var light = logo.getAttribute("src"); var dark = source.getAttribute("srcset"); source.remove(); logo.alt = "Django"; function syncLogo() { var scheme = document.querySelector("[data-md-color-scheme]"); logo.src = scheme && scheme.getAttribute("data-md-color-scheme") === "slate" ? dark : light; } syncLogo(); new MutationObserver(syncLogo).observe(document.documentElement, { attributes: true, subtree: true, attributeFilter: ["data-md-color-scheme"], }); } } if (typeof document$ !== "undefined") document$.subscribe(enhanceDirectory); else if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", enhanceDirectory); else enhanceDirectory(); })();