diff options
Diffstat (limited to 'pysite/views/wiki')
| -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)}) | 
