Add support for relative search results (#715)
* Relativization of search results * Fix JavaScript error when opening images * Replace single-letter logo and remove sign-in link * Add `WHOOGLE_URL_PREFIX` env var to support relative path redirection The `WHOOGLE_URL_PREFIX` var can now be set to fix internal app redirects, such as the `/session` redirect performed on the first visit to the Whoogle home page. Co-authored-by: Ben Busby <contact@benbusby.com>main
parent
94b4eb08a2
commit
6d362ca5c7
|
@ -26,6 +26,7 @@ RUN mkdir -p $config_dir
|
||||||
RUN chmod a+w $config_dir
|
RUN chmod a+w $config_dir
|
||||||
VOLUME $config_dir
|
VOLUME $config_dir
|
||||||
|
|
||||||
|
ARG url_prefix=''
|
||||||
ARG username=''
|
ARG username=''
|
||||||
ARG password=''
|
ARG password=''
|
||||||
ARG proxyuser=''
|
ARG proxyuser=''
|
||||||
|
@ -45,6 +46,7 @@ ARG imgur_alt='farside.link/rimgo'
|
||||||
ARG wikipedia_alt='farside.link/wikiless'
|
ARG wikipedia_alt='farside.link/wikiless'
|
||||||
|
|
||||||
ENV CONFIG_VOLUME=$config_dir \
|
ENV CONFIG_VOLUME=$config_dir \
|
||||||
|
WHOOGLE_URL_PREFIX=$url_prefix \
|
||||||
WHOOGLE_USER=$username \
|
WHOOGLE_USER=$username \
|
||||||
WHOOGLE_PASS=$password \
|
WHOOGLE_PASS=$password \
|
||||||
WHOOGLE_PROXY_USER=$proxyuser \
|
WHOOGLE_PROXY_USER=$proxyuser \
|
||||||
|
|
|
@ -321,6 +321,7 @@ There are a few optional environment variables available for customizing a Whoog
|
||||||
|
|
||||||
| Variable | Description |
|
| Variable | Description |
|
||||||
| -------------------- | ----------------------------------------------------------------------------------------- |
|
| -------------------- | ----------------------------------------------------------------------------------------- |
|
||||||
|
| WHOOGLE_URL_PREFIX | The URL prefix to use for the whoogle instance (i.e. "/whoogle") |
|
||||||
| WHOOGLE_DOTENV | Load environment variables in `whoogle.env` |
|
| WHOOGLE_DOTENV | Load environment variables in `whoogle.env` |
|
||||||
| WHOOGLE_USER | The username for basic auth. WHOOGLE_PASS must also be set if used. |
|
| WHOOGLE_USER | The username for basic auth. WHOOGLE_PASS must also be set if used. |
|
||||||
| WHOOGLE_PASS | The password for basic auth. WHOOGLE_USER must also be set if used. |
|
| WHOOGLE_PASS | The password for basic auth. WHOOGLE_USER must also be set if used. |
|
||||||
|
|
|
@ -139,6 +139,8 @@ class Filter:
|
||||||
input_form = soup.find('form')
|
input_form = soup.find('form')
|
||||||
if input_form is not None:
|
if input_form is not None:
|
||||||
input_form['method'] = 'GET' if self.config.get_only else 'POST'
|
input_form['method'] = 'GET' if self.config.get_only else 'POST'
|
||||||
|
# Use a relative URI for submissions
|
||||||
|
input_form['action'] = 'search'
|
||||||
|
|
||||||
# Ensure no extra scripts passed through
|
# Ensure no extra scripts passed through
|
||||||
for script in soup('script'):
|
for script in soup('script'):
|
||||||
|
@ -320,6 +322,11 @@ class Filter:
|
||||||
render_template('logo.html'),
|
render_template('logo.html'),
|
||||||
features='html.parser'))
|
features='html.parser'))
|
||||||
return
|
return
|
||||||
|
elif src.startswith(G_M_LOGO_URL):
|
||||||
|
# Re-brand with single-letter Whoogle logo
|
||||||
|
element['src'] = 'static/img/favicon/apple-icon.png'
|
||||||
|
element.parent['href'] = 'home'
|
||||||
|
return
|
||||||
elif src.startswith(GOOG_IMG) or GOOG_STATIC in src:
|
elif src.startswith(GOOG_IMG) or GOOG_STATIC in src:
|
||||||
element['src'] = BLANK_B64
|
element['src'] = BLANK_B64
|
||||||
return
|
return
|
||||||
|
@ -423,6 +430,10 @@ class Filter:
|
||||||
# Internal google links (i.e. mail, maps, etc) should still
|
# Internal google links (i.e. mail, maps, etc) should still
|
||||||
# be forwarded to Google
|
# be forwarded to Google
|
||||||
link['href'] = 'https://google.com' + q
|
link['href'] = 'https://google.com' + q
|
||||||
|
elif q.startswith('https://accounts.google.com'):
|
||||||
|
# Remove Sign-in link
|
||||||
|
link.decompose()
|
||||||
|
return
|
||||||
elif '/search?q=' in href:
|
elif '/search?q=' in href:
|
||||||
# "li:1" implies the query should be interpreted verbatim,
|
# "li:1" implies the query should be interpreted verbatim,
|
||||||
# which is accomplished by wrapping the query in double quotes
|
# which is accomplished by wrapping the query in double quotes
|
||||||
|
@ -454,6 +465,16 @@ class Filter:
|
||||||
if href.startswith(MAPS_URL):
|
if href.startswith(MAPS_URL):
|
||||||
# Maps links don't work if a site filter is applied
|
# Maps links don't work if a site filter is applied
|
||||||
link['href'] = MAPS_URL + "?q=" + clean_query(q)
|
link['href'] = MAPS_URL + "?q=" + clean_query(q)
|
||||||
|
elif href.startswith('/?') or href.startswith('/search?'):
|
||||||
|
# make sure that tags can be clicked as relative URLs
|
||||||
|
link['href'] = href[1:]
|
||||||
|
elif href.startswith('/intl/'):
|
||||||
|
# do nothing, keep original URL for ToS
|
||||||
|
pass
|
||||||
|
elif href.startswith('/preferences'):
|
||||||
|
# there is no config specific URL, remove this
|
||||||
|
link.decompose()
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
link['href'] = href
|
link['href'] = href
|
||||||
|
|
||||||
|
|
|
@ -625,4 +625,7 @@ def run_app() -> None:
|
||||||
elif args.unix_socket:
|
elif args.unix_socket:
|
||||||
waitress.serve(app, unix_socket=args.unix_socket)
|
waitress.serve(app, unix_socket=args.unix_socket)
|
||||||
else:
|
else:
|
||||||
waitress.serve(app, listen="{}:{}".format(args.host, args.port))
|
waitress.serve(
|
||||||
|
app,
|
||||||
|
listen="{}:{}".format(args.host, args.port),
|
||||||
|
url_prefix=os.environ.get('WHOOGLE_URL_PREFIX', ''))
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
const checkForTracking = () => {
|
const checkForTracking = () => {
|
||||||
const mainDiv = document.getElementById("main");
|
const mainDiv = document.getElementById("main");
|
||||||
const query = document.getElementById("search-bar").value.replace(/\s+/g, '');
|
const searchBar = document.getElementById("search-bar");
|
||||||
|
// some pages (e.g. images) do not have these
|
||||||
|
if (!mainDiv || !searchBar)
|
||||||
|
return;
|
||||||
|
const query = searchBar.value.replace(/\s+/g, '');
|
||||||
|
|
||||||
// Note: regex functions for checking for tracking queries were derived
|
// Note: regex functions for checking for tracking queries were derived
|
||||||
// from here -- https://stackoverflow.com/questions/619977
|
// from here -- https://stackoverflow.com/questions/619977
|
||||||
|
@ -59,11 +63,14 @@ document.addEventListener("DOMContentLoaded", function() {
|
||||||
checkForTracking();
|
checkForTracking();
|
||||||
|
|
||||||
// Clear input if reset button tapped
|
// Clear input if reset button tapped
|
||||||
const search = document.getElementById("search-bar");
|
const searchBar = document.getElementById("search-bar");
|
||||||
const resetBtn = document.getElementById("search-reset");
|
const resetBtn = document.getElementById("search-reset");
|
||||||
|
// some pages (e.g. images) do not have these
|
||||||
|
if (!searchBar || !resetBtn)
|
||||||
|
return;
|
||||||
resetBtn.addEventListener("click", event => {
|
resetBtn.addEventListener("click", event => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
search.value = "";
|
searchBar.value = "";
|
||||||
search.focus();
|
searchBar.focus();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<form id="search-form" action="{{ url }}/search" method="post">
|
<form id="search-form" action="search" method="post">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="q"
|
name="q"
|
||||||
|
|
|
@ -12,6 +12,7 @@ import re
|
||||||
SKIP_ARGS = ['ref_src', 'utm']
|
SKIP_ARGS = ['ref_src', 'utm']
|
||||||
SKIP_PREFIX = ['//www.', '//mobile.', '//m.']
|
SKIP_PREFIX = ['//www.', '//mobile.', '//m.']
|
||||||
GOOG_STATIC = 'www.gstatic.com'
|
GOOG_STATIC = 'www.gstatic.com'
|
||||||
|
G_M_LOGO_URL = 'https://www.gstatic.com/m/images/icons/googleg.gif'
|
||||||
GOOG_IMG = '/images/branding/searchlogo/1x/googlelogo'
|
GOOG_IMG = '/images/branding/searchlogo/1x/googlelogo'
|
||||||
LOGO_URL = GOOG_IMG + '_desk'
|
LOGO_URL = GOOG_IMG + '_desk'
|
||||||
BLANK_B64 = ('data:image/png;base64,'
|
BLANK_B64 = ('data:image/png;base64,'
|
||||||
|
|
|
@ -24,6 +24,7 @@ serviceAccount:
|
||||||
name: ""
|
name: ""
|
||||||
|
|
||||||
conf: {}
|
conf: {}
|
||||||
|
# WHOOGLE_URL_PREFIX: "" # The URL prefix to use for the whoogle instance (i.e. "/whoogle")
|
||||||
# WHOOGLE_DOTENV: "" # Load environment variables in whoogle.env
|
# WHOOGLE_DOTENV: "" # Load environment variables in whoogle.env
|
||||||
# WHOOGLE_USER: "" # The username for basic auth. WHOOGLE_PASS must also be set if used.
|
# WHOOGLE_USER: "" # The username for basic auth. WHOOGLE_PASS must also be set if used.
|
||||||
# WHOOGLE_PASS: "" # The password for basic auth. WHOOGLE_USER must also be set if used.
|
# WHOOGLE_PASS: "" # The password for basic auth. WHOOGLE_USER must also be set if used.
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
#WHOOGLE_CSP=1
|
#WHOOGLE_CSP=1
|
||||||
#HTTPS_ONLY=1
|
#HTTPS_ONLY=1
|
||||||
|
|
||||||
|
# The URL prefix to use for the whoogle instance (i.e. "/whoogle")
|
||||||
|
#WHOOGLE_URL_PREFIX=""
|
||||||
|
|
||||||
# Restrict results to only those near a particular city
|
# Restrict results to only those near a particular city
|
||||||
#WHOOGLE_CONFIG_NEAR=denver
|
#WHOOGLE_CONFIG_NEAR=denver
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue