aboutsummaryrefslogtreecommitdiffstats
path: root/pysite
diff options
context:
space:
mode:
authorGravatar Gareth Coles <[email protected]>2018-04-09 14:53:56 +0100
committerGravatar Gareth Coles <[email protected]>2018-04-09 14:53:56 +0100
commit0dc85de66d84d51bff4260f3fefcc8b2251d12e6 (patch)
treee12352a8ff3a961a36b1bbaa3d980a0c79d4d92b /pysite
parent[Wiki] Fix editor (diff)
Abstract rst away and add icon directive
Diffstat (limited to 'pysite')
-rw-r--r--pysite/rst/__init__.py14
-rw-r--r--pysite/rst/directives/__init__.py1
-rw-r--r--pysite/rst/roles.py46
-rw-r--r--pysite/views/wiki/edit.py6
-rw-r--r--pysite/views/wiki/render.py7
-rw-r--r--pysite/views/ws/rst.py6
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)