import os import click from click.formatting import join_options from lektor.cli import cli as root_command OUT = os.path.abspath(os.path.join( os.path.dirname(__file__), '..', 'content', 'docs', 'cli')) def get_opts(param): any_prefix_is_slash = [] def _write(opts): rv, any_slashes = join_options(opts) if any_slashes: any_prefix_is_slash[:] = [True] if not param.is_flag and not param.count: rv += ' ' + param.make_metavar() return rv rv = [_write(param.opts)] if param.secondary_opts: rv.append(_write(param.secondary_opts)) return (any_prefix_is_slash and '; ' or ' / ').join(rv) def write_page(data): path = data['path'][1:] if not path: return filename = os.path.join(OUT, *(path + ['contents.lr'])) dirname = os.path.dirname(filename) try: os.makedirs(dirname) except OSError: pass args = [x['metavar'] for x in data['arguments']] body = [ '`%s`' % ' '.join(data['path'] + args), '', data['help'] or '', ] body.append('') body.append('## Options') body.append('') for opt in data['options']: prefix = '- `%s`: ' % opt['opt_string'] for line in click.wrap_text( opt['help'] or '', 74, prefix, ' ').splitlines(): body.append(line) body.append('- `--help`: print this help page.') fields = [ ('comment', 'This file is auto generated by dump-cli-help.py'), ('title', path[-1]), ('summary', data['summary']), ('type', 'cmdlet'), ('body', '\n'.join(body)), ] with open(filename, 'w') as f: f.write('\n---\n'.join('%s:%s%s' % ( k, len(v.splitlines()) > 1 and '\n\n' or ' ', v ) for k, v in fields)) def dump_command(cmd, path): data = { 'path': path, 'summary': cmd.short_help, 'help': cmd.help.replace('\b', ''), 'options': [], 'arguments': [], } for param in cmd.params: if isinstance(param, click.Option): data['options'].append({ 'opt_string': get_opts(param), 'help': param.help, }) else: data['arguments'].append({ 'metavar': param.make_metavar(), }) write_page(data) if isinstance(cmd, click.Group): for child_name, child_cmd in cmd.commands.iteritems(): dump_command(child_cmd, path + [child_name]) dump_command(root_command, ['lektor'])