comparison contenttransformer/transformers.py @ 7:68643e72c749

use abstract base class for transformers so that behaviour can be streamlined
author k0s <k0scist@gmail.com>
date Wed, 03 Feb 2010 17:56:24 -0500
parents 1a267297f779
children 051d4d39b4b9
comparison
equal deleted inserted replaced
6:85f84b928768 7:68643e72c749
1 import docutils.core 1 import docutils.core
2 import subprocess 2 import subprocess
3 from webob import Response 3 from webob import Request, Response
4 4
5 class Graphviz(object): 5 class Transformer(object):
6 """abstract base class for transformer objects"""
6 def __init__(self, content): 7 def __init__(self, content):
8 self.content = content
9
10 def transform(self, request):
11 """returns a tuple of (body, content-type)"""
12 raise NotImplementedError
13
14 def __call__(self, environ, start_response):
15 request = Request(environ)
16 content_type, body = self.transform(request)
17 return Response(content_type=content_type, body=body)(environ, start_response)
18
19 class Graphviz(Transformer):
20 def transform(self, request):
7 """create a Graphviz object""" 21 """create a Graphviz object"""
8 process = subprocess.Popen(['dot', '-Tpng'], 22 process = subprocess.Popen(['dot', '-Tpng'],
9 stdin=subprocess.PIPE, 23 stdin=subprocess.PIPE,
10 stdout=subprocess.PIPE) 24 stdout=subprocess.PIPE)
11 self.image, _ = process.communicate(content) 25 image, _ = process.communicate(self.content)
26 return ('image/png', image)
12 27
13 def __call__(self, environ, start_response): 28 class RestructuredText(Transformer):
14 """return a WSGI response"""
15 return Response(content_type='image/png', body=self.image)(environ, start_response)
16
17 class RestructuredText(object):
18 settings = { 'report_level': 5 } 29 settings = { 'report_level': 5 }
19 30
20 def __init__(self, content): 31 def transform(self, request):
21 """template: genshi(?) template to use (???)""" 32 """template: genshi(?) template to use (???)"""
22 self.html = docutils.core.publish_string(content, 33 html = docutils.core.publish_string(self.content,
23 writer_name='html', 34 writer_name='html',
24 settings_overrides=self.settings) 35 settings_overrides=self.settings)
25 36 return ('text/html', html)
26 def __call__(self, environ, start_response):
27 """return a WSGI response"""
28 return Response(content_type='text/html', body=self.html)(environ, start_response)