Fix nested defs problem and add unit test

This commit is contained in:
Jeff Schiller 2012-03-26 23:33:27 -07:00
parent ac6d4529bd
commit 4b10b6d627
3 changed files with 42 additions and 0 deletions

View file

@ -565,6 +565,25 @@ numBytesSavedInTransforms = 0
numPointsRemovedFromPolygon = 0
numCommentBytes = 0
def flattenDefs(doc):
"""
Puts all defined elements into a newly created defs in the document. This function
handles recursive defs elements.
"""
defs = doc.documentElement.getElementsByTagName('defs')
if defs.length > 1:
topDef = doc.createElementNS(NS['SVG'], 'defs')
for defElem in defs:
# Remove all children of this defs and put it into the topDef.
while defElem.hasChildNodes():
topDef.appendChild(defElem.firstChild)
defElem.parentNode.removeChild(defElem)
if topDef.hasChildNodes():
doc.documentElement.insertBefore(topDef, doc.documentElement.firstChild)
def removeUnusedDefs(doc, defElem, elemsToRemove=None):
if elemsToRemove is None:
elemsToRemove = []
@ -2887,6 +2906,9 @@ def scourString(in_string, options=None):
if options.remove_metadata:
removeMetadataElements(doc)
# flattend defs elements into just one defs element
flattenDefs(doc)
# remove unreferenced gradients/patterns outside of defs
# and most unreferenced elements inside of defs
while removeUnreferencedElements(doc) > 0: