mirror of
https://github.com/vinta/awesome-python.git
synced 2026-05-28 20:56:44 +08:00
refactor(js): hoist repeated queries, drop stale comments, tighten collapseAll scope
- Hoist reducedMotion and sortHeaders to module scope to avoid repeated DOM queries on every call - collapseAll now queries within tbody instead of the full document - Replace indexOf with includes for tag filtering - Remove null check on activeSort (always initialized) - Drop inline section comments that just restate the code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+14
-27
@@ -1,11 +1,10 @@
|
|||||||
|
var reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)");
|
||||||
|
|
||||||
function getScrollBehavior() {
|
function getScrollBehavior() {
|
||||||
return window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
return reducedMotion.matches ? "auto" : "smooth";
|
||||||
? "auto"
|
|
||||||
: "smooth";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// State
|
let activeFilter = null;
|
||||||
let activeFilter = null; // string value or null
|
|
||||||
let activeSort = { col: "stars", order: "desc" };
|
let activeSort = { col: "stars", order: "desc" };
|
||||||
const searchInput = document.querySelector(".search");
|
const searchInput = document.querySelector(".search");
|
||||||
const filterBar = document.querySelector(".filter-bar");
|
const filterBar = document.querySelector(".filter-bar");
|
||||||
@@ -70,7 +69,6 @@ document.querySelectorAll("[data-scroll-to]").forEach(function (link) {
|
|||||||
observer.observe(hero);
|
observer.observe(hero);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
// Relative time formatting
|
|
||||||
function relativeTime(isoStr) {
|
function relativeTime(isoStr) {
|
||||||
const date = new Date(isoStr);
|
const date = new Date(isoStr);
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
@@ -89,7 +87,6 @@ function relativeTime(isoStr) {
|
|||||||
return diffYears === 1 ? "1 year ago" : diffYears + " years ago";
|
return diffYears === 1 ? "1 year ago" : diffYears + " years ago";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Format all commit date cells
|
|
||||||
document.querySelectorAll(".col-commit[data-commit]").forEach(function (td) {
|
document.querySelectorAll(".col-commit[data-commit]").forEach(function (td) {
|
||||||
const time = td.querySelector("time");
|
const time = td.querySelector("time");
|
||||||
if (time) time.textContent = relativeTime(td.dataset.commit);
|
if (time) time.textContent = relativeTime(td.dataset.commit);
|
||||||
@@ -101,14 +98,14 @@ document
|
|||||||
time.textContent = relativeTime(time.getAttribute("datetime"));
|
time.textContent = relativeTime(time.getAttribute("datetime"));
|
||||||
});
|
});
|
||||||
|
|
||||||
// Store original row order for sort reset
|
|
||||||
rows.forEach(function (row, i) {
|
rows.forEach(function (row, i) {
|
||||||
row._origIndex = i;
|
row._origIndex = i;
|
||||||
row._expandRow = row.nextElementSibling;
|
row._expandRow = row.nextElementSibling;
|
||||||
});
|
});
|
||||||
|
|
||||||
function collapseAll() {
|
function collapseAll() {
|
||||||
const openRows = document.querySelectorAll(".table tbody tr.row.open");
|
if (!tbody) return;
|
||||||
|
var openRows = tbody.querySelectorAll("tr.row.open");
|
||||||
openRows.forEach(function (row) {
|
openRows.forEach(function (row) {
|
||||||
row.classList.remove("open");
|
row.classList.remove("open");
|
||||||
row.setAttribute("aria-expanded", "false");
|
row.setAttribute("aria-expanded", "false");
|
||||||
@@ -119,18 +116,16 @@ function applyFilters() {
|
|||||||
const query = searchInput ? searchInput.value.toLowerCase().trim() : "";
|
const query = searchInput ? searchInput.value.toLowerCase().trim() : "";
|
||||||
let visibleCount = 0;
|
let visibleCount = 0;
|
||||||
|
|
||||||
// Collapse all expanded rows on filter/search change
|
|
||||||
collapseAll();
|
collapseAll();
|
||||||
|
|
||||||
rows.forEach(function (row) {
|
rows.forEach(function (row) {
|
||||||
let show = true;
|
let show = true;
|
||||||
|
|
||||||
if (activeFilter) {
|
if (activeFilter) {
|
||||||
const tags = row.dataset.tags;
|
var rowTags = row.dataset.tags;
|
||||||
show = tags ? tags.split("||").indexOf(activeFilter) !== -1 : false;
|
show = rowTags ? rowTags.split("||").includes(activeFilter) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Text search
|
|
||||||
if (show && query) {
|
if (show && query) {
|
||||||
if (!row._searchText) {
|
if (!row._searchText) {
|
||||||
let text = row.textContent.toLowerCase();
|
let text = row.textContent.toLowerCase();
|
||||||
@@ -156,12 +151,10 @@ function applyFilters() {
|
|||||||
|
|
||||||
if (noResults) noResults.hidden = visibleCount > 0;
|
if (noResults) noResults.hidden = visibleCount > 0;
|
||||||
|
|
||||||
// Update tag highlights
|
|
||||||
tags.forEach(function (tag) {
|
tags.forEach(function (tag) {
|
||||||
tag.classList.toggle("active", activeFilter === tag.dataset.value);
|
tag.classList.toggle("active", activeFilter === tag.dataset.value);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Filter bar
|
|
||||||
if (filterBar) {
|
if (filterBar) {
|
||||||
if (activeFilter) {
|
if (activeFilter) {
|
||||||
filterBar.classList.add("visible");
|
filterBar.classList.add("visible");
|
||||||
@@ -243,10 +236,12 @@ function sortRows() {
|
|||||||
applyFilters();
|
applyFilters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var sortHeaders = document.querySelectorAll("th[data-sort]");
|
||||||
|
|
||||||
function updateSortIndicators() {
|
function updateSortIndicators() {
|
||||||
document.querySelectorAll("th[data-sort]").forEach(function (th) {
|
sortHeaders.forEach(function (th) {
|
||||||
th.classList.remove("sort-asc", "sort-desc");
|
th.classList.remove("sort-asc", "sort-desc");
|
||||||
if (activeSort && th.dataset.sort === activeSort.col) {
|
if (th.dataset.sort === activeSort.col) {
|
||||||
th.classList.add("sort-" + activeSort.order);
|
th.classList.add("sort-" + activeSort.order);
|
||||||
th.setAttribute(
|
th.setAttribute(
|
||||||
"aria-sort",
|
"aria-sort",
|
||||||
@@ -287,7 +282,6 @@ if (tbody) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tag click: filter
|
|
||||||
tags.forEach(function (tag) {
|
tags.forEach(function (tag) {
|
||||||
tag.addEventListener("click", function (e) {
|
tag.addEventListener("click", function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@@ -297,7 +291,6 @@ tags.forEach(function (tag) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Clear filter
|
|
||||||
if (filterClear) {
|
if (filterClear) {
|
||||||
filterClear.addEventListener("click", function () {
|
filterClear.addEventListener("click", function () {
|
||||||
activeFilter = null;
|
activeFilter = null;
|
||||||
@@ -305,7 +298,6 @@ if (filterClear) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// No-results clear
|
|
||||||
const noResultsClear = document.querySelector(".no-results-clear");
|
const noResultsClear = document.querySelector(".no-results-clear");
|
||||||
if (noResultsClear) {
|
if (noResultsClear) {
|
||||||
noResultsClear.addEventListener("click", function () {
|
noResultsClear.addEventListener("click", function () {
|
||||||
@@ -315,13 +307,12 @@ if (noResultsClear) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Column sorting
|
sortHeaders.forEach(function (th) {
|
||||||
document.querySelectorAll("th[data-sort]").forEach(function (th) {
|
|
||||||
th.addEventListener("click", function () {
|
th.addEventListener("click", function () {
|
||||||
const col = th.dataset.sort;
|
const col = th.dataset.sort;
|
||||||
const defaultOrder = col === "name" ? "asc" : "desc";
|
const defaultOrder = col === "name" ? "asc" : "desc";
|
||||||
const altOrder = defaultOrder === "asc" ? "desc" : "asc";
|
const altOrder = defaultOrder === "asc" ? "desc" : "asc";
|
||||||
if (activeSort && activeSort.col === col) {
|
if (activeSort.col === col) {
|
||||||
if (activeSort.order === defaultOrder)
|
if (activeSort.order === defaultOrder)
|
||||||
activeSort = { col: col, order: altOrder };
|
activeSort = { col: col, order: altOrder };
|
||||||
else activeSort = { col: "stars", order: "desc" };
|
else activeSort = { col: "stars", order: "desc" };
|
||||||
@@ -333,7 +324,6 @@ document.querySelectorAll("th[data-sort]").forEach(function (th) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Search input
|
|
||||||
if (searchInput) {
|
if (searchInput) {
|
||||||
let searchTimer;
|
let searchTimer;
|
||||||
searchInput.addEventListener("input", function () {
|
searchInput.addEventListener("input", function () {
|
||||||
@@ -341,7 +331,6 @@ if (searchInput) {
|
|||||||
searchTimer = setTimeout(applyFilters, 150);
|
searchTimer = setTimeout(applyFilters, 150);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Keyboard shortcuts
|
|
||||||
document.addEventListener("keydown", function (e) {
|
document.addEventListener("keydown", function (e) {
|
||||||
if (
|
if (
|
||||||
e.key === "/" &&
|
e.key === "/" &&
|
||||||
@@ -363,7 +352,6 @@ if (searchInput) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Back to top
|
|
||||||
const backToTop = document.querySelector(".back-to-top");
|
const backToTop = document.querySelector(".back-to-top");
|
||||||
const resultsSection = document.querySelector("#library-index");
|
const resultsSection = document.querySelector("#library-index");
|
||||||
const tableWrap = document.querySelector(".table-wrap");
|
const tableWrap = document.querySelector(".table-wrap");
|
||||||
@@ -403,7 +391,6 @@ if (backToTop) {
|
|||||||
updateBackToTopVisibility();
|
updateBackToTopVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore state from URL
|
|
||||||
(function () {
|
(function () {
|
||||||
const params = new URLSearchParams(location.search);
|
const params = new URLSearchParams(location.search);
|
||||||
const q = params.get("q");
|
const q = params.get("q");
|
||||||
|
|||||||
Reference in New Issue
Block a user