mightyscape-1.2/extensions/fablabchemnitz/boxes.py/boxes/scripts/boxes
2024-03-31 18:51:28 +02:00

113 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python3
"""boxes.py
Generate stencils for wooden boxes.
Usage:
boxes <generator> [<args>...]
boxes --list
boxes (-h | --help)
boxes --version
Options:
-h --help Show this screen.
--version Show version.
--list List available generators.
"""
import gettext
import os
import sys
try:
import boxes
except ImportError:
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..'))
import boxes
import boxes.generators
def print_usage():
print(__doc__)
def list_grouped_generators():
print('Available generators:')
for group in generator_groups():
print('\n' + group.title)
if group.description:
print('\n%s\n' % group.description)
else:
print()
for box in group.generators:
print(' * {} - {}'.format(box.__name__, box.__doc__ or ''))
def get_translation():
try:
return gettext.translation('boxes.py', localedir='locale')
except OSError:
return gettext.translation('boxes.py', fallback=True)
def run_generator(name, args):
generators = generators_by_name()
lower_name = name.lower()
if lower_name in generators.keys():
box = generators[lower_name]()
box.translations = get_translation()
box.parseArgs(args)
box.open()
box.render()
data = box.close()
with os.fdopen(sys.stdout.fileno(), "wb", closefd=False) if box.output == "-" else open(box.output, 'wb') as f:
f.write(data.getvalue())
else:
msg = f'Unknown generator \'{name}\'. Use boxes --list to get a list of available commands.\n'
sys.stderr.write(msg)
def generator_groups():
generators = generators_by_name()
return group_generators(generators)
def group_generators(generators):
groups = boxes.generators.ui_groups
groups_by_name = boxes.generators.ui_groups_by_name
for name, generator in generators.items():
group_for_generator = groups_by_name.get(generator.ui_group,
groups_by_name['Misc'])
group_for_generator.add(generator)
return groups
def generators_by_name():
all_generators = boxes.generators.getAllBoxGenerators()
return {
name.split('.')[-1].lower(): generator
for name, generator in all_generators.items()
}
def main() -> None:
if len(sys.argv) > 1 and sys.argv[1].startswith("--id="):
del sys.argv[1]
if len(sys.argv) == 1:
print_usage()
elif sys.argv[1] == '--list':
list_grouped_generators()
else:
name = sys.argv[1].lower()
if name.startswith("--generator="):
name = name[12:]
run_generator(name, sys.argv[2:])
if __name__ == '__main__':
main()