annotate examples/trac/trac/mimeview/php.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2005 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2005 Christian Boos <cboos@bct-technology.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16 # Author: Christian Boos <cboos@bct-technology.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 # Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 import re
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 from trac.core import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 from trac.config import Option
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 from trac.mimeview.api import IHTMLPreviewRenderer, content_to_unicode
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 from trac.util import NaivePopen
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 from trac.util.markup import Deuglifier
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27 __all__ = ['PHPRenderer']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 php_types = ('text/x-php', 'application/x-httpd-php',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 'application/x-httpd-php4', 'application/x-httpd-php1')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 class PhpDeuglifier(Deuglifier):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 def format(self, indata):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 # The PHP highlighter produces the end-span tags on the next line
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 # instead of the line they actually apply to, which causes
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 # Trac to produce lots of (useless) open-and-immediately-close
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 # spans beginning each line. This tries to curtail by bubbling
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 # the first span after a set of 1+ "<br />" to before them.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 r_fixeol = re.compile(r"((?:<br />)+)(</(?:font|span)>)")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 indata = r_fixeol.sub(lambda m: m.group(2) + m.group(1), indata)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44 # Now call superclass implementation that handles the dirty work
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 # of applying css classes.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 return Deuglifier.format(self, indata)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 def rules(cls):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 colors = dict(comment='FF8000', lang='0000BB', keyword='007700',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 string='DD0000')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 # rules check for <font> for PHP 4 or <span> for PHP 5
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 color_rules = [
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 r'(?P<%s><(?:font color="|span style="color: )#%s">)' % c
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 for c in colors.items()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55 ]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 return color_rules + [ r'(?P<font><font.*?>)', r'(?P<endfont></font>)' ]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 rules = classmethod(rules)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 class PHPRenderer(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 Syntax highlighting using the PHP executable if available.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 implements(IHTMLPreviewRenderer)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 path = Option('mimeviewer', 'php_path', 'php',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 """Path to the PHP executable (''since 0.9'').""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 # IHTMLPreviewRenderer methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 def get_quality_ratio(self, mimetype):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 if mimetype in php_types:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 return 4
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 return 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 def render(self, req, mimetype, content, filename=None, rev=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 cmdline = self.config.get('mimeviewer', 'php_path')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 # -n to ignore php.ini so we're using default colors
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 cmdline += ' -sn'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 self.env.log.debug("PHP command line: %s" % cmdline)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 content = content_to_unicode(self.env, content, mimetype)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 content = content.encode('utf-8')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 np = NaivePopen(cmdline, content, capturestderr=1)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 if np.errorlevel or np.err:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 np.err)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 raise Exception, err
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 odata = ''.join(np.out.splitlines()[1:-2])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 if odata.startswith('X-Powered-By'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 raise TracError, 'You appear to be using the PHP CGI binary. ' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 'Trac requires the CLI version for syntax ' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 'highlighting.'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95 html = PhpDeuglifier().format(odata.decode('utf-8'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 for line in html.split('<br />'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 # PHP generates _way_ too many non-breaking spaces...
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 # We don't need them anyway, so replace them by normal spaces
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 yield line.replace('&nbsp;', ' ')
Copyright (C) 2012-2017 Edgewall Software