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']">
22 <xsl:when test="dia:attribute[@name='comment']/dia:string!='##'">
23 <xsl:value-of select="dia:attribute[@name='comment']/dia:string"/>
26 <xsl:value-of select="dia:attribute[@name='name']/dia:string"/>
29 <xsl:text> </xsl:text>
30 <xsl:value-of select="dia:attribute[@name='obj_bb']/dia:rectangle/@val"/>
31 <xsl:text>
</xsl:text>
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>
</xsl:text>
41 """.strip().encode('utf-8')
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()
51 minx = miny = maxx = maxy = None
54 basename = sys.argv[1].rsplit('.',1)[0]
55 png = os.popen("pngtopnm %s.png 2>/dev/null" % basename)
57 size = map(int, png.readline().strip().split(' '))
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(','))
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
76 classes[name] = (tlx, tly, brx, bry)
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),
87 print '\\htmlonly <img src="%s.png" border="0" alt="%s" usemap="#%s"> \\endhtmlonly' % (
88 basename,basename,basename)