diff --git a/extensions/fablabchemnitz/cleanup.inx b/extensions/fablabchemnitz/cleanup.inx
index 9957a010..b6001cdc 100644
--- a/extensions/fablabchemnitz/cleanup.inx
+++ b/extensions/fablabchemnitz/cleanup.inx
@@ -11,7 +11,10 @@
100.0
- true
+ true
+ true
+ true
+ true
all
diff --git a/extensions/fablabchemnitz/cleanup.py b/extensions/fablabchemnitz/cleanup.py
index b285dbea..b4c165a3 100644
--- a/extensions/fablabchemnitz/cleanup.py
+++ b/extensions/fablabchemnitz/cleanup.py
@@ -20,44 +20,70 @@ Based on coloreffect.py by Jos Hirth and Aaron C. Spike
'''
import inkex
+import re
class Cleanup(inkex.EffectExtension):
def __init__(self):
inkex.Effect.__init__(self)
self.arg_parser.add_argument("--stroke_width", type=float, default=0.1, help="Stroke width")
self.arg_parser.add_argument("--stroke_units", default="mm", help="Stroke unit")
- self.arg_parser.add_argument("--remove_styles", type=inkex.Boolean, help="Remove stroke styles")
self.arg_parser.add_argument("--opacity", type=float, default="100.0", help="Opacity")
+ self.arg_parser.add_argument("--reset_style_attributes", type=inkex.Boolean, help="Remove stroke style attributes like stroke-dasharray, stroke-dashoffset, stroke-linejoin, linecap, stroke-miterlimit")
+ self.arg_parser.add_argument("--reset_fill_attributes", type=inkex.Boolean, help="Sets 'fill:none;' to style attribute")
+ self.arg_parser.add_argument("--apply_hairlines", type=inkex.Boolean, help="Adds 'vector-effect:non-scaling-stroke;' and '-inkscape-stroke:hairline;' Hint: stroke-width is kept in background. All hairlines still have a valued width.")
+ self.arg_parser.add_argument("--apply_black_strokes", type=inkex.Boolean, help="Adds 'stroke:#000000;' to style attribute")
+
def effect(self):
- if len(self.svg.selected)==0:
+ if len(self.svg.selected) == 0:
self.getAttribs(self.document.getroot())
else:
- for id,node in self.svg.selected.items():
+ for id, node in self.svg.selected.items():
self.getAttribs(node)
- def getAttribs(self,node):
+ def getAttribs(self, node):
self.changeStyle(node)
for child in node:
self.getAttribs(child)
- def changeStyle(self,node):
+ #stroke and fill styles can be included in style attribute or they can exist separately (can occure in older SVG files). We do not parse other attributes than style
+ def changeStyle(self, node):
if node.attrib.has_key('style'):
style = node.get('style')
- if style:
+ if style:
+ #add missing style attributes if required
+ if style.endswith(';') is False:
+ style += ';'
+ if re.search('(;|^)stroke:(.*?)(;|$)', style) is None: #if "stroke" is None, add one. We need to distinguish because there's also attribute "-inkscape-stroke" that's why we check starting with ^ or ;
+ style += 'stroke:none;'
+ if "stroke-width:" not in style:
+ style += 'stroke-width:' + str(self.svg.unittouu(str(self.options.stroke_width) + self.options.stroke_units)) + ';'
+ if "stroke-opacity:" not in style:
+ style += 'stroke-opacity:' + str(self.options.opacity / 100) + ';'
+
+ if self.options.apply_hairlines is True:
+ if "vector-effect:non-scaling-stroke" not in style:
+ style += 'vector-effect:non-scaling-stroke;'
+ if "-inkscape-stroke:hairline" not in style:
+ style += '-inkscape-stroke:hairline;'
+
+ if re.search('fill:(.*?)(;|$)', style) is None: #if "fill" is None, add one.
+ style += 'fill:none;'
+
+ #then parse the content and check what we need to adjust
declarations = style.split(';')
- for i,decl in enumerate(declarations):
+ for i, decl in enumerate(declarations):
parts = decl.split(':', 2)
if len(parts) == 2:
(prop, val) = parts
prop = prop.strip().lower()
if prop == 'stroke-width':
- new_val = self.svg.unittouu(str(self.options.stroke_width)+self.options.stroke_units)
+ new_val = self.svg.unittouu(str(self.options.stroke_width) + self.options.stroke_units)
declarations[i] = prop + ':' + str(new_val)
if prop == 'stroke-opacity':
new_val = str(self.options.opacity / 100)
declarations[i] = prop + ':' + new_val
- if self.options.remove_styles == True:
+ if self.options.reset_style_attributes is True:
if prop == 'stroke-dasharray':
declarations[i] = ''
if prop == 'stroke-dashoffset':
@@ -68,6 +94,15 @@ class Cleanup(inkex.EffectExtension):
declarations[i] = ''
if prop == 'stroke-miterlimit':
declarations[i] = ''
+ if self.options.apply_black_strokes is True:
+ if prop == 'stroke':
+ if val == 'none':
+ new_val = '#000000'
+ declarations[i] = prop + ':' + new_val
+ if self.options.reset_fill_attributes is True:
+ if prop == 'fill':
+ new_val = 'none'
+ declarations[i] = prop + ':' + new_val
node.set('style', ';'.join(declarations))
if __name__ == '__main__':