diff options
| author | 2018-04-09 14:53:56 +0100 | |
|---|---|---|
| committer | 2018-04-09 14:53:56 +0100 | |
| commit | 0dc85de66d84d51bff4260f3fefcc8b2251d12e6 (patch) | |
| tree | e12352a8ff3a961a36b1bbaa3d980a0c79d4d92b | |
| parent | [Wiki] Fix editor (diff) | |
Abstract rst away and add icon directive
Diffstat (limited to '')
| -rw-r--r-- | pysite/rst/__init__.py | 14 | ||||
| -rw-r--r-- | pysite/rst/directives/__init__.py | 1 | ||||
| -rw-r--r-- | pysite/rst/roles.py | 46 | ||||
| -rw-r--r-- | pysite/views/wiki/edit.py | 6 | ||||
| -rw-r--r-- | pysite/views/wiki/render.py | 7 | ||||
| -rw-r--r-- | pysite/views/ws/rst.py | 6 | 
6 files changed, 68 insertions, 12 deletions
| diff --git a/pysite/rst/__init__.py b/pysite/rst/__init__.py new file mode 100644 index 00000000..0e5f6ffe --- /dev/null +++ b/pysite/rst/__init__.py @@ -0,0 +1,14 @@ +# coding=utf-8 +from docutils.core import publish_parts +from docutils.parsers.rst.roles import register_canonical_role + +from pysite.rst.roles import icon_role + + +def render(rst: str): +    return publish_parts( +        source=rst, writer_name="html5", settings_overrides={"halt_level": 2} +    )["html_body"] + + +register_canonical_role("icon", icon_role) diff --git a/pysite/rst/directives/__init__.py b/pysite/rst/directives/__init__.py new file mode 100644 index 00000000..9bad5790 --- /dev/null +++ b/pysite/rst/directives/__init__.py @@ -0,0 +1 @@ +# coding=utf-8 diff --git a/pysite/rst/roles.py b/pysite/rst/roles.py new file mode 100644 index 00000000..bff00533 --- /dev/null +++ b/pysite/rst/roles.py @@ -0,0 +1,46 @@ +# coding=utf-8 +from docutils import nodes +from docutils.parsers.rst.roles import set_classes +from docutils.parsers.rst.states import Inliner +from jinja2 import escape + + +def icon_role(_role: str, rawtext: str, text: str, lineno: int, inliner: Inliner, +              options: dict = None, _content: dict = None): +    if options is None: +        options = {} + +    set_classes(options) + +    if "/" in text: +        parts = [escape(x) for x in text.split("/")] +    else: +        msg = inliner.reporter.error("Icon specification must be in the form <type>/<name>", line=lineno) +        prb = inliner.problematic(text, rawtext, msg) + +        return [prb], [msg] + +    if len(parts) != 2: +        msg = inliner.reporter.error("Icon specification must be in the form <type>/<name>", line=lineno) +        prb = inliner.problematic(text, rawtext, msg) + +        return [prb], [msg] +    else: +        if parts[0] == "light": +            weight = "fal" +        elif parts[0] == "regular": +            weight = "far" +        elif parts[0] == "solid": +            weight = "fas" +        elif parts[0] == "branding": +            weight = "fab" +        else: +            msg = inliner.reporter.error("Icon type must be one of light, regular, solid or branding", line=lineno) +            prb = inliner.problematic(text, rawtext, msg) + +            return [prb], [msg] + +        html = f"""<i class="uk-icon {weight} fa-{parts[1]}"></i>""" + +        node = nodes.raw(html, html, format="html", **options) +        return [node], [] diff --git a/pysite/views/wiki/edit.py b/pysite/views/wiki/edit.py index 0a0af15b..a111f9ce 100644 --- a/pysite/views/wiki/edit.py +++ b/pysite/views/wiki/edit.py @@ -1,5 +1,4 @@  # coding=utf-8 -from docutils.core import publish_parts  from flask import request, url_for  from werkzeug.utils import redirect @@ -7,6 +6,7 @@ from pysite.base_route import RouteView  from pysite.constants import EDITOR_ROLES  from pysite.decorators import csrf, require_roles  from pysite.mixins import DBMixin +from pysite.rst import render  class EditView(RouteView, DBMixin): @@ -39,9 +39,7 @@ class EditView(RouteView, DBMixin):              "slug": page,              "title": request.form["title"],              "rst": rst, -            "html": publish_parts( -                source=rst, writer_name="html5", settings_overrides={"halt_level": 2} -            )["html_body"] +            "html": render(rst)          }          self.db.insert( diff --git a/pysite/views/wiki/render.py b/pysite/views/wiki/render.py index 131db1d3..aa365c4a 100644 --- a/pysite/views/wiki/render.py +++ b/pysite/views/wiki/render.py @@ -1,7 +1,6 @@  # coding=utf-8  import re -from docutils.core import publish_parts  from docutils.utils import SystemMessage  from flask import jsonify  from schema import Schema @@ -9,6 +8,7 @@ from schema import Schema  from pysite.base_route import APIView  from pysite.constants import EDITOR_ROLES, ValidationTypes  from pysite.decorators import api_params, csrf, require_roles +from pysite.rst import render  SCHEMA = Schema([{      "data": str @@ -30,9 +30,7 @@ class RenderView(APIView):          data = data[0]["data"]          try: -            html = publish_parts( -                source=data, writer_name="html5", settings_overrides={"halt_level": 2} -            )["html_body"] +            html = render(data)              return jsonify({"data": html})          except SystemMessage as e: @@ -60,6 +58,7 @@ class RenderView(APIView):                          }                      ) +            print(data)              return jsonify(data)          except Exception as e:              return jsonify({"error": str(e)}) diff --git a/pysite/views/ws/rst.py b/pysite/views/ws/rst.py index cdc45db5..19c4129b 100644 --- a/pysite/views/ws/rst.py +++ b/pysite/views/ws/rst.py @@ -1,9 +1,9 @@  # coding=utf-8  import logging -from docutils.core import publish_parts  from geventwebsocket.websocket import WebSocket +from pysite.rst import render  from pysite.websockets import WS @@ -23,9 +23,7 @@ class RSTWebsocket(WS):          self.log.debug(f"RST | Message: {message}")          try: -            data = publish_parts( -                source=message, writer_name="html5", settings_overrides={"traceback": True, "halt_level": 2} -            )["html_body"] +            data = render(message)          except Exception as e:              self.log.exception("Parsing error")              data = str(e) | 
