diff --git a/fulltests/notification-audio-next.svg b/fulltests/notification-audio-next.svg
new file mode 100644
index 0000000..7251a9b
--- /dev/null
+++ b/fulltests/notification-audio-next.svg
@@ -0,0 +1,581 @@
+
+
+
\ No newline at end of file
diff --git a/package.sh b/package.sh
index c4a8416..be8c1a0 100755
--- a/package.sh
+++ b/package.sh
@@ -1,4 +1,4 @@
#!/bin/bash
-SCOURVER="0.06"
+SCOURVER="0.07"
tar cvf scour-$SCOURVER.tar scour.py LICENSE NOTICE README.txt
gzip scour-$SCOURVER.tar
diff --git a/scour.py b/scour.py
index 2d88ee2..69e1f76 100755
--- a/scour.py
+++ b/scour.py
@@ -49,9 +49,10 @@
# Next Up:
# + moved all functionality into a module level function named 'scour' and only call it
# when being run as main (for unit testing)
-# - Removed duplicate gradient stops
+# + prevent metadata from being removed if they contain only text nodes
+# - Remove unreferenced pattern elements
+# - Remove duplicate gradient stops
# - Convert all colors to #RRGGBB format
-# - prevent metadata from being removed if they contain only text nodes
# - rework command-line argument processing so that options are configurable
# - remove unreferenced patterns? https://bugs.edge.launchpad.net/ubuntu/+source/human-icon-theme/+bug/361667/
@@ -205,18 +206,39 @@ def removeUnreferencedIDs(referencedIDs, identifiedElements):
num += 1
return num
+# returns the number of unreferenced children removed from defs elements
def vacuumDefs(doc):
global numElemsRemoved
num = 0
defs = doc.documentElement.getElementsByTagNameNS(NS['SVG'], 'defs')
for aDef in defs:
+ elemsToRemove = []
for elem in aDef.childNodes:
if elem.nodeType == 1 and elem.getAttribute('id') == '' :
- aDef.removeChild(elem)
- numElemsRemoved += 1
- num += 1
+ elemsToRemove.append(elem)
+ for elem in elemsToRemove:
+ aDef.removeChild(elem)
+ numElemsRemoved += 1
+ num += 1
return num
+# returns the number of unreferenced gradients or patterns removed from the document
+# (this relies on the ids being removed first)
+def removeUnreferencedElements(doc):
+ global numElemsRemoved
+ num = 0
+ for tag in ['pattern', 'linearGradient', 'radialGradient'] :
+ elems = doc.documentElement.getElementsByTagNameNS(NS['SVG'], tag)
+ elemsToRemove = []
+ for elem in elems:
+ if elem.getAttribute('id') == '' :
+ elemsToRemove.append(elem)
+ for elem in elemsToRemove:
+ elem.parentNode.removeChild(elem)
+ numElemsRemoved += 1
+ num += 1
+ return num
+
def removeNamespacedAttributes(node, namespaces):
global numAttrsRemoved
num = 0
@@ -608,6 +630,9 @@ def scourString(in_string):
elem.parentNode.removeChild(elem)
numElemsRemoved += 1
+ # remove unreferenced gradients/patterns outside of defs
+ removeUnreferencedElements(doc)
+
# clean path data
for elem in doc.documentElement.getElementsByTagNameNS(NS['SVG'], 'path') :
cleanPath(elem)
diff --git a/testscour.py b/testscour.py
index 43116c2..2877ed5 100755
--- a/testscour.py
+++ b/testscour.py
@@ -120,5 +120,16 @@ class RemoveEmptyGElements(unittest.TestCase):
self.assertEquals(len(doc.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'g')), 1,
'Did not remove empty g element' )
+class RemoveUnreferencedPattern(unittest.TestCase):
+ def runTest(self):
+ doc = scour.scourXmlFile('unittests/unreferenced-pattern.svg')
+ self.assertEquals(len(doc.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'pattern')), 0,
+ 'Unreferenced pattern not removed' )
+
+# These tests will fail at present
+#class RemoveDuplicateGradientStops(unittest.TestCase):
+# def runTest(self):
+# doc = scour.scourXmlFile('unittests/duplicate-gradient-stops.svg')
+
if __name__ == '__main__':
unittest.main()
diff --git a/unittests/duplicate-gradient-stops.svg b/unittests/duplicate-gradient-stops.svg
new file mode 100644
index 0000000..010bb95
--- /dev/null
+++ b/unittests/duplicate-gradient-stops.svg
@@ -0,0 +1,11 @@
+
diff --git a/unittests/inkscape.svg b/unittests/inkscape.svg
index 4b72559..1ce1a80 100644
--- a/unittests/inkscape.svg
+++ b/unittests/inkscape.svg
@@ -1,4 +1,4 @@
-