Add Wiki syntax for page links, style updates
This commit is contained in:
parent
13b5c18062
commit
8a7cf66248
|
@ -2,13 +2,45 @@
|
||||||
|
|
||||||
"""Wiki models."""
|
"""Wiki models."""
|
||||||
|
|
||||||
|
from flask import url_for
|
||||||
import time
|
import time
|
||||||
import re
|
import re
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
import rophako.jsondb as JsonDB
|
import rophako.jsondb as JsonDB
|
||||||
|
from rophako.utils import render_markdown
|
||||||
from rophako.log import logger
|
from rophako.log import logger
|
||||||
|
|
||||||
|
def render_page(content):
|
||||||
|
"""Render the Markdown content of a Wiki page, and support inter-page
|
||||||
|
linking with [[double braces]].
|
||||||
|
|
||||||
|
For simple links, just use the [[Page Name]]. To have a different link text
|
||||||
|
than the page name, use [[Link Text|Page Name]]."""
|
||||||
|
html = render_markdown(content)
|
||||||
|
|
||||||
|
# Look for [[double brackets]]
|
||||||
|
links = re.findall(r'\[\[(.+?)\]\]', html)
|
||||||
|
for match in links:
|
||||||
|
label = page = match
|
||||||
|
if "|" in match:
|
||||||
|
label, page = match.split("|", 2)
|
||||||
|
|
||||||
|
# Does the page exist?
|
||||||
|
output = '''<a href="{url}">{label}</a>'''
|
||||||
|
if not JsonDB.exists("wiki/pages/{}".format(page)):
|
||||||
|
output = '''<a href="{url}" class="wiki-broken">{label}</a>'''
|
||||||
|
|
||||||
|
html = html.replace("[[{}]]".format(match),
|
||||||
|
output.format(
|
||||||
|
url=url_for("wiki.view_page", name=name_to_url(page)),
|
||||||
|
label=label,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return html
|
||||||
|
|
||||||
|
|
||||||
def get_page(name):
|
def get_page(name):
|
||||||
"""Get a Wiki page. Returns `None` if the page isn't found."""
|
"""Get a Wiki page. Returns `None` if the page isn't found."""
|
||||||
name = name.strip("/") # Remove any surrounding slashes.
|
name = name.strip("/") # Remove any surrounding slashes.
|
||||||
|
|
|
@ -7,8 +7,7 @@ from flask import Blueprint, g, request, redirect, url_for, flash
|
||||||
import rophako.model.user as User
|
import rophako.model.user as User
|
||||||
import rophako.model.wiki as Wiki
|
import rophako.model.wiki as Wiki
|
||||||
import rophako.model.emoticons as Emoticons
|
import rophako.model.emoticons as Emoticons
|
||||||
from rophako.utils import (template, render_markdown, pretty_time,
|
from rophako.utils import template, pretty_time, render_markdown, login_required
|
||||||
login_required)
|
|
||||||
from rophako.settings import Config
|
from rophako.settings import Config
|
||||||
|
|
||||||
mod = Blueprint("wiki", __name__, url_prefix="/wiki")
|
mod = Blueprint("wiki", __name__, url_prefix="/wiki")
|
||||||
|
@ -33,8 +32,12 @@ def list_pages():
|
||||||
@mod.route("/<path:name>")
|
@mod.route("/<path:name>")
|
||||||
def view_page(name):
|
def view_page(name):
|
||||||
"""Show a specific wiki page."""
|
"""Show a specific wiki page."""
|
||||||
|
link = name
|
||||||
name = Wiki.url_to_name(name)
|
name = Wiki.url_to_name(name)
|
||||||
|
|
||||||
|
g.info["link"] = link
|
||||||
|
g.info["title"] = name
|
||||||
|
|
||||||
# Look up the page.
|
# Look up the page.
|
||||||
page = Wiki.get_page(name)
|
page = Wiki.get_page(name)
|
||||||
if not page:
|
if not page:
|
||||||
|
@ -59,10 +62,19 @@ def view_page(name):
|
||||||
# Show the latest one.
|
# Show the latest one.
|
||||||
rev = page["revisions"][0]
|
rev = page["revisions"][0]
|
||||||
|
|
||||||
|
# Getting the plain text source?
|
||||||
|
if request.args.get("source", None):
|
||||||
|
g.info["markdown"] = render_markdown("\n".join([
|
||||||
|
"# Source: {}".format(name),
|
||||||
|
"",
|
||||||
|
"```markdown",
|
||||||
|
rev["body"],
|
||||||
|
"```"
|
||||||
|
]))
|
||||||
|
return template("markdown.inc.html")
|
||||||
|
|
||||||
# Render it!
|
# Render it!
|
||||||
g.info["link"] = Wiki.name_to_url(name)
|
g.info["rendered_body"] = Wiki.render_page(rev["body"])
|
||||||
g.info["title"] = name
|
|
||||||
g.info["rendered_body"] = render_markdown(rev["body"])
|
|
||||||
g.info["rendered_body"] = Emoticons.render(g.info["rendered_body"])
|
g.info["rendered_body"] = Emoticons.render(g.info["rendered_body"])
|
||||||
g.info["pretty_time"] = pretty_time(Config.wiki.time_format, rev["time"])
|
g.info["pretty_time"] = pretty_time(Config.wiki.time_format, rev["time"])
|
||||||
|
|
||||||
|
@ -131,7 +143,7 @@ def edit():
|
||||||
g.info["preview"] = True
|
g.info["preview"] = True
|
||||||
|
|
||||||
# Render markdown
|
# Render markdown
|
||||||
g.info["rendered_body"] = render_markdown(body)
|
g.info["rendered_body"] = Wiki.render_page(body)
|
||||||
|
|
||||||
# Render emoticons.
|
# Render emoticons.
|
||||||
g.info["rendered_body"] = Emoticons.render(g.info["rendered_body"])
|
g.info["rendered_body"] = Emoticons.render(g.info["rendered_body"])
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
[ <a href="{{ url_for('wiki.history', name=link) }}">History</a>
|
[ <a href="{{ url_for('wiki.history', name=link) }}">History</a>
|
||||||
| <a href="{{ url_for('wiki.list_pages') }}">Index</a>
|
| <a href="{{ url_for('wiki.list_pages') }}">Index</a>
|
||||||
|
| <a href="{{ url_for('wiki.view_page', name=link, source='1') }}">Source</a>
|
||||||
{% if session["login"] %}
|
{% if session["login"] %}
|
||||||
| <a href="{{ url_for('wiki.edit', name=title) }}">Edit</a>
|
| <a href="{{ url_for('wiki.edit', name=title) }}">Edit</a>
|
||||||
| <a href="{{ url_for('wiki.edit') }}">New Page</a>
|
| <a href="{{ url_for('wiki.edit') }}">New Page</a>
|
||||||
|
@ -16,6 +17,8 @@
|
||||||
|
|
||||||
<h1>{{ title }}</h1>
|
<h1>{{ title }}</h1>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
{{ rendered_body|safe }}
|
{{ rendered_body|safe }}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -314,6 +314,11 @@ ul.blog-categories li:last-child:after {
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Wiki styles */
|
||||||
|
a.wiki-broken {
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
|
|
||||||
/* Visitor history page */
|
/* Visitor history page */
|
||||||
.visitor-graph {
|
.visitor-graph {
|
||||||
height: 16px;
|
height: 16px;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user