Changeset 28:a70e7d36ed97

Show
Ignore:
Timestamp:
08/05/08 01:16:05 (5 years ago)
Author:
Nicolas ?vrard <nicoe@…>
Branch:
default
Message:

Switched pdf templating to ConTeXt?

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • relatorio/templates/pdf.py

    r26 r28  
    2121__metaclass__ = type 
    2222 
     23import os 
     24import shutil 
     25import tempfile 
     26import subprocess 
    2327from cStringIO import StringIO 
    24 from trml2pdf import parseString 
    2528 
    26 from genshi.template import Template as GenshiTemplate, MarkupTemplate 
     29import genshi 
     30from genshi.template import Template as GenshiTemplate, NewTextTemplate 
     31 
     32TEXEXEC_PATH = '/usr/bin/texexec' 
     33_encode = genshi.output.encode 
    2734 
    2835 
    29 class Template(GenshiTemplate): 
     36class Template(NewTextTemplate): 
    3037 
    3138    def __init__(self, source, filepath=None, filename=None, loader=None, 
    3239                 encoding=None, lookup='strict', allow_exec=True): 
    33         self.content_template = MarkupTemplate(source, filepath, filename, 
    34                                                loader, encoding, lookup, 
    35                                                allow_exec) 
     40        if source is None: 
     41            source = open(filepath, 'r').read() 
     42        super(Template, self).__init__(source, filepath, filename, loader, 
     43                                       encoding, lookup, allow_exec) 
     44    def generate(self, *args, **kwargs): 
     45        generated = super(Template, self).generate(*args, **kwargs) 
     46        return PDFStream(generated, PDFSerializer()) 
    3647 
    37     def _parse(self, source, encoding): 
    38         pass 
    39      
    40     def _prepare(self, stream): 
    41         return [] 
    4248 
    43     def generate(self, *args, **kwargs): 
     49class PDFStream(genshi.core.Stream): 
     50 
     51    def __init__(self, content_stream, serializer): 
     52        self.events = content_stream 
     53        self.serializer = serializer 
     54 
     55    def render(self, method=None, encoding='utf-8', out=None, **kwargs): 
     56        return self.serializer(self.events) 
     57 
     58    def serialize(self, method, **kwargs): 
     59        return self.render(method, **kwargs) 
     60 
     61    def __or__(self, function): 
     62        return PDFStream(self.events | function, self.serializer) 
     63 
     64 
     65class PDFSerializer: 
     66 
     67    def __init__(self): 
     68        self.working_dir = tempfile.mkdtemp(prefix='relatorio') 
     69        self.tex_file = os.path.join(self.working_dir, 'report.tex') 
     70        self.pdf_file = os.path.join(self.working_dir, 'report.pdf') 
     71        self.text_serializer = genshi.output.TextSerializer() 
     72 
     73    def __call__(self, stream): 
     74        tex_file = open(self.tex_file, 'w') 
     75        tex_file.write(_encode(self.text_serializer(stream))) 
     76        tex_file.close() 
     77 
     78        p = subprocess.check_call([TEXEXEC_PATH, '--purge', 'report.tex'], 
     79                                  cwd=self.working_dir) 
     80 
    4481        pdf = StringIO() 
    45         pdf.write(str(parseString(self.content_template.generate(*args, 
    46                                                                  **kwargs)))) 
     82        pdf.write(open(self.pdf_file, 'r').read()) 
     83 
     84        shutil.rmtree(self.working_dir, ignore_errors=True) 
    4785        return pdf 
     86