#!/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 argparse import os.path import sys from xml.sax.saxutils import quoteattr try: import boxes.generators except ImportError: sys.path.append(os.path.dirname(__file__) + "/..") import boxes.generators class Boxes2INX: def __init__(self) -> None: 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) # see boxes.__init__.py elif a.dest == "layout": return "" # val = a.default.split("\n") # input = f"""""" elif a.choices: uniqueChoices = [] for e in a.choices: if e not in uniqueChoices: uniqueChoices.append(e) return (f'''\n''' + "".join(f'\n' 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 f'''{default}\n''' else: return f'''{default}\n''' def generator2inx(self, name, box): result = [f""" {name} info.festi.boxes.py.{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(f"""""") result.extend(pageParams) result.append("\n") groupid += 1 result.append(f"""\n""") result.append(f"""./{name}-thumb.jpg\n""") result.append("\n") result.append(f""" all """) 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) def main() -> None: if len(sys.argv) != 2: print("Usage: boxes2inkscape TARGETPATH") return b = Boxes2INX() b.writeAllINX(sys.argv[1]) if __name__ == "__main__": main()