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
77 77 The `label` is already HTML escaped, whereas the `target` is not. 78 78 """ 79 79 80 class IWikiFormatExporter(Interface): 81 """ Represents an export format for Wiki pages. """ 80 82 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 81 93 class WikiSystem(Component): 82 94 """Represents the wiki system.""" 83 95 -
trac/wiki/web_ui.py
29 29 from trac.versioncontrol.diff import get_diff_options, hdf_diff 30 30 from trac.web.chrome import add_link, add_stylesheet, INavigationContributor 31 31 from trac.web import IRequestHandler 32 from trac.wiki.api import IWikiFormatExporter 32 33 from trac.wiki.model import WikiPage 33 34 from trac.wiki.formatter import wiki_to_html, wiki_to_oneliner 34 35 … … 36 37 class WikiModule(Component): 37 38 38 39 implements(INavigationContributor, IPermissionRequestor, IRequestHandler, 39 ITimelineEventProvider, ISearchSource )40 ITimelineEventProvider, ISearchSource, IWikiFormatExporter) 40 41 42 wiki_exporters = ExtensionPoint(IWikiFormatExporter) 43 41 44 # INavigationContributor methods 42 45 43 46 def get_active_navigation_item(self, req): … … 109 112 elif action == 'history': 110 113 self._render_history(req, db, page) 111 114 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) 118 126 self._render_view(req, db, page) 119 127 120 128 req.hdf['wiki.action'] = action … … 357 365 # Ask web spiders to not index old versions 358 366 req.hdf['html.norobots'] = 1 359 367 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]) 362 372 363 373 req.hdf['wiki'] = {'page_name': page.name, 'exists': page.exists, 364 374 'version': page.version, 'readonly': page.readonly} … … 405 415 '%s: %s' % (name, shorten_line(text)), 406 416 date, author, 407 417 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())
