From 066c6278334062a3b0f48c405ca1d85f9f271141 Mon Sep 17 00:00:00 2001 From: JSCHILL1 Date: Wed, 15 Apr 2009 10:58:06 -0500 Subject: [PATCH] Remove unreferenced patterns and gradients outside of a defs --- fulltests/notification-audio-next.svg | 581 +++++++++++++++++++++++++ package.sh | 2 +- scour.py | 35 +- testscour.py | 11 + unittests/duplicate-gradient-stops.svg | 11 + unittests/inkscape.svg | 2 +- unittests/unreferenced-pattern.svg | 5 + 7 files changed, 640 insertions(+), 7 deletions(-) create mode 100644 fulltests/notification-audio-next.svg create mode 100644 unittests/duplicate-gradient-stops.svg create mode 100644 unittests/unreferenced-pattern.svg 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 @@ + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 @@ - diff --git a/unittests/unreferenced-pattern.svg b/unittests/unreferenced-pattern.svg new file mode 100644 index 0000000..8e43ffb --- /dev/null +++ b/unittests/unreferenced-pattern.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file