Fix #296, don't remove elements with referenced children
This commit is contained in:
parent
0609c59676
commit
544027fa94
3 changed files with 22 additions and 3 deletions
|
|
@ -646,7 +646,7 @@ def removeUnusedDefs(doc, defElem, elemsToRemove=None, referencedIDs=None):
|
|||
# removeUnusedDefs do not change the XML itself; therefore there is no point in
|
||||
# recomputing findReferencedElements when we recurse into child nodes.
|
||||
if referencedIDs is None:
|
||||
referencedIDs = findReferencedElements(doc.documentElement)
|
||||
referencedIDs = set(findReferencedElements(doc.documentElement).keys())
|
||||
|
||||
keepTags = ['font', 'style', 'metadata', 'script', 'title', 'desc']
|
||||
for elem in defElem.childNodes:
|
||||
|
|
@ -660,10 +660,13 @@ def removeUnusedDefs(doc, defElem, elemsToRemove=None, referencedIDs=None):
|
|||
# we only inspect the children of a group in a defs if the group
|
||||
# is not referenced anywhere else
|
||||
if elem.nodeName == 'g' and elem.namespaceURI == NS['SVG']:
|
||||
elemsToRemove = removeUnusedDefs(doc, elem, elemsToRemove, referencedIDs=referencedIDs)
|
||||
removeUnusedDefs(doc, elem, elemsToRemove, referencedIDs=referencedIDs)
|
||||
# we only remove if it is not one of our tags we always keep (see above)
|
||||
# also we can't remove an element if a child is referenced
|
||||
elif elem.nodeName not in keepTags:
|
||||
elemsToRemove.append(elem)
|
||||
if (set(findElementsWithId(elem).keys()).intersection(referencedIDs) == set() or
|
||||
elem.tagName == 'defs'):
|
||||
elemsToRemove.append(elem)
|
||||
return elemsToRemove
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -379,6 +379,13 @@ class KeepUnreferencedDefs(unittest.TestCase):
|
|||
self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'circle')), 1,
|
||||
'Unreferenced circle removed from defs with `--keep-unreferenced-defs`')
|
||||
|
||||
class KeepUnreferencedElementWithReferencedChild(unittest.TestCase):
|
||||
def runTest(self):
|
||||
doc = scourXmlFile('unittests/referenced_child.svg')
|
||||
|
||||
self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'rect')), 1,
|
||||
'Referenced element was deleted')
|
||||
|
||||
|
||||
class DoNotRemoveChainedRefsInDefs(unittest.TestCase):
|
||||
|
||||
|
|
|
|||
9
unittests/referenced_child.svg
Normal file
9
unittests/referenced_child.svg
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<defs>
|
||||
<clipPath id="unusedclip">
|
||||
<rect id="the_path" width="100" height="100"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<use fill="red" width="100%" height="100%" xlink:href="#the_path"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 343 B |
Loading…
Add table
Add a link
Reference in a new issue