From ecf14540f5d74d8100edcca7dce72b7e6fe26d42 Mon Sep 17 00:00:00 2001 From: Mario Voigt Date: Wed, 28 Apr 2021 12:07:35 +0200 Subject: [PATCH] Adjust inx parser for InkScape 1.0 This is a more recent inx file creator which does not throw errors on console (except the ones where no thumbnail files exist yet) Resolves: #314 --- scripts/boxes2inkscape | 300 ++++++++++++++++++++++------------------- 1 file changed, 158 insertions(+), 142 deletions(-) diff --git a/scripts/boxes2inkscape b/scripts/boxes2inkscape index ad68206..ae6e65d 100755 --- a/scripts/boxes2inkscape +++ b/scripts/boxes2inkscape @@ -1,142 +1,158 @@ -#!/usr/bin/env python3 -# Copyright (C) 2017 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 sys -import argparse -import os.path -from xml.sax.saxutils import quoteattr - -# Python 2 vs Python 3 compat -try: - from urllib.parse import unquote_plus -except ImportError: - from urllib import unquote_plus - -try: - import boxes.generators -except ImportError: - sys.path.append(os.path.dirname(__file__) + "/..") - import boxes.generators - -class Boxes2INX: - def __init__(self): - self.boxes = {b.__name__ : b() for b in boxes.generators.getAllBoxGenerators().values() if b.webinterface} - self.groups = boxes.generators.ui_groups - self.groups_by_name = boxes.generators.ui_groups_by_name - - for name, box in self.boxes.items(): - self.groups_by_name.get(box.ui_group, - self.groups_by_name["Misc"]).add(box) - - def arg2inx(self, a, prefix): - name = a.option_strings[0].replace("-", "") - if isinstance(a, argparse._HelpAction): - return "" - viewname = name - if prefix and name.startswith(prefix + '_'): - viewname = name[len(prefix)+1:] - - if (isinstance(a, argparse._StoreAction) and - hasattr(a.type, "inx")): - return a.type.inx(name, viewname, a) - - elif a.dest == "layout": # XXX - return "" - val = a.default.split("\n") - input = """""" % \ - (name, max((len(l) for l in val))+10, len(val)+1, a.default) - elif a.choices: - return (''' \n''' - % (name, viewname, quoteattr(a.help or viewname)) + - "".join(' %s\n' % - (e, ' selected="selected"' if e == a.default else "", - e) for e in a.choices) + ' \n') - else: - default = a.default - if isinstance(a.type, boxes.BoolArg): - t = '"boolean"' - default = str(a.default).lower() - elif a.type is boxes.argparseSections: - t = '"string"' - else: - t = { int : '"int"', - float : '"float" precision="2"', - str : '"string"', - }.get(a.type, '"string"') - return ''' %s\n''' % (name, t, viewname, quoteattr(a.help or viewname), default) - - def generator2inx(self, name, box): - result = [ """ - - <_name>%s - boxes - info.festi.boxes.py.%s - - %s - -""" % (name, name, name.lower())] - groupid = 0 - for group in box.argparser._action_groups: - if not group._group_actions: - continue - prefix = getattr(group, "prefix", None) - title = group.title - if title.startswith("Settings for "): - title = title[len("Settings for "):] - if title.endswith(" Settings"): - title = title[:-len(" Settings")] - result.append(""" - -""" % (groupid, title)) - for a in group._group_actions: - if a.dest in ("input", "output", "format"): - continue - result.append(self.arg2inx(a, prefix)) - result.append(" \n") - groupid += 1 - result.append(""" - - - all - - - - - - - - -""" % self.groups_by_name[box.ui_group].title) - return b''.join(s.encode("utf-8") for s in result) - - def writeINX(self, name, box, path): - with open(os.path.join(path, "boxes.py." + name + '.inx'), "wb") as f: - f.write(self.generator2inx(name, box)) - - def writeAllINX(self, path): - for name, box in self.boxes.items(): - if name.startswith("TrayLayout"): - # The two stage thing does not work (yet?) - continue - self.writeINX(name, box, path) - -if __name__=="__main__": - if len(sys.argv) != 2: - print("Usage: boxes2inksacpe TARGETPATH") - b = Boxes2INX() - b.writeAllINX(sys.argv[1]) +#!/usr/bin/env python3 +# Copyright (C) 2017 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 sys +import argparse +import os.path +from xml.sax.saxutils import quoteattr +from urllib.parse import unquote_plus + +try: + import boxes.generators +except ImportError: + sys.path.append(os.path.dirname(__file__) + "/..") + import boxes.generators + +class Boxes2INX: + def __init__(self): + self.boxes = {b.__name__ : b() for b in boxes.generators.getAllBoxGenerators().values() if b.webinterface} + self.groups = boxes.generators.ui_groups + self.groups_by_name = boxes.generators.ui_groups_by_name + + for name, box in self.boxes.items(): + self.groups_by_name.get(box.ui_group, + self.groups_by_name["Misc"]).add(box) + + def arg2inx(self, a, prefix): + name = a.option_strings[0].replace("-", "") + + if isinstance(a, argparse._HelpAction): + return "" + + viewname = name + if prefix and name.startswith(prefix + '_'): + viewname = name[len(prefix)+1:] + + #returns old enum type. disabled + #if (isinstance(a, argparse._StoreAction) and hasattr(a.type, "inx")): + #return a.type.inx(name, viewname, a) #see boxes.__init__.py + + #elif a.dest == "layout": # XXX + if a.dest == "layout": # XXX + return "" + val = a.default.split("\n") + input = """""" % \ + (name, max((len(l) for l in val))+10, len(val)+1, a.default) + + elif (isinstance(a, argparse._StoreAction) and hasattr(a.type, "inx")) or a.choices: + uniqueChoices = [] + for e in a.choices: + if e not in uniqueChoices: + uniqueChoices.append(e) + return (''' \n''' + % (name, viewname, quoteattr(a.help or viewname)) + + "".join(' \n' % (e, e) for e in uniqueChoices) + ' \n') + + else: + default = a.default + if isinstance(a.type, boxes.BoolArg): + t = '"bool"' + default = str(a.default).lower() + + elif a.type is boxes.argparseSections: + t = '"string"' + + else: + t = { int : '"int"', + float : '"float" precision="2"', + str : '"string"', + }.get(a.type, '"string"') + + if t == '"int"' or t == '"float" precision="2"': + return ''' %s\n''' % (name, t, viewname, quoteattr(a.help or viewname), default) + + else: + return ''' %s\n''' % (name, t, viewname, quoteattr(a.help or viewname), default) + + def generator2inx(self, name, box): + result = [ """ + +%s +info.festi.boxes.py.%s +%s +""" % (name, name, name.lower())] + groupid = 0 + for group in box.argparser._action_groups: + if not group._group_actions: + continue + prefix = getattr(group, "prefix", None) + title = group.title + if title.startswith("Settings for "): + title = title[len("Settings for "):] + if title.endswith(" Settings"): + title = title[:-len(" Settings")] + + pageParams = [] + for a in group._group_actions: + if a.dest in ("input", "output", "format"): + continue + if self.arg2inx(a, prefix) != "": + pageParams.append(self.arg2inx(a, prefix)) + if len(pageParams) > 0: + result.append(""" + +""" % (groupid, title)) + result.extend(pageParams) + result.append(" ") + + groupid += 1 + result.append(""" + +""" % (groupid)) + result.append(" ./" + name + "-thumb.jpg\n") + result.append(" \n") + result.append(""" + + + all + + + + + + + +""" % self.groups_by_name[box.ui_group].title) + return b''.join(s.encode("utf-8") for s in result) + + def writeINX(self, name, box, path): + with open(os.path.join(path, "boxes.py." + name + '.inx'), "wb") as f: + f.write(self.generator2inx(name, box)) + + def writeAllINX(self, path): + for name, box in self.boxes.items(): + if name.startswith("TrayLayout"): + # The two stage thing does not work (yet?) + continue + self.writeINX(name, box, path) + +if __name__=="__main__": + if len(sys.argv) != 2: + print("Usage: boxes2inksacpe TARGETPATH") + b = Boxes2INX() + b.writeAllINX(sys.argv[1])