source: TI03-DataExtractor/branches/titania_install/bin/cdms2html.py @ 1520

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI03-DataExtractor/branches/titania_install/bin/cdms2html.py@1709
Revision 1520, 8.0 KB checked in by astephen, 14 years ago (diff)

This is the live version on titania - changes have been made so safest to SVN it.

  • Property svn:executable set to *
Line 
1#!/usr/bin/env python
2
3"""
4cdms2html.py
5============
6
7Script to generate an HTML document representing a CDMS dataset.
8Began as 'cd2html.py' script and extended by BADC.
9
10Usage:
11======
12
13    cd2html.py -o <html_file> <input_file1> [<input_file2> ...]
14
15Where:
16======
17
18    <html_file>     - is the output HTML file path.
19    <input_file>    - a list of files in the the existing dataset that will be summarised in
20                      the output HTML file.
21
22"""
23
24import cdms, sys, string, re, getopt
25from cdms.cdmsNode import NumericToCdType
26from cdms.avariable import AbstractVariable
27#from cdms.axis import AbstractAxis
28
29TITLE="HadGEM1 Atmospheric Monthly Means"
30
31_Illegal = re.compile('([<>&\"])|([^\t\r\n -\176\240-\377])')   #" illegal chars in content
32
33def head(dset):
34    print """<head>
35<title>%s</title>
36<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
37</head>"""%dset.id
38
39def title(dset, filepath):
40   
41    #from seealso import seealso, url
42    #doc = seealso.get(dset.id)
43    doc=None
44    if doc is None:
45        doc = "http://www-pcmdi.llnl.gov"
46    else:
47        doc = doc[url]
48    print """<div align="center">
49  <p><font face="Georgia, Times New Roman, Times, serif"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="#0080FF">%s</font><font face="Verdana, Arial, Helvetica, sans-serif" size="4"> </font></b></font></p>
50</div>"""% TITLE #dset.id
51    start, end=getTimeRange(dset)
52    print """<p align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
53    <b><font size="3" color="#008000">
54    Example file listing from the %s dataset.
55    This listing is taken from the first file in the dataset but the
56    date range for the entire dataset is %s to %s.</font></b></font></p>
57    """ % (TITLE, start, end)
58    print """<p align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
59            <b><font color="#008000" size="3">Filepath:</font><font size="3"> %s</font>
60            </b></font></p>"""%(strof(filepath))
61   
62
63def getTimeRange(dset):
64    vars=dset.listvariables()
65    earliest="undefined"
66    latest="undefined"
67    for var in vars:
68        timeAx=dset[var].getTime()
69        if timeAx:
70            comptimes=timeAx.asComponentTime()
71            start=str(comptimes[0])
72            end=str(comptimes[-1])
73            if start<earliest or earliest=="undefined":
74                earliest=start
75            if end>latest or latest=="undefined":
76                latest=end
77    return earliest, latest
78   
79
80   
81def globalAttrs(dset):
82    heading("Global metadata in this dataset")
83    print "<blockquote>"
84    for key,value in dset.attributes.items():
85        if key not in ['cdms_filemap', 'directory', 'history']:
86            print """<font face="Verdana, Arial, Helvetica, sans-serif" size="2">
87            <b><font color="#008000" size="3">%s</font><font size="3"> = %s</font>
88            </b></font><br>"""%(key,strof(value))
89    print "</blockquote>"
90
91
92def heading(name):
93    print """<p align="left"><font size="3"><b>
94    <font face="Verdana, Arial, Helvetica, sans-serif" color="#800000">%s</font>
95    <font face="Verdana, Arial, Helvetica, sans-serif">:</font></b></font></p>"""%name
96
97# Map illegal XML characters to entity references:
98# '<' --> &lt;
99# '>' --> &gt;
100# '&' --> &amp;
101# '"' --> &quot;
102# "'" --> &apos;
103# all other illegal characters are removed #"
104def mapIllegalToEntity(matchobj):
105    s = matchobj.group(0)
106    if s == '<':
107        return '&lt;'
108    elif s == '>':
109        return '&gt;'
110    elif s == '&':
111        return '&amp;'
112    elif s == '"':   #"
113        return '&quot;'
114    else:
115        return ""
116
117def strof(s):
118    if type(s) is type(''):
119        ss = '"%s"'%s
120    else:
121        ss = str(s)
122    return _Illegal.sub(mapIllegalToEntity,str(ss))
123
124def attrs(obj):
125    print '  <blockquote>'
126    keys = obj.attributes.keys()
127    keys.sort()
128    for key in keys:
129        if key not in ["datatype", "length","isvar","name_in_file","partition","partition_length"]:
130            value = obj.attributes[key]
131            if value is None:
132                continue
133            print """<font size="3"><b>
134            <font face="Verdana, Arial, Helvetica, sans-serif" color="#004080">%s</font>
135            <font face="Verdana, Arial, Helvetica, sans-serif"> : <font color="#008000">%s</font> = %s</font></b></font><br>"""%(obj.id, key, strof(value))
136    print '  </blockquote>'
137
138def join(x,y):
139    return x+', '+y
140
141def subof(a):
142    if isinstance(a,AbstractVariable):
143        ids = a.getAxisIds()
144        if len(ids)>0:
145            return reduce(join,ids)
146        else:
147            return ''
148    else:
149        return str(len(a))
150
151def axisSummary(a):
152    if isinstance(a,AbstractVariable):       
153        axes = a.getAxisList()
154       
155        if len(axes)>0:
156            axesInfo=""
157            for axis in axes:
158                name, length=(axis.id, len(axis))
159                axesInfo=axesInfo+(", %s [%s]" % (name, length))
160           
161            return "(%s)" % axesInfo[2:] 
162        else:
163            return ''
164    else:
165        return "(No axis info)"
166
167def obj(a):
168    tc = string.lower(NumericToCdType[a.typecode()])
169    print """ <br><font size="3"><b>
170    <font face="Verdana, Arial, Helvetica, sans-serif">%s <font color="#004080">%s</font>
171    (%s)</font></b></font>"""%(tc,a.id,subof(a))
172    attrs(a)
173
174def getBestName(a):
175    if hasattr(a, "standard_name"):
176        return a.standard_name
177    if hasattr(a, "long_name"):
178        return a.long_name
179    if hasattr(a, "name"):
180        return a.name
181    if hasattr(a, "title"):
182        return a.title
183    return a.id
184
185def shortVar(a):
186    print """<p><font size="3"><b>
187    <font face="Verdana, Arial, Helvetica, sans-serif">
188    <font color="#004080">%s</font> -"%s"</font>
189    </font>
190    <blockquote>Axes: %s</b></blockquote></p>"""%(a.id, getBestName(a), axisSummary(a))   
191
192def getAxes(dset):
193    heading("Axis details")
194    print '<blockquote>'
195    vars=dset.listvariables()
196    axisList=[]
197    for var in vars:
198        axes=dset[var].getAxisList()
199        for axis in axes:
200            if axis not in axisList:
201                axisList.append(axis)
202
203    axisList.sort()
204    for axis in axisList:
205        obj(axis)
206    print '</blockquote>'
207
208def axes(dset):
209    heading('Axes')
210    print '<blockquote>'
211    keys = dset.axes.keys()
212    keys.sort()
213    for key in keys:
214        obj(dset.axes[key])
215    print '</blockquote>'
216
217def vars(dset):
218    heading("Variables contained in this dataset")
219    keys = dset.variables.keys()
220    keys.sort()
221
222    print '<blockquote>'
223    for key in keys:
224        shortVar(dset.variables[key])   
225
226    print '</blockquote>'
227   
228    heading('Full variable listings')
229    print '<blockquote>'
230    for key in keys:
231        obj(dset.variables[key])
232    print '</blockquote>'
233
234
235def data(dset):
236    heading('Axis values')
237    print '<blockquote>'
238    keys = dset.axes.keys()
239    keys.sort()
240    for key in keys:
241        a = dset.axes[key]
242        if a.isTime():
243            values = a.asComponentTime(a.getCalendar())
244        else:
245            values = a[:]
246        if len(values)>100:
247            sval = str(values[:100])[:-1]+" ... "+str(values[-1])+"]"
248        else:
249            sval = str(values)
250        print """  <p><font size="3"><b><font face="Verdana, Arial, Helvetica, sans-serif" color="#004080">%s</font><font face="Verdana, Arial, Helvetica, sans-serif">
251    = %s</font></b></font></p>"""%(a.id, sval)
252    print '</blockquote>'
253
254def body(dset, filepath):
255    print '<body bgcolor="#FFFFFF" text="#000000">'
256    title(dset, filepath)
257    globalAttrs(dset)
258    vars(dset)
259    #axes(dset)
260    getAxes(dset)
261    data(dset)
262    print '</body>'
263
264def translate(dset, filepath):
265    print '<html>'
266    head(dset)
267    body(dset, filepath)
268    print '</html>'
269
270def main(datafiles, htmlfile):
271    xmlfile = datafiles[0]
272
273    f = cdms.open(xmlfile)
274    sys.stdout = open(htmlfile,'w')
275    translate(f, xmlfile)
276    f.close()
277    sys.stdout.close()
278
279if __name__ == '__main__':
280    args=sys.argv[1:]
281    htmlfile=None
282   
283    (argList, datafiles)=getopt.getopt(args, "o:")
284    for arg, value in argList:
285        if arg=="-o":
286            htmlfile=value
287   
288   
289    main(datafiles, htmlfile)
Note: See TracBrowser for help on using the repository browser.