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
This commit is contained in:
Mario Voigt 2021-04-28 12:07:35 +02:00 committed by Florian Festi
parent 4449c2c2cd
commit ecf14540f5
1 changed files with 158 additions and 142 deletions

View File

@ -18,12 +18,7 @@ import sys
import argparse import argparse
import os.path import os.path
from xml.sax.saxutils import quoteattr from xml.sax.saxutils import quoteattr
# Python 2 vs Python 3 compat
try:
from urllib.parse import unquote_plus from urllib.parse import unquote_plus
except ImportError:
from urllib import unquote_plus
try: try:
import boxes.generators import boxes.generators
@ -43,51 +38,62 @@ class Boxes2INX:
def arg2inx(self, a, prefix): def arg2inx(self, a, prefix):
name = a.option_strings[0].replace("-", "") name = a.option_strings[0].replace("-", "")
if isinstance(a, argparse._HelpAction): if isinstance(a, argparse._HelpAction):
return "" return ""
viewname = name viewname = name
if prefix and name.startswith(prefix + '_'): if prefix and name.startswith(prefix + '_'):
viewname = name[len(prefix)+1:] viewname = name[len(prefix)+1:]
if (isinstance(a, argparse._StoreAction) and #returns old enum type. disabled
hasattr(a.type, "inx")): #if (isinstance(a, argparse._StoreAction) and hasattr(a.type, "inx")):
return a.type.inx(name, viewname, a) #return a.type.inx(name, viewname, a) #see boxes.__init__.py
elif a.dest == "layout": # XXX #elif a.dest == "layout": # XXX
if a.dest == "layout": # XXX
return "" return ""
val = a.default.split("\n") val = a.default.split("\n")
input = """<textarea name="%s" cols="%s" rows="%s">%s</textarea>""" % \ input = """<textarea name="%s" cols="%s" rows="%s">%s</textarea>""" % \
(name, max((len(l) for l in val))+10, len(val)+1, a.default) (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''' 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 (''' <param name="%s" type="optiongroup" appearance="combo" gui-text="%s" gui-description=%s>\n'''
% (name, viewname, quoteattr(a.help or viewname)) + % (name, viewname, quoteattr(a.help or viewname)) +
"".join(' <item value="%s"%s>%s</item>\n' % "".join(' <option value="%s">%s</option>\n' % (e, e) for e in uniqueChoices) + ' </param>\n')
(e, ' selected="selected"' if e == a.default else "",
e) for e in a.choices) + ' </param>\n')
else: else:
default = a.default default = a.default
if isinstance(a.type, boxes.BoolArg): if isinstance(a.type, boxes.BoolArg):
t = '"boolean"' t = '"bool"'
default = str(a.default).lower() default = str(a.default).lower()
elif a.type is boxes.argparseSections: elif a.type is boxes.argparseSections:
t = '"string"' t = '"string"'
else: else:
t = { int : '"int"', t = { int : '"int"',
float : '"float" precision="2"', float : '"float" precision="2"',
str : '"string"', str : '"string"',
}.get(a.type, '"string"') }.get(a.type, '"string"')
return ''' <param name="%s" type=%s max="9999" _gui-text="%s" gui-description=%s>%s</param>\n''' % (name, t, viewname, quoteattr(a.help or viewname), default)
if t == '"int"' or t == '"float" precision="2"':
return ''' <param name="%s" type=%s max="9999" gui-text="%s" gui-description=%s>%s</param>\n''' % (name, t, viewname, quoteattr(a.help or viewname), default)
else:
return ''' <param name="%s" type=%s gui-text="%s" gui-description=%s>%s</param>\n''' % (name, t, viewname, quoteattr(a.help or viewname), default)
def generator2inx(self, name, box): def generator2inx(self, name, box):
result = [ """<?xml version="1.0" encoding="UTF-8"?> result = [ """<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension"> <inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
<_name>%s</_name> <name>%s</name>
<dependency type="executable" location="path">boxes</dependency>
<id>info.festi.boxes.py.%s</id> <id>info.festi.boxes.py.%s</id>
<param name="generator" type="string" gui-hidden="true">%s</param> <param name="generator" type="string" gui-hidden="true">%s</param>
<param name="tab" type="notebook"> <param name="tab" type="notebook">""" % (name, name, name.lower())]
""" % (name, name, name.lower())]
groupid = 0 groupid = 0
for group in box.argparser._action_groups: for group in box.argparser._action_groups:
if not group._group_actions: if not group._group_actions:
@ -98,30 +104,40 @@ class Boxes2INX:
title = title[len("Settings for "):] title = title[len("Settings for "):]
if title.endswith(" Settings"): if title.endswith(" Settings"):
title = title[:-len(" Settings")] title = title[:-len(" Settings")]
result.append("""
<page name="%s" _gui-text="%s"> pageParams = []
""" % (groupid, title))
for a in group._group_actions: for a in group._group_actions:
if a.dest in ("input", "output", "format"): if a.dest in ("input", "output", "format"):
continue continue
result.append(self.arg2inx(a, prefix)) if self.arg2inx(a, prefix) != "":
result.append(" </page>\n") pageParams.append(self.arg2inx(a, prefix))
if len(pageParams) > 0:
result.append("""
<page name="tab_%s" gui-text="%s">
""" % (groupid, title))
result.extend(pageParams)
result.append(" </page>")
groupid += 1 groupid += 1
result.append(""" result.append("""
</param> <page name="tab_%s" gui-text="Example">
""" % (groupid))
result.append(" <image>./" + name + "-thumb.jpg</image>\n")
result.append(" </page>\n")
result.append("""</param>
<label appearance="url">https://www.festi.info/boxes.py/""" + name + """</label>
<effect> <effect>
<object-type>all</object-type> <object-type>all</object-type>
<effects-menu> <effects-menu>
<submenu _name="Boxes.py"> <submenu name="Boxes.py">
<submenu _name="%s"/> <submenu name="%s"/>
</submenu> </submenu>
</effects-menu> </effects-menu>
</effect> </effect>
<script> <script>
<command reldir="extensions">boxes</command> <command location="inx" interpreter="python">boxes_proxy.py</command>
</script> </script>
</inkscape-extension> </inkscape-extension>""" % self.groups_by_name[box.ui_group].title)
""" % self.groups_by_name[box.ui_group].title)
return b''.join(s.encode("utf-8") for s in result) return b''.join(s.encode("utf-8") for s in result)
def writeINX(self, name, box, path): def writeINX(self, name, box, path):