aboutsummaryrefslogtreecommitdiffstats
path: root/parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'parser.py')
-rwxr-xr-xparser.py200
1 files changed, 0 insertions, 200 deletions
diff --git a/parser.py b/parser.py
deleted file mode 100755
index a851846..0000000
--- a/parser.py
+++ /dev/null
@@ -1,200 +0,0 @@
-#!/usr/bin/env python3
-
-from urllib.parse import urlparse
-from pygments import highlight
-from pygments.formatters import HtmlFormatter, ClassNotFound
-from pygments.lexers import get_lexer_by_name
-import urllib.parse
-import webbrowser
-import lxml.etree
-import lxml.html
-import database
-import argparse
-import getpass
-import houdini
-import mistune
-import jinja2
-import app
-import sys
-import re
-import os
-
-class EdawebRenderer(mistune.HTMLRenderer):
- def blockcode(self, text, lang):
- try:
- lexer = get_lexer_by_name(lang, stripall=True)
- except ClassNotFound:
- lexer = None
-
- if lexer:
- formatter = HtmlFormatter()
- return highlight(text, lexer, formatter)
- # default
- return '\n<pre><code>{}</code></pre>\n'.format(houdini.escape_html(text.strip()))
-
- def block_quote(self, content):
- content = content[3:-5] # idk why this is required...
- out = '\n<blockquote>'
- for line in houdini.escape_html(content.strip()).split("\n"):
- out += '\n<span class="quote">{}</span><br>'.format(line)
- return out + '\n</blockquote>'
-
- def image(self, link, text, title):
- return "<a href='%s' target='_blank'><img alt='%s' src='%s'></a>" % (
- urlparse(link)._replace(query='').geturl(), text, link
- )
-
- def heading(self, text, level):
- hash_ = urllib.parse.quote_plus(text)
- return "<h%d id='%s'>%s <a class='header_linker' href='#%s'>[#]</a></h%d>" % (
- level, hash_, text, hash_, level
- )
-
-def get_thought_from_id(db, id_):
- category_name, title, dt, markdown, redirect = db.get_thought(id_)
- html, headers = parse_text(markdown)
- return category_name, title, dt, html, headers, redirect
-
-def parse_file(path):
- with open(path, "r") as f:
- unformatted = f.read()
-
- return parse_text(unformatted)[0]
-
-def parse_text(unformatted):
- md = mistune.create_markdown(
- renderer = EdawebRenderer(),
- plugins = ["strikethrough", "table", "url", "task_lists", "def_list"]
- )
- html = md(unformatted)
- if html == "":
- return "", ""
-
- return html, get_headers(html)
-
-def get_headers(html):
- root = lxml.html.fromstring(html)
-
- headers = []
- thesmallestlevel = 7
- for node in root.xpath('//h1|//h2|//h3|//h4|//h5//h6'):
- level = int(node.tag[-1])
- if level < thesmallestlevel:
- thesmallestlevel = level
- headers.append((
- # lxml.etree.tostring(node),
- # "<p>%s</p>" % urllib.parse.unquote_plus(node.attrib["id"]), # possibly insecure?
- urllib.parse.unquote_plus(node.attrib["id"]),
- level, # -horrible hack
- "#%s" % node.attrib["id"])
- )
-
- headers = [(i[0], i[1] - thesmallestlevel, i[2]) for i in headers]
- # print(headers)
- # there is a bug here-
- # it must start with the largest header and only go up and down in increments of one
- # TODO: fix it!
- md_template = jinja2.Template("""
-{% for text, depth, link in contents %}
-{{ " " * depth }} - [{{ text }}]({{ link }})
-{% endfor %}
- """)
-
- return mistune.html(md_template.render(contents = headers))
-
-def main():
- p = argparse.ArgumentParser()
- subparse = p.add_subparsers(help = "sub-command help")
- save_parser = subparse.add_parser("save", help = "Add a markdown file to the database")
- 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")
- list_parser = subparse.add_parser("list", help = "List all the markdowns in the database")
-
- for s in [save_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]:
- 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, list_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())
-
- 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", "list"]:
- 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"])[-2])
- print("Written to %s" % args["out"])
-
- elif verb == "update":
- with open(args["markdown"], "r") as f:
- db.update_thought_markdown(args["id"], f.read())
-
- elif verb == "list":
- for id_, title, dt, category_name in db.get_all_thoughts():
- print("%d\t%s\t%s\t%s" % (id_, title, dt, category_name))
-
- elif verb == "echo":
- print(parse_file(args["markdown"]))
-
-if __name__ == "__main__":
- main()