trac/wiki/web_api.py
# -*- coding: utf-8 -*-
#
# Copyright (C) 2009-2023 Edgewall Software
# All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://trac.edgewall.org/wiki/TracLicense.
#
# This software consists of voluntary contributions made by many
# individuals. For the exact contribution history, see the revision
# history and logs, available at https://trac.edgewall.org/log/.
from trac.core import *
from trac.resource import Resource
from trac.web.api import IRequestHandler
from trac.web.chrome import chrome_info_script, web_context
from trac.wiki.api import WikiSystem
from trac.wiki.formatter import format_to
class WikiRenderer(Component):
"""Wiki text renderer."""
implements(IRequestHandler)
is_valid_default_handler = False
# IRequestHandler methods
def match_request(self, req):
return req.path_info == '/wiki_render'
def process_request(self, req):
# Allow all POST requests (with a valid __FORM_TOKEN, ensuring that
# the client has at least some permission). Additionally, allow GET
# requests from TRAC_ADMIN for testing purposes.
if req.method != 'POST':
req.perm.require('TRAC_ADMIN')
realm = req.args.get('realm', WikiSystem.realm)
id = req.args.get('id')
version = req.args.getint('version')
text = req.args.get('text', '')
flavor = req.args.get('flavor')
options = {}
if 'escape_newlines' in req.args:
options['escape_newlines'] = \
req.args.getbool('escape_newlines', False)
if 'shorten' in req.args:
options['shorten'] = req.args.getbool('shorten', False)
resource = Resource(realm, id=id, version=version)
context = web_context(req, resource)
rendered = format_to(self.env, flavor, context, text, **options) + \
chrome_info_script(req)
req.send(rendered.encode('utf-8'))