annotate contenttransformer/transformers.py @ 25:2a2063d571a6 default tip

py3
author Jeff Hammel <k0scist@gmail.com>
date Mon, 28 Dec 2020 20:42:56 +0000
parents 9cf78a1c7373
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
1e2c475015d8 restructured text now works
k0s <k0scist@gmail.com>
parents: 0
diff changeset
2 import subprocess
23
9cf78a1c7373 python3
Jeff Hammel <k0scist@gmail.com>
parents: 19
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
23
9cf78a1c7373 python3
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
38
7
68643e72c749 use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents: 3
diff changeset
39 class Graphviz(Transformer):
12
59496de89997 allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
40 content_types = { 'png': 'image/png',
59496de89997 allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
41 'svg': 'image/svg+xml' }
23
9cf78a1c7373 python3
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
42
12
59496de89997 allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
43 def __init__(self, content, content_type, format='png'):
59496de89997 allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
44 self.format=format
59496de89997 allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
45 Transformer.__init__(self, content, content_type)
23
9cf78a1c7373 python3
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
46
7
68643e72c749 use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents: 3
diff changeset
47 def transform(self, request):
0
29805d442afc initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff changeset
48 """create a Graphviz object"""
12
59496de89997 allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
49 _format = request.GET.get('format', self.format)
59496de89997 allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
50 assert _format in self.content_types, 'Unknown format: ' + _format
59496de89997 allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
51 process = subprocess.Popen(['dot', '-T' + _format],
3
1a267297f779 graphviz now works, giving real version
k0s <k0scist@gmail.com>
parents: 2
diff changeset
52 stdin=subprocess.PIPE,
1a267297f779 graphviz now works, giving real version
k0s <k0scist@gmail.com>
parents: 2
diff changeset
53 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
54 image, _ = process.communicate(self.content)
12
59496de89997 allow graphviz to serve svg
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
55 return (self.content_types[_format], image)
0
29805d442afc initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff changeset
56
23
9cf78a1c7373 python3
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
57
7
68643e72c749 use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents: 3
diff changeset
58 class RestructuredText(Transformer):
0
29805d442afc initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff changeset
59 settings = { 'report_level': 5 }
29805d442afc initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff changeset
60
7
68643e72c749 use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents: 3
diff changeset
61 def transform(self, request):
0
29805d442afc initial commit of contenttransformer; still in the stub stage
k0s <k0scist@gmail.com>
parents:
diff changeset
62 """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
63 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
64 writer_name='html',
68643e72c749 use abstract base class for transformers so that behaviour can be streamlined
k0s <k0scist@gmail.com>
parents: 3
diff changeset
65 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
66 return ('text/html', html)
15
946176949bba add the genshi transformer
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
67
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 class GenshiTransformer(Transformer):
15
946176949bba add the genshi transformer
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
70
19
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
71 def __init__(self, content, content_type, 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 - modules : strings of modules
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
74 """
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
75 self.variables = {}
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
76 for path in modules:
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
77 module = import_path(path)
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
78 name = path.rsplit('.')[-1]
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
79 self.variables[name] = module
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
80 Transformer.__init__(self, content, content_type)
23
9cf78a1c7373 python3
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
81
19
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
82 def transform(self, request):
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
83 variables = dict(request=request)
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
84 template = MarkupTemplate(self.content)
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
85 stream = template.generate(**variables)
afd11b758da0 just require genshi for now
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
86 return ('text/html', stream.render('html', doctype='html'))