1// This function filters arr within the range [min,max] of the tag key 2function jsFilter_filterObjectsByRange(arr, key, min, max) { 3 return arr.filter((obj) => obj[key] >= min && obj[key] <= max); 4} 5 6// Not needed, but kept because I am not sure if the new version works everytime... 7function jsFilter_filterObjectsByKeywordOld( 8 objectsArray, 9 propertyName, 10 keyword, 11 propertyName2 12) { 13 const returnValue = objectsArray.filter(function (obj) { 14 if (typeof obj != "object") { 15 console.log("typeof obj != 'object'"); 16 return obj.toString() == keyword.toString(); 17 } else if (obj[propertyName] == null) { 18 console.log("obj[propertyName] == null"); 19 return keyword == "null"; 20 } else if (keyword == null) { 21 console.log("keyword == null"); 22 return false; 23 } else { 24 if (!Array.isArray(obj[propertyName])) 25 return obj[propertyName].toString() == keyword.toString(); 26 else { 27 if ( 28 jsFilter_filterObjectsByKeyword( 29 obj[propertyName], 30 propertyName2, 31 keyword, 32 "" 33 ).length > 0 34 ) 35 return true; 36 else return false; 37 } 38 } 39 }); 40 return returnValue; 41} 42 43// Function that filters an array based on a keyword 44// - objectsArray: array to be filtered 45// - propertyName: bibtex tag used to filter 46// - keyword: string used to filter array. If the value of propertyName matches keyword, then keep it 47// - propertyName2: if propertyName value is an obj ({}), then use propertyName2 as the bibtex word 48function jsFilter_filterObjectsByKeyword( 49 objectsArray, 50 propertyName, 51 keyword, 52 propertyName2 53) { 54 const returnValue = objectsArray.filter(function (obj) { 55 if (!Array.isArray(obj[propertyName])) 56 if (obj[propertyName] == null) return keyword == "null"; 57 else return obj[propertyName].toString() == keyword.toString(); 58 else { 59 if ( 60 jsFilter_filterObjectsByKeyword( 61 obj[propertyName], 62 propertyName2, 63 keyword, 64 "" 65 ).length > 0 66 ) 67 return true; 68 else return false; 69 } 70 }); 71 return returnValue; 72} 73 74// Function that filters an array based on a set of keyword 75// - objectsArray: array to be filtered 76// - propertyName: bibtex tag used to filter 77// - keywords: set of strings to be used to filter array. If the value of propertyName matches keyword, then keep it 78// - propertyName2: if propertyName value is an obj ({}), then use propertyName2 as the bibtex word 79function jsFilter_filterObjectsByKeywords( 80 objectsArray, 81 propertyName, 82 keywords, 83 propertyName2 84) { 85 const returnValue = objectsArray.filter(function (obj) { 86 if (!Array.isArray(obj[propertyName])) { 87 if (obj[propertyName] == null) return keywords.includes(""); 88 else return keywords.includes(obj[propertyName].toString()); 89 } else { 90 if ( 91 jsFilter_filterObjectsByKeywords( 92 obj[propertyName], 93 propertyName2, 94 keywords, 95 "" 96 ).length > 0 97 ) 98 return true; 99 else return false; 100 } 101 }); 102 return returnValue; 103} 104 105// Function that filters an array based on string similarity 106// - arr: array to be filtered 107// - targetWord: word searched to filter arr 108// - propertyName: bibtex tag used to filter 109// - propertyName2: if propertyName value is an obj ({}), then use propertyName2 as the bibtex word 110function jsFilter_filterBySimilarity( 111 arr, 112 targetWord, 113 propertyName, 114 propertyName2 115) { 116 return arr.filter((item) => { 117 if (Array.isArray(item[propertyName])) { 118 if ( 119 jsFilter_filterBySimilarity( 120 item[propertyName], 121 targetWord, 122 propertyName2, 123 "" 124 ).length > 0 125 ) 126 return true; 127 else return false; 128 } else if (typeof item[propertyName] === "object") { 129 return jsFilter_simplifySpecialCharacters( 130 item[propertyName][propertyName2] 131 ) 132 .toLowerCase() 133 .includes(jsFilter_simplifySpecialCharacters(targetWord).toLowerCase()); 134 } else { 135 return jsFilter_simplifySpecialCharacters(item[propertyName]) 136 .toLowerCase() 137 .includes(jsFilter_simplifySpecialCharacters(targetWord).toLowerCase()); 138 } 139 }); 140} 141 142// Function that filters an array based on string similarity of a array of several strings 143// - arr: array to be filtered 144// - targetWords: set of words searched to filter arr
145// - propertyName: bibtex tag used to filter 146// - propertyName2: if propertyName value is an obj ({}), then use propertyName2 as the bibtex word 147function jsFilter_filterBySimilarities( 148 arr, 149 targetWords, 150 propertyName, 151 propertyName2 152) { 153 return arr.filter((item) => { 154 if (Array.isArray(item[propertyName])) { 155 if ( 156 jsFilter_filterBySimilarities( 157 item[propertyName], 158 targetWords, 159 propertyName2, 160 "" 161 ).length > 0 162 ) 163 return true; 164 else return false; 165 } else if (typeof item[propertyName] === "object") { 166 return targetWords.some(function (str) { 167 return jsFilter_simplifySpecialCharacters( 168 item[propertyName][propertyName2] 169 ) 170 .toLowerCase() 171 .includes(jsFilter_simplifySpecialCharacters(str).toLowerCase()); 172 }); 173 } else { 174 return targetWords.some(function (str) { 175 return jsFilter_simplifySpecialCharacters(item[propertyName]) 176 .toLowerCase() 177 .includes(jsFilter_simplifySpecialCharacters(str).toLowerCase()); 178 }); 179 } 180 }); 181} 182 183// Function that handles the functionality when a keyword is to be entered in a search bar 184// - bibTexTags: bibTex tags used on the filtering of the search bar 185// - value: string from the searchbar that will be entered 186// - event: keypress event 187// - div: element where the keyword will be placed after the enter event 188// - name: name of the class to be given to the element corresponding to the keyword entered 189function jsFilter_handleKeyPressSearch(bibTexTags, value, event, div, name) { 190 if (event.key == "Enter") { 191 if (jsFilter_currentFilters[bibTexTags].includes(value)) return; 192 document.getElementById("mainBody").scrollTop = 0; 193 clearTimeout(jsFilter_timeoutId2); 194 jsFilter_timeoutId2 = setTimeout(() => { 195 if (jsFilter_currentData.length > 0) { 196 jsFilter_putLoadingScreen(); 197 setTimeout(() => { 198 jsFilter_currentFilters[bibTexTags].push(...value.split(" ")); 199 jsFilter_currentFilteringCategory = bibTexTags[0]; 200 var className; 201 var divName; 202 var inputName; 203 className = name; 204 divName = div; 205 inputName = bibTexTags[0]; 206 const newElement = document.createElement("p"); 207 newElement.innerHTML = value + " (x)"; 208 newElement.onclick = function () { 209 jsFilter_putLoadingScreen(); 210 setTimeout(() => { 211 jsFilter_currentFilters[bibTexTags] = jsFilter_currentFilters[ 212 bibTexTags 213 ].filter(function (element) { 214 return !value.split(" ").includes(element); 215 }); 216 jsFilter_reCalculateFilteredList(); 217 this.remove(); 218 jsFilter_removeLoadingScreen(); 219 }, 100); 220 }; 221 newElement.classList.add(className); 222 newElement.classList.add("keyWord"); 223 document.getElementById(divName).appendChild(newElement); 224 document.getElementById(inputName).value = ""; 225 jsFilter_filteredData = jsFilter_currentData; 226 jsFilter_updateLabels(); 227 jsFilter_removeLoadingScreen(); 228 }, 100); 229 } 230 }, 500); 231 } 232} 233 234// Function that handles the functionality when a keyword is written, but not ey entered 235// - bibTexTags: bibTex tags used on the filtering of the search bar 236// - value: string from the searchbar that will be entered 237function jsFilter_triggerFilterSearch(bibTexTags, value) { 238 clearTimeout(jsFilter_timeoutId); 239 jsFilter_timeoutId = setTimeout(function () { 240 jsFilter_putLoadingScreen(); 241 setTimeout(() => { 242 if (value.trim() != "") { 243 var temp = []; 244 var temp2 = []; 245 bibTexTags.forEach((element) => { 246 const secondProperty = 247 jsFilter_contextMappingRecursive[jsFilter_currentContext][element]; 248 temp2 = temp2.concat( 249 jsFilter_filterBySimilarity( 250 jsFilter_filteredData, 251 value, 252 element, 253 secondProperty 254 ) 255 ); 256 value.split(" ").forEach((element2) => { 257 if (element2 != "") 258 temp = temp.concat( 259 jsFilter_filterBySimilarity( 260 jsFilter_filteredData, 261 element2, 262 element, 263 secondProperty 264 ) 265 ); 266 }); 267 }); 268 if (temp2.length > 0 && temp2.length <= temp.length) 269 jsFilter_currentData = jsFilter_removeDuplicatesObjects(temp2); 270 else jsFilter_currentData = jsFilter_removeDuplicatesObjects(temp); 271 jsFilter_updateList(jsFilter_currentData); 272 } else { 273 jsFilter_updateList(jsFilter_filteredData); 274 } 275 jsFilter_removeLoadingScreen(); 276 }, 100); 277 }, 500); 278} 279 280// Function that updates the labels of the checkboxes
281function jsFilter_updateLabels() { 282 var checkBoxDivs = []; 283 Object.keys(jsFilter_contexMapping[jsFilter_currentContext]).forEach( 284 (key) => { 285 if ( 286 jsFilter_contexMapping[jsFilter_currentContext][key][1] == "checkBox" 287 ) { 288 checkBoxDivs.push(key); 289 } 290 } 291 ); 292 var tempFilteredData = jsFilter_filteredData; 293 checkBoxDivs.forEach((key) => { 294 var labels = []; 295 Array.from( 296 document.querySelectorAll("#" + key + "DIV " + "div.checkboxContainer") 297 ).forEach((element) => { 298 const input = element.querySelector("input"); 299 const divBar = element.querySelector("div.labelContainer"); 300 const labelSize = element.querySelector(".labelSize"); 301 const labelText = divBar.querySelector("strong"); 302 if (jsFilter_currentFilteringCategory != input.classList[1]) { 303 const sizeData = jsFilter_removeDuplicatesObjects( 304 jsFilter_filterObjectsByKeyword( 305 tempFilteredData, 306 input.classList[1], 307 input.id, 308 jsFilter_contextMappingRecursive[jsFilter_currentContext][ 309 input.classList[1] 310 ] 311 ) 312 ).length; 313 labelSize.textContent = "(" + sizeData + ")"; 314 labels.push([divBar, sizeData]); 315 if (sizeData == 0) { 316 jsFilter_currentFilters[input.classList[1]] = jsFilter_currentFilters[ 317 input.classList[1] 318 ].filter(function (element2) { 319 return element2 !== input.id; 320 }); 321 input.checked = false; 322 input.disabled = true; 323 labelText.style.color = "lightgray"; 324 input.style.cursor = "not-allowed"; 325 } else { 326 input.disabled = false; 327 labelText.style.color = "#555"; 328 input.style.cursor = "pointer"; 329 } 330 } 331 }); 332 jsFilter_createVis(labels); 333 }); 334} 335 336// Function that calculates the new set of items to display based on the current filtering 337function jsFilter_reCalculateFilteredList() { 338 var tempFilteredData = [...jsFilter_originalData]; 339 moveElementToBeginning( 340 Object.keys(jsFilter_contexMapping[jsFilter_currentContext]), 341 jsFilter_currentFilteringCategoryName 342 ).forEach((key) => { 343 const [filterType, inputType] = 344 jsFilter_contexMapping[jsFilter_currentContext][key]; 345 switch (inputType) { 346 case "searchBar": 347 filterType.forEach((bibTexTag) => { 348 var checkBoxTemp = jsFilter_filterBySimilarities( 349 tempFilteredData, 350 jsFilter_currentFilters[filterType], 351 bibTexTag, 352 jsFilter_contextMappingRecursive[jsFilter_currentContext][bibTexTag] 353 ); 354 if (checkBoxTemp.length > 0) tempFilteredData = checkBoxTemp; 355 }); 356 break; 357 case "checkBox": 358 var checkBoxTemp = []; 359 if (jsFilter_currentFilters[filterType] != null) 360 checkBoxTemp = jsFilter_filterObjectsByKeywords( 361 tempFilteredData, 362 filterType, 363 jsFilter_currentFilters[filterType], 364 jsFilter_contextMappingRecursive[jsFilter_currentContext][ 365 filterType 366 ] 367 ); 368 if (checkBoxTemp.length > 0) tempFilteredData = checkBoxTemp; 369 break; 370 case "slider": 371 tempFilteredData = jsFilter_filterObjectsByRange( 372 tempFilteredData, 373 filterType, 374 jsFilter_currentFilters[filterType][1], 375 jsFilter_currentFilters[filterType][0] 376 ); 377 break; 378 379 default: 380 break; 381 } 382 }); 383 384 jsFilter_filteredData = tempFilteredData; 385 jsFilter_updateLabels(); 386 jsFilter_updateList(jsFilter_filteredData); 387 window.scrollTo(0, 0); 388}
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.