Add scripts/boxes2inkscape for generating inx files from box generators

Code for handling traylayout still missing.
This commit is contained in:
Florian Festi 2017-02-23 17:27:20 +01:00
parent a93e280477
commit 39e74e67ba
2 changed files with 142 additions and 0 deletions

View File

@ -26,6 +26,8 @@ import argparse
from argparse import ArgumentParser
import re
from functools import wraps
from xml.sax.saxutils import quoteattr
from boxes import edges
from boxes import formats
from boxes import gears
@ -178,6 +180,14 @@ class ArgparseEdgeType:
e, self.names.get(e, "")) for e in self.edges))
return """<select name="%s" size="1">\n%s</select>\n""" % (name, options)
def inx(self, name, viewname, arg):
return (' <param name="%s" type="enum" gui-text="%s" gui-description=%s>\n' %
(name, viewname, quoteattr(arg.help or "")) +
''.join((' <item value="%s">%s %s</item>\n' % (
e, e, self.names.get(e, ""))
for e in self.edges)) +
' </param>\n')
class BoolArg:
def __call__(self, arg):
if not arg or arg.lower() in ("none", "0", "off", "false"):

132
scripts/boxes2inkscape Executable file
View File

@ -0,0 +1,132 @@
#!/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 <http://www.gnu.org/licenses/>.
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 = """<textarea name="%s" cols="%s" rows="%s">%s</textarea>""" % \
(name, max((len(l) for l in val))+10, len(val)+1, a.default)
elif a.choices:
return (''' <param name="%s" type="enum" _gui-text="%s" gui-description=%s>\n'''
% (name, viewname, quoteattr(a.help or "")) +
"".join(' <item value="%s"%s>%s</item>\n' %
(e, ' selected="selected"' if e == a.default else "",
e) for e in a.choices) + ' </param>\n')
else:
if isinstance(a.type, boxes.BoolArg):
t = "boolean"
elif a.type is boxes.argparseSections:
t = "string"
else:
t = { int : "int",
float : "float",
str : "string",
}.get(a.type, a.type)
return ''' <param name="%s" type="%s" max="9999" _gui-text="%s" gui-description=%s>%s</param>\n''' % (name, t, viewname, quoteattr(a.help or ""), a.default)
def generator2inx(self, name, box):
result = [ """<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
<_name>%s</_name>
<id>info.festi.boxes.py.%s</id>
<param name="generator" type="string" gui-hidden="true">%s</param>
<param name="tab" type="notebook">
""" % (name, name, name.lower())]
# <dependency type="executable" location="[extensions|path|plugins|{location}]">boxes</dependency>
groupid = 0
for group in box.argparser._action_groups:
if not group._group_actions:
continue
prefix = getattr(group, "prefix", None)
result.append("""
<page name="%s" _gui-text="%s">
""" % (groupid, group.title))
for a in group._group_actions:
if a.dest in ("input", "output", "format"):
continue
result.append(self.arg2inx(a, prefix))
result.append(" </page>\n")
groupid += 1
result.append("""
</param>
<effect>
<object-type>all</object-type>
<effects-menu>
<submenu _name="Boxes.py">
<submenu _name="%s"/>
</submenu>
</effects-menu>
</effect>
<script>
<command reldir="extensions" interpreter="python">boxes</command>
</script>
</inkscape-extension>
""" % 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():
self.writeINX(name, box, path)
if __name__=="__main__":
if len(sys.argv) != 2:
print("Usage: boxes2inksacpe TARGETPATH")
b = Boxes2INX()
b.writeAllINX(sys.argv[1])