From 426baff75f0e548da186df3ca90dc62859641d1b Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sun, 5 Aug 2012 08:56:48 +0200 Subject: Exporting. Optimized SVG output extension update (scour). (bzr r11591) --- share/extensions/scour.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/share/extensions/scour.py b/share/extensions/scour.py index a3a8a7487..7fdd55b28 100644 --- a/share/extensions/scour.py +++ b/share/extensions/scour.py @@ -70,8 +70,8 @@ except ImportError: pass APP = 'scour' -VER = '0.26' -COPYRIGHT = 'Copyright Jeff Schiller, Louis Simard, 2010' +VER = '0.26+r220' +COPYRIGHT = 'Copyright Jeff Schiller, Louis Simard, 2012' NS = { 'SVG': 'http://www.w3.org/2000/svg', 'XLINK': 'http://www.w3.org/1999/xlink', @@ -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 = [] @@ -2556,7 +2575,9 @@ def removeComments(element) : if isinstance(element, xml.dom.minidom.Document): # must process the document object separately, because its # documentElement's nodes have None as their parentNode - for subelement in element.childNodes: + # iterate in reverse order to prevent mess-ups with renumbering + for index in xrange(len(element.childNodes) - 1, -1, -1): + subelement = element.childNodes[index] if isinstance(subelement, xml.dom.minidom.Comment): numCommentBytes += len(subelement.data) element.removeChild(subelement) @@ -2566,7 +2587,9 @@ def removeComments(element) : numCommentBytes += len(element.data) element.parentNode.removeChild(element) else: - for subelement in element.childNodes: + # iterate in reverse order to prevent mess-ups with renumbering + for index in xrange(len(element.childNodes) - 1, -1, -1): + subelement = element.childNodes[index] removeComments(subelement) def embedRasters(element, options) : @@ -2887,6 +2910,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: -- cgit v1.2.3