From fe2884c3e8f4eecc552af49dc7bb0569f4abeba2 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 Aug 2016 18:52:55 +0200 Subject: [PATCH] Don't remove unreferenced defs if `--keep-unreferenced-defs` is specified (#62) * Don't remove unreferenced defs if `--keep-unreferenced-defs` is specified (fixes #18) * Add unittests for previous commit --- scour/scour.py | 4 +++- testscour.py | 29 +++++++++++++++++++++++++++++ unittests/unreferenced-defs.svg | 19 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 unittests/unreferenced-defs.svg diff --git a/scour/scour.py b/scour/scour.py index f65e271..5e9aaf0 100644 --- a/scour/scour.py +++ b/scour/scour.py @@ -623,7 +623,9 @@ def removeUnreferencedElements(doc, keepDefs): for id in identifiedElements: if not id in referencedIDs: goner = identifiedElements[id] - if goner != None and goner.parentNode != None and goner.nodeName in removeTags: + if (goner != None and goner.nodeName in removeTags + and goner.parentNode != None + and goner.parentNode.tagName != 'defs'): goner.parentNode.removeChild(goner) num += 1 numElemsRemoved += 1 diff --git a/testscour.py b/testscour.py index ee2eef7..06eaf49 100755 --- a/testscour.py +++ b/testscour.py @@ -176,6 +176,35 @@ class RemoveUnreferencedElementInDefs(unittest.TestCase): self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'rect')), 1, 'Unreferenced rect left in defs' ) +class RemoveUnreferencedDefs(unittest.TestCase): + def runTest(self): + doc = scour.scourXmlFile('unittests/unreferenced-defs.svg') + self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'linearGradient')), 1, + 'Referenced linearGradient removed from defs' ) + self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'radialGradient')), 0, + 'Unreferenced radialGradient left in defs' ) + self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'pattern')), 0, + 'Unreferenced pattern left in defs' ) + self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'rect')), 1, + 'Referenced rect removed from defs' ) + self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'circle')), 0, + 'Unreferenced circle left in defs' ) + +class KeepUnreferencedDefs(unittest.TestCase): + def runTest(self): + doc = scour.scourXmlFile('unittests/unreferenced-defs.svg', + scour.parse_args(['--keep-unreferenced-defs'])[0]) + self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'linearGradient')), 1, + 'Referenced linearGradient removed from defs with `--keep-unreferenced-defs`' ) + self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'radialGradient')), 1, + 'Unreferenced radialGradient removed from defs with `--keep-unreferenced-defs`' ) + self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'pattern')), 1, + 'Unreferenced pattern removed from defs with `--keep-unreferenced-defs`' ) + self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'rect')), 1, + 'Referenced rect removed from defs with `--keep-unreferenced-defs`' ) + self.assertEqual(len(doc.getElementsByTagNameNS(SVGNS, 'circle')), 1, + 'Unreferenced circle removed from defs with `--keep-unreferenced-defs`' ) + class DoNotRemoveChainedRefsInDefs(unittest.TestCase): def runTest(self): doc = scour.scourXmlFile('unittests/refs-in-defs.svg') diff --git a/unittests/unreferenced-defs.svg b/unittests/unreferenced-defs.svg new file mode 100644 index 0000000..2fd8a26 --- /dev/null +++ b/unittests/unreferenced-defs.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + +