From b979fe19e563a559d03f15da818f95ddff00bc56 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Tue, 17 Nov 2015 22:30:23 +0100 Subject: [PATCH 1/4] Remove unused XML namespace declarations --- scour/scour.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/scour/scour.py b/scour/scour.py index 978d45d..010f686 100644 --- a/scour/scour.py +++ b/scour/scour.py @@ -2903,7 +2903,17 @@ def scourString(in_string, options=None): doc.documentElement.setAttribute('xmlns', 'http://www.w3.org/2000/svg') # TODO: throw error or warning? - # check for redundant SVG namespace declaration + # check for redundant and unused SVG namespace declarations + def xmlnsUnused(prefix, namespace): + if doc.getElementsByTagNameNS(namespace, "*"): + return False + else: + for element in doc.getElementsByTagName("*"): + for attrName in six.iterkeys(element.attributes): + if attrName.startswith(prefix): + return False + return True + attrList = doc.documentElement.attributes xmlnsDeclsToRemove = [] redundantPrefixes = [] @@ -2911,9 +2921,12 @@ def scourString(in_string, options=None): attr = attrList.item(i) name = attr.nodeName val = attr.nodeValue - if name[0:6] == 'xmlns:' and val == 'http://www.w3.org/2000/svg': - redundantPrefixes.append(name[6:]) - xmlnsDeclsToRemove.append(name) + if name[0:6] == 'xmlns:': + if val == 'http://www.w3.org/2000/svg': + redundantPrefixes.append(name[6:]) + xmlnsDeclsToRemove.append(name) + elif xmlnsUnused(name[6:], val): + xmlnsDeclsToRemove.append(name) for attrName in xmlnsDeclsToRemove: doc.documentElement.removeAttribute(attrName) From 67bacc2f2322ad340fb6d8346bea0a6df74a857e Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Tue, 17 Nov 2015 22:46:50 +0100 Subject: [PATCH 2/4] Remove metadata right away (i.e. before checking for unused XML namespaces; otherwise the relevant namespaces used for metadata would not yet be unused) --- scour/scour.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scour/scour.py b/scour/scour.py index 010f686..f72e459 100644 --- a/scour/scour.py +++ b/scour/scour.py @@ -2877,6 +2877,10 @@ def scourString(in_string, options=None): global numBytesSavedInTransforms doc = xml.dom.minidom.parseString(in_string) + # remove if the user wants to + if options.remove_metadata: + removeMetadataElements(doc) + # for whatever reason this does not always remove all inkscape/sodipodi attributes/elements # on the first pass, so we do it multiple times # does it have to do with removal of children affecting the childlist? @@ -2947,10 +2951,6 @@ def scourString(in_string, options=None): if options.simple_colors: numBytesSavedInColors = convertColors(doc.documentElement) - # remove if the user wants to - if options.remove_metadata: - removeMetadataElements(doc) - # remove unreferenced gradients/patterns outside of defs # and most unreferenced elements inside of defs while removeUnreferencedElements(doc, options.keep_defs) > 0: From 89f4b687f273f1181e1884b911f66f672ce3adc8 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Tue, 17 Nov 2015 22:49:50 +0100 Subject: [PATCH 3/4] Statistics: count also attributes removed from root SVG element --- scour/scour.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scour/scour.py b/scour/scour.py index f72e459..aeb730a 100644 --- a/scour/scour.py +++ b/scour/scour.py @@ -2934,6 +2934,7 @@ def scourString(in_string, options=None): for attrName in xmlnsDeclsToRemove: doc.documentElement.removeAttribute(attrName) + numAttrsRemoved += 1 for prefix in redundantPrefixes: remapNamespacePrefix(doc.documentElement, prefix, '') @@ -2943,6 +2944,7 @@ def scourString(in_string, options=None): if options.strip_xml_space_attribute and doc.documentElement.hasAttribute('xml:space'): doc.documentElement.removeAttribute('xml:space') + numAttrsRemoved += 1 # repair style (remove unnecessary style properties and change them into XML attributes) numStylePropsFixed = repairStyle(doc.documentElement, options) From 532f6640017c28ccb6e2067b969ded3ef313fb86 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Tue, 17 Nov 2015 23:09:25 +0100 Subject: [PATCH 4/4] Minor fix in console output (superfluous space) --- scour/scour.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scour/scour.py b/scour/scour.py index aeb730a..19e8ac4 100644 --- a/scour/scour.py +++ b/scour/scour.py @@ -3301,8 +3301,8 @@ def start(options, input, output): # GZ: not using globals would be good too if not options.quiet: - print(' File:', input.name, \ - os.linesep + ' Time taken:', str(end-start) + 's' + os.linesep, \ + print(' File:', input.name, os.linesep + \ + ' Time taken:', str(end-start) + 's', os.linesep + \ getReport(), file=sys.stderr) oldsize = len(in_string)