Removal of stroke:none. Prevent groups from being collapsed if title/desc present. Add option to prevent groups from being collapsed. Unit tests. Started release notes HTML.

This commit is contained in:
JSCHILL1 2009-04-25 02:09:08 -05:00
parent 8e9683f648
commit 9f38caabaa
4 changed files with 145 additions and 9 deletions

88
release-notes.html Normal file
View file

@ -0,0 +1,88 @@
<!DOCTYPE html>
<html>
<head>
<title>Scour Release Notes</title>
</head>
<body>
<section id="0.09">
<header>
<h3><a href="#0.09">Version 0.09</a></h3>
</header>
<ul>
<li>Fix bug when removing stroke styles</li>
<li>Remove gradients that are only referenced by one other gradient</li>
<li>Added option to prevent group collapsing</li>
<li>Prevent groups with title/desc children from being collapsed</li>
<li>Remove stroke="none"</li>
</ul>
</section>
<section id="0.08">
<header>
<h3><a href="#0.08">Version 0.08</a></h3>
</header>
<ul>
<li>Remove unnecessary nested &lt;g&gt; elements</li>
<li>Remove duplicate gradient stops (same offset, stop-color, stop-opacity)</li>
<li>Always keep fonts inside &lt;defs&gt;, always keep ids on fonts</li>
<li>made ID stripping optional (disabled by default)</li>
</ul>
</section>
<section id="0.07">
<header>
<h3><a href="#0.07">Version 0.07</a></h3>
</header>
<ul>
<li>moved all functionality into a module level function named 'scour' and began adding unit tests</li>
<li>prevent metadata from being removed if they contain only text nodes</li>
<li>Remove unreferenced pattern and gradient elements outside of defs</li>
<li>Removal of extra whitespace, pretty printing of XML</li>
</ul>
</section>
<section id="0.06">
<header>
<h3><a href="#0.06">Version 0.06</a></h3>
</header>
<ul>
<li>Prevent error when stroke-width property value has a unit</li>
<li>Convert width/height into a viewBox where possible</li>
<li>Convert all referenced rasters into base64 encoded URLs if the files can be found</li>
</ul>
</section>
<section id="0.05">
<header>
<h3><a href="#0.05">Version 0.05 and earlier</a></h3>
</header>
<ul>
<li>Removes unreferenced elements in a &lt;defs&gt;</li>
<li>Removes all inkscape, sodipodi, adobe elements</li>
<li>Removes all inkscape, sodipodi, adobe attributes</li>
<li>Remove all unused namespace declarations on the document element</li>
<li>Removes any empty &lt;defs&gt;, &lt;metadata&gt;, or &lt;g&gt; elements</li>
<li>Style fix-ups:
<ul><li>Fixes any style properties like this: <code>style="fill: url(#linearGradient1000) rgb(0, 0, 0);"</code></li>
<li>Removes any style property of: <code>opacity: 1;</code></li>
<li>Removes any stroke properties when stroke=none or stroke-opacity=0 or stroke-width=0</li>
<li>Removes any fill properties when fill=none or fill-opacity=0</li>
<li>Removes all fill/stroke properties when opacity=0</li>
<li>Removes any <code>stop-opacity: 1</code></li>
<li>Removes any <code>fill-opacity: 1</code></li>
<li>Removes any <code>stroke-opacity: 1</code></li>
</ul></li>
<li>Convert style properties into SVG attributes</li>
</ul>
</section>
</body>
</html>

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
# Scour
# Version 0.08
# Version 0.09
#
# Copyright 2009 Jeff Schiller
#
@ -30,7 +30,6 @@
# * Specify a limit to the precision of all positional elements.
# * Clean up Definitions
# * Collapse duplicate gradient definitions
# * Remove gradients that are only referenced by one other gradient
# * Clean up CSS
# * Convert RGB colours from RGB(r,g,b) to #RRGGBB format
# * Convert RGB colours from #RRGGBB to #RGB if possible
@ -50,6 +49,9 @@
# Next Up:
# + fix bug when removing stroke styles
# + Remove gradients that are only referenced by one other gradient
# + added option to prevent group collapsing
# + prevent groups with title/desc children from being collapsed
# + remove stroke=none attribute
# - Remove unnecessary units of precision on attributes
# - Remove unnecessary units of precision on path coordinates
# - Convert all colors to #RRGGBB format
@ -295,8 +297,8 @@ def removeNamespacedElements(node, namespaces):
return num
# this walks further and further down the tree, removing groups
# which do not have any attributes and promoting their children
# up one level
# which do not have any attributes or a title/desc child and
# promoting their children up one level
def removeNestedGroups(node):
global numElemsRemoved
num = 0
@ -304,6 +306,12 @@ def removeNestedGroups(node):
groupsToRemove = []
for child in node.childNodes:
if child.nodeName == 'g' and child.namespaceURI == NS['SVG'] and len(child.attributes) == 0:
# only collapse group if it does not have a title or desc as a direct descendant
for grandchild in child.childNodes:
if grandchild.nodeType == 1 and grandchild.namespaceURI == NS['SVG'] and \
grandchild.nodeName in ['title','desc']:
break
else:
groupsToRemove.append(child)
for g in groupsToRemove:
@ -530,6 +538,7 @@ def repairStyle(node):
if styleMap.has_key(strokestyle) :
del styleMap[strokestyle]
num += 1
del styleMap['stroke']
# if fill:none, then remove all fill-related properties (fill-rule, etc)
# TODO: should also detect if fill-opacity=0
@ -757,6 +766,7 @@ def scourString(in_string, options=[]):
referencedIDs = findReferencedElements(doc.documentElement, {})
bContinueLooping = (removeUnreferencedIDs(referencedIDs, identifiedElements) > 0)
if not '--disable-group-collapsing' in options:
while removeNestedGroups(doc.documentElement) > 0:
pass
@ -813,6 +823,7 @@ def printSyntaxAndQuit():
print 'If an option is not available below that means it occurs automatically'
print 'when scour is invoked. Available OPTIONS:\n'
print ' --enable-id-stripping : Scour will remove all un-referenced ID attributes'
print ' --disable-group-collapsing : Scour will not collapse <g> elements'
print ''
quit()
@ -826,6 +837,7 @@ def parseCLA():
output = sys.stdout
options = []
validOptions = [
'--disable-group-collapsing',
'--enable-id-stripping',
]

View file

@ -163,6 +163,24 @@ class RemoveUselessNestedGroups(unittest.TestCase):
self.assertEquals(len(doc.getElementsByTagNameNS(SVGNS, 'g')), 1,
'Useless nested groups not removed' )
class DoNotRemoveUselessNestedGroups(unittest.TestCase):
def runTest(self):
doc = scour.scourXmlFile('unittests/nested-useless-groups.svg', ['--disable-group-collapsing'])
self.assertEquals(len(doc.getElementsByTagNameNS(SVGNS, 'g')), 2,
'Useless nested groups were removed despite --disable-group-collapsing' )
class DoNotRemoveNestedGroupsWithTitle(unittest.TestCase):
def runTest(self):
doc = scour.scourXmlFile('unittests/groups-with-title-desc.svg')
self.assertEquals(len(doc.getElementsByTagNameNS(SVGNS, 'g')), 2,
'Nested groups with title was removed' )
class DoNotRemoveNestedGroupsWithDesc(unittest.TestCase):
def runTest(self):
doc = scour.scourXmlFile('unittests/groups-with-title-desc.svg')
self.assertEquals(len(doc.getElementsByTagNameNS(SVGNS, 'g')), 2,
'Nested groups with desc was removed' )
class RemoveDuplicateLinearGradientStops(unittest.TestCase):
def runTest(self):
doc = scour.scourXmlFile('unittests/duplicate-gradient-stops.svg')
@ -305,6 +323,12 @@ class RemoveStrokeDashoffsetWhenStrokeWidthZero(unittest.TestCase):
'stroke-dashoffset attribute not emptied when width zero' )
class RemoveStrokeWhenStrokeNone(unittest.TestCase):
def runTest(self):
doc = scour.scourXmlFile('unittests/stroke-none.svg')
self.assertEquals(doc.getElementsByTagNameNS(SVGNS, 'path')[0].getAttribute('stroke'), '',
'stroke attribute not emptied when no stroke' )
class RemoveStrokeWidthWhenStrokeNone(unittest.TestCase):
def runTest(self):
doc = scour.scourXmlFile('unittests/stroke-none.svg')
self.assertEquals(doc.getElementsByTagNameNS(SVGNS, 'path')[0].getAttribute('stroke-width'), '',

View file

@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g>
<title>Group 1</title>
<rect width="300" height="200" fill="green" />
<circle cx="200" cy="100" r="50" fill="yellow" />
</g>
<g>
<desc>Group 1</desc>
<rect width="300" height="200" fill="green" />
<circle cx="200" cy="100" r="50" fill="yellow" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 309 B