Edgewall Software

Ticket #1468: wiki-exporter-2.diff

File wiki-exporter-2.diff, 4.1 KB (added by Alec Thomas <alec@…>, 6 years ago)
  • trac/wiki/api.py

     
    7777        The `label` is already HTML escaped, whereas the `target` is not. 
    7878        """ 
    7979  
     80class IWikiFormatExporter(Interface): 
     81    """ Represents an export format for Wiki pages. """ 
    8082 
     83    def get_export_formats(): 
     84        """ Return an iterable over (format, description, content_type). 
     85 
     86        For example, the default "text/plain" exporter would yield 
     87        ('txt', 'Plain text', 'text/plain;charset=utf-8'). 
     88        """ 
     89 
     90    def export_page(format, req, page): 
     91        """ Export page in the given format. """ 
     92 
    8193class WikiSystem(Component): 
    8294    """Represents the wiki system.""" 
    8395 
  • trac/wiki/web_ui.py

     
    2929from trac.versioncontrol.diff import get_diff_options, hdf_diff 
    3030from trac.web.chrome import add_link, add_stylesheet, INavigationContributor 
    3131from trac.web import IRequestHandler 
     32from trac.wiki.api import IWikiFormatExporter 
    3233from trac.wiki.model import WikiPage 
    3334from trac.wiki.formatter import wiki_to_html, wiki_to_oneliner 
    3435 
     
    3637class WikiModule(Component): 
    3738 
    3839    implements(INavigationContributor, IPermissionRequestor, IRequestHandler, 
    39                ITimelineEventProvider, ISearchSource) 
     40               ITimelineEventProvider, ISearchSource, IWikiFormatExporter) 
    4041 
     42    wiki_exporters = ExtensionPoint(IWikiFormatExporter) 
     43 
    4144    # INavigationContributor methods 
    4245 
    4346    def get_active_navigation_item(self, req): 
     
    109112        elif action == 'history': 
    110113            self._render_history(req, db, page) 
    111114        else: 
    112             if req.args.get('format') == 'txt': 
    113                 req.send_response(200) 
    114                 req.send_header('Content-Type', 'text/plain;charset=utf-8') 
    115                 req.end_headers() 
    116                 req.write(page.text) 
    117                 return 
     115            if req.args.has_key('format'): 
     116                required_format = req.args.get('format') 
     117                for exporter in self.wiki_exporters: 
     118                    for format, description, content_type in exporter.get_export_formats(): 
     119                        if required_format == format: 
     120                            req.send_response(200) 
     121                            req.send_header('Content-Type', '%s' % content_type) 
     122                            req.end_headers() 
     123                            req.write(exporter.export_page(format, req, page)) 
     124                            return 
     125                raise TracError('No IWikiFormatExporter for format "%s"' % required_format) 
    118126            self._render_view(req, db, page) 
    119127 
    120128        req.hdf['wiki.action'] = action 
     
    357365            # Ask web spiders to not index old versions 
    358366            req.hdf['html.norobots'] = 1 
    359367 
    360         txt_href = self.env.href.wiki(page.name, version=version, format='txt') 
    361         add_link(req, 'alternate', txt_href, 'Plain Text', 'text/plain') 
     368        for exporter in self.wiki_exporters: 
     369            for format, description, content_type in exporter.get_export_formats(): 
     370                format_href = self.env.href.wiki(page.name, version=version, format=format) 
     371                add_link(req, 'alternate', format_href, description, content_type.split(';')[0]) 
    362372 
    363373        req.hdf['wiki'] = {'page_name': page.name, 'exists': page.exists, 
    364374                           'version': page.version, 'readonly': page.readonly} 
     
    405415                   '%s: %s' % (name, shorten_line(text)), 
    406416                   date, author, 
    407417                   shorten_result(text, query.split())) 
     418 
     419    # IWikiFormatExporter methods 
     420 
     421    def get_export_formats(self): 
     422        yield ('txt', 'Plain text', 'text/plain;charset=utf-8') 
     423        yield ('html', 'Raw HTML', 'text/html') 
     424 
     425    def export_page(self, format, req, page): 
     426        if format == 'txt': 
     427            return page.text 
     428        else: 
     429            return wiki_to_html(page.text, self.env, req, self.env.get_db_cnx())