diff options
| -rw-r--r-- | app.py | 4 | ||||
| -rw-r--r-- | database.py | 5 | ||||
| -rw-r--r-- | parser.py | 155 | ||||
| -rw-r--r-- | static/style.css | 2 | 
4 files changed, 104 insertions, 62 deletions
| @@ -83,7 +83,7 @@ def get_thought():              flask.abort(404)              return          return flask.render_template_string( -            parsed, +            '{% extends "template.html" %}\n{% block content %}\n' + parsed + '\n{% endblock %}',              **get_template_items(title, db),              thought = True,              dt = "published: " + str(dt), @@ -145,7 +145,5 @@ def preview():      else:          flask.abort(404) -     -  if __name__ == "__main__":      app.run(host = "0.0.0.0", debug = True)
\ No newline at end of file diff --git a/database.py b/database.py index 6bf3c1f..181effb 100644 --- a/database.py +++ b/database.py @@ -84,6 +84,11 @@ class Database:              WHERE thought_id = %s;""", (id_, ))              return cursor.fetchone() +    def update_thought_markdown(self, id_, markdown): +        with self.__connection.cursor() as cursor: +            cursor.execute("UPDATE thoughts SET markdown_text = %s WHERE thought_id = %s;", (markdown, id_)) +        self.__connection.commit() +      def get_categories_not(self, category_name):          with self.__connection.cursor() as cursor:              cursor.execute("SELECT category_name FROM categories WHERE category_name != %s;", (category_name, )) @@ -1,12 +1,20 @@ -import argparse  from urllib.parse import urlparse  import webbrowser  import database +import argparse  import getpass  import app +import sys  import re  import os +# DISCLAIMER +# There is almost certainly a python package to +# do this better. I wanted to do it myself as a challenge. + +# TODO: +#   - Add table formatting +  HEADER_INCREMENTER = 1  IMAGE_TYPES = [".png", ".jpg"] @@ -28,7 +36,7 @@ def parse_text(unformatted):      formatted = parse_lists(formatted)      formatted = add_linebreaks(formatted) -    return '{% extends "template.html" %}\n{% block content %}\n' + formatted + '\n{% endblock %}' +    return formatted  def parse_headers(test_str):      regex = r"^#{1,5}\s\w.*$" @@ -161,65 +169,96 @@ def preview_markdown(path, title, category):  def main():      p = argparse.ArgumentParser() -    p.add_argument( -        "markdown", -        help = "Path to a markdown file", -        type = str -    ) -    p.add_argument( -        "-u", "--username", -        help = "Username to use for the database", -        required = True, -        type = str -    ) -    p.add_argument( -        "-t", "--title", -        help = "Article title", -        required = True, -        type = str -    ) -    p.add_argument( -        "-c", "--category", -        help = "Article category", -        required = True, -        type = str -    ) -    g = p.add_mutually_exclusive_group(required = True) -    g.add_argument( -        "-p", "--preview", -        help = "Preview markdown rendering", -        action='store_true' -    ) -    g.add_argument( -        "-s", "--save", -        help = "Save markdown to database", -        action='store_true' -    ) -    g.add_argument( -        "-e", "--echo", -        help = "Print parsed markdown to stdout", -        action='store_true' +    subparse = p.add_subparsers(help = "sub-command help") +    save_parser = subparse.add_parser("save", help = "Add a markdown file to the database") +    preview_parser = subparse.add_parser("preview", help = "Preview a markdown render") +    echo_parser = subparse.add_parser("echo", help = "Print markdown render to stdout") +    update_parser = subparse.add_parser("update", help = "Replace a markdown file") +    export_parser = subparse.add_parser("export", help = "Export a database markdown file to disk") + +    for s in [save_parser, preview_parser, echo_parser, update_parser]: +        s.add_argument( +            "-m", "--markdown", +            help = "Path to a markdown file", +            type = str, +            required = True +        ) +     +    for s in [save_parser, preview_parser]: +        s.add_argument( +            "-t", "--title", +            help = "Article title", +            type = str, +            required = True +        ) +        s.add_argument( +            "-c", "--category", +            help = "Article category", +            type = str, +            required = True +        ) + +    for s in [save_parser, update_parser, export_parser]: +        s.add_argument( +            "-u", "--username", +            help = "Username to use for the database", +            type = str, +            required = True +        ) + +    for s in [export_parser, update_parser]: +        s.add_argument( +            "-i", "--id", +            help = "Article's id", +            type = int, +            required = True +        ) + +    export_parser.add_argument( +        "-o", "--out", +        help = "Path to write the markdown file to", +        type = str, +        required = True      ) +      args = vars(p.parse_args()) -    passwd = getpass.getpass("Enter password for %s@%s: " % (args["username"], app.CONFIG["mysql"]["host"])) - -    with database.Database( -        safeLogin = False, -        user = args["username"], -        passwd = passwd -    ) as db: - -        if args["preview"]: -            preview_markdown(args["markdown"], args["title"], args["category"]) -        elif args["save"]: -            if db.add_category(args["category"]): -                print("Added category...") -            with open(args["markdown"], "r") as f: -                db.add_thought(args["category"], args["title"], f.read()) -            print("Added thought...") -        else: -            print(parse_file(args["markdown"])) +    if "username" in args.keys(): +        args["password"] = getpass.getpass("Enter password for %s@%s: " % (args["username"], app.CONFIG["mysql"]["host"])) + +    try: +        verb = sys.argv[1] +    except IndexError: +        print("No verb specified... Nothing to do... Exiting...") +        exit() +     +    if verb in ["save", "export", "update"]: +        with database.Database( +            safeLogin = False, +            user = args["username"], +            passwd = args["password"] +        ) as db: +            if verb == "save": +                if db.add_category(args["category"]): +                    print("Added category...") +                with open(args["markdown"], "r") as f: +                    db.add_thought(args["category"], args["title"], f.read()) +                print("Added thought...") + +            elif verb == "export": +                with open(args["out"], "w") as f: +                    f.writelines(db.get_thought(args["id"])[-1]) +                print("Written to %s" % args["out"]) + +            elif verb == "update": +                with open(args["markdown"], "r") as f: +                    db.update_thought_markdown(args["id"], f.read()) + +    if verb == "preview": +        preview_markdown(args["markdown"], args["title"], args["category"]) + +    elif verb == "echo": +        print(parse_file(args["markdown"]))  if __name__ == "__main__":      main()
\ No newline at end of file diff --git a/static/style.css b/static/style.css index 93ec3ed..1ac4ec3 100644 --- a/static/style.css +++ b/static/style.css @@ -53,7 +53,7 @@ header span nav ul li a {  }  header div { -    padding-left: 30px; +    padding-left: 20px;      padding-bottom: 10px;  } | 
