Add bytefield.sty latex package to doclib
[senf.git] / doclib / 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:value-of select="dia:attribute[@name='name']/dia:string"/>
22     <xsl:text> </xsl:text>
23     <xsl:value-of select="dia:attribute[@name='obj_bb']/dia:rectangle/@val"/>
24     <xsl:text>&#x0a;</xsl:text>
25   </xsl:template>
26
27   <xsl:template match="dia:attribute[@name='obj_bb']/dia:rectangle">
28     <xsl:text>## </xsl:text>
29     <xsl:value-of select="@val"/>
30     <xsl:text>&#x0a;</xsl:text>
31   </xsl:template>
32
33 </xsl:stylesheet>
34 """.strip().encode('utf-8')
35
36 def xsltproc(source, stylesheet):
37     processor = Ft.Xml.Xslt.Processor.Processor()
38     processor.setDocumentReader(Ft.Xml.Domlette.NonvalidatingReader)
39     processor.appendStylesheet(stylesheet)
40     output = cStringIO.StringIO()
41     processor.run(source, outputStream = output)
42     return output.getvalue()
43
44 minx = miny = maxx = maxy = None
45 classes = {}
46
47 basename = sys.argv[1].rsplit('.',1)[0]
48 png = os.popen("pngtopnm %s.png 2>/dev/null" % basename)
49 png.readline()
50 size = map(int, png.readline().strip().split(' '))
51 png.read()
52
53 for line in xsltproc(InputFactory.fromStream(gzip.open(sys.argv[1]), sys.argv[1]),
54                      InputFactory.fromString(stylesheet, '<string>')).strip().split("\n"):
55     name,box = line.rsplit(' ',1)
56     tlx, tly, brx, bry = (float(val)
57                           for point in box.split(';')
58                           for val in point.split(','))
59     name = name[1:-1]
60     if minx is None or tlx<minx : minx = tlx
61     if maxx is None or tlx>maxx : maxx = tlx
62     if minx is None or brx<minx : minx = brx
63     if maxx is None or brx>maxx : maxx = brx
64     if miny is None or tly<miny : miny = tly
65     if maxy is None or tly>maxy : maxy = tly
66     if miny is None or bry<miny : miny = bry
67     if maxy is None or bry>maxy : maxy = bry 
68     if name:
69         classes[name] = (tlx, tly, brx, bry)
70
71 print '<div class="diamap" name="%s">' % basename
72 for name,box in classes.iteritems():
73     print '<span coords="%d,%d,%d,%d">\\ref %s</span>' % (
74         (box[0]-minx)*size[0]/(maxx-minx),
75         (box[1]-miny)*size[1]/(maxy-miny),
76         (box[2]-minx)*size[0]/(maxx-minx),
77         (box[3]-miny)*size[1]/(maxy-miny),
78         name)
79 print '</div>'
80 print '\\htmlonly <img src="%s.png" border="0" alt="%s" usemap="#%s"> \\endhtmlonly' % (
81     basename,basename,basename)