diff options
author | 2018-04-06 11:12:08 +0100 | |
---|---|---|
committer | 2018-04-06 11:13:16 +0100 | |
commit | 02e40b76817b06816ae37510c2fde2a88aecea37 (patch) | |
tree | 1587ae82d2304efc4ce7fc01d6491266f2c9df4e /pysite/views | |
parent | 5XX error view non-werkzeug exception support (diff) |
Updated wiki editing system with live-previewing
Diffstat (limited to 'pysite/views')
-rw-r--r-- | pysite/views/wiki/edit.py | 9 | ||||
-rw-r--r-- | pysite/views/wiki/render.py | 33 |
2 files changed, 40 insertions, 2 deletions
diff --git a/pysite/views/wiki/edit.py b/pysite/views/wiki/edit.py index 483be046..d9ea692f 100644 --- a/pysite/views/wiki/edit.py +++ b/pysite/views/wiki/edit.py @@ -1,5 +1,5 @@ # coding=utf-8 -from flask import url_for +from flask import url_for, request from werkzeug.utils import redirect from pysite.base_route import RouteView @@ -32,4 +32,11 @@ class EditView(RouteView, DBMixin): @csrf def post(self, page): # rst = request.form["rst"] + obj = { + "slug": page, + "title": request.form["title"], + "rst": request.form["rst"], + "html": "" + } + return redirect(url_for("wiki.page", page=page), code=303) # Redirect, ensuring a GET diff --git a/pysite/views/wiki/render.py b/pysite/views/wiki/render.py index d177a8b3..73c38731 100644 --- a/pysite/views/wiki/render.py +++ b/pysite/views/wiki/render.py @@ -1,5 +1,8 @@ # coding=utf-8 +import re + from docutils.core import publish_parts +from docutils.utils import SystemMessage from flask import jsonify from schema import Schema @@ -11,6 +14,8 @@ SCHEMA = Schema([{ "data": str }]) +MESSAGE_REGEX = re.compile(r"<string>:(\d+): \([A-Z]+/\d\) (.*)") + class RenderView(APIView): path = "/render" # "path" means that it accepts slashes @@ -26,9 +31,35 @@ class RenderView(APIView): data = data[0]["data"] try: html = publish_parts( - source=data, writer_name="html5", settings_overrides={"traceback": True, "halt_level": 2} + source=data, writer_name="html5", settings_overrides={"halt_level": 2} )["html_body"] return jsonify({"data": html}) + except SystemMessage as e: + lines = str(e) + data = { + "error": lines, + "error_lines": [] + } + + if "\n" in lines: + lines = lines.split("\n") + else: + lines = [lines] + + for message in lines: + match = MESSAGE_REGEX.match(message) + + if match: + data["error_lines"].append( + { + "row": int(match.group(1)) - 1, + "column": 0, + "type": "error", + "text": match.group(2) + } + ) + + return jsonify(data) except Exception as e: return jsonify({"error": str(e)}) |