aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pysite/views/wiki/source.py45
-rw-r--r--static/css/pygments-monokai.css73
-rw-r--r--templates/wiki/base.html24
-rw-r--r--templates/wiki/page_source.html13
4 files changed, 149 insertions, 6 deletions
diff --git a/pysite/views/wiki/source.py b/pysite/views/wiki/source.py
new file mode 100644
index 00000000..7038dad9
--- /dev/null
+++ b/pysite/views/wiki/source.py
@@ -0,0 +1,45 @@
+# coding=utf-8
+from flask import redirect, url_for
+from pygments import highlight
+from pygments.formatters.html import HtmlFormatter
+from pygments.lexers import get_lexer_by_name
+from werkzeug.exceptions import NotFound
+
+from pysite.base_route import RouteView
+from pysite.constants import DEBUG_MODE, EDITOR_ROLES
+from pysite.mixins import DBMixin
+
+
+class PageView(RouteView, DBMixin):
+ path = "/source/<path:page>" # "path" means that it accepts slashes
+ name = "source"
+
+ table_name = "wiki"
+ table_primary_key = "slug"
+
+ def get(self, page):
+ obj = self.db.get(self.table_name, page)
+
+ if obj is None:
+ if self.is_staff():
+ return redirect(url_for("wiki.edit", page=page, can_edit=False))
+
+ raise NotFound()
+
+ rst = obj["rst"]
+ rst = highlight(rst, get_lexer_by_name("rst"), HtmlFormatter(preclass="code", linenos="inline"))
+ return self.render("wiki/page_source.html", page=page, data=obj, rst=rst, can_edit=self.is_staff())
+
+ def is_staff(self):
+ if DEBUG_MODE:
+ return True
+ if not self.logged_in:
+ return False
+
+ roles = self.user_data.get("roles", [])
+
+ for role in roles:
+ if role in EDITOR_ROLES:
+ return True
+
+ return False
diff --git a/static/css/pygments-monokai.css b/static/css/pygments-monokai.css
index 250c8d44..756a5850 100644
--- a/static/css/pygments-monokai.css
+++ b/static/css/pygments-monokai.css
@@ -68,3 +68,76 @@
.code .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.code .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.code .il { color: #ae81ff } /* Literal.Number.Integer.Long */
+
+/* Extra CSS for non-docutils output */
+
+.highlight pre .hll { background-color: #49483e }
+.highlight pre { background: #272822; color: #f8f8f2 }
+.highlight pre .c { color: #75715e } /* Comment */
+.highlight pre .err { color: #960050; background-color: #1e0010 } /* Error */
+.highlight pre .k { color: #66d9ef } /* Keyword */
+.highlight pre .l { color: #ae81ff } /* Literal */
+.highlight pre .n { color: #f8f8f2 } /* Name */
+.highlight pre .o { color: #f92672 } /* Operator */
+.highlight pre .p { color: #f8f8f2 } /* Punctuation */
+.highlight pre .ch { color: #75715e } /* Comment.Hashbang */
+.highlight pre .cm { color: #75715e } /* Comment.Multiline */
+.highlight pre .cp { color: #75715e } /* Comment.Preproc */
+.highlight pre .cpf { color: #75715e } /* Comment.PreprocFile */
+.highlight pre .c1 { color: #75715e } /* Comment.Single */
+.highlight pre .cs { color: #75715e } /* Comment.Special */
+.highlight pre .gd { color: #f92672 } /* Generic.Deleted */
+.highlight pre .ge { font-style: italic } /* Generic.Emph */
+.highlight pre .gi { color: #a6e22e } /* Generic.Inserted */
+.highlight pre .gs { font-weight: bold } /* Generic.Strong */
+.highlight pre .gu { color: #75715e } /* Generic.Subheading */
+.highlight pre .kc { color: #66d9ef } /* Keyword.Constant */
+.highlight pre .kd { color: #66d9ef } /* Keyword.Declaration */
+.highlight pre .kn { color: #f92672 } /* Keyword.Namespace */
+.highlight pre .kp { color: #66d9ef } /* Keyword.Pseudo */
+.highlight pre .kr { color: #66d9ef } /* Keyword.Reserved */
+.highlight pre .kt { color: #66d9ef } /* Keyword.Type */
+.highlight pre .ld { color: #e6db74 } /* Literal.Date */
+.highlight pre .m { color: #ae81ff } /* Literal.Number */
+.highlight pre .s { color: #e6db74 } /* Literal.String */
+.highlight pre .na { color: #a6e22e } /* Name.Attribute */
+.highlight pre .nb { color: #f8f8f2 } /* Name.Builtin */
+.highlight pre .nc { color: #a6e22e } /* Name.Class */
+.highlight pre .no { color: #66d9ef } /* Name.Constant */
+.highlight pre .nd { color: #a6e22e } /* Name.Decorator */
+.highlight pre .ni { color: #f8f8f2 } /* Name.Entity */
+.highlight pre .ne { color: #a6e22e } /* Name.Exception */
+.highlight pre .nf { color: #a6e22e } /* Name.Function */
+.highlight pre .nl { color: #f8f8f2 } /* Name.Label */
+.highlight pre .nn { color: #f8f8f2 } /* Name.Namespace */
+.highlight pre .nx { color: #a6e22e } /* Name.Other */
+.highlight pre .py { color: #f8f8f2 } /* Name.Property */
+.highlight pre .nt { color: #f92672 } /* Name.Tag */
+.highlight pre .nv { color: #f8f8f2 } /* Name.Variable */
+.highlight pre .ow { color: #f92672 } /* Operator.Word */
+.highlight pre .w { color: #f8f8f2 } /* Text.Whitespace */
+.highlight pre .mb { color: #ae81ff } /* Literal.Number.Bin */
+.highlight pre .mf { color: #ae81ff } /* Literal.Number.Float */
+.highlight pre .mh { color: #ae81ff } /* Literal.Number.Hex */
+.highlight pre .mi { color: #ae81ff } /* Literal.Number.Integer */
+.highlight pre .mo { color: #ae81ff } /* Literal.Number.Oct */
+.highlight pre .sa { color: #e6db74 } /* Literal.String.Affix */
+.highlight pre .sb { color: #e6db74 } /* Literal.String.Backtick */
+.highlight pre .sc { color: #e6db74 } /* Literal.String.Char */
+.highlight pre .dl { color: #e6db74 } /* Literal.String.Delimiter */
+.highlight pre .sd { color: #e6db74 } /* Literal.String.Doc */
+.highlight pre .s2 { color: #e6db74 } /* Literal.String.Double */
+.highlight pre .se { color: #ae81ff } /* Literal.String.Escape */
+.highlight pre .sh { color: #e6db74 } /* Literal.String.Heredoc */
+.highlight pre .si { color: #e6db74 } /* Literal.String.Interpol */
+.highlight pre .sx { color: #e6db74 } /* Literal.String.Other */
+.highlight pre .sr { color: #e6db74 } /* Literal.String.Regex */
+.highlight pre .s1 { color: #e6db74 } /* Literal.String.Single */
+.highlight pre .ss { color: #e6db74 } /* Literal.String.Symbol */
+.highlight pre .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
+.highlight pre .fm { color: #a6e22e } /* Name.Function.Magic */
+.highlight pre .vc { color: #f8f8f2 } /* Name.Variable.Class */
+.highlight pre .vg { color: #f8f8f2 } /* Name.Variable.Global */
+.highlight pre .vi { color: #f8f8f2 } /* Name.Variable.Instance */
+.highlight pre .vm { color: #f8f8f2 } /* Name.Variable.Magic */
+.highlight pre .il { color: #ae81ff } /* Literal.Number.Integer.Long */
diff --git a/templates/wiki/base.html b/templates/wiki/base.html
index 4bb227df..9464782b 100644
--- a/templates/wiki/base.html
+++ b/templates/wiki/base.html
@@ -33,21 +33,33 @@
<div class="uk-flex uk-flex-row uk-flex-1">
<div class="uk-card uk-card-body uk-flex-left uk-flex uk-card-primary">
<ul class="uk-nav-default uk-nav-parent-icon" uk-nav>
- {% if (can_edit or debug) and current_page == "page" %}
+ {% if (can_edit or debug) and current_page != "edit" %}
<li>
<a href="{{ url_for("wiki.edit", page=page) }}">
- <i class="fas fa-pencil-alt"></i> &nbsp;Edit
+ <i class="fas fa-fw fa-pencil-alt"></i> &nbsp;Edit
</a>
</li>
- <li class="uk-nav-divider"></li>
- {% elif current_page == "edit" %}
+ {% else %}
<li>
<a href="{{ url_for("wiki.page", page=page) }}">
- <i class="fas fa-arrow-left fa-fw"></i> &nbsp;Back
+ <i class="fas fa-fw fa-arrow-left"></i> &nbsp;Back
</a>
</li>
- <li class="uk-nav-divider"></li>
{% endif %}
+ {% if current_page != "source" %}
+ <li>
+ <a href="{{ url_for("wiki.source", page=page) }}">
+ <i class="fas fa-fw fa-code"></i> &nbsp;Source
+ </a>
+ </li>
+ {% else %}
+ <li>
+ <a href="{{ url_for("wiki.page", page=page) }}">
+ <i class="fas fa-fw fa-arrow-left"></i> &nbsp;Back
+ </a>
+ </li>
+ {% endif %}
+ <li class="uk-nav-divider"></li>
<li class="uk-active"><a href="#">Placeholder</a></li>
<li class="uk-parent">
<a href="#">Parent</a>
diff --git a/templates/wiki/page_source.html b/templates/wiki/page_source.html
new file mode 100644
index 00000000..15384aa9
--- /dev/null
+++ b/templates/wiki/page_source.html
@@ -0,0 +1,13 @@
+{% extends "wiki/base.html" %}
+{% block title %}Wiki | {{ data["title"] }}{% endblock %}
+{% block og_title %}Wiki | {{ data["title"] }}{% endblock %}
+{% block og_description %}{% endblock %}
+{% block content %}
+ <div class="uk-container uk-container-small">
+ <h2 class="uk-title">
+ {{ data["title"] }}
+ </h2>
+
+ {{ rst | safe }}
+ </div>
+{% endblock %} \ No newline at end of file