mirror of
https://github.com/shoelace-style/webawesome.git
synced 2026-01-12 20:19:13 +00:00
77 lines
2.3 KiB
JavaScript
77 lines
2.3 KiB
JavaScript
let url = new URL(location);
|
|
const pushedURL = false;
|
|
|
|
const matchers = {
|
|
default(textContent, query) {
|
|
return textContent.includes(query);
|
|
},
|
|
|
|
i(textContent, query) {
|
|
return textContent.toLowerCase().includes(query.toLowerCase());
|
|
},
|
|
|
|
regexp(textContent, query) {
|
|
query.lastIndex = 0;
|
|
return query.test(textContent);
|
|
}
|
|
};
|
|
|
|
matchers.iregexp = matchers.regexp; // i is baked into the query
|
|
|
|
function filterByName(value) {
|
|
const previousFilter = url.searchParams.get('name') || '';
|
|
url = new URL(location);
|
|
|
|
if (value) {
|
|
const isRegexp = name_search_regexp.checked;
|
|
const i = !name_search_i.checked;
|
|
const query = isRegexp ? new RegExp(value, 'gmsv' + (i ? 'i' : '')) : value;
|
|
const matcherId = (i ? 'i' : '') + (isRegexp ? 'regexp' : '');
|
|
const matcher = matchers[matcherId] ?? matchers.default;
|
|
|
|
for (const th of document.querySelectorAll('table tbody th:first-child')) {
|
|
const tr = th.parentNode;
|
|
const matches = matcher(th.textContent, query);
|
|
tr.toggleAttribute('hidden', !matches);
|
|
}
|
|
url.searchParams.set('name', value);
|
|
|
|
if (matcherId) {
|
|
url.searchParams.set('match', matcherId);
|
|
} else {
|
|
url.searchParams.delete('match');
|
|
}
|
|
} else {
|
|
for (const tr of document.querySelectorAll('table tbody tr[hidden]')) {
|
|
tr.removeAttribute('hidden');
|
|
}
|
|
url.searchParams.delete('name');
|
|
url.searchParams.delete('match');
|
|
}
|
|
|
|
if (value !== previousFilter) {
|
|
history[pushedURL ? 'replaceState' : 'pushState'](null, '', url);
|
|
}
|
|
|
|
// Update heading counts
|
|
for (const h2 of document.querySelectorAll('h2:has(+ table)')) {
|
|
const count = h2.querySelector('.count');
|
|
if (!count) continue;
|
|
const table = h2.nextElementSibling;
|
|
const visibleRows = table.querySelectorAll('tbody tr:not([hidden])').length;
|
|
count.textContent = visibleRows;
|
|
const outlineLink = document.querySelector(`#outline-standard a[href="#${h2.id}"]`);
|
|
if (outlineLink) {
|
|
// Why not just = h2.textContent? To skip the "Jump to heading" link
|
|
outlineLink.textContent = '';
|
|
outlineLink.append(...[...h2.childNodes].slice(0, 3).map(n => n.cloneNode(true)));
|
|
}
|
|
}
|
|
}
|
|
|
|
if (name_search.value) {
|
|
filterByName(name_search.value);
|
|
}
|
|
|
|
name_search_group.addEventListener('wa-input', e => filterByName(name_search.value));
|