|
|
@@ -1,16 +1,18 @@
|
|
|
"""
|
|
|
-Generates a Draw.IO file from the in-memory specification.
|
|
|
+Functions for converting in-memory drawio data to XML.
|
|
|
"""
|
|
|
|
|
|
import xml.etree.ElementTree as ET
|
|
|
from drawio2py.abstract_syntax import *
|
|
|
|
|
|
|
|
|
+# generates XML tree and serializes it to a file (or any writeable object)
|
|
|
def generate(drawio: DrawIOFile, file_object):
|
|
|
graph = generate_mxfile(drawio)
|
|
|
et = ET.ElementTree(graph)
|
|
|
et.write(file_object)
|
|
|
|
|
|
+# generates XML tree for a drawio "file" (root element: <mxfile>)
|
|
|
def generate_mxfile(drawio: DrawIOFile) -> ET.Element:
|
|
|
graph = ET.Element("mxfile", {
|
|
|
"compressed": "false", # always write uncompressed files
|
|
|
@@ -23,7 +25,7 @@ def generate_mxfile(drawio: DrawIOFile) -> ET.Element:
|
|
|
graph.append(dia)
|
|
|
return graph
|
|
|
|
|
|
-
|
|
|
+# generates XML tree for a drawio "page" (root element: <diagram>)
|
|
|
def generate_diagram(page: Page) -> ET.Element:
|
|
|
dia = ET.Element("diagram", {
|
|
|
"id": str(page.id),
|
|
|
@@ -81,32 +83,30 @@ def generate_diagram(page: Page) -> ET.Element:
|
|
|
})
|
|
|
return ET.SubElement(parent_xml, "mxPoint", attrs)
|
|
|
|
|
|
- # Geometry
|
|
|
- if isinstance(cell, Vertex):
|
|
|
- g = ET.SubElement(c, "mxGeometry", optional_attributes({
|
|
|
- "x": cell.geometry.x,
|
|
|
- "y": cell.geometry.y,
|
|
|
- "width": cell.geometry.width,
|
|
|
- "height": cell.geometry.height,
|
|
|
+ def write_geometry(parent_xml, geometry):
|
|
|
+ return ET.SubElement(parent_xml, "mxGeometry", optional_attributes({
|
|
|
+ "x": geometry.x,
|
|
|
+ "y": geometry.y,
|
|
|
+ "width": geometry.width,
|
|
|
+ "height": geometry.height,
|
|
|
+ "relative": "1" if geometry.relative else None,
|
|
|
"as": "geometry",
|
|
|
}))
|
|
|
+
|
|
|
+ # Geometry
|
|
|
+ if isinstance(cell, Vertex) or isinstance(cell, Edge):
|
|
|
+ g = write_geometry(c, cell.geometry)
|
|
|
if cell.geometry.offset != None:
|
|
|
write_point(g, cell.geometry.offset, "offset")
|
|
|
- elif isinstance(cell, Edge):
|
|
|
- g = ET.SubElement(c, "mxGeometry", {
|
|
|
- "relative": "1",
|
|
|
- "as": "geometry",
|
|
|
- })
|
|
|
- if len(cell.geometry.points) > 0:
|
|
|
- a = ET.SubElement(g, "Array", {"as": "points"})
|
|
|
- for p in cell.geometry.points:
|
|
|
- write_point(a, p)
|
|
|
- if cell.geometry.source_point is not None:
|
|
|
- write_point(g, cell.geometry.source_point, "sourcePoint")
|
|
|
- if cell.geometry.target_point is not None:
|
|
|
- write_point(g, cell.geometry.target_point, "targetPoint")
|
|
|
- if cell.geometry.offset != None:
|
|
|
- write_point(g, cell.geometry.offset, "offset")
|
|
|
+ if isinstance(cell, Edge):
|
|
|
+ if len(cell.geometry.points) > 0:
|
|
|
+ a = ET.SubElement(g, "Array", {"as": "points"})
|
|
|
+ for p in cell.geometry.points:
|
|
|
+ write_point(a, p)
|
|
|
+ if cell.geometry.source_point is not None:
|
|
|
+ write_point(g, cell.geometry.source_point, "sourcePoint")
|
|
|
+ if cell.geometry.target_point is not None:
|
|
|
+ write_point(g, cell.geometry.target_point, "targetPoint")
|
|
|
|
|
|
for child in cell.children:
|
|
|
write_cell(child)
|