From 950131c9b027fada9ad1357d14ceac8b5106035d Mon Sep 17 00:00:00 2001 From: Daniel Muckerman Date: Sat, 31 Oct 2020 22:25:17 -0400 Subject: [PATCH] Overhaul JS, make sidebar a template --- app.py | 21 ++--- pocket/readitlater.db | Bin 90112 -> 188416 bytes static/add_modal.js | 37 ++++++++ static/style.css | 16 ++++ templates/bookmarklet.j2 | 53 +++++++++++ templates/fragments/add_modal.j2 | 16 ++++ templates/fragments/sidebar.j2 | 56 ++++++++++++ templates/list.j2 | 46 ++-------- templates/save.j2 | 148 ------------------------------- utils.py | 15 +++- 10 files changed, 206 insertions(+), 202 deletions(-) create mode 100644 static/add_modal.js create mode 100644 templates/bookmarklet.j2 create mode 100644 templates/fragments/add_modal.j2 create mode 100644 templates/fragments/sidebar.j2 delete mode 100644 templates/save.j2 diff --git a/app.py b/app.py index c3e8584..2d0d330 100644 --- a/app.py +++ b/app.py @@ -4,12 +4,10 @@ from ldap3 import Server, Connection, ALL, MODIFY_REPLACE from flask import Flask, g, request, session, redirect, url_for, render_template from flask_simpleldap import LDAP from flask_bootstrap import Bootstrap -from readabilipy import simple_json_from_html_string import os import sqlite3 import requests -from requests.api import head -from utils import clean_articles +from utils import clean_articles, get_article app = Flask(__name__) Bootstrap(app) @@ -65,7 +63,7 @@ def index(): conn.commit() conn.close() - return render_template('list.j2', articles = clean_articles(rows)) + return render_template('list.j2', articles = rows) @app.route('/archived') @@ -81,13 +79,13 @@ def archived(): conn.commit() conn.close() - return render_template('list.j2', articles = clean_articles(rows)) + return render_template('list.j2', articles = rows) -@app.route('/save') +@app.route('/bookmarklet') @ldap.login_required -def save(): - return render_template('save.j2') +def bookmarklet(): + return render_template('bookmarklet.j2') @app.route('/login', methods=['GET', 'POST']) @@ -145,16 +143,13 @@ def add_url(): c = conn.cursor() if url is not None and len(url) > 0: - headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} - response = requests.get(url, headers=headers) - - article = simple_json_from_html_string(response.text, use_readability=True) + article, short_domain = get_article(url) c.execute("SELECT * FROM articles WHERE url=?", (url,)) rows = c.fetchall() if (len(rows) == 0): - c.execute("INSERT INTO articles (url, content, title, byline) VALUES (?, ?, ?, ?)", (url, article['content'], article['title'], article['byline'])) + c.execute("INSERT INTO articles (url, content, title, byline) VALUES (?, ?, ?, ?)", (url, article['content'], article['title'], short_domain)) c.execute("SELECT * FROM articles WHERE url=?", (url,)) rows = c.fetchall() diff --git a/pocket/readitlater.db b/pocket/readitlater.db index 2613c2336c0a65cc07148bbce009e40a8f5411f8..1597720616a7ff061ba93c0b6ab873d6ac6007c4 100644 GIT binary patch literal 188416 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 v<`mYr#k_v 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 QpA)S^HcmWHn91q?1D6M2v;Y7A delta 11332 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 a { + color: rgba(0,0,0,.5); +} + +#sidebar div.active > a { + color: black; +} + #content { width: 100%; padding: 20px; @@ -64,6 +72,14 @@ #sidebar ul > li.active > a { color: white; } + + #sidebar div > a { + color: rgba(255,255,255,.5); + } + + #sidebar div.active > a { + color: white; + } body { background-color: #111 !important; diff --git a/templates/bookmarklet.j2 b/templates/bookmarklet.j2 new file mode 100644 index 0000000..db76cd7 --- /dev/null +++ b/templates/bookmarklet.j2 @@ -0,0 +1,53 @@ +{% extends "bootstrap/base.html" %} +{% block title %}Read TI Later{% endblock %} + +{% block styles %} +{{super()}} + +{% endblock %} + +{% block navbar %} + +{% endblock %} + +{% block content %} +
+ + + + +
+
+

Would you rather save on the go? Try our bookmarklet!

+ + javascript:(function(){var%20url%20=%20location.href;var%20otherWindow=window.open('about:blank','_blank');otherWindow.opener=null;otherWindow.location='https://read.technicalincompetence.club/add?close=1&url='+encodeURIComponent(url);})(); + +
+
+
+{% endblock %} + +{% block scripts %} +{{ super() }} +{% endblock %} \ No newline at end of file diff --git a/templates/fragments/add_modal.j2 b/templates/fragments/add_modal.j2 new file mode 100644 index 0000000..b095900 --- /dev/null +++ b/templates/fragments/add_modal.j2 @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/templates/fragments/sidebar.j2 b/templates/fragments/sidebar.j2 new file mode 100644 index 0000000..1bf2fca --- /dev/null +++ b/templates/fragments/sidebar.j2 @@ -0,0 +1,56 @@ +
    + {% if request.path == url_for('index') %} + + {% if request.path == url_for('archived') %} + +
+ + {% if request.path == url_for('bookmarklet') %} +
+ {% else %} +
+ {% endif %} + + + Bookmarklet +
\ No newline at end of file diff --git a/templates/list.j2 b/templates/list.j2 index 1aa862e..de5d846 100644 --- a/templates/list.j2 +++ b/templates/list.j2 @@ -31,7 +31,7 @@
- Save + Add Link Logout
@@ -42,44 +42,7 @@
@@ -90,7 +53,7 @@ {% for article in articles|reverse %}
{{ article[2] }} - {{ article[4] }} + {{ article[3] }}
Archive @@ -104,8 +67,11 @@
+ +{% include "fragments/add_modal.j2" %} {% endblock %} {% block scripts %} {{ super() }} + {% endblock %} \ No newline at end of file diff --git a/templates/save.j2 b/templates/save.j2 deleted file mode 100644 index a7a7b5c..0000000 --- a/templates/save.j2 +++ /dev/null @@ -1,148 +0,0 @@ -{% extends "bootstrap/base.html" %} -{% block title %}Read TI Later{% endblock %} - -{% block styles %} -{{super()}} - -{% endblock %} - -{% block navbar %} - -{% endblock %} - -{% block content %} -
- - - - -
- -
-
-
- - -
- -
-
-
-
-

Would you rather save on the go? Try our bookmarklet!

- - javascript:(function(){var%20url%20=%20location.href;var%20otherWindow=window.open('about:blank','_blank');otherWindow.opener=null;otherWindow.location='{{ request.url_root }}add?close=1&url='+encodeURIComponent(url);})(); - -
-
-
-
-
-{% endblock %} - -{% block scripts %} -{{ super() }} - -{% endblock %} \ No newline at end of file diff --git a/utils.py b/utils.py index 7fb6d1e..fec64a2 100644 --- a/utils.py +++ b/utils.py @@ -1,4 +1,6 @@ from urllib.parse import urlparse +from readabilipy import simple_json_from_html_string +import requests def clean_articles(rows): #article_id, url, title, byline @@ -9,4 +11,15 @@ def clean_articles(rows): result = '{uri.netloc}'.format(uri=parsed_uri) out.append([row[0], row[1], row[2], row[3], result]) - return out \ No newline at end of file + return out + + +def get_article(url): + headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} + response = requests.get(url, headers=headers) + + article = simple_json_from_html_string(response.text, use_readability=True) + parsed_uri = urlparse(url) + result = '{uri.netloc}'.format(uri=parsed_uri) + + return article, result \ No newline at end of file