minor fixes for clang++
[senf.git] / site_scons / lib / makeDiaImageMap.py
1 #!/usr/bin/python
2
3 import sys, os, gzip
4 import Ft.Xml.Xslt.Processor
5 import Ft.Xml.Domlette
6 from Ft.Xml.InputSource import DefaultFactory as InputFactory
7 import cStringIO
8
9 stylesheet=u"""
10 <?xml version="1.0" encoding="utf-8"?>
11 <xsl:stylesheet 
12   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
13   xmlns:dia="http://www.lysator.liu.se/~alla/dia/"
14   version="1.0">
15
16   <xsl:output method="text"/>
17
18   <xsl:template match="text()"/>
19
20   <xsl:template match="dia:object[@type='UML - Class']">
21     <xsl:choose>
22       <xsl:when test="dia:attribute[@name='comment']/dia:string!='##'">
23         <xsl:value-of select="dia:attribute[@name='comment']/dia:string"/>
24       </xsl:when>
25       <xsl:otherwise>
26         <xsl:value-of select="dia:attribute[@name='name']/dia:string"/>
27       </xsl:otherwise>
28     </xsl:choose>
29     <xsl:text> </xsl:text>
30     <xsl:value-of select="dia:attribute[@name='obj_bb']/dia:rectangle/@val"/>
31     <xsl:text>&#x0a;</xsl:text>
32   </xsl:template>
33
34   <xsl:template match="dia:attribute[@name='obj_bb']/dia:rectangle">
35     <xsl:text>!! </xsl:text>
36     <xsl:value-of select="@val"/>
37     <xsl:text>&#x0a;</xsl:text>
38   </xsl:template>
39
40 </xsl:stylesheet>
41 """.strip().encode('utf-8')
42
43 def xsltproc(source, stylesheet):
44     processor = Ft.Xml.Xslt.Processor.Processor()
45     processor.setDocumentReader(Ft.Xml.Domlette.NonvalidatingReader)
46     processor.appendStylesheet(stylesheet)
47     output = cStringIO.StringIO()
48     processor.run(source, outputStream = output)
49     return output.getvalue()
50
51 minx = miny = maxx = maxy = None
52 classes = {}
53
54 basename = sys.argv[1].rsplit('.',1)[0]
55 png = os.popen("pngtopnm %s.png 2>/dev/null" % basename)
56 png.readline()
57 size = map(int, png.readline().strip().split(' '))
58 png.read()
59
60 for line in xsltproc(InputFactory.fromStream(gzip.open(sys.argv[1]), sys.argv[1]),
61                      InputFactory.fromString(stylesheet, '<string>')).strip().split("\n"):
62     name,box = line.rsplit(' ',1)
63     tlx, tly, brx, bry = (float(val)
64                           for point in box.split(';')
65                           for val in point.split(','))
66     name = name[1:-1]
67     if minx is None or tlx<minx : minx = tlx
68     if maxx is None or tlx>maxx : maxx = tlx
69     if minx is None or brx<minx : minx = brx
70     if maxx is None or brx>maxx : maxx = brx
71     if miny is None or tly<miny : miny = tly
72     if maxy is None or tly>maxy : maxy = tly
73     if miny is None or bry<miny : miny = bry
74     if maxy is None or bry>maxy : maxy = bry 
75     if name:
76         classes[name] = (tlx, tly, brx, bry)
77
78 print '<div class="diamap" name="%s">' % basename
79 for name,box in classes.iteritems():
80     print '<span coords="%d,%d,%d,%d">\\ref %s</span>' % (
81         (box[0]-minx)*size[0]/(maxx-minx),
82         (box[1]-miny)*size[1]/(maxy-miny),
83         (box[2]-minx)*size[0]/(maxx-minx),
84         (box[3]-miny)*size[1]/(maxy-miny),
85         name)
86 print '</div>'
87 print '\\htmlonly <img src="%s.png" border="0" alt="%s" usemap="#%s"> \\endhtmlonly' % (
88     basename,basename,basename)