mirror of
https://github.com/searxng/searxng
synced 2024-01-01 19:24:07 +01:00
[feat] hostname replace on client side
This commit is contained in:
parent
047c7a7cf6
commit
fddcedccc2
2 changed files with 78 additions and 1 deletions
78
searx/static/themes/simple/src/js/main/hostname_replace.js
Normal file
78
searx/static/themes/simple/src/js/main/hostname_replace.js
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/* SPDX-License-Identifier: AGPL-3.0-or-later */
|
||||||
|
(function (w, d, searxng) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
if (searxng.endpoint !== 'results') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
searxng.ready(function () {
|
||||||
|
const formatUrl = (urlStr) => {
|
||||||
|
const url = new URL(urlStr);
|
||||||
|
return url.origin + url.pathname.split("/").join(" › ");
|
||||||
|
}
|
||||||
|
|
||||||
|
// client side hostname replace
|
||||||
|
if (window.localStorage?.getItem("rewrites")) {
|
||||||
|
const rewrites = window.localStorage.getItem("rewrites").split("\n");
|
||||||
|
|
||||||
|
const applyAllRewrites = (url) => {
|
||||||
|
for (let rewrite of rewrites) {
|
||||||
|
|
||||||
|
// filter out blank lines
|
||||||
|
if (!rewrite) continue;
|
||||||
|
|
||||||
|
// we're dealing with user input here, hence all the regex logic
|
||||||
|
// is done inside a try catch clause to avoid crashes due to wrong
|
||||||
|
// usage by the end user
|
||||||
|
try {
|
||||||
|
const [pattern, replacement] = rewrite.split(":");
|
||||||
|
const regExp = new RegExp(pattern);
|
||||||
|
// if no replacement specified and the pattern found, all
|
||||||
|
if (url.origin.match(regExp).length) {
|
||||||
|
if (!replacement) return true;
|
||||||
|
|
||||||
|
// replace the hostname of the url and skip any further patterns
|
||||||
|
url.hostname = replacement;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (exception) {
|
||||||
|
// ignore malformed patterns and skip to the next one
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// iterate over all visible results and replace the url if needed
|
||||||
|
for (let element of document.querySelectorAll("article.result")) {
|
||||||
|
const anchorElements = element.querySelectorAll("a");
|
||||||
|
|
||||||
|
// iterate over all anchor elements with a 'href' and replace the
|
||||||
|
// href if the pattern was found or completely remove it if no
|
||||||
|
// replacement was provided by the user
|
||||||
|
for (let anchorElement of anchorElements) {
|
||||||
|
if (!anchorElement.href.trim()) continue;
|
||||||
|
|
||||||
|
let newUrl = new URL(anchorElement.href);
|
||||||
|
const shouldHide = applyAllRewrites(newUrl);
|
||||||
|
if (shouldHide) {
|
||||||
|
element.style.display = 'none';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
anchorElement.href = newUrl.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// update the url in the url preview wrapper
|
||||||
|
const urlPreview = element.querySelector(".url_wrapper");
|
||||||
|
if (urlPreview) {
|
||||||
|
let url = new URL(urlPreview.href);
|
||||||
|
applyAllRewrites(url);
|
||||||
|
urlPreview.href = url;
|
||||||
|
urlPreview.innerText = formatUrl(url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})(window, document, window.searxng);
|
|
@ -113,7 +113,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
})(window, document, window.searxng);
|
})(window, document, window.searxng);
|
||||||
|
|
Loading…
Add table
Reference in a new issue