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:

View file

@ -172,6 +172,12 @@ class KeepTitleInDefs(unittest.TestCase):
self.assertEquals(len(doc.getElementsByTagNameNS(SVGNS, 'title')), 1,
'Title removed from in defs' )
class RemoveNestedDefs(unittest.TestCase):
def runTest(self):
doc = scour.scourXmlFile('unittests/nested-defs.svg')
allDefs = doc.getElementsByTagNameNS(SVGNS, 'defs')
self.assertEquals(len(allDefs), 1, 'More than one defs left in doc')
class KeepUnreferencedIDsWhenEnabled(unittest.TestCase):
def runTest(self):
doc = scour.scourXmlFile('unittests/ids-to-strip.svg')

14
unittests/nested-defs.svg Normal file
View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<defs>
<linearGradient id="linearGradient662">
<stop style="stop-color:#000000;stop-opacity:1" offset="0"/>
<stop style="stop-color:#0000ff;stop-opacity:1" offset="1"/>
</linearGradient>
</defs>
<linearGradient x1="120.22393" y1="156.07137" x2="119.33763" y2="162.87338" id="linearGradient3211" xlink:href="#linearGradient662" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.789103,0,0,1.131232,0.366124,452.0845)"/>
</defs>
<path d="m50 50h50v50h-50z" fill="url(#linearGradient3211)"/>
</svg>

After

Width:  |  Height:  |  Size: 732 B