#!/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):
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 = """""" % \
(name, max((len(l) for l in val))+10, len(val)+1, a.default)
elif 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 = [ """
%sinfo.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: boxes2inkscape TARGETPATH")
b = Boxes2INX()
b.writeAllINX(sys.argv[1])