1(function () { 2 let filters = document.querySelectorAll('[data-filter]') 3 let projects = document.querySelectorAll('[data-categories]') 4 let all = document.querySelector('[data-filter="all"]') 5 let selected = []; 6 let anchor = getAnchor() 7 8 filters.forEach((el) => { 9 let category = el.dataset.filter 10 if (anchor === category) { 11 el.checked = true; 12 all.checked = false 13 selected.push(category) 14 showProjects() 15 } 16 17 el.addEventListener('change', (e) => { 18 let el = e.target 19 20 21 if (el.checked && category !== all.dataset.filter) { 22 selected.push(category) 23 all.checked = false 24 } 25 26 if (!el.checked && category !== all.dataset.filter) { 27 removeFromArray(category) 28 } 29 30 if (category === all.dataset.filter || selected.length === 0) { 31 selected = [] 32 showAll() 33 return 34 } 35 36 showProjects() 37 38 }) 39 }) 40 41 function showAll() 42 { 43 filters.forEach((el) => { 44 el.checked = el.dataset.filter === all.dataset.filter 45 }) 46 showProjects() 47 } 48 49 50 function showProjects() 51 { 52 projects.forEach((el) => { 53 if (selected.length === 0) { 54 return el.classList.remove('d-none') 55 } 56 let show = false 57 let projectCategories = JSON.parse(el.dataset.categories); 58 projectCategories.forEach((cat) => { 59 if (selected.includes(cat)) { 60 show = true 61 } 62 }) 63 64 if (show) { 65 return el.classList.remove('d-none') 66 } 67 68 el.classList.add('d-none') 69 }) 70 } 71 72 function removeFromArray(item) 73 { 74 selected = selected.filter(function (value, index, arr) { 75 return value !== item; 76 }); 77 } 78 79 function getAnchor() 80 { 81 let currentUrl = document.URL, 82 urlParts = currentUrl.split('#'); 83 84 return (urlParts.length > 1) ? urlParts[1] : null; 85 } 86})()
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.