4 import Ft.Xml.Xslt.Processor
6 from Ft.Xml.InputSource import DefaultFactory as InputFactory
10 <?xml version="1.0" encoding="utf-8"?>
12 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
13 xmlns:dia="http://www.lysator.liu.se/~alla/dia/"
16 <xsl:output method="text"/>
18 <xsl:template match="text()"/>
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>
</xsl:text>
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>
</xsl:text>
34 """.strip().encode('utf-8')
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()
44 minx = miny = maxx = maxy = None
47 basename = sys.argv[1].rsplit('.',1)[0]
48 png = os.popen("pngtopnm %s.png 2>/dev/null" % basename)
50 size = map(int, png.readline().strip().split(' '))
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(','))
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
69 classes[name] = (tlx, tly, brx, bry)
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),
80 print '\\htmlonly <img src="%s.png" border="0" alt="%s" usemap="#%s"> \\endhtmlonly' % (
81 basename,basename,basename)