Fix nested defs problem and add unit test
This commit is contained in:
parent
ac6d4529bd
commit
4b10b6d627
3 changed files with 42 additions and 0 deletions
22
scour.py
22
scour.py
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue