#!/usr/bin/env python3
# Copyright (C) 2016 Florian Festi
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
import xml.parsers.expat
import re
class SVGFile(object):
pathre = re.compile(r"[MCL]? *((-?\d+(\.\d+)?) (-?\d+(\.\d+)?) *)+")
transformre = re.compile(r"matrix\(" + ",".join([r"(-?\d+(\.\d+)?)"] * 6) + "\)")
def __init__(self, filename):
self.filename = filename
self.minx = self.maxx = self.miny = self.maxy = None
def handleStartElement(self, name, attrs):
self.tags.append(name)
if name == "path" and "symbol" not in self.tags:
minx = maxx = miny = maxy = None
m = self.transformre.match(attrs.get("transform", ""))
if m:
matrix = [float(m.group(i)) for i in range(1, 12, 2)]
else:
matrix = [1, 0,
0, 1,
0, 0]
for m in self.pathre.findall(attrs.get("d", "")):
x = float(m[1])
y = float(m[3])
tx = matrix[0]*x+matrix[2]*y+matrix[4]
ty = matrix[1]*x+matrix[3]*y+matrix[5]
if self.minx is None or self.minx > tx:
self.minx = tx
if self.maxx is None or self.maxx < tx:
self.maxx = tx
if self.miny is None or self.miny > ty:
self.miny = ty
if self.maxy is None or self.maxy < ty:
self.maxy = ty
def handleEndElement(self, name):
last = self.tags.pop()
if last != name:
raise ValueError("Got %s> expected %s>" % (name, last))
def getEnvelope(self):
self.tags = []
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = self.handleStartElement
p.EndElementHandler = self.handleEndElement
p.ParseFile(open(self.filename, "rb"))
def rewriteViewPort(self):
f = open(self.filename, "r+")
s = f.read(1024)
m = re.search(r"""