Ticket #3481: wiki_to_pdf_clean_and_fix.patch

File wiki_to_pdf_clean_and_fix.patch, 15.7 kB (added by airadier, 5 months ago)
  • docs/cover/cover.html

    old new  
    5353</P> 
    5454<P CLASS="western" ALIGN=JUSTIFY STYLE="margin-bottom: 0cm"><IMG SRC="/path/to/cover/logo.png" NAME="figura2" ALIGN=RIGHT BORDER=0 width="230px" height="72px"><BR CLEAR=LEFT><BR> 
    5555</P> 
    56 <P CLASS="western" ALIGN=RIGHT STYLE="margin-bottom: 0cm"><FONT FACE="Century Schoolbook L, serif"><FONT SIZE=2 STYLE="font-size: 11pt">#VERSAO
    57 #DATA#</FONT></FONT></P> 
     56<P CLASS="western" ALIGN=RIGHT STYLE="margin-bottom: 0cm"><FONT FACE="Century Schoolbook L, serif"><FONT SIZE=2 STYLE="font-size: 11pt">#VERSION
     57#DATE#</FONT></FONT></P> 
    5858<P CLASS="western" ALIGN=JUSTIFY STYLE="margin-bottom: 0cm"><BR><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> 
    5959<P CLASS="western" ALIGN=JUSTIFY STYLE="margin-bottom: 0cm"><BR> 
    6060</P> 
  • setup.py

    old new  
    77 
    88setup( 
    99    name = 'TracWikiToPdfPlugin', 
    10     version = '2.0', 
     10    version = '2.1', 
    1111    packages = ['wikitopdf'], 
    1212    package_data={ 'wikitopdf' : [ 'templates/*.cs', 'htdocs/js/*.js' ] },      
    1313    author = "Diorgenes Felipe Grzesiuk", 
  • wikitopdf/formats.py

    old new  
    2121import urllib2 
    2222import base64 
    2323 
    24 from api import IWikiToPdfFormat 
     24from api import IWikiToPdfFormat 
     25from wikitopdf import wiki_to_pdf, html_to_pdf 
    2526 
    2627EXCLUDE_RES = [ 
    2728    re.compile(r'\[\[PageOutline([^]]*)\]\]'), 
     
    3637         
    3738    def wikitopdf_formats(self, req): 
    3839        yield 'pdf', 'PDF' 
    39 #        yield 'ps', 'PS' 
    4040         
    4141    def process_wikitopdf(self, req, format, title, subject, pages, version, date, pdfname): 
    4242 
    4343        os.system("rm -f /tmp/tmp*wikitopdf") 
    4444 
    45        # Dump all pages to HTML files 
    46        files = [self._page_to_file('', req, p) for p in pages] 
     45        # Dump all pages to HTML files 
     46        files = [self._page_to_file('', req, p) for p in pages] 
    4747         
    4848        #Setup the title and license pages 
    4949        title_template = self.env.config.get('wikitopdf', 'titlefile') 
    50         titlefile = self.get_titlepage(title_template, title, subject, date, version) 
     50        titlefile = title_template and self.get_titlepage(title_template, title, subject, date, version) or None 
    5151         
    52         # File to write PDF to 
    53         pfile, pfilename = mkstemp('wikitopdf') 
    54         os.close(pfile)        
     52        # Prepare html doc arguments 
     53        codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 
    5554 
    56         # Render 
    57         os.environ["HTMLDOC_NOCGI"] = 'yes' 
    58         codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 
     55        htmldoc_args = { 'book': '', 'format': 'pdf14', 'charset': codepage } 
     56             
     57        if titlefile: htmldoc_args['titlefile'] = titlefile 
     58        else: htmldoc_args['no-title'] = '' 
    5959 
    60         htmldoc_format = {'pdf': 'pdf14', 'ps':'ps3'}[format] 
     60        htmldoc_args.update(dict(self.env.config.options('wikitopdf-admin'))) 
     61 
     62        #render 
     63        out = html_to_pdf(self.env, htmldoc_args, files) 
    6164 
    62         htmldoc_args = { 'book': None, 'format': htmldoc_format, 'titlefile': titlefile, 'charset': codepage } 
    63  
    64         htmldoc_args.update(dict(self.env.config.options('wikitopdf-admin'))) 
    65  
    66         args_string = ' '.join(['--%s %s' % (arg, value or '') for arg, value 
    67                                         in htmldoc_args.iteritems()]) 
    68  
    69         cmd_string = 'htmldoc %s %s -f %s'%(args_string, ' '.join(files), pfilename) 
    70  
    71         self.log.info('WikiToPdf: Running %r', cmd_string) 
    72         os.system(cmd_string.encode('latin-1')) 
    73             
    74         out = open(pfilename, 'rb').read() 
    75              
    7665        # Clean up 
    77         os.unlink(pfilename) 
    78         for f in files: 
    79             os.unlink(f) 
     66        if titlefile: os.unlink(titlefile) 
     67        for f in files: os.unlink(f) 
    8068               
    8169        # Send the output 
    8270        req.send_response(200) 
    8371        req.send_header('Content-Type', {'pdf':'application/pdf', 'ps':'application/postscript'}[format]) 
    84         req.send_header('Content-Disposition', 'attachment; filename=' + pdfname + '.pdf') 
     72        #req.send_header('Content-Disposition', 'attachment; filename=' + pdfname + '.pdf') 
    8573        req.send_header('Content-Length', len(out)) 
    8674        req.end_headers() 
    8775        req.write(out) 
    88         raise RequestDone 
     76        raise RequestDone 
     77     
    8978 
    90     def _page_to_file(self, header, req, pagename, text=None): 
     79    def _page_to_file(self, header, req, pagename): 
    9180        """Slight modification of some code from Alec's PageToPdf plugin.""" 
    92  
    93         hfile, hfilename = mkstemp('wikitopdf') 
    94         codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 
    95  
     81 
     82        # htmldoc doesn't support utf-8, we need to use some other input encoding 
     83        codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 
    9684        base_dir = self.env.config.get('wikitopdf', 'base_dir') 
    9785         
    98         self.log.debug('WikiToPdf => Writting %s to %s using encoding %s', pagename, hfilename, codepage) 
    99  
    100         page = text 
    101         if text is None: 
    102             text = WikiPage(self.env, pagename).text 
    103             for r in EXCLUDE_RES: 
    104                 text = r.sub('', text) 
    105             page = wiki_to_html(text, self.env, req).encode(codepage, 'replace') 
    106  
    107         self.log.debug('WikiToPdf => Page text is: %r', page) 
    108  
    109         imgpos = page.find('<img') 
    110         while imgpos != -1: 
    111                 addrpos = page.find('src=', imgpos) 
    112                 base_dir = base_dir.encode('ascii') 
    113                 page = page[:addrpos+5] + base_dir + page[addrpos+5:] 
    114                 imgpos = page.find('<img', addrpos) 
    115  
    116         page = page.replace('raw-attachment', 'attachments') 
    117         page = page.replace('?format=raw','') 
    118         page = page.replace('<pre class="wiki">', '<table align="center" width="95%" border="1" bordercolor="#d7d7d7"><tr>' 
    119                                                 + '<td bgcolor="#f7f7f7"><pre class="wiki">') 
    120         page = page.replace('</pre>', '</pre></td></tr></table>') 
    121         page = page.replace('<table class="wiki">', '<table class="wiki" border="1" width="100%">') 
    122  
    123         self.log.debug('WikiToPdf => Page change text is: %r', page) 
    124  
    125         meta = ('<meta http-equiv="Content-Type" content="text/html; charset=%s"/>' % codepage).encode(codepage) 
    126         os.write(hfile, '<html><head>' + meta + '</head><body>' + page + '</body></html>') 
     86        page = wiki_to_pdf(WikiPage(self.env, pagename).text, self.env, req, base_dir, codepage) 
     87         
     88        hfile, hfilename = mkstemp('wikitopdf') 
     89        self.log.debug('WikiToPdf => Writting %s to %s using encoding %s', pagename, hfilename, codepage) 
     90        os.write(hfile, page) 
    12791        os.close(hfile) 
    12892        return hfilename 
    129              
     93     
     94     
    13095    def get_titlepage(self, template_path, title, subject, version, date): 
    13196 
    132         hfile, hfilename = mkstemp('wikitopdf') 
    133         codepage = Mimeview(self.env).default_charset 
    134  
    135         file_page = open(template_path, 'r') 
    136         string_page = file_page.read() 
    137         string_page = string_page.replace('#TITLE#', title) 
    138         string_page = string_page.replace('#SUBJECT#', subject) 
    139         string_page = string_page.replace('#VERSAO#', version) 
    140         string_page = string_page.replace('#DATA#', date) 
    141         os.write(hfile, string_page) 
    142         os.close(hfile) 
    143         return hfilename 
    144          
     97        hfile, hfilename = mkstemp('wikitopdf') 
     98        codepage = Mimeview(self.env).default_charset 
     99 
     100        try: 
     101            file_page = open(template_path, 'r') 
     102            string_page = file_page.read() 
     103            string_page = string_page.replace('#TITLE#', title) 
     104            string_page = string_page.replace('#SUBJECT#', subject) 
     105            string_page = string_page.replace('#VERSION#', version) 
     106            string_page = string_page.replace('#DATE#', date) 
     107        except: 
     108            os.close(hfile) 
     109            return None 
     110         
     111        os.write(hfile, string_page) 
     112        os.close(hfile) 
     113         
     114        return hfilename 
     115     
  • wikitopdf/web_ui.py

    old new  
    3232         
    3333    def get_htdocs_dirs(self): 
    3434        from pkg_resources import resource_filename 
    35        return [('wikitopdf', resource_filename(__name__, 'htdocs'))] 
     35        return [('wikitopdf', resource_filename(__name__, 'htdocs'))] 
    3636        #return [] 
    3737 
    3838    # IAdminPanelsProvider methods 
     
    4545        return handler 
    4646 
    4747    def post_process_request(self, req, template, data, content_type): 
    48        return template, data, content_type     
     48        return template, data, content_type    
    4949 
    5050    def process_admin_request(self, req, cat, page, path_info): 
    5151        allpages = list(WikiSystem(self.env).get_pages()) 
     
    6262        if req.method == 'POST': 
    6363            rightpages = req.args.get('rightpages_all') 
    6464            title = req.args.get('title').encode('latin-1') or self.env.project_name.encode('latin-1') 
    65            subject = req.args.get('subject').encode('latin-1') 
     65            subject = req.args.get('subject').encode('latin-1') 
    6666            date = req.args.get('date').encode('latin-1'); 
    6767            version = req.args.get('version').encode('latin-1'); 
    68            toctitle = req.args.get('toctitle') 
    69            req.session['wikitopdf_rightpages'] = rightpages 
     68            toctitle = req.args.get('toctitle') 
     69            req.session['wikitopdf_rightpages'] = rightpages 
    7070            rightpages = rightpages.split(',') 
    7171            format = req.args.get('format') 
    7272 
     
    8585        req.hdf['wikitopdf.formats'] = formats 
    8686        req.hdf['wikitopdf.default_format'] = formats.iterkeys().next() 
    8787 
    88        add_script(req, 'wikitopdf/js/admin_wikitopdf.js')  
     88        add_script(req, 'wikitopdf/js/admin_wikitopdf.js')  
    8989 
    9090        return 'admin_wikitopdf.cs', None 
    9191 
  • wikitopdf/wikitopdf.py

    old new  
    1212import re 
    1313 
    1414EXCLUDE_RES = [ 
    15        re.compile(r'\[\[PageOutline([^]]*)\]\]'), 
    16        re.compile(r'\[\[TracGuideToc([^]]*)\]\]'), 
    17        re.compile(r'----(\r)?$\n^Back up: \[\[ParentWiki\]\]', re.M|re.I) 
     15    re.compile(r'\[\[PageOutline([^]]*)\]\]'), 
     16    re.compile(r'\[\[TracGuideToc([^]]*)\]\]'), 
     17    re.compile(r'----(\r)?$\n^Back up: \[\[ParentWiki\]\]', re.M|re.I) 
    1818] 
     19 
     20 
     21def wiki_to_pdf(text, env, req, base_dir, codepage): 
     22     
     23    #Remove exclude expressions 
     24    for r in EXCLUDE_RES: 
     25        text = r.sub('', text) 
     26     
     27    env.log.debug('WikiToPdf => Wiki intput for WikiToPdf: %r' % text) 
     28 
     29    page = wiki_to_html(text, env, req).encode(codepage, 'replace') 
     30     
     31    page = page.replace('attachment', 'attachments') 
     32    page = page.replace('?format=raw','') 
     33    page = page.replace('<pre class="wiki">', '<table align="center" width="95%" border="1" bordercolor="#d7d7d7">' 
     34        + '<tr><td bgcolor="#f7f7f7"><pre class="wiki">') 
     35    page = page.replace('</pre>', '</pre></td></tr></table>') 
     36    page = page.replace('<table class="wiki">', '<table class="wiki" border="1" width="100%">') 
     37 
     38    imgpos = page.find('<img') 
     39 
     40    while imgpos != -1: 
     41        addrpos = page.find('src=',imgpos) 
     42        page = page[:addrpos+5] + base_dir + page[addrpos+5:] 
     43        imgpos = page.find('<img', addrpos) 
     44     
     45    meta = ('<meta http-equiv="Content-Type" content="text/html; charset=%s"/>' % codepage).encode(codepage) 
     46 
     47    page = '<html><head>' + meta + '</head><body>' + page + '</body></html>' 
     48     
     49    env.log.debug('WikiToPdf => HTML output for WikiToPdf in charset %s is: %r' % (codepage, page)) 
     50     
     51    return page 
     52 
     53def html_to_pdf(env, htmldoc_args, files): 
     54    os.environ["HTMLDOC_NOCGI"] = 'yes' 
     55     
     56    args_string = ' '.join(['--%s %s' % (arg, value or '') for arg, value 
     57        in htmldoc_args.iteritems() if value != None]) 
     58     
     59    pfile, pfilename = mkstemp('wikitopdf') 
     60    os.close(pfile) 
     61     
     62    cmd_string = 'htmldoc %s -f %s %s' % (args_string, pfilename, ' '.join(files)) 
     63    env.log.debug('WikiToPdf => Htmldoc command line: %s' % cmd_string) 
     64    os.system(cmd_string) 
     65     
     66    infile = open(pfilename, 'rb') 
     67    out = infile.read() 
     68    infile.close() 
     69     
     70    os.unlink(pfilename) 
     71     
     72    return out 
     73 
     74 
    1975 
    2076class WikiToPdfPage(Component): 
    2177    """Convert Wiki pages to PDF using HTMLDOC (http://www.htmldoc.org/).""" 
    2278    implements(IContentConverter) 
    23  
     79 
     80         
    2481    # IContentConverter methods 
    2582    def get_supported_conversions(self): 
    26         yield ('pdf', 'WikiToPdf', 'pdf', 'text/x-trac-wiki', 'application/pdf', 7) 
     83        yield ('pdf', 'WikiToPdf', 'pdf', 'text/x-trac-wiki', 'application/pdf', 7) 
    2784 
    2885    def convert_content(self, req, input_type, text, output_type): 
    2986 
    30         os.system("rm -f /tmp/tmp*wikitopdf") 
     87        # htmldoc doesn't support utf-8, we need to use some other input encoding 
     88        codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 
     89        base_dir = self.env.config.get('wikitopdf', 'base_dir') 
     90 
     91        page = wiki_to_pdf(text, self.env, req, base_dir, codepage) 
    3192 
    32         base_dir = self.env.config.get('wikitopdf', 'base_dir') 
    33  
    34         hfile, hfilename = mkstemp('wikitopdf') 
    35         # htmldoc doesn't support utf-8, we need to use some other input encoding 
    36  
    37         codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 
    38  
    39         for r in EXCLUDE_RES: 
    40                 text = r.sub('', text) 
    41                  
    42         page = wiki_to_html(text, self.env, req).encode(codepage, 'replace') 
    43  
    44         self.env.log.debug('WikiToPdf => HTML output for WikiToPdf in charset: %s' % codepage) 
    45         self.env.log.debug('WikiToPdf => HTML intput for WikiToPdf: %s' % text) 
    46  
    47         page = page.replace('attachment', 'attachments') 
    48         page = page.replace('?format=raw','') 
    49         page = page.replace('<pre class="wiki">', '<table align="center" width="95%" border="1" bordercolor="#d7d7d7">' 
    50                                                 + '<tr><td bgcolor="#f7f7f7"><pre class="wiki">') 
    51         page = page.replace('</pre>', '</pre></td></tr></table>') 
    52         page = page.replace('<table class="wiki">', '<table class="wiki" border="1" width="100%">') 
    53          
    54         imgpos = page.find('<img') 
    55  
    56         while imgpos != -1: 
    57                 addrpos = page.find('src=',imgpos) 
    58                 base_dir = base_dir.encode('ascii') 
    59                 page = page[:addrpos+5] + base_dir + page[addrpos+5:] 
    60                 imgpos = page.find('<img', addrpos) 
    61  
    62         self.env.log.debug('WikiToPdf => Html code: %r' % page) 
    63  
    64         meta = ('<meta http-equiv="Content-Type" content="text/html; charset=%s"/>' % codepage).encode(codepage) 
    65  
    66         os.write(hfile, '<html><head>' + meta + '</head><body>' + page + '</body></html>') 
     93        hfile, hfilename = mkstemp('wikitopdf') 
     94        os.write(hfile, page) 
    6795        os.close(hfile) 
    6896 
    69         pfile, pfilename = mkstemp('wikitopdf') 
    70         os.close(pfile) 
     97        htmldoc_args = { 'webpage': '', 'format': 'pdf14', 'charset': codepage } 
     98        htmldoc_args.update(dict(self.env.config.options('wikitopdf-page'))) 
     99 
     100        out = html_to_pdf(self.env, htmldoc_args, [hfilename]) 
     101        os.unlink(hfilename) 
    71102 
    72         os.environ["HTMLDOC_NOCGI"] = 'yes' 
    73         htmldoc_args = { 'webpage': None, 'format': 'pdf14', 'charset': codepage } 
    74  
    75         htmldoc_args.update(dict(self.env.config.options('wikitopdf-page'))) 
    76  
    77         args_string = ' '.join(['--%s %s' % (arg, value or '') for arg, value 
    78                                 in htmldoc_args.iteritems()]) 
    79  
    80         self.env.log.debug('WikiToPdf => Htmldoc code out: %s' % args_string) 
    81  
    82         os.system('htmldoc %s %s -f %s' % (args_string, hfilename, pfilename)) 
    83  
    84         out = open(pfilename, 'rb').read() 
    85         os.unlink(pfilename) 
    86         os.unlink(hfilename) 
    87103        return (out, 'application/pdf')