Ticket #3493: wikitopdf_2.2_dynimg_css.patch
| File wikitopdf_2.2_dynimg_css.patch, 11.8 kB (added by grigi, 5 months ago) |
|---|
-
wikitopdf/wikitopdf.py
old new 10 10 from tempfile import mkstemp 11 11 import os 12 12 import re 13 import random 14 from urllib import urlretrieve 13 15 14 16 EXCLUDE_RES = [ 15 17 re.compile(r'\[\[PageOutline([^]]*)\]\]'), … … 17 19 re.compile(r'----(\r)?$\n^Back up: \[\[ParentWiki\]\]', re.M|re.I) 18 20 ] 19 21 22 IMG_CACHE = { } 20 23 24 def 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 21 39 def wiki_to_pdf(text, env, req, base_dir, codepage): 40 global IMG_CACHE 22 41 23 42 #Remove exclude expressions 24 43 for r in EXCLUDE_RES: … … 27 46 env.log.debug('WikiToPdf => Wiki intput for WikiToPdf: %r' % text) 28 47 29 48 page = wiki_to_html(text, env, req).encode(codepage, 'replace') 30 page = page.replace('raw-attachment', 'attachments')31 49 page = page.replace('<img', '<img border="0"') 32 50 page = page.replace('?format=raw', '') 33 51 … … 40 58 page = page.replace('</pre>', '</pre></td></tr></table>') 41 59 page = page.replace('<table class="wiki">', '<table class="wiki" border="1" width="100%">') 42 60 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 44 65 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 50 160 51 161 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) 52 165 53 page = '<html><head>' + meta + '</head><body>' + page + '</body></html>'166 page = '<html><head>' + meta + css + '</head><body>' + page + '</body></html>' 54 167 55 168 env.log.debug('WikiToPdf => HTML output for WikiToPdf in charset %s is: %r' % (codepage, page)) 56 169 57 170 return page 58 171 59 172 def html_to_pdf(env, htmldoc_args, files): 173 global IMG_CACHE 60 174 os.environ["HTMLDOC_NOCGI"] = 'yes' 61 175 62 176 args_string = ' '.join(['--%s %s' % (arg, value or '') for arg, value … … 68 182 cmd_string = 'htmldoc %s %s -f %s'%(args_string, ' '.join(files), pfilename) 69 183 env.log.debug('WikiToPdf => Htmldoc command line: %s' % cmd_string) 70 184 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 = { } 71 190 72 191 infile = open(pfilename, 'rb') 73 192 out = infile.read() -
docs/css/htmldoc.css
old new 1 div.error, div.system-message { 2 background: #fdc; 3 border: 2px solid #d00; 4 color: #500; 5 padding: .5em; 6 margin: 1em 0; 7 } 8 9 div.important { 10 background: #fcb; 11 border: 1px dotted #d00; 12 color: #500; 13 padding: 0 .5em 0 .5em; 14 margin: .5em; 15 } 16 17 blockquote.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 28 table.wiki { 29 border: 2px solid #ccc; 30 border-collapse: collapse; 31 border-spacing: 0; 32 } 33 34 table.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 45 tt { 46 font-family: courier; 47 } 48 49 pre.wiki { 50 padding: .25em; 51 font-family: courier; 52 color: #000000; 53 font-style: normal; 54 font-weight: normal; 55 } 56 57 div.code { 58 padding: .25em; 59 font-family: courier; 60 color: #000000; 61 font-style: normal; 62 font-weight: normal; 63 } 64 65 div.code pre { margin: 0; background: #ffffff; white-space: pre; } 66 div.code pre .c { color: #999988; font-style: italic; white-space: pre; } 67 div.code pre .err { color: #a61717; background-color: #e3d2d2; white-space: pre; } 68 div.code pre .k { font-weight: bold; white-space: pre; } 69 div.code pre .o { font-weight: bold; white-space: pre; } 70 div.code pre .cm { color: #999988; font-style: italic; white-space: pre; } 71 div.code pre .cp { color: #999999; font-weight: bold; white-space: pre; } 72 div.code pre .c1 { color: #999988; font-style: italic; white-space: pre; } 73 div.code pre .cs { color: #999999; font-weight: bold; font-style: italic; white-space: pre; } 74 div.code pre .gd { color: #000000; background-color: #ffdddd; white-space: pre; } 75 div.code pre .ge { font-style: italic; white-space: pre; } 76 div.code pre .gr { color: #aa0000; white-space: pre; } 77 div.code pre .gh { color: #999999; white-space: pre; } 78 div.code pre .gi { color: #000000; background-color: #ddffdd; white-space: pre; } 79 div.code pre .go { color: #888888; white-space: pre; } 80 div.code pre .gp { color: #555555; white-space: pre; } 81 div.code pre .gs { font-weight: bold; white-space: pre; } 82 div.code pre .gu { color: #aaaaaa; white-space: pre; } 83 div.code pre .gt { color: #aa0000; white-space: pre; } 84 div.code pre .kc { font-weight: bold; white-space: pre; } 85 div.code pre .kd { font-weight: bold; white-space: pre; } 86 div.code pre .kp { font-weight: bold; white-space: pre; } 87 div.code pre .kr { font-weight: bold; white-space: pre; } 88 div.code pre .kt { color: #445588; font-weight: bold; white-space: pre; } 89 div.code pre .m { color: #009999; white-space: pre; } 90 div.code pre .s { color: #bb8844; white-space: pre; } 91 div.code pre .na { color: #008080; white-space: pre; } 92 div.code pre .nb { color: #999999; white-space: pre; } 93 div.code pre .nc { color: #445588; font-weight: bold; white-space: pre; } 94 div.code pre .no { color: #008080; white-space: pre; } 95 div.code pre .ni { color: #800080; white-space: pre; } 96 div.code pre .ne { color: #990000; font-weight: bold; white-space: pre; } 97 div.code pre .nf { color: #990000; font-weight: bold; white-space: pre; } 98 div.code pre .nn { color: #555555; white-space: pre; } 99 div.code pre .nt { color: #000080; white-space: pre; } 100 div.code pre .nv { color: #008080; white-space: pre; } 101 div.code pre .ow { font-weight: bold; white-space: pre; } 102 div.code pre .w { color: #bbbbbb; white-space: pre; } 103 div.code pre .mf { color: #009999; white-space: pre; } 104 div.code pre .mh { color: #009999; white-space: pre; } 105 div.code pre .mi { color: #009999; white-space: pre; } 106 div.code pre .mo { color: #009999; white-space: pre; } 107 div.code pre .sb { color: #bb8844; white-space: pre; } 108 div.code pre .sc { color: #bb8844; white-space: pre; } 109 div.code pre .sd { color: #bb8844; white-space: pre; } 110 div.code pre .s2 { color: #bb8844; white-space: pre; } 111 div.code pre .se { color: #bb8844; white-space: pre; } 112 div.code pre .sh { color: #bb8844; white-space: pre; } 113 div.code pre .si { color: #bb8844; white-space: pre; } 114 div.code pre .sx { color: #bb8844; white-space: pre; } 115 div.code pre .sr { color: #808000; white-space: pre; } 116 div.code pre .s1 { color: #bb8844; white-space: pre; } 117 div.code pre .ss { color: #bb8844; white-space: pre; } 118 div.code pre .bp { color: #999999; white-space: pre; } 119 div.code pre .vc { color: #008080; white-space: pre; } 120 div.code pre .vg { color: #008080; white-space: pre; } 121 div.code pre .vi { color: #008080; white-space: pre; } 122 div.code pre .il { color: #009999; white-space: pre; } 123 div.code pre .workaround { } 124
