From d90d2d87693d275fec0ac67c68a75bb6b1bfbc33 Mon Sep 17 00:00:00 2001 From: jomae Date: Wed, 5 Feb 2025 12:18:39 +0000 Subject: [PATCH] 1.7.1dev: merge [17873,17876-17878] from 1.6-stable (fix for #13864,13865,13866) git-svn-id: http://trac.edgewall.org/intertrac/log:/trunk@17879 af82e41b-90c4-0310-8c96-b1721e28e2e2 --- trac/mimeview/pygments.py | 45 +++++++++++++++------ trac/mimeview/templates/prefs_pygments.html | 29 +++++++------ trac/mimeview/tests/pygments.data | 8 ++++ trac/mimeview/tests/pygments.py | 14 +++++-- 4 files changed, 65 insertions(+), 31 deletions(-) diff --git a/trac/mimeview/pygments.py b/trac/mimeview/pygments.py index f1c30f994d..c3fa038346 100644 --- a/trac/mimeview/pygments.py +++ b/trac/mimeview/pygments.py @@ -37,6 +37,20 @@ __all__ = ['PygmentsRenderer'] +if hasattr(HtmlFormatter, 'get_background_style_defs') and \ + hasattr(HtmlFormatter, 'get_token_style_defs'): + def _get_style_defs(style, arg): + lines = [] + formatter = HtmlFormatter(style=style) + lines.extend(formatter.get_background_style_defs(arg)) + lines.extend(formatter.get_token_style_defs(arg)) + return '\n'.join(lines) +else: + def _get_style_defs(style, arg): + formatter = HtmlFormatter(style=style) + return formatter.get_style_defs(arg) + + class PygmentsRenderer(Component): """HTML renderer for syntax highlighting based on Pygments.""" @@ -140,7 +154,7 @@ def get_preference_panels(self, req): yield 'pygments', _('Syntax Highlighting') def render_preference_panel(self, req, panel): - styles = list(get_all_styles()) + styles = set(get_all_styles()) if req.method == 'POST': style = req.args.get('style') @@ -151,15 +165,25 @@ def render_preference_panel(self, req, panel): add_notice(req, _("Your preferences have been saved.")) req.redirect(req.href.prefs(panel or None)) - for style in sorted(styles): - add_stylesheet(req, '/pygments/%s.css' % style, title=style.title()) + def style_defs(style): + cls = get_style_by_name(style) + selector = '.trac-pygments-%s div.code pre' % style + return _get_style_defs(cls, selector) + + default_style = self.default_style + if default_style not in styles: + default_style = 'trac' + selection = req.session.get('pygments_style') + if selection not in styles: + selection = default_style output = self._generate('html', self.EXAMPLE) - add_script_data(req, default_style=self.default_style.title()) + add_script_data(req, default_style=default_style, selection=selection) return 'prefs_pygments.html', { 'output': output, - 'selection': req.session.get('pygments_style'), - 'default_style': self.default_style, - 'styles': styles + 'selection': selection, + 'default_style': default_style, + 'styles': sorted(styles), + 'style_defs': style_defs, } # IRequestHandler methods @@ -186,11 +210,8 @@ def process_request(self, req): req.end_headers() return - formatter = HtmlFormatter(style=style_cls) - content = '\n\n'.join([ - formatter.get_style_defs('div.code pre'), - formatter.get_style_defs('table.code td') - ]).encode('utf-8') + content = _get_style_defs(style_cls, ['div.code pre', 'table.code td']) + content = content.encode('utf-8') req.send_response(200) req.send_header('Content-Type', 'text/css; charset=utf-8') diff --git a/trac/mimeview/templates/prefs_pygments.html b/trac/mimeview/templates/prefs_pygments.html index 8221a1bcdb..7794fcb2d2 100644 --- a/trac/mimeview/templates/prefs_pygments.html +++ b/trac/mimeview/templates/prefs_pygments.html @@ -24,22 +24,21 @@ div.code pre { border: 1px solid #999; font-size: 90%; margin: 1em 2em; padding: 5px; width: 60%; } + # for style_ in styles: + ${- style_defs(style_)|safe} + # endfor @@ -48,12 +47,12 @@ # block prefpanel -
+