From 0a55e9ca6bfe13880ac7162e2212871bee72b9fc Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Fri, 19 Jul 2019 21:49:55 +0200 Subject: [PATCH] Optimize SVG paths Resolves #63 --- boxes/svgutil.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/boxes/svgutil.py b/boxes/svgutil.py index 5c5fc5b..6b4b663 100755 --- a/boxes/svgutil.py +++ b/boxes/svgutil.py @@ -61,6 +61,8 @@ class SVGFile(object): self.symbol_extends = {} def fix(self, metadata=None): + #print("Optimizations:", + self.optimize(self.tree.getroot()) self.getEnvelope() self.moveOrigin() self.addMetadata(metadata) @@ -159,6 +161,35 @@ class SVGFile(object): self.tree.write(self.filename) + def optimize(self, element): + number = 0 + if element.tag.endswith("}path"): + path = element.attrib.get("d", "") + d = r"(\-?\d+(\.\d+)?)" + while True: + old_number = number + for pattern, replacement in ( + (" " + d + " " + d + r" (M|L) \1 \3 ", + r" \1 \3 "), # remove useless moves + # compress L parts of paths into V and H + (" " + d + " " + d + r" L " + d + r" \3 ", + r" \1 \3 H \5 "), + (" " + d + " " + d + r" L \1 " + d + " ", + r" \1 \3 V \5 "), + (r"H " + d + r" L \1 " + d + " ", + r"H \1 V \3 "), + (r"V " + d + " L " + d + " \1 ", + r"V \1 H \3 "), + ): + path, n = re.subn(pattern, replacement, path, 2) + number += n + if number == old_number: + break + element.attrib["d"] = path + for e in element: + number += self.optimize(e) + return number + def addMetadata(self, md): txt = """ {name} - {description}