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:
|
||||
|
|
|
|||
|
|
@ -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
14
unittests/nested-defs.svg
Normal 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 |
Loading…
Add table
Add a link
Reference in a new issue