Mercurial > repos > fubar > tool_factory_2
comparison toolfactory/html_dir.py @ 43:e7e9732ebed6 draft
Uploaded
author | fubar |
---|---|
date | Sun, 16 Aug 2020 08:51:14 -0400 |
parents | f8c1694190f0 |
children |
comparison
equal
deleted
inserted
replaced
42:b938475235e3 | 43:e7e9732ebed6 |
---|---|
1 | |
2 class tooloutHTMLifyer(self): | |
3 | |
4 def compressPDF(self,inpdf=None,thumbformat='png'): | |
5 """need absolute path to pdf | |
6 note that GS gets confoozled if no $TMP or $TEMP | |
7 so we set it | |
8 """ | |
9 assert os.path.isfile(inpdf), "## Input %s supplied to %s compressPDF not found" % (inpdf,self.myName) | |
10 hlog = os.path.join(self.opts.output_dir,"compress_%s.txt" % os.path.basename(inpdf)) | |
11 sto = open(hlog,'a') | |
12 our_env = os.environ.copy() | |
13 our_tmp = our_env.get('TMP',None) | |
14 if not our_tmp: | |
15 our_tmp = our_env.get('TEMP',None) | |
16 if not (our_tmp and os.path.exists(our_tmp)): | |
17 newtmp = os.path.join(self.opts.output_dir,'tmp') | |
18 try: | |
19 os.mkdir(newtmp) | |
20 except: | |
21 sto.write('## WARNING - cannot make %s - it may exist or permissions need fixing\n' % newtmp) | |
22 our_env['TEMP'] = newtmp | |
23 if not self.temp_warned: | |
24 sto.write('## WARNING - no $TMP or $TEMP!!! Please fix - using %s temporarily\n' % newtmp) | |
25 self.temp_warned = True | |
26 outpdf = '%s_compressed' % inpdf | |
27 cl = ["gs", "-sDEVICE=pdfwrite", "-dNOPAUSE", "-dUseCIEColor", "-dBATCH","-dPDFSETTINGS=/printer", "-sOutputFile=%s" % outpdf,inpdf] | |
28 x = subprocess.Popen(cl,stdout=sto,stderr=sto,cwd=self.opts.output_dir,env=our_env) | |
29 retval1 = x.wait() | |
30 sto.close() | |
31 if retval1 == 0: | |
32 os.unlink(inpdf) | |
33 shutil.move(outpdf,inpdf) | |
34 os.unlink(hlog) | |
35 hlog = os.path.join(self.opts.output_dir,"thumbnail_%s.txt" % os.path.basename(inpdf)) | |
36 sto = open(hlog,'w') | |
37 outpng = '%s.%s' % (os.path.splitext(inpdf)[0],thumbformat) | |
38 if self.useGM: | |
39 cl2 = ['gm', 'convert', inpdf, outpng] | |
40 else: # assume imagemagick | |
41 cl2 = ['convert', inpdf, outpng] | |
42 x = subprocess.Popen(cl2,stdout=sto,stderr=sto,cwd=self.opts.output_dir,env=our_env) | |
43 retval2 = x.wait() | |
44 sto.close() | |
45 if retval2 == 0: | |
46 os.unlink(hlog) | |
47 retval = retval1 or retval2 | |
48 return retval | |
49 | |
50 | |
51 def getfSize(self,fpath,outpath): | |
52 """ | |
53 format a nice file size string | |
54 """ | |
55 size = '' | |
56 fp = os.path.join(outpath,fpath) | |
57 if os.path.isfile(fp): | |
58 size = '0 B' | |
59 n = float(os.path.getsize(fp)) | |
60 if n > 2**20: | |
61 size = '%1.1f MB' % (n/2**20) | |
62 elif n > 2**10: | |
63 size = '%1.1f KB' % (n/2**10) | |
64 elif n > 0: | |
65 size = '%d B' % (int(n)) | |
66 return size | |
67 | |
68 def makeHtml(self): | |
69 """ Create an HTML file content to list all the artifacts found in the output_dir | |
70 """ | |
71 | |
72 galhtmlprefix = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |
73 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | |
74 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
75 <meta name="generator" content="Galaxy %s tool output - see http://g2.trac.bx.psu.edu/" /> | |
76 <title></title> | |
77 <link rel="stylesheet" href="/static/style/base.css" type="text/css" /> | |
78 </head> | |
79 <body> | |
80 <div class="toolFormBody"> | |
81 """ | |
82 galhtmlattr = """<hr/><div class="infomessage">This tool (%s) was generated by the <a href="https://bitbucket.org/fubar/galaxytoolfactory/overview">Galaxy Tool Factory</a></div><br/>""" | |
83 galhtmlpostfix = """</div></body></html>\n""" | |
84 | |
85 flist = os.listdir(self.opts.output_dir) | |
86 flist = [x for x in flist if x != 'Rplots.pdf'] | |
87 flist.sort() | |
88 html = [] | |
89 html.append(galhtmlprefix % progname) | |
90 html.append('<div class="infomessage">Galaxy Tool "%s" run at %s</div><br/>' % (self.toolname,timenow())) | |
91 fhtml = [] | |
92 if len(flist) > 0: | |
93 logfiles = [x for x in flist if x.lower().endswith('.log')] # log file names determine sections | |
94 logfiles.sort() | |
95 logfiles = [x for x in logfiles if os.path.abspath(x) != os.path.abspath(self.tlog)] | |
96 logfiles.append(os.path.abspath(self.tlog)) # make it the last one | |
97 pdflist = [] | |
98 npdf = len([x for x in flist if os.path.splitext(x)[-1].lower() == '.pdf']) | |
99 for rownum,fname in enumerate(flist): | |
100 dname,e = os.path.splitext(fname) | |
101 sfsize = self.getfSize(fname,self.opts.output_dir) | |
102 if e.lower() == '.pdf' : # compress and make a thumbnail | |
103 thumb = '%s.%s' % (dname,self.thumbformat) | |
104 pdff = os.path.join(self.opts.output_dir,fname) | |
105 retval = self.compressPDF(inpdf=pdff,thumbformat=self.thumbformat) | |
106 if retval == 0: | |
107 pdflist.append((fname,thumb)) | |
108 else: | |
109 pdflist.append((fname,fname)) | |
110 if (rownum+1) % 2 == 0: | |
111 fhtml.append('<tr class="odd_row"><td><a href="%s">%s</a></td><td>%s</td></tr>' % (fname,fname,sfsize)) | |
112 else: | |
113 fhtml.append('<tr><td><a href="%s">%s</a></td><td>%s</td></tr>' % (fname,fname,sfsize)) | |
114 for logfname in logfiles: # expect at least tlog - if more | |
115 if os.path.abspath(logfname) == os.path.abspath(self.tlog): # handled later | |
116 sectionname = 'All tool run' | |
117 if (len(logfiles) > 1): | |
118 sectionname = 'Other' | |
119 ourpdfs = pdflist | |
120 else: | |
121 realname = os.path.basename(logfname) | |
122 sectionname = os.path.splitext(realname)[0].split('_')[0] # break in case _ added to log | |
123 ourpdfs = [x for x in pdflist if os.path.basename(x[0]).split('_')[0] == sectionname] | |
124 pdflist = [x for x in pdflist if os.path.basename(x[0]).split('_')[0] != sectionname] # remove | |
125 nacross = 1 | |
126 npdf = len(ourpdfs) | |
127 | |
128 if npdf > 0: | |
129 nacross = math.sqrt(npdf) ## int(round(math.log(npdf,2))) | |
130 if int(nacross)**2 != npdf: | |
131 nacross += 1 | |
132 nacross = int(nacross) | |
133 width = min(400,int(1200/nacross)) | |
134 html.append('<div class="toolFormTitle">%s images and outputs</div>' % sectionname) | |
135 html.append('(Click on a thumbnail image to download the corresponding original PDF image)<br/>') | |
136 ntogo = nacross # counter for table row padding with empty cells | |
137 html.append('<div><table class="simple" cellpadding="2" cellspacing="2">\n<tr>') | |
138 for i,paths in enumerate(ourpdfs): | |
139 fname,thumb = paths | |
140 s= """<td><a href="%s"><img src="%s" title="Click to download a PDF of %s" hspace="5" width="%d" | |
141 alt="Image called %s"/></a></td>\n""" % (fname,thumb,fname,width,fname) | |
142 if ((i+1) % nacross == 0): | |
143 s += '</tr>\n' | |
144 ntogo = 0 | |
145 if i < (npdf - 1): # more to come | |
146 s += '<tr>' | |
147 ntogo = nacross | |
148 else: | |
149 ntogo -= 1 | |
150 html.append(s) | |
151 if html[-1].strip().endswith('</tr>'): | |
152 html.append('</table></div>\n') | |
153 else: | |
154 if ntogo > 0: # pad | |
155 html.append('<td> </td>'*ntogo) | |
156 html.append('</tr></table></div>\n') | |
157 logt = open(logfname,'r').readlines() | |
158 logtext = [x for x in logt if x.strip() > ''] | |
159 html.append('<div class="toolFormTitle">%s log output</div>' % sectionname) | |
160 if len(logtext) > 1: | |
161 html.append('\n<pre>\n') | |
162 html += logtext | |
163 html.append('\n</pre>\n') | |
164 else: | |
165 html.append('%s is empty<br/>' % logfname) | |
166 if len(fhtml) > 0: | |
167 fhtml.insert(0,'<div><table class="colored" cellpadding="3" cellspacing="3"><tr><th>Output File Name (click to view)</th><th>Size</th></tr>\n') | |
168 fhtml.append('</table></div><br/>') | |
169 html.append('<div class="toolFormTitle">All output files available for downloading</div>\n') | |
170 html += fhtml # add all non-pdf files to the end of the display | |
171 else: | |
172 html.append('<div class="warningmessagelarge">### Error - %s returned no files - please confirm that parameters are sane</div>' % self.opts.interpreter) | |
173 html.append(galhtmlpostfix) | |
174 htmlf = file(self.opts.output_html,'w') | |
175 htmlf.write('\n'.join(html)) | |
176 htmlf.write('\n') | |
177 htmlf.close() | |
178 self.html = html | |
179 | |
180 |