diff --git a/MANIFEST.in b/MANIFEST.in index 46f5d6f..4d410d1 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,4 +3,4 @@ include examples/*.svg include documentation/presentation.odp include inkex/*.txt include po/* -include scripts/boxes2pot scripts/boxes2inkscape \ No newline at end of file +include scripts/boxes2pot scripts/boxes2inkscape scripts/boxes_proxy.py \ No newline at end of file diff --git a/scripts/boxes_proxy.py b/scripts/boxes_proxy.py new file mode 100644 index 0000000..bed58d3 --- /dev/null +++ b/scripts/boxes_proxy.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 + +""" +Extension for InkScape 1.0+ + +boxes.py wrapper script to make it work on Windows and Linux systems without duplicating .inx files + +Author: Mario Voigt / FabLab Chemnitz +Mail: mario.voigt@stadtfabrikanten.org +Date: 27.04.2021 +Last patch: 27.04.2021 +License: GNU GPL v3 + +""" +import inkex +import sys +import os +from lxml import etree + +class boxesPyWrapper(inkex.GenerateExtension): + + def add_arguments(self, pars): + args = sys.argv[1:] + for arg in args: + key=arg.split("=")[0] + if len(arg.split("=")) == 2: + value=arg.split("=")[1] + try: + pars.add_argument(key, default=key) + except: + pass #ignore duplicate id arg + + def generate(self): + box_file = "box.svg" + if os.path.exists(box_file): + os.remove(box_file) #remove previously generated box file at the beginning + + cmd = "boxes" #boxes.exe in this local dir (or if present in %PATH%), or boxes from $PATH in linux + for arg in vars(self.options): + if arg != "output" and arg != "ids" and arg != "selected_nodes": + #inkex.utils.debug(str(arg) + " = " + str(getattr(self.options, arg))) + #fix behaviour of "original" arg which does not correctly gets interpreted if set to false + if arg == "original" and str(getattr(self.options, arg)) == "false": + continue + if arg in ("input_file", "tab"): + continue + else: + cmd += " --" + arg + " " + str(getattr(self.options, arg)) + cmd += " --output " + box_file + " " + box_file #we need to add box_file string twice in a row. Otherwise program executable throws an error + cmd = cmd.replace("boxes --generator", "boxes") + + # run boxes with the parameters provided + with os.popen(cmd, "r") as boxes: + result = boxes.read() + + # check output existence + try: + stream = open(box_file, 'r') + except FileNotFoundError as e: + inkex.utils.debug("There was no " + box_file + " output generated. Cannot continue. Command was:") + inkex.utils.debug(str(cmd)) + exit(1) + + # write the generated SVG into Inkscape's canvas + p = etree.XMLParser(huge_tree=True) + doc = etree.parse(stream, parser=etree.XMLParser(huge_tree=True)) + stream.close() + if os.path.exists(box_file): + os.remove(box_file) #remove previously generated box file at the end too + + group = inkex.Group(id="boxes.py") + for element in doc.getroot(): + group.append(element) + return group + +if __name__ == '__main__': + boxesPyWrapper().run() \ No newline at end of file diff --git a/setup.py b/setup.py index 44620b0..3cbc314 100755 --- a/setup.py +++ b/setup.py @@ -66,7 +66,7 @@ class CustomBuildExtCommand(build_py): self.distribution.data_files.append( (path, [i for i in glob.glob(os.path.join("inkex", "*.inx"))])) - self.distribution.data_files.append((path, ['scripts/boxes'])) + self.distribution.data_files.append((path, ['scripts/boxes_proxy.py'])) except CalledProcessError: pass # Inkscape is not installed