wiki: Add wiki renderers.

This commit is contained in:
Andre D
2013-05-28 13:30:21 -07:00
committed by Max Goodman
parent 003fcf8943
commit 94daebd746
5 changed files with 31 additions and 12 deletions

View File

@@ -35,6 +35,7 @@ from r2.lib.template_helpers import join_urls
from r2.lib.validator import (
nop,
validate,
VExistingUname,
VInt,
@@ -84,7 +85,9 @@ page_descriptions = {'config/stylesheet':_("This page is the subreddit styleshee
ATTRIBUTE_BY_PAGE = {"config/sidebar": "description",
"config/description": "public_description"}
RENDERERS_BY_PAGE = {"config/sidebar": "reddit",
"config/description": "reddit",
"config/stylesheet": "stylesheet"}
class WikiController(RedditController):
allow_stylesheets = True
@@ -142,9 +145,12 @@ class WikiController(RedditController):
message = _("viewing revision from %s ago") % timesince(version.date)
content = version.content
renderer = RENDERERS_BY_PAGE.get(page.name, 'wiki')
return WikiPageView(content, alert=message, v=version, diff=diffcontent,
may_revise=this_may_revise(page), edit_by=edit_by,
edit_date=edit_date, page=page.name).render()
edit_date=edit_date, page=page.name,
renderer=renderer).render()
@paginated_listing(max_page_size=100, backend='cassandra')
@validate(page=VWikiPage(('page'), restricted=False))
@@ -284,7 +290,7 @@ class WikiController(RedditController):
class WikiApiController(WikiController):
@validate(VModhash(),
pageandprevious=VWikiPageRevise(('page', 'previous'), restricted=True),
content=VMarkdown(('content'), renderer='wiki'),
content=nop(('content')),
page_name=VWikiPageName('page'),
reason=VPrintable('reason', 256))
@api_doc(api_section.wiki, uri='/api/wiki/edit')
@@ -300,6 +306,11 @@ class WikiApiController(WikiController):
if c.user._spam:
error = _("You are doing that too much, please try again later.")
self.handle_error(415, 'SPECIAL_ERRORS', special_errors=[error])
renderer = RENDERERS_BY_PAGE.get(page.name, 'wiki')
if renderer in ('wiki', 'reddit'):
content = VMarkdown(('content'), renderer=renderer).run(content)
# Use the raw POST value as we need to tell the difference between
# None/Undefined and an empty string. The validators use a default
# value with both of those cases and would need to be changed.

View File

@@ -201,7 +201,7 @@ def markdown_souptest(text, nofollow=False, target=None, renderer=None):
if not text:
return text
if not renderer:
if not renderer or renderer == 'reddit':
smd = safemarkdown(text, nofollow=nofollow, target=target)
elif renderer == 'wiki':
smd = wikimarkdown(text)

View File

@@ -26,7 +26,7 @@ from utils import to36, tup, iters
from wrapped import Wrapped, StringTemplate, CacheStub, CachedVariable, Templated
from mako.template import Template
from r2.config.extensions import get_api_subtype
from r2.lib.filters import spaceCompress, safemarkdown, wikimarkdown
from r2.lib.filters import spaceCompress, safemarkdown
from r2.models.subreddit import SubSR
import time, pytz
from pylons import c, g
@@ -651,7 +651,7 @@ class WikiViewJsonTemplate(ThingJsonTemplate):
if thing.edit_by and not thing.edit_by._deleted:
edit_by = Wrapped(thing.edit_by).render()
return dict(content_md=thing.page_content_md,
content_html=wikimarkdown(thing.page_content_md),
content_html=thing.page_content,
revision_by=edit_by,
revision_date=edit_date,
may_revise=thing.may_revise)

View File

@@ -20,16 +20,25 @@
# Inc. All Rights Reserved.
###############################################################################
from r2.lib.pages.pages import Reddit
from r2.lib.pages.pages import Reddit, SubredditStylesheetSource
from pylons import c
from r2.lib.wrapped import Templated
from r2.lib.menus import PageNameNav
from r2.lib.validator.wiki import this_may_revise
from r2.lib.filters import wikimarkdown, safemarkdown
from pylons.i18n import _
class WikiView(Templated):
def __init__(self, content, edit_by, edit_date, may_revise=False, page=None, diff=None):
def __init__(self, content, edit_by, edit_date, may_revise=False,
page=None, diff=None, renderer=None):
self.page_content_md = content
if not renderer or renderer == 'wiki':
self.page_content = wikimarkdown(content)
elif renderer == 'reddit':
self.page_content = safemarkdown(content)
elif renderer == 'stylesheet':
self.page_content = SubredditStylesheetSource(content).render()
self.renderer = renderer
self.page = page
self.diff = diff
self.edit_by = edit_by
@@ -132,13 +141,13 @@ class WikiBasePage(Reddit):
**context)
class WikiPageView(WikiBasePage):
def __init__(self, content, page, diff=None, **context):
def __init__(self, content, page, diff=None, renderer=None, **context):
may_revise = context.get('may_revise')
if not content and not context.get('alert'):
if may_revise:
context['alert'] = _("this page is empty, edit it to add some content.")
content = WikiView(content, context.get('edit_by'), context.get('edit_date'),
may_revise=may_revise, page=page, diff=diff)
may_revise=may_revise, page=page, diff=diff, renderer=renderer)
WikiBasePage.__init__(self, content, page=page, **context)
class WikiNotFound(WikiBasePage):

View File

@@ -23,7 +23,6 @@
<%namespace file="utils.html" import="timestamp"/>
<%!
from r2.lib.filters import wikimarkdown
from r2.lib.pages import WrappedUser
%>
@@ -36,7 +35,7 @@
%if not thing.page_content_md:
<em>${_("this page is empty")}</em>
%else:
${unsafe(wikimarkdown(thing.page_content_md))}
${unsafe(thing.page_content)}
%endif
</p>
%if thing.edit_date: