Ticket #3493: wikitopdf_2.2_dynimg_css.patch

File wikitopdf_2.2_dynimg_css.patch, 11.8 kB (added by grigi, 5 months ago)

Patch to add Downloading Images & enable Code highlighting wht using HTMLDoc 1.9

  • wikitopdf/wikitopdf.py

    old new  
    1010from tempfile import mkstemp 
    1111import os 
    1212import re 
     13import random 
     14from urllib import urlretrieve 
    1315 
    1416EXCLUDE_RES = [ 
    1517    re.compile(r'\[\[PageOutline([^]]*)\]\]'), 
     
    1719    re.compile(r'----(\r)?$\n^Back up: \[\[ParentWiki\]\]', re.M|re.I) 
    1820] 
    1921 
     22IMG_CACHE = { } 
    2023 
     24def tagattrfind(page, tag, attr, pos): 
     25    tb_pos = page.find('<%s' % tag, pos) 
     26 
     27    while tb_pos != -1: 
     28        te_pos = page.find('>', tb_pos) 
     29        tc_pos = page.find(attr, tb_pos, te_pos) 
     30 
     31        if tc_pos != -1: 
     32            return tb_pos, te_pos+1 
     33 
     34        tb_pos = page.find('<%s' % tag, te_pos+1) 
     35 
     36    return -1, -1 
     37 
     38 
    2139def wiki_to_pdf(text, env, req, base_dir, codepage): 
     40    global IMG_CACHE 
    2241     
    2342    #Remove exclude expressions 
    2443    for r in EXCLUDE_RES: 
     
    2746    env.log.debug('WikiToPdf => Wiki intput for WikiToPdf: %r' % text) 
    2847     
    2948    page = wiki_to_html(text, env, req).encode(codepage, 'replace') 
    30     page = page.replace('raw-attachment', 'attachments') 
    3149    page = page.replace('<img', '<img border="0"') 
    3250    page = page.replace('?format=raw', '') 
    3351 
     
    4058    page = page.replace('</pre>', '</pre></td></tr></table>') 
    4159    page = page.replace('<table class="wiki">', '<table class="wiki" border="1" width="100%">') 
    4260 
    43     imgpos = page.find('<img') 
     61    tracuri = env.config.get('wikitopdf', 'trac_uri') 
     62    tmp_dir = env.config.get('wikitopdf', 'tmp_dir') 
     63    if tracuri != '' and tmp_dir != '': 
     64        # Download images so that dynamic images also work right 
    4465 
    45     while imgpos != -1: 
    46         addrpos = page.find('src=',imgpos) 
    47         base_dir = base_dir.encode('ascii') 
    48         page = page[:addrpos+5] + base_dir + page[addrpos+5:] 
    49         imgpos = page.find('<img', addrpos) 
     66        # Create temp dir, incase not existing 
     67        os.system('mkdir %s 2>/dev/null' % (tmp_dir)) 
     68 
     69        # Create a random prefix 
     70        random.seed() 
     71        tmp_dir += '/%(#)04x_' %{"#":random.randint(0,65535)} 
     72 
     73        imgcounter = 0 
     74        imgpos = page.find('<img') 
     75 
     76        while imgpos != -1: 
     77                addrpos = page.find('src="',imgpos) 
     78                theimg = page[addrpos+5:] 
     79                thepos = theimg.find('"') 
     80                theimg = theimg[:thepos] 
     81 
     82                if theimg[:1] == '/': 
     83                        theimg = tracuri + theimg 
     84 
     85                try: 
     86                    newimg = IMG_CACHE[theimg] 
     87                except:     
     88                    newimg = tmp_dir + '%(#)d_' %{"#":imgcounter} + theimg[theimg.rfind('/')+1:] 
     89                    #download 
     90                    urlretrieve(theimg, newimg) 
     91                    IMG_CACHE[theimg] = newimg 
     92                    imgcounter += 1 
     93 
     94                page = page[:addrpos+5] + newimg + page[addrpos+5+thepos:] 
     95                imgpos = page.find('<img', addrpos) 
     96 
     97 
     98    else: 
     99        # Use old search for images in path 
     100        page = page.replace('raw-attachment', 'attachments') 
     101 
     102        imgpos = page.find('<img') 
     103 
     104        while imgpos != -1: 
     105            addrpos = page.find('src=',imgpos) 
     106            base_dir = base_dir.encode('ascii') 
     107            page = page[:addrpos+5] + base_dir + page[addrpos+5:] 
     108            imgpos = page.find('<img', addrpos) 
     109 
     110    # Add center tags, since htmldoc 1.9 does not handle align="center" 
     111    (tablepos,tableend) = tagattrfind(page, 'table', 'align="center"', 0) 
     112    while tablepos != -1: 
     113        endpos = page.find('</table>',tablepos) 
     114        page = page[:endpos+8] + '</center>' + page[endpos+8:] 
     115        page = page[:tablepos] + '<center>' + page[tablepos:]; 
     116 
     117        endpos = page.find('</table>',tablepos) 
     118        (tablepos,tableend) = tagattrfind(page, 'table', 'align="center"', endpos) 
     119 
     120    # Add table around '<div class="code">' 
     121    (tablepos,tableend) = tagattrfind(page, 'div', 'class="code"', 0) 
     122    while tablepos != -1: 
     123        endpos = page.find('</div>',tablepos) 
     124        page = page[:endpos+6] + '</td></tr></table></center>' + page[endpos+6:] 
     125        page = page[:tableend] + '<center><table align="center" width="95%" border="1" bordercolor="#d7d7d7"><tr><td>' + page[tableend:] 
     126 
     127        endpos = page.find('</div>',tablepos) 
     128        (tablepos,tableend) = tagattrfind(page, 'div', 'class="code"', endpos) 
     129 
     130    # Add table around '<div class="system-message">' 
     131    (tablepos,tableend) = tagattrfind(page, 'div', 'class="system-message"', 0) 
     132    while tablepos != -1: 
     133        endpos = page.find('</div>',tablepos) 
     134        page = page[:endpos+6] + '</td></tr></table>' + page[endpos+6:] 
     135        page = page[:tableend] + '<table width="100%" border="2" bordercolor="#dd0000" bgcolor="#ffddcc"><tr><td>' + page[tableend:] 
     136 
     137        endpos = page.find('</div>',tablepos) 
     138        (tablepos,tableend) = tagattrfind(page, 'div', 'class="system-message"', endpos) 
     139 
     140    # Add table around '<div class="error">' 
     141    (tablepos,tableend) = tagattrfind(page, 'div', 'class="error"', 0) 
     142    while tablepos != -1: 
     143        endpos = page.find('</div>',tablepos) 
     144        page = page[:endpos+6] + '</td></tr></table>' + page[endpos+6:] 
     145        page = page[:tableend] + '<table width="100%" border="2" bordercolor="#dd0000" bgcolor="#ffddcc"><tr><td>' + page[tableend:] 
     146 
     147        endpos = page.find('</div>',tablepos) 
     148        (tablepos,tableend) = tagattrfind(page, 'div', 'class="error"', endpos) 
     149 
     150    # Add table around '<div class="important">' 
     151    (tablepos,tableend) = tagattrfind(page, 'div', 'class="important"', 0) 
     152    while tablepos != -1: 
     153        endpos = page.find('</div>',tablepos) 
     154        page = page[:endpos+6] + '</td></tr></table>' + page[endpos+6:] 
     155        page = page[:tableend] + '<table width="100%" border="2" bordercolor="#550000" bgcolor="#ffccbb"><tr><td>' + page[tableend:] 
     156 
     157        endpos = page.find('</div>',tablepos) 
     158        (tablepos,tableend) = tagattrfind(page, 'div', 'class="important"', endpos) 
     159 
    50160     
    51161    meta = ('<meta http-equiv="Content-Type" content="text/html; charset=%s"/>' % codepage).encode(codepage) 
     162    css = '' 
     163    if env.config.get('wikitopdf', 'css_file') != '': 
     164        css = ('<link rel="stylesheet" href="%s" type="text/css"/>' % env.config.get('wikitopdf', 'css_file')).encode(codepage) 
    52165 
    53     page = '<html><head>' + meta + '</head><body>' + page + '</body></html>' 
     166    page = '<html><head>' + meta + css + '</head><body>' + page + '</body></html>' 
    54167     
    55168    env.log.debug('WikiToPdf => HTML output for WikiToPdf in charset %s is: %r' % (codepage, page)) 
    56169     
    57170    return page 
    58171 
    59172def html_to_pdf(env, htmldoc_args, files): 
     173    global IMG_CACHE 
    60174    os.environ["HTMLDOC_NOCGI"] = 'yes' 
    61175     
    62176    args_string = ' '.join(['--%s %s' % (arg, value or '') for arg, value 
     
    68182    cmd_string = 'htmldoc %s %s -f %s'%(args_string, ' '.join(files), pfilename) 
    69183    env.log.debug('WikiToPdf => Htmldoc command line: %s' % cmd_string) 
    70184    os.system(cmd_string.encode(env.config.get('trac', 'charset', 'iso-8859-1'))) 
     185 
     186    # Delete files from tmp_dir 
     187    for v in IMG_CACHE.values(): 
     188        os.unlink(v); 
     189    IMG_CACHE = { } 
    71190     
    72191    infile = open(pfilename, 'rb') 
    73192    out = infile.read() 
  • docs/css/htmldoc.css

    old new  
     1div.error, div.system-message { 
     2 background: #fdc; 
     3 border: 2px solid #d00; 
     4 color: #500; 
     5 padding: .5em; 
     6 margin: 1em 0; 
     7} 
     8 
     9div.important { 
     10 background: #fcb; 
     11 border: 1px dotted #d00; 
     12 color: #500; 
     13 padding: 0 .5em 0 .5em; 
     14 margin: .5em; 
     15} 
     16 
     17blockquote.citation { 
     18 margin: -0.6em 0; 
     19 border-style: solid; 
     20 border-width: 0 0 0 2px; 
     21 padding-left: .5em; 
     22 border-color: #b44; 
     23} 
     24.citation blockquote.citation { border-color: #4b4; } 
     25.citation .citation blockquote.citation { border-color: #44b; } 
     26.citation .citation .citation blockquote.citation { border-color: #c55; } 
     27 
     28table.wiki { 
     29 border: 2px solid #ccc; 
     30 border-collapse: collapse; 
     31 border-spacing: 0; 
     32} 
     33 
     34table.wiki td { 
     35 border: 1px  solid #ccc; 
     36 padding: .1em .25em; 
     37} 
     38 
     39:link { 
     40 border: none; 
     41 text-decoration: none; 
     42 color: #000000; 
     43} 
     44 
     45tt { 
     46 font-family: courier; 
     47} 
     48 
     49pre.wiki { 
     50 padding: .25em; 
     51 font-family: courier; 
     52 color: #000000; 
     53 font-style: normal; 
     54 font-weight: normal; 
     55} 
     56 
     57div.code { 
     58 padding: .25em; 
     59 font-family: courier; 
     60 color: #000000; 
     61 font-style: normal; 
     62 font-weight: normal; 
     63} 
     64 
     65div.code pre { margin: 0; background: #ffffff; white-space: pre; } 
     66div.code pre .c { color: #999988; font-style: italic; white-space: pre; } 
     67div.code pre .err { color: #a61717; background-color: #e3d2d2; white-space: pre; } 
     68div.code pre .k { font-weight: bold; white-space: pre; } 
     69div.code pre .o { font-weight: bold; white-space: pre; } 
     70div.code pre .cm { color: #999988; font-style: italic; white-space: pre; } 
     71div.code pre .cp { color: #999999; font-weight: bold; white-space: pre; } 
     72div.code pre .c1 { color: #999988; font-style: italic; white-space: pre; } 
     73div.code pre .cs { color: #999999; font-weight: bold; font-style: italic; white-space: pre; } 
     74div.code pre .gd { color: #000000; background-color: #ffdddd; white-space: pre; } 
     75div.code pre .ge { font-style: italic; white-space: pre; } 
     76div.code pre .gr { color: #aa0000; white-space: pre; } 
     77div.code pre .gh { color: #999999; white-space: pre; } 
     78div.code pre .gi { color: #000000; background-color: #ddffdd; white-space: pre; } 
     79div.code pre .go { color: #888888; white-space: pre; } 
     80div.code pre .gp { color: #555555; white-space: pre; } 
     81div.code pre .gs { font-weight: bold; white-space: pre; } 
     82div.code pre .gu { color: #aaaaaa; white-space: pre; } 
     83div.code pre .gt { color: #aa0000; white-space: pre; } 
     84div.code pre .kc { font-weight: bold; white-space: pre; } 
     85div.code pre .kd { font-weight: bold; white-space: pre; } 
     86div.code pre .kp { font-weight: bold; white-space: pre; } 
     87div.code pre .kr { font-weight: bold; white-space: pre; } 
     88div.code pre .kt { color: #445588; font-weight: bold; white-space: pre; } 
     89div.code pre .m { color: #009999; white-space: pre; } 
     90div.code pre .s { color: #bb8844; white-space: pre; } 
     91div.code pre .na { color: #008080; white-space: pre; } 
     92div.code pre .nb { color: #999999; white-space: pre; } 
     93div.code pre .nc { color: #445588; font-weight: bold; white-space: pre; } 
     94div.code pre .no { color: #008080; white-space: pre; } 
     95div.code pre .ni { color: #800080; white-space: pre; } 
     96div.code pre .ne { color: #990000; font-weight: bold; white-space: pre; } 
     97div.code pre .nf { color: #990000; font-weight: bold; white-space: pre; } 
     98div.code pre .nn { color: #555555; white-space: pre; } 
     99div.code pre .nt { color: #000080; white-space: pre; } 
     100div.code pre .nv { color: #008080; white-space: pre; } 
     101div.code pre .ow { font-weight: bold; white-space: pre; } 
     102div.code pre .w { color: #bbbbbb; white-space: pre; } 
     103div.code pre .mf { color: #009999; white-space: pre; } 
     104div.code pre .mh { color: #009999; white-space: pre; } 
     105div.code pre .mi { color: #009999; white-space: pre; } 
     106div.code pre .mo { color: #009999; white-space: pre; } 
     107div.code pre .sb { color: #bb8844; white-space: pre; } 
     108div.code pre .sc { color: #bb8844; white-space: pre; } 
     109div.code pre .sd { color: #bb8844; white-space: pre; } 
     110div.code pre .s2 { color: #bb8844; white-space: pre; } 
     111div.code pre .se { color: #bb8844; white-space: pre; } 
     112div.code pre .sh { color: #bb8844; white-space: pre; } 
     113div.code pre .si { color: #bb8844; white-space: pre; } 
     114div.code pre .sx { color: #bb8844; white-space: pre; } 
     115div.code pre .sr { color: #808000; white-space: pre; } 
     116div.code pre .s1 { color: #bb8844; white-space: pre; } 
     117div.code pre .ss { color: #bb8844; white-space: pre; } 
     118div.code pre .bp { color: #999999; white-space: pre; } 
     119div.code pre .vc { color: #008080; white-space: pre; } 
     120div.code pre .vg { color: #008080; white-space: pre; } 
     121div.code pre .vi { color: #008080; white-space: pre; } 
     122div.code pre .il { color: #009999; white-space: pre; } 
     123div.code pre .workaround { } 
     124