113 lines
2.8 KiB
Python
Executable File
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()
|