Apply a modified patch submitted by Jan Thor in bug 717254 to fix a bug whereby Scour would keep the <defs/> element if it was there but had only whitespace or unreferenced children.

This commit is contained in:
Louis Simard 2011-02-11 12:29:20 -05:00
parent bdae2bafae
commit 4657cb7515
4 changed files with 61 additions and 20 deletions

View file

@ -596,8 +596,9 @@ def removeUnreferencedElements(doc):
"""
global numElemsRemoved
num = 0
# Remove certain unreferenced elements outside of defs
removeTags = ['linearGradient', 'radialGradient', 'pattern']
identifiedElements = findElementsWithId(doc.documentElement)
referencedIDs = findReferencedElements(doc.documentElement)
@ -609,8 +610,7 @@ def removeUnreferencedElements(doc):
num += 1
numElemsRemoved += 1
# TODO: should also go through defs and vacuum it
num = 0
# Remove most unreferenced elements inside defs
defs = doc.documentElement.getElementsByTagName('defs')
for aDef in defs:
elemsToRemove = removeUnusedDefs(doc, aDef)
@ -2784,15 +2784,21 @@ def scourString(in_string, options=None):
if options.remove_metadata:
removeMetadataElements(doc)
# remove unreferenced gradients/patterns outside of defs
# and most unreferenced elements inside of defs
while removeUnreferencedElements(doc) > 0:
pass
# remove empty defs, metadata, g
# NOTE: these elements will be removed even if they have (invalid) text nodes
elemsToRemove = []
# NOTE: these elements will be removed if they just have whitespace-only text nodes
for tag in ['defs', 'metadata', 'g'] :
for elem in doc.documentElement.getElementsByTagName(tag) :
removeElem = not elem.hasChildNodes()
if removeElem == False :
for child in elem.childNodes :
if child.nodeType in [1, 3, 4, 8] :
if child.nodeType in [1, 4, 8]:
break
elif child.nodeType == 3 and not child.nodeValue.isspace():
break
else:
removeElem = True
@ -2800,10 +2806,6 @@ def scourString(in_string, options=None):
elem.parentNode.removeChild(elem)
numElemsRemoved += 1
# remove unreferenced gradients/patterns outside of defs
while removeUnreferencedElements(doc) > 0:
pass
if options.strip_ids:
bContinueLooping = True
while bContinueLooping: