···
import xml.sax.saxutils as xml
8
+
from collections import defaultdict
···
67
+
self.orderedChildren = defaultdict(list)
def checkChildrenAllowed(self):
'{} does not support children'.format(type(self)))
72
+
def allChildren(self):
73
+
''' Returns self.children and self.orderedChildren as a single list. '''
74
+
output = list(self.children)
75
+
for z in sorted(self.orderedChildren):
76
+
output.extend(self.orderedChildren[z])
return self.args.get('id', None)
···
def writeSvgElement(self, idGen, isDuplicate, outputFile, dryRun,
86
+
children = self.allChildren()
if isDuplicate(self) and self.id is None:
···
self.writeContent(idGen, isDuplicate, outputFile, dryRun)
self.writeChildrenContent(idGen, isDuplicate, outputFile,
···
outputFile.write(self.TAG_NAME)
writeXmlNodeArgs(self.args, outputFile)
96
-
if not self.hasContent and not self.children:
105
+
if not self.hasContent and not children:
self.writeContent(idGen, isDuplicate, outputFile, dryRun)
self.writeChildrenContent(idGen, isDuplicate, outputFile,
···
def writeChildrenContent(self, idGen, isDuplicate, outputFile, dryRun):
''' Override in a subclass to add data between the start and end
tags. This will not be called if hasContent is False. '''
124
+
children = self.allChildren()
116
-
for child in self.children:
126
+
for child in children:
child.writeSvgElement(idGen, isDuplicate, outputFile, dryRun)
120
-
for child in self.children:
130
+
for child in children:
child.writeSvgElement(idGen, isDuplicate, outputFile, dryRun)
···
if isinstance(v, DrawingElement)]
def writeSvgDefs(self, idGen, isDuplicate, outputFile, dryRun):
super().writeSvgDefs(idGen, isDuplicate, outputFile, dryRun)
128
-
for child in self.children:
138
+
for child in self.allChildren():
child.writeSvgDefs(idGen, isDuplicate, outputFile, dryRun)
if isinstance(other, type(self)):
return (self.TAG_NAME == other.TAG_NAME and
self.args == other.args and
134
-
self.children == other.children)
144
+
self.children == other.children and
145
+
self.orderedChildren == other.orderedChildren)
def appendAnim(self, animateElement):
self.children.append(animateElement)
···
class DrawingParentElement(DrawingBasicElement):
''' Base class for SVG elements that can have child nodes '''
144
-
def __init__(self, children=(), **args):
155
+
def __init__(self, children=(), orderedChildren=None, **args):
self.children = list(children)
147
-
if len(self.children) > 0:
158
+
if orderedChildren:
159
+
self.orderedChildren.update(
160
+
(z, list(v)) for z, v in orderedChildren.items())
161
+
if self.children or self.orderedChildren:
self.checkChildrenAllowed()
149
-
def draw(self, obj, **kwargs):
163
+
def draw(self, obj, *, z=None, **kwargs):
if not hasattr(obj, 'writeSvgElement'):
elements = obj.toDrawables(elements=elementsModule, **kwargs)
152
-
self.extend(elements)
156
-
def append(self, element):
171
+
self.extend(elements, z=z)
172
+
def append(self, element, *, z=None):
self.checkChildrenAllowed()
158
-
self.children.append(element)
159
-
def extend(self, iterable):
175
+
self.orderedChildren[z].append(element)
177
+
self.children.append(element)
178
+
def extend(self, iterable, *, z=None):
self.checkChildrenAllowed()
161
-
self.children.extend(iterable)
181
+
self.orderedChildren[z].extend(iterable)
183
+
self.children.extend(iterable)
def writeContent(self, idGen, isDuplicate, outputFile, dryRun):
···
def writeChildrenContent(self, idGen, isDuplicate, outputFile, dryRun):
''' Override in a subclass to add data between the start and end
tags. This will not be called if hasContent is False. '''
423
+
children = self.allChildren()
402
-
for child in self.children:
425
+
for child in children:
child.writeSvgElement(idGen, isDuplicate, outputFile, dryRun)
405
-
for child in self.children:
428
+
for child in children:
child.writeSvgElement(idGen, isDuplicate, outputFile, dryRun)
def appendLine(self, line, **kwargs):
self.append(TSpan(line, **kwargs))