From 58fecf855d151ef0459a43ab9af271a3a4922ad5 Mon Sep 17 00:00:00 2001 From: jwansek Date: Fri, 5 Feb 2021 16:25:06 +0000 Subject: finished start formatting, added preview script --- .gitignore | 2 + app.py | 14 +++++- database.py | 2 +- parser.py | 123 ++++++++++++++++++++++++++++++++++++++++++++++++ services.py | 9 ++-- templates/services.html | 10 +++- 6 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 parser.py diff --git a/.gitignore b/.gitignore index 777952b..f2583ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ +!README.md edaweb.conf +*.md # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/app.py b/app.py index 935ef12..e100689 100644 --- a/app.py +++ b/app.py @@ -1,4 +1,5 @@ import configparser +import webbrowser import database import services import flask @@ -10,7 +11,7 @@ CONFIG.read("edaweb.conf") def get_template_items(title, db): return { "links": db.get_header_links(), - "image": db.get_image("telegrampic"), + "image": db.get_image("twitterpic"), "title": title, "articles": db.get_header_articles() } @@ -44,5 +45,16 @@ def serve_services(): pihole = services.get_pihole_stats() ) +@app.route("/preview") +def preview(): + import os + if "PREVIEW" in os.environ: + with database.Database() as db: + return flask.render_template_string(os.environ["PREVIEW"], **get_template_items(os.environ["PREVIEW_TITLE"], db)) + else: + return "page for internal use only" + + + if __name__ == "__main__": app.run(host = "0.0.0.0", debug = True) diff --git a/database.py b/database.py index 05e8a7e..93f7538 100644 --- a/database.py +++ b/database.py @@ -30,4 +30,4 @@ class Database: if __name__ == "__main__": with Database() as db: - print(db.get_header_articles()) \ No newline at end of file + print(db.get_image("headerImage")) \ No newline at end of file diff --git a/parser.py b/parser.py new file mode 100644 index 0000000..8677342 --- /dev/null +++ b/parser.py @@ -0,0 +1,123 @@ +import argparse +from urllib.parse import urlparse +import webbrowser +import app +import re +import os + +HEADER_INCREMENTER = 1 +IMAGE_TYPES = [".png", ".jpg"] + +def parse_file(path): + with open(path, "r") as f: + unformatted = f.read() + + formatted = parse_headers(unformatted) + formatted = parse_asteriscs(formatted) + formatted = parse_links(formatted) + formatted = add_linebreaks(formatted) + + return '{% extends "template.html" %}\n{% block content %}\n' + formatted + '\n{% endblock %}' + +def parse_headers(test_str): + regex = r"^#{1,5}\s\w.*$" + matches = re.finditer(regex, test_str, re.MULTILINE) + offset = 0 + + for match in matches: + # work out if its h2, h3 etc. from the number of #s + headerNo = len(match.group().split(" ")[0]) + HEADER_INCREMENTER + + replacement = "%s" % (headerNo, " ".join(match.group().split(" ")[1:]), headerNo) + + #don't use .replace() in the unlikely case the the regex hit appears in a block + test_str = test_str[:match.start()+offset] + replacement + test_str[match.end()+offset:] + #replacing the hits fucks up the indexes, accommodate for this + offset += (len(replacement) - (match.end() - match.start())) + + return test_str + +def parse_asteriscs(test_str): + regex = r"(?%s" % (match.group()[3:-3]) + elif match.group().startswith("**"): + replacement = "%s" % (match.group()[2:-2]) + else: + replacement = "%s" % (match.group()[1:-1]) + + test_str = test_str[:match.start()+offset] + replacement + test_str[match.end()+offset:] + offset += (len(replacement) - (match.end() - match.start())) + + return test_str + +def parse_links(test_str): + regex = r"(?" % (label, url) + else: + replacement = "%s" % (url, label) + + test_str = test_str[:match.start()+offset] + replacement + test_str[match.end()+offset:] + offset += (len(replacement) - (match.end() - match.start())) + + return test_str + +def add_linebreaks(test_str): + return re.sub(r"^$", "

", test_str, 0, re.MULTILINE) + +def preview_markdown(path, title): + def startBrowser(): + webbrowser.get("firefox").open("http://localhost:5000/preview") + del os.environ["PREVIEW"] + del os.environ["PREVIEW_TITLE"] + + os.environ["PREVIEW"] = parse_file(path) + os.environ["PREVIEW_TITLE"] = title + + import threading + threading.Timer(1.25, startBrowser ).start() + + app.app.run(host = "0.0.0.0", debug = True) + +def main(): + p = argparse.ArgumentParser() + p.add_argument( + "-m", "--markdown", + help = "Path to a markdown file", + required = True, + type = str + ) + p.add_argument( + "-t", "--title", + help = "Article title", + required = True, + type = str + ) + p.add_argument( + "-p", "--preview", + help = "Preview markdown rendering", + action='store_true' + ) + args = vars(p.parse_args()) + if args["preview"]: + preview_markdown(args["markdown"], args["title"]) + else: + print(parse_file(args["markdown"])) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/services.py b/services.py index dd70b33..b592427 100644 --- a/services.py +++ b/services.py @@ -1,5 +1,6 @@ -import qbittorrent import multiprocessing +import qbittorrent +import datetime import docker import clutch import pihole @@ -104,9 +105,11 @@ def get_pihole_stats(): "queries": ph.total_queries, "clients": ph.unique_clients, "percentage": ph.ads_percentage, - "blocked": ph.blocked + "blocked": ph.blocked, + "domains": ph.domain_count, + "last_updated": str(datetime.datetime.fromtimestamp(ph.gravity_last_updated["absolute"])) } if __name__ == "__main__": - print(get_qbit_stats()) \ No newline at end of file + print(get_pihole_stats()) \ No newline at end of file diff --git a/templates/services.html b/templates/services.html index 321a7a0..9ea1d3f 100644 --- a/templates/services.html +++ b/templates/services.html @@ -95,9 +95,17 @@ {{pihole["percentage"]}}% - blocked + blocked requests {{pihole["blocked"]}} + + domains in blocklist + {{pihole["domains"]}} + + + last updated + {{pihole["last_updated"]}} + {% endif %} -- cgit v1.2.3