diff options
Diffstat (limited to 'client/simple/src')
| -rw-r--r-- | client/simple/src/js/head/00_init.js | 12 | ||||
| -rw-r--r-- | client/simple/src/js/main/00_toolkit.js | 42 | ||||
| -rw-r--r-- | client/simple/src/js/main/infinite_scroll.js | 16 | ||||
| -rw-r--r-- | client/simple/src/js/main/keyboard.js | 73 | ||||
| -rw-r--r-- | client/simple/src/js/main/mapresult.js | 40 | ||||
| -rw-r--r-- | client/simple/src/js/main/preferences.js | 6 | ||||
| -rw-r--r-- | client/simple/src/js/main/results.js | 22 | ||||
| -rw-r--r-- | client/simple/src/js/main/search.js | 14 |
8 files changed, 118 insertions, 107 deletions
diff --git a/client/simple/src/js/head/00_init.js b/client/simple/src/js/head/00_init.js index d6abd6b6f..7aec676a4 100644 --- a/client/simple/src/js/head/00_init.js +++ b/client/simple/src/js/head/00_init.js @@ -1,12 +1,12 @@ /* SPDX-License-Identifier: AGPL-3.0-or-later */ ((w, d) => { // add data- properties - var script = - d.currentScript || - (() => { - var scripts = d.getElementsByTagName("script"); - return scripts[scripts.length - 1]; - })(); + const getLastScriptElement = () => { + const scripts = d.getElementsByTagName("script"); + return scripts[scripts.length - 1]; + }; + + const script = d.currentScript || getLastScriptElement(); w.searxng = { settings: JSON.parse(atob(script.getAttribute("client_settings"))) diff --git a/client/simple/src/js/main/00_toolkit.js b/client/simple/src/js/main/00_toolkit.js index ca5e1d0e0..81e5071f9 100644 --- a/client/simple/src/js/main/00_toolkit.js +++ b/client/simple/src/js/main/00_toolkit.js @@ -17,8 +17,8 @@ window.searxng = ((w, d) => { ElementPrototype.webkitMatchesSelector || ElementPrototype.msMatchesSelector || function (selector) { - var nodes = (this.parentNode || this.document).querySelectorAll(selector), - i = -1; + const nodes = (this.parentNode || this.document).querySelectorAll(selector); + let i = -1; while (nodes[++i] && nodes[i] !== this); return !!nodes[i]; }; @@ -33,7 +33,7 @@ window.searxng = ((w, d) => { } } - var searxng = window.searxng || {}; + const searxng = window.searxng || {}; searxng.on = (obj, eventType, callback, useCapture) => { useCapture = useCapture || false; @@ -45,10 +45,20 @@ window.searxng = ((w, d) => { d.addEventListener( eventType, (e) => { - var el = e.target || e.srcElement, - found = false; - while (el?.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement; - if (found) callbackSafe(callback, el, e); + let el = e.target || e.srcElement; + let found = false; + + while (el?.matches && el !== d) { + found = el.matches(obj); + + if (found) break; + + el = el.parentElement; + } + + if (found) { + callbackSafe(callback, el, e); + } }, useCapture ); @@ -66,7 +76,7 @@ window.searxng = ((w, d) => { searxng.http = (method, url, data = null) => new Promise((resolve, reject) => { try { - var req = new XMLHttpRequest(); + const req = new XMLHttpRequest(); req.open(method, url, true); req.timeout = 20000; @@ -104,9 +114,9 @@ window.searxng = ((w, d) => { }); searxng.loadStyle = (src) => { - var path = searxng.settings.theme_static_path + "/" + src, - id = "style_" + src.replace(".", "_"), - s = d.getElementById(id); + const path = `${searxng.settings.theme_static_path}/${src}`; + const id = `style_${src.replace(".", "_")}`; + let s = d.getElementById(id); if (s === null) { s = d.createElement("link"); s.setAttribute("id", id); @@ -118,9 +128,9 @@ window.searxng = ((w, d) => { }; searxng.loadScript = (src, callback) => { - var path = searxng.settings.theme_static_path + "/" + src, - id = "script_" + src.replace(".", "_"), - s = d.getElementById(id); + const path = `${searxng.settings.theme_static_path}/${src}`; + const id = `script_${src.replace(".", "_")}`; + let s = d.getElementById(id); if (s === null) { s = d.createElement("script"); s.setAttribute("id", id); @@ -137,7 +147,7 @@ window.searxng = ((w, d) => { console.log(exception); } } else { - console.log("callback not executed : script '" + path + "' not loaded."); + console.log(`callback not executed : script '${path}' not loaded.`); } }; @@ -154,7 +164,7 @@ window.searxng = ((w, d) => { }); function getEndpoint() { - for (var className of d.getElementsByTagName("body")[0].classList.values()) { + for (const className of d.getElementsByTagName("body")[0].classList.values()) { if (className.endsWith("_endpoint")) { return className.split("_")[0]; } diff --git a/client/simple/src/js/main/infinite_scroll.js b/client/simple/src/js/main/infinite_scroll.js index b3d308c0c..12ecd83be 100644 --- a/client/simple/src/js/main/infinite_scroll.js +++ b/client/simple/src/js/main/infinite_scroll.js @@ -18,10 +18,10 @@ searxng.ready(() => { } const d = document; - var onlyImages = d.getElementById("results").classList.contains("only_template_images"); + const onlyImages = d.getElementById("results").classList.contains("only_template_images"); function newLoadSpinner() { - var loader = d.createElement("div"); + const loader = d.createElement("div"); loader.classList.add("loader"); return loader; } @@ -32,18 +32,18 @@ searxng.ready(() => { } function loadNextPage(callback) { - var form = d.querySelector("#pagination form.next_page"); + const form = d.querySelector("#pagination form.next_page"); if (!form) { return; } replaceChildrenWith(d.querySelector("#pagination"), [newLoadSpinner()]); - var formData = new FormData(form); + const formData = new FormData(form); searxng .http("POST", d.querySelector("#search").getAttribute("action"), formData) .then((response) => { - var nextPageDoc = new DOMParser().parseFromString(response, "text/html"); - var articleList = nextPageDoc.querySelectorAll("#urls article"); - var paginationElement = nextPageDoc.querySelector("#pagination"); + const nextPageDoc = new DOMParser().parseFromString(response, "text/html"); + const articleList = nextPageDoc.querySelectorAll("#urls article"); + const paginationElement = nextPageDoc.querySelector("#pagination"); d.querySelector("#pagination").remove(); if (articleList.length > 0 && !onlyImages) { // do not add <hr> element when there are only images @@ -59,7 +59,7 @@ searxng.ready(() => { }) .catch((err) => { console.log(err); - var e = d.createElement("div"); + const e = d.createElement("div"); e.textContent = searxng.settings.translations.error_loading_next_page; e.classList.add("dialog-error"); e.setAttribute("role", "alert"); diff --git a/client/simple/src/js/main/keyboard.js b/client/simple/src/js/main/keyboard.js index bc878c561..e707c397f 100644 --- a/client/simple/src/js/main/keyboard.js +++ b/client/simple/src/js/main/keyboard.js @@ -28,7 +28,7 @@ searxng.ready(() => { } function isImageResult(resultElement) { - return resultElement && resultElement.classList.contains("result-images"); + return resultElement?.classList.contains("result-images"); } searxng.on(".result", "click", function (e) { @@ -60,7 +60,7 @@ searxng.ready(() => { ); /* common base for layouts */ - var baseKeyBinding = { + const baseKeyBinding = { Escape: { key: "ESC", fun: removeFocus, @@ -116,7 +116,7 @@ searxng.ready(() => { cat: "Results" } }; - var keyBindingLayouts = { + const keyBindingLayouts = { default: Object.assign( { /* SearXNG layout */ @@ -198,7 +198,7 @@ searxng.ready(() => { ) }; - var keyBindings = keyBindingLayouts[searxng.settings.hotkeys] || keyBindingLayouts.default; + const keyBindings = keyBindingLayouts[searxng.settings.hotkeys] || keyBindingLayouts.default; searxng.on(document, "keydown", (e) => { // check for modifiers so we don't break browser's hotkeys @@ -210,7 +210,7 @@ searxng.ready(() => { !e.shiftKey && !e.metaKey ) { - var tagName = e.target.tagName.toLowerCase(); + const tagName = e.target.tagName.toLowerCase(); if (e.key === "Escape") { keyBindings[e.key].fun(e); } else { @@ -224,7 +224,7 @@ searxng.ready(() => { function highlightResult(which) { return (noScroll, keepFocus) => { - var current = document.querySelector(".result[data-vim-selected]"), + let current = document.querySelector(".result[data-vim-selected]"), effectiveWhich = which; if (current === null) { // no selection : choose the first one @@ -239,7 +239,7 @@ searxng.ready(() => { } } - var next, + let next, results = document.querySelectorAll(".result"); results = Array.from(results); // convert NodeList to Array for further use @@ -248,13 +248,13 @@ searxng.ready(() => { } else { switch (effectiveWhich) { case "visible": { - var top = document.documentElement.scrollTop || document.body.scrollTop; - var bot = top + document.documentElement.clientHeight; + const top = document.documentElement.scrollTop || document.body.scrollTop; + const bot = top + document.documentElement.clientHeight; - for (var i = 0; i < results.length; i++) { + for (let i = 0; i < results.length; i++) { next = results[i]; - var etop = next.offsetTop; - var ebot = etop + next.clientHeight; + const etop = next.offsetTop; + const ebot = etop + next.clientHeight; if (ebot <= bot && etop > top) { break; @@ -271,6 +271,7 @@ searxng.ready(() => { case "bottom": next = results[results.length - 1]; break; + // biome-ignore lint/complexity/noUselessSwitchCase: fallthrough is intended case "top": /* falls through */ default: @@ -282,7 +283,7 @@ searxng.ready(() => { current.removeAttribute("data-vim-selected"); next.setAttribute("data-vim-selected", "true"); if (!keepFocus) { - var link = next.querySelector("h3 a") || next.querySelector("a"); + const link = next.querySelector("h3 a") || next.querySelector("a"); if (link !== null) { link.focus(); } @@ -309,7 +310,7 @@ searxng.ready(() => { function pageButtonClick(css_selector) { return () => { - var button = document.querySelector(css_selector); + const button = document.querySelector(css_selector); if (button) { button.click(); } @@ -325,11 +326,11 @@ searxng.ready(() => { } function scrollPageToSelected() { - var sel = document.querySelector(".result[data-vim-selected]"); + const sel = document.querySelector(".result[data-vim-selected]"); if (sel === null) { return; } - var wtop = document.documentElement.scrollTop || document.body.scrollTop, + const wtop = document.documentElement.scrollTop || document.body.scrollTop, wheight = document.documentElement.clientHeight, etop = sel.offsetTop, ebot = etop + sel.clientHeight, @@ -344,7 +345,7 @@ searxng.ready(() => { if (wtop > etop - offset) { window.scroll(window.scrollX, etop - offset); } else { - var wbot = wtop + wheight; + const wbot = wtop + wheight; if (wbot < ebot + offset) { window.scroll(window.scrollX, ebot - wheight + offset); } @@ -367,22 +368,22 @@ searxng.ready(() => { function searchInputFocus() { window.scrollTo(0, 0); - var q = document.querySelector("#q"); + const q = document.querySelector("#q"); q.focus(); if (q.setSelectionRange) { - var len = q.value.length; + const len = q.value.length; q.setSelectionRange(len, len); } } function openResult(newTab) { return () => { - var link = document.querySelector(".result[data-vim-selected] h3 a"); + let link = document.querySelector(".result[data-vim-selected] h3 a"); if (link === null) { link = document.querySelector(".result[data-vim-selected] > a"); } if (link !== null) { - var url = link.getAttribute("href"); + const url = link.getAttribute("href"); if (newTab) { window.open(url); } else { @@ -393,40 +394,40 @@ searxng.ready(() => { } function initHelpContent(divElement) { - var categories = {}; + const categories = {}; - for (var k in keyBindings) { - var key = keyBindings[k]; + for (const k in keyBindings) { + const key = keyBindings[k]; categories[key.cat] = categories[key.cat] || []; categories[key.cat].push(key); } - var sorted = Object.keys(categories).sort((a, b) => categories[b].length - categories[a].length); + const sorted = Object.keys(categories).sort((a, b) => categories[b].length - categories[a].length); if (sorted.length === 0) { return; } - var html = '<a href="#" class="close" aria-label="close" title="close">×</a>'; + let html = '<a href="#" class="close" aria-label="close" title="close">×</a>'; html += "<h3>How to navigate SearXNG with hotkeys</h3>"; html += "<table>"; - for (var i = 0; i < sorted.length; i++) { - var cat = categories[sorted[i]]; + for (let i = 0; i < sorted.length; i++) { + const cat = categories[sorted[i]]; - var lastCategory = i === sorted.length - 1; - var first = i % 2 === 0; + const lastCategory = i === sorted.length - 1; + const first = i % 2 === 0; if (first) { html += "<tr>"; } html += "<td>"; - html += "<h4>" + cat[0].cat + "</h4>"; + html += `<h4>${cat[0].cat}</h4>`; html += '<ul class="list-unstyled">'; - for (var cj in cat) { - html += "<li><kbd>" + cat[cj].key + "</kbd> " + cat[cj].des + "</li>"; + for (const cj in cat) { + html += `<li><kbd>${cat[cj].key}</kbd> ${cat[cj].des}</li>`; } html += "</ul>"; @@ -443,14 +444,14 @@ searxng.ready(() => { } function toggleHelp() { - var helpPanel = document.querySelector("#vim-hotkeys-help"); + let helpPanel = document.querySelector("#vim-hotkeys-help"); if (helpPanel === undefined || helpPanel === null) { // first call helpPanel = document.createElement("div"); helpPanel.id = "vim-hotkeys-help"; helpPanel.className = "dialog-modal"; initHelpContent(helpPanel); - var body = document.getElementsByTagName("body")[0]; + const body = document.getElementsByTagName("body")[0]; body.appendChild(helpPanel); } else { // toggle hidden @@ -459,7 +460,7 @@ searxng.ready(() => { } function copyURLToClipboard() { - var currentUrlElement = document.querySelector(".result[data-vim-selected] h3 a"); + const currentUrlElement = document.querySelector(".result[data-vim-selected] h3 a"); if (currentUrlElement === null) return; const url = currentUrlElement.getAttribute("href"); diff --git a/client/simple/src/js/main/mapresult.js b/client/simple/src/js/main/mapresult.js index 0d212f7c5..3f2d06548 100644 --- a/client/simple/src/js/main/mapresult.js +++ b/client/simple/src/js/main/mapresult.js @@ -1,38 +1,38 @@ /* SPDX-License-Identifier: AGPL-3.0-or-later */ /* global L */ -((w, d, searxng) => { +((_w, _d, searxng) => { searxng.ready(() => { searxng.on(".searxng_init_map", "click", function (event) { // no more request this.classList.remove("searxng_init_map"); // - var leaflet_target = this.dataset.leafletTarget; - var map_lon = parseFloat(this.dataset.mapLon); - var map_lat = parseFloat(this.dataset.mapLat); - var map_zoom = parseFloat(this.dataset.mapZoom); - var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox); - var map_geojson = JSON.parse(this.dataset.mapGeojson); + const leaflet_target = this.dataset.leafletTarget; + const map_lon = parseFloat(this.dataset.mapLon); + const map_lat = parseFloat(this.dataset.mapLat); + const map_zoom = parseFloat(this.dataset.mapZoom); + const map_boundingbox = JSON.parse(this.dataset.mapBoundingbox); + const map_geojson = JSON.parse(this.dataset.mapGeojson); searxng.loadStyle("css/leaflet.css"); searxng.loadScript("js/leaflet.js", () => { - var map_bounds = null; + let map_bounds = null; if (map_boundingbox) { - var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]); - var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]); + const southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]); + const northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]); map_bounds = L.latLngBounds(southWest, northEast); } // init map - var map = L.map(leaflet_target); + const map = L.map(leaflet_target); // create the tile layer with correct attribution - var osmMapnikUrl = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"; - var osmMapnikAttrib = 'Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors'; - var osmMapnik = new L.TileLayer(osmMapnikUrl, { minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib }); - var osmWikimediaUrl = "https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png"; - var osmWikimediaAttrib = + const osmMapnikUrl = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"; + const osmMapnikAttrib = 'Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors'; + const osmMapnik = new L.TileLayer(osmMapnikUrl, { minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib }); + const osmWikimediaUrl = "https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png"; + const osmWikimediaAttrib = 'Wikimedia maps | Maps data © <a href="https://openstreetmap.org">OpenStreetMap contributors</a>'; - var osmWikimedia = new L.TileLayer(osmWikimediaUrl, { + const osmWikimedia = new L.TileLayer(osmWikimediaUrl, { minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib @@ -48,15 +48,15 @@ }, 0); } else if (map_lon && map_lat) { if (map_zoom) { - map.setView(new L.latLng(map_lat, map_lon), map_zoom); + map.setView(new L.LatLng(map_lat, map_lon), map_zoom); } else { - map.setView(new L.latLng(map_lat, map_lon), 8); + map.setView(new L.LatLng(map_lat, map_lon), 8); } } map.addLayer(osmMapnik); - var baseLayers = { + const baseLayers = { "OSM Mapnik": osmMapnik, "OSM Wikimedia": osmWikimedia }; diff --git a/client/simple/src/js/main/preferences.js b/client/simple/src/js/main/preferences.js index 2760d589d..ac080e290 100644 --- a/client/simple/src/js/main/preferences.js +++ b/client/simple/src/js/main/preferences.js @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: AGPL-3.0-or-later */ -((w, d, searxng) => { +((_w, d, searxng) => { if (searxng.endpoint !== "preferences") { return; } @@ -12,9 +12,9 @@ searxng.http("GET", "engine_descriptions.json").then((content) => { engine_descriptions = JSON.parse(content); for (const [engine_name, description] of Object.entries(engine_descriptions)) { - const elements = d.querySelectorAll('[data-engine-name="' + engine_name + '"] .engine-description'); + const elements = d.querySelectorAll(`[data-engine-name="${engine_name}"] .engine-description`); for (const element of elements) { - const source = " (<i>" + searxng.settings.translations.Source + ": " + description[1] + "</i>)"; + const source = ` (<i>${searxng.settings.translations.Source}: ${description[1]}</i>)`; element.innerHTML = description[0] + source; } } diff --git a/client/simple/src/js/main/results.js b/client/simple/src/js/main/results.js index 67d28cc65..cf7829912 100644 --- a/client/simple/src/js/main/results.js +++ b/client/simple/src/js/main/results.js @@ -13,7 +13,7 @@ import "../../../node_modules/swiped-events/src/swiped-events.js"; "error", () => { // console.log("ERROR can't load: " + img.src); - img.src = window.searxng.settings.theme_static_path + "/img/img_load_error.svg"; + img.src = `${window.searxng.settings.theme_static_path}/img/img_load_error.svg`; }, { once: true } ) @@ -24,11 +24,11 @@ import "../../../node_modules/swiped-events/src/swiped-events.js"; } searxng.on(".btn-collapse", "click", function () { - var btnLabelCollapsed = this.getAttribute("data-btn-text-collapsed"); - var btnLabelNotCollapsed = this.getAttribute("data-btn-text-not-collapsed"); - var target = this.getAttribute("data-target"); - var targetElement = d.querySelector(target); - var html = this.innerHTML; + const btnLabelCollapsed = this.getAttribute("data-btn-text-collapsed"); + const btnLabelNotCollapsed = this.getAttribute("data-btn-text-not-collapsed"); + const target = this.getAttribute("data-target"); + const targetElement = d.querySelector(target); + let html = this.innerHTML; if (this.classList.contains("collapsed")) { html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed); } else { @@ -40,16 +40,16 @@ import "../../../node_modules/swiped-events/src/swiped-events.js"; }); searxng.on(".media-loader", "click", function () { - var target = this.getAttribute("data-target"); - var iframe_load = d.querySelector(target + " > iframe"); - var srctest = iframe_load.getAttribute("src"); + const target = this.getAttribute("data-target"); + const iframe_load = d.querySelector(`${target} > iframe`); + const srctest = iframe_load.getAttribute("src"); if (srctest === null || srctest === undefined || srctest === false) { iframe_load.setAttribute("src", iframe_load.getAttribute("data-src")); } }); searxng.on("#copy_url", "click", function () { - var target = this.parentElement.querySelector("pre"); + const target = this.parentElement.querySelector("pre"); navigator.clipboard.writeText(target.innerText); this.innerText = this.dataset.copiedText; }); @@ -165,7 +165,7 @@ import "../../../node_modules/swiped-events/src/swiped-events.js"; w.addEventListener( "scroll", () => { - var e = d.getElementById("backToTop"), + const e = d.getElementById("backToTop"), scrollTop = document.documentElement.scrollTop || document.body.scrollTop, results = d.getElementById("results"); if (e !== null) { diff --git a/client/simple/src/js/main/search.js b/client/simple/src/js/main/search.js index aac2fb2b4..5d1e18bde 100644 --- a/client/simple/src/js/main/search.js +++ b/client/simple/src/js/main/search.js @@ -1,23 +1,23 @@ /* SPDX-License-Identifier: AGPL-3.0-or-later */ /* exported AutoComplete */ -((w, d, searxng) => { - var qinput_id = "q", - qinput; +((_w, d, searxng) => { + const qinput_id = "q"; + let qinput; const isMobile = window.matchMedia("only screen and (max-width: 50em)").matches; const isResultsPage = document.querySelector("main").id === "main_results"; function submitIfQuery() { if (qinput.value.length > 0) { - var search = document.getElementById("search"); + const search = document.getElementById("search"); setTimeout(search.submit.bind(search), 0); } } function createClearButton(qinput) { - var cs = document.getElementById("clear_search"); - var updateClearButton = () => { + const cs = document.getElementById("clear_search"); + const updateClearButton = () => { if (qinput.value.length === 0) { cs.classList.add("empty"); } else { @@ -41,7 +41,7 @@ if (searxng.settings.method === "GET") { const reqParams = new URLSearchParams(); reqParams.append("q", query); - request = fetch("./autocompleter?" + reqParams.toString()); + request = fetch(`./autocompleter?${reqParams.toString()}`); } else { const formData = new FormData(); formData.append("q", query); |