annotate examples/trac/trac/mimeview/silvercity.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) 2004-2006 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2004 Daniel Lundin <daniel@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 # Author: Daniel Lundin <daniel@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 """Syntax highlighting module, based on the SilverCity module.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 Get it at: http://silvercity.sourceforge.net/
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 import re
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 from StringIO import StringIO
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 from trac.core import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 from trac.config import ListOption
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27 from trac.mimeview.api import IHTMLPreviewRenderer, Mimeview
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 __all__ = ['SilverCityRenderer']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 types = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 'text/css': ('CSS', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 'text/html': ('HyperText', 3, {'asp.default.language':1}),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34 'application/xml': ('XML', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 'application/xhtml+xml': ('HyperText', 3, {'asp.default.language':1}),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 'application/x-javascript': ('CPP', 3), # Kludgy.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 'text/x-asp': ('HyperText', 3, {'asp.default.language':2}),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 'text/x-c++hdr': ('CPP', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 'text/x-c++src': ('CPP', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 'text/x-chdr': ('CPP', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 'text/x-csrc': ('CPP', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 'text/x-perl': ('Perl', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 'text/x-php': ('HyperText', 3, {'asp.default.language':4}),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44 'application/x-httpd-php': ('HyperText', 3, {'asp.default.language':4}),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 'application/x-httpd-php4': ('HyperText', 3, {'asp.default.language':4}),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 'application/x-httpd-php3': ('HyperText', 3, {'asp.default.language':4}),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 'text/x-javascript': ('CPP', 3), # Kludgy.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 'text/x-psp': ('HyperText', 3, {'asp.default.language':3}),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 'text/x-python': ('Python', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 'text/x-ruby': ('Ruby', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 'text/x-sql': ('SQL', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 'text/xml': ('XML', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 'text/xslt': ('XSLT', 3),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 'image/svg+xml': ('XML', 3)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 CRLF_RE = re.compile('\r$', re.MULTILINE)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 class SilverCityRenderer(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 """Syntax highlighting based on SilverCity."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 implements(IHTMLPreviewRenderer)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 enscript_modes = ListOption('mimeviewer', 'silvercity_modes',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 '',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 """List of additional MIME types known by SilverCity.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 For each, a tuple `mimetype:mode:quality` has to be
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 specified, where `mimetype` is the MIME type,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 `mode` is the corresponding SilverCity mode to be used
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 for the conversion and `quality` is the quality ratio
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 associated to this conversion.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 That can also be used to override the default
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 quality ratio used by the SilverCity render, which is 3
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 (''since 0.10'').""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 expand_tabs = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 def __init__(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 self._types = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 def get_quality_ratio(self, mimetype):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 # Extend default MIME type to mode mappings with configured ones
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 if not self._types:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 self._types = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 self._types.update(types)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 self._types.update(
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 Mimeview(self.env).configured_modes_mapping('silvercity'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 return self._types.get(mimetype, (None, 0))[1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 def render(self, req, mimetype, content, filename=None, rev=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 import SilverCity
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 mimetype = mimetype.split(';', 1)[0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95 typelang = self._types[mimetype]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 lang = typelang[0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 module = getattr(SilverCity, lang)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 generator = getattr(module, lang + "HTMLGenerator")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 allprops = typelang[2]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 propset = SilverCity.PropertySet()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 for p in allprops.keys():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 propset[p] = allprops[p]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 except IndexError:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 pass
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 except (KeyError, AttributeError):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 err = "No SilverCity lexer found for mime-type '%s'." % mimetype
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 raise Exception, err
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 # SilverCity does not like unicode strings
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 content = content.encode('utf-8')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 # SilverCity generates extra empty line against some types of
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 # the line such as comment or #include with CRLF. So we
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 # standardize to LF end-of-line style before call.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 content = CRLF_RE.sub('', content)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 buf = StringIO()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 generator().generate_html(buf, content)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 br_re = re.compile(r'<br\s*/?>$', re.MULTILINE)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122 span_default_re = re.compile(r'<span class="\w+_default">(.*?)</span>',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 re.DOTALL)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 html = span_default_re.sub(r'\1', br_re.sub('', buf.getvalue()))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 # Convert the output back to a unicode string
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 html = html.decode('utf-8')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 # SilverCity generates _way_ too many non-breaking spaces...
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 # We don't need them anyway, so replace them by normal spaces
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 return html.replace('&nbsp;', ' ').splitlines()
Copyright (C) 2012-2017 Edgewall Software