From 94daebd746aa657a7836ac759f42753891f2c572 Mon Sep 17 00:00:00 2001 From: Andre D Date: Tue, 28 May 2013 13:30:21 -0700 Subject: [PATCH] wiki: Add wiki renderers. --- r2/r2/controllers/wiki.py | 17 ++++++++++++++--- r2/r2/lib/filters.py | 2 +- r2/r2/lib/jsontemplates.py | 4 ++-- r2/r2/lib/pages/wiki.py | 17 +++++++++++++---- r2/r2/templates/wikiview.html | 3 +-- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/r2/r2/controllers/wiki.py b/r2/r2/controllers/wiki.py index 0ddbbe330..666805d1b 100644 --- a/r2/r2/controllers/wiki.py +++ b/r2/r2/controllers/wiki.py @@ -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. diff --git a/r2/r2/lib/filters.py b/r2/r2/lib/filters.py index d881476bd..5107cefea 100644 --- a/r2/r2/lib/filters.py +++ b/r2/r2/lib/filters.py @@ -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) diff --git a/r2/r2/lib/jsontemplates.py b/r2/r2/lib/jsontemplates.py index 2007339ee..2f6a5aed8 100755 --- a/r2/r2/lib/jsontemplates.py +++ b/r2/r2/lib/jsontemplates.py @@ -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) diff --git a/r2/r2/lib/pages/wiki.py b/r2/r2/lib/pages/wiki.py index 14320bba2..f5438aeab 100644 --- a/r2/r2/lib/pages/wiki.py +++ b/r2/r2/lib/pages/wiki.py @@ -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): diff --git a/r2/r2/templates/wikiview.html b/r2/r2/templates/wikiview.html index a21c53e87..770d1f02b 100644 --- a/r2/r2/templates/wikiview.html +++ b/r2/r2/templates/wikiview.html @@ -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: ${_("this page is empty")} %else: - ${unsafe(wikimarkdown(thing.page_content_md))} + ${unsafe(thing.page_content)} %endif

%if thing.edit_date: