diff --git a/app/routes.py b/app/routes.py
index 58f722b..bcfb725 100644
--- a/app/routes.py
+++ b/app/routes.py
@@ -10,6 +10,9 @@ import urllib.parse as urlparse
from urllib.parse import parse_qs
from io import BytesIO
+APP_ROOT = os.path.dirname(os.path.abspath(__file__))
+STATIC_FOLDER = os.path.join(APP_ROOT, 'static')
+
# Get Mozilla Firefox rhyme (important) and form a new user agent
mozilla = rhyme.get_rhyme('Mo') + 'zilla'
firefox = rhyme.get_rhyme('Fire') + 'fox'
@@ -24,7 +27,7 @@ SEARCH_URL = 'https://www.google.com/search?gbv=1&q='
# (can be useful for achieving nojs on mobile)
nojs = int(os.environ.get('NOJS'))
-config = json.load(open('config.json'))
+user_config = json.load(open(STATIC_FOLDER + '/config.json'))
def get_ua(user_agent):
@@ -81,8 +84,8 @@ def search():
# Grab city from config, if available
near = ''
- if 'near' in config:
- near = '&near=' + config['near']
+ if 'near' in user_config:
+ near = '&near=' + urlparse.quote(user_config['near'])
user_agent = request.headers.get('User-Agent')
full_query = q + tbs + tbm + start + near
@@ -114,7 +117,7 @@ def search():
# Update logo
logo = soup.find('a', {'class': 'l'})
if logo is not None and 'Android' in user_agent or 'iPhone' in user_agent:
- logo.insert(0, "Shoogle")
+ logo.insert(0, 'Shoogle')
logo['style'] = 'display: flex;justify-content: center;align-items: center;color: #685e79;font-size: 18px;'
# Replace hrefs with only the intended destination (no "utm" type tags)
@@ -133,7 +136,7 @@ def search():
# Ensure no extra scripts passed through
try:
- for script in soup("script"):
+ for script in soup('script'):
script.decompose()
soup.find('div', id='sfooter').decompose()
except Exception:
@@ -142,6 +145,18 @@ def search():
return render_template('display.html', response=soup)
+@app.route('/config', methods=['POST'])
+def config():
+ global user_config
+ with open(STATIC_FOLDER + '/config.json', 'w') as config_file:
+ config_file.write(json.dumps(json.loads(request.data), indent=4))
+ config_file.close()
+
+ user_config = json.loads(request.data)
+
+ return 'New config: ' + str(request.data)
+
+
@app.route('/url', methods=['GET'])
def url():
if 'url' in request.args:
diff --git a/app/static/js/controller.js b/app/static/js/controller.js
index 38b10a7..758fbc0 100644
--- a/app/static/js/controller.js
+++ b/app/static/js/controller.js
@@ -1,4 +1,6 @@
document.addEventListener("DOMContentLoaded", function() {
+
+ // Setup search field
const searchBar = document.getElementById("search-bar");
const searchBtn = document.getElementById("search-submit");
@@ -15,5 +17,36 @@ document.addEventListener("DOMContentLoaded", function() {
searchBtn.onclick = function() {
window.location.href = '/search?q=' + encodeURI(searchBar.value);
- }
+ };
+
+ // Setup shoogle config
+ const saveConfig = document.getElementById("config-submit");
+ const nearConfig = document.getElementById("config-near");
+
+ // Request existing config info
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", "/static/config.json");
+ xhr.onload = function() {
+ if (xhr.readyState === 4 && xhr.status !== 200) {
+ alert("Error loading Shoogle config");
+ return;
+ }
+
+ // Allow for updating/saving config values
+ let configSettings = JSON.parse(xhr.responseText);
+
+ nearConfig.value = configSettings["near"];
+ nearConfig.addEventListener("keyup", function(event) {
+ configSettings["near"] = nearConfig.value;
+ });
+
+ saveConfig.onclick = function() {
+ var xhr = new XMLHttpRequest();
+ xhr.open("POST", "/config");
+ xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
+ xhr.send(JSON.stringify(configSettings));
+ }
+ };
+ xhr.send();
+
});
diff --git a/app/templates/index.html b/app/templates/index.html
index d1353a4..2e8a29a 100644
--- a/app/templates/index.html
+++ b/app/templates/index.html
@@ -10,4 +10,10 @@
+
+