diff options
| author | Martin Owens <doctormo@gmail.com> | 2014-03-01 03:37:24 +0000 |
|---|---|---|
| committer | Martin Owens <doctormo@gmail.com> | 2014-03-01 03:37:24 +0000 |
| commit | 1a6ae514ad34780a5ff147cb1f0401914f6e5fb6 (patch) | |
| tree | 5e861e4e061fff5f40b0f790fd022dbeff3b07a1 /share | |
| parent | Remove unused variable. (diff) | |
| download | inkscape-1a6ae514ad34780a5ff147cb1f0401914f6e5fb6.tar.gz inkscape-1a6ae514ad34780a5ff147cb1f0401914f6e5fb6.zip | |
Add layers export extension as a tar creation extension
(bzr r13080)
Diffstat (limited to 'share')
| -rw-r--r-- | share/extensions/tar_layers.inx | 19 | ||||
| -rwxr-xr-x | share/extensions/tar_layers.py | 113 |
2 files changed, 132 insertions, 0 deletions
diff --git a/share/extensions/tar_layers.inx b/share/extensions/tar_layers.inx new file mode 100644 index 000000000..43664c910 --- /dev/null +++ b/share/extensions/tar_layers.inx @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension"> + <_name>Collection of SVG files One per root layer</_name> + <id>org.inkscape.output.LAYERS</id> + <dependency type="extension">org.inkscape.output.svg.inkscape</dependency> + <dependency type="executable" location="extensions">tar_layers.py</dependency> + <dependency type="executable" location="extensions">inkex.py</dependency> + <output> + <extension>.tar</extension> + <mimetype>application/tar</mimetype> + <_filetypename>Layers as Seperate SVG (*.tar)</_filetypename> + <_filetypetooltip>Each layer split into it's own svg file and collected as a tape archive (tar file)</_filetypetooltip> + <dataloss>false</dataloss> + </output> + <script> + <command reldir="extensions" interpreter="python">tar_layers.py</command> + <helper_extension>org.inkscape.output.svg.inkscape</helper_extension> + </script> +</inkscape-extension> diff --git a/share/extensions/tar_layers.py b/share/extensions/tar_layers.py new file mode 100755 index 000000000..8d7ce0541 --- /dev/null +++ b/share/extensions/tar_layers.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +""" +An extention to export multiple svg files from a single svg file containing layers. + +Each defs is duplicated for each svg outputed. +""" +import os +import sys +import copy +import tarfile +import StringIO + +# Inkscape Libraries +import inkex +import simplestyle + +GROUP = "{http://www.w3.org/2000/svg}g" +LABEL = "{http://www.inkscape.org/namespaces/inkscape}label" +GROUPMODE = "{http://www.inkscape.org/namespaces/inkscape}groupmode" + + +def oprint(item): + """DEBUG print an object""" + for name in dir(item): + value = getattr(item, name) + if callable(value): + yield "%s()" % name + else: + yield "%s = %s" % (name, str(value)) + +def fprint(data): + """DEBUG print something""" + if isinstance(data, basestring): + sys.stderr.write("DEBUG: %s\n" % data) + else: + return fprint("%s(%s)\n " % (str(data), type(data).__name__) \ + + "\n ".join(oprint(data))) + + +class LayersOutput(inkex.Effect): + """Entry point to our layers export""" + def __init__(self): + inkex.Effect.__init__(self) + if os.name == 'nt': + self.encoding = "cp437" + else: + self.encoding = "latin-1" + + 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 self.is_layer(node): + name = node.attrib.get(LABEL, None) + if name: + yield (name, node) + + def is_layer(self, node): + return node.tag == GROUP and node.attrib.get(GROUPMODE,'').lower() == 'layer' + + def io_document(self, name, doc): + string = StringIO.StringIO() + doc.write(string) + string.seek(0) + info = tarfile.TarInfo(name=name+'.svg') + info.size=len(string.buf) + return dict(tarinfo=info, fileobj=string) + + def effect(self): + # open output tar file as a stream (to stdout) + tar = tarfile.open(fileobj=sys.stdout, mode='w|') + + 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 + e = LayersOutput() + e.affect() + +# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99 |
