From 02e40b76817b06816ae37510c2fde2a88aecea37 Mon Sep 17 00:00:00 2001 From: Gareth Coles Date: Fri, 6 Apr 2018 11:12:08 +0100 Subject: Updated wiki editing system with live-previewing --- pysite/views/wiki/render.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'pysite/views/wiki/render.py') 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":(\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)}) -- cgit v1.2.3