Mercurial > hg > contenttransformer
annotate contenttransformer/transformers.py @ 19:afd11b758da0
just require genshi for now
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Wed, 27 Oct 2010 09:09:37 -0700 |
parents | 6cbe4172b54b |
children | 9cf78a1c7373 |
rev | line source |
---|---|
0
29805d442afc
initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
1 import docutils.core |
2 | 2 import subprocess |
16
6cbe4172b54b
sketch of how to hook up imports for genshi transformer
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
3 from utils import import_path |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
4 from webob import Request, Response |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
5 |
19
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
6 import genshi |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
7 from genshi.template import MarkupTemplate |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
8 |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
9 class Transformer(object): |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
10 """abstract base class for transformer objects""" |
9
051d4d39b4b9
* separate out get_response to its own function
k0s <k0scist@gmail.com>
parents:
7
diff
changeset
|
11 def __init__(self, content, content_type): |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
12 self.content = content |
9
051d4d39b4b9
* separate out get_response to its own function
k0s <k0scist@gmail.com>
parents:
7
diff
changeset
|
13 self.content_type = content_type |
0
29805d442afc
initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
14 |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
15 def transform(self, request): |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
16 """returns a tuple of (body, content-type)""" |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
17 raise NotImplementedError |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
18 |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
19 def __call__(self, environ, start_response): |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
20 request = Request(environ) |
9
051d4d39b4b9
* separate out get_response to its own function
k0s <k0scist@gmail.com>
parents:
7
diff
changeset
|
21 response = self.get_response(request) |
051d4d39b4b9
* separate out get_response to its own function
k0s <k0scist@gmail.com>
parents:
7
diff
changeset
|
22 return response(environ, start_response) |
051d4d39b4b9
* separate out get_response to its own function
k0s <k0scist@gmail.com>
parents:
7
diff
changeset
|
23 |
051d4d39b4b9
* separate out get_response to its own function
k0s <k0scist@gmail.com>
parents:
7
diff
changeset
|
24 def get_response(self, request): |
051d4d39b4b9
* separate out get_response to its own function
k0s <k0scist@gmail.com>
parents:
7
diff
changeset
|
25 if request.GET.get('format') == 'raw': |
051d4d39b4b9
* separate out get_response to its own function
k0s <k0scist@gmail.com>
parents:
7
diff
changeset
|
26 return Response(content_type=self.content_type, body=self.content) |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
27 content_type, body = self.transform(request) |
9
051d4d39b4b9
* separate out get_response to its own function
k0s <k0scist@gmail.com>
parents:
7
diff
changeset
|
28 return Response(content_type=content_type, body=body) |
10
a9ddcfc7c4e8
added transformer just of content-type name
k0s <k0scist@gmail.com>
parents:
9
diff
changeset
|
29 |
a9ddcfc7c4e8
added transformer just of content-type name
k0s <k0scist@gmail.com>
parents:
9
diff
changeset
|
30 class ContentTypeChanger(Transformer): |
a9ddcfc7c4e8
added transformer just of content-type name
k0s <k0scist@gmail.com>
parents:
9
diff
changeset
|
31 def __init__(self, content, from_type, to_type): |
a9ddcfc7c4e8
added transformer just of content-type name
k0s <k0scist@gmail.com>
parents:
9
diff
changeset
|
32 self.to_type = to_type |
a9ddcfc7c4e8
added transformer just of content-type name
k0s <k0scist@gmail.com>
parents:
9
diff
changeset
|
33 Transformer.__init__(self, content, from_type) |
a9ddcfc7c4e8
added transformer just of content-type name
k0s <k0scist@gmail.com>
parents:
9
diff
changeset
|
34 |
a9ddcfc7c4e8
added transformer just of content-type name
k0s <k0scist@gmail.com>
parents:
9
diff
changeset
|
35 def transform(self, request): |
a9ddcfc7c4e8
added transformer just of content-type name
k0s <k0scist@gmail.com>
parents:
9
diff
changeset
|
36 return (self.to_type, self.content) |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
37 |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
38 class Graphviz(Transformer): |
12
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
39 content_types = { 'png': 'image/png', |
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
40 'svg': 'image/svg+xml' } |
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
41 |
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
42 def __init__(self, content, content_type, format='png'): |
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
43 self.format=format |
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
44 Transformer.__init__(self, content, content_type) |
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
45 |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
46 def transform(self, request): |
0
29805d442afc
initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
47 """create a Graphviz object""" |
12
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
48 _format = request.GET.get('format', self.format) |
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
49 assert _format in self.content_types, 'Unknown format: ' + _format |
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
50 process = subprocess.Popen(['dot', '-T' + _format], |
3
1a267297f779
graphviz now works, giving real version
k0s <k0scist@gmail.com>
parents:
2
diff
changeset
|
51 stdin=subprocess.PIPE, |
1a267297f779
graphviz now works, giving real version
k0s <k0scist@gmail.com>
parents:
2
diff
changeset
|
52 stdout=subprocess.PIPE) |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
53 image, _ = process.communicate(self.content) |
12
59496de89997
allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
54 return (self.content_types[_format], image) |
0
29805d442afc
initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
55 |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
56 class RestructuredText(Transformer): |
0
29805d442afc
initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
57 settings = { 'report_level': 5 } |
29805d442afc
initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
58 |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
59 def transform(self, request): |
0
29805d442afc
initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
60 """template: genshi(?) template to use (???)""" |
7
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
61 html = docutils.core.publish_string(self.content, |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
62 writer_name='html', |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
63 settings_overrides=self.settings) |
68643e72c749
use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents:
3
diff
changeset
|
64 return ('text/html', html) |
15
946176949bba
add the genshi transformer
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
65 |
946176949bba
add the genshi transformer
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
66 |
19
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
67 class GenshiTransformer(Transformer): |
15
946176949bba
add the genshi transformer
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
68 |
19
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
69 def __init__(self, content, content_type, modules=()): |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
70 """ |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
71 - modules : strings of modules |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
72 """ |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
73 self.variables = {} |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
74 for path in modules: |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
75 module = import_path(path) |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
76 name = path.rsplit('.')[-1] |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
77 self.variables[name] = module |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
78 Transformer.__init__(self, content, content_type) |
15
946176949bba
add the genshi transformer
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
79 |
19
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
80 def transform(self, request): |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
81 variables = dict(request=request) |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
82 template = MarkupTemplate(self.content) |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
83 stream = template.generate(**variables) |
afd11b758da0
just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
84 return ('text/html', stream.render('html', doctype='html')) |
15
946176949bba
add the genshi transformer
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
85 |