diff options
Diffstat (limited to 'share/extensions/tar_layers.py')
-rwxr-xr-x | share/extensions/tar_layers.py | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/share/extensions/tar_layers.py b/share/extensions/tar_layers.py new file mode 100755 index 0000000..3a4732c --- /dev/null +++ b/share/extensions/tar_layers.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +# coding=utf-8 +# +# Copyright (C) 2014 Martin Owens, email@doctormo.org +# +# 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 2 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +""" +An extension to export multiple svg files from a single svg file containing layers. + +Each defs is duplicated for each svg outputted. +""" + +from __future__ import unicode_literals +import os +import sys +import copy +import tarfile +import io +import calendar +import time +import inkex + + +class TarLayers(inkex.OutputExtension): + """Entry point to our layers export""" + + def make_template(self): + """Returns the current document as a new empty document with the same defs""" + newdoc = copy.deepcopy(self.document) + for (name, layer) in self.layers(newdoc): + layer.getparent().remove(layer) + return newdoc + + def layers(self, document): + for node in document.getroot().iterchildren(): + if isinstance(node, inkex.Layer) and node.label: + yield (node.label, node) + + def io_document(self, name, doc): + string = io.BytesIO() + doc.write(string) + info = tarfile.TarInfo(name=name + ".svg") + info.mtime = calendar.timegm(time.gmtime()) + info.size = string.tell() + string.seek(0) + return dict(tarinfo=info, fileobj=string) + + def save(self, stream): + """Save the tar file output""" + tar = tarfile.open(fileobj=stream, mode="w|") + + # Switch stdout to binary on Windows. + if sys.platform == "win32": + import msvcrt + + try: + msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) + except io.UnsupportedOperation: + pass # The .fileno() function is not available during pytest runs + + template = self.make_template() + + previous = None + for (name, _layer) in self.layers(self.document): + layer = copy.deepcopy(_layer) + if previous != None: + template.getroot().replace(previous, layer) + else: + template.getroot().append(layer) + previous = layer + + tar.addfile(**self.io_document(name, template)) + + +if __name__ == "__main__": # pragma: no cover + TarLayers().run() |