123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #!/usr/bin/env python3
- # :Copyright: © 2020, 2022 Günter Milde.
- # :License: Released under the terms of the `2-Clause BSD license`_, in short:
- #
- # Copying and distribution of this file, with or without modification,
- # are permitted in any medium without royalty provided the copyright
- # notice and this notice are preserved.
- # This file is offered as-is, without any warranty.
- #
- # .. _2-Clause BSD license: https://opensource.org/licenses/BSD-2-Clause
- #
- # Revision: $Revision: 9064 $
- # Date: $Date: 2022-06-10 13:08:13 +0200 (Fr, 10. Jun 2022) $
- """Generic command line interface for the `docutils` package.
- See also
- https://docs.python.org/3/library/__main__.html#main-py-in-python-packages
- """
- import argparse
- import locale
- import sys
- import docutils
- from docutils.core import Publisher, publish_cmdline, default_description
- class CliSettingsSpec(docutils.SettingsSpec):
- """Runtime settings & command-line options for the generic CLI.
- Configurable reader, parser, and writer components.
- The "--writer" default will change to 'html' when this becomes
- an alias for 'html5'.
- """
- settings_spec = (
- 'Docutils Application Options',
- 'Reader, writer, and parser settings influence the available options. '
- ' Example: use `--help --writer=latex` to see LaTeX writer options. ',
- # options: ('help text', [<option strings>], {<keyword arguments>})
- (('Reader name (currently: "%default").',
- ['--reader'], {'default': 'standalone', 'metavar': '<reader>'}),
- ('Parser name (currently: "%default").',
- ['--parser'], {'default': 'rst', 'metavar': '<parser>'}),
- ('Writer name (currently: "%default").',
- ['--writer'], {'default': 'html5', 'metavar': '<writer>'}),
- )
- )
- config_section = 'docutils application'
- config_section_dependencies = ('docutils-cli application', # back-compat
- 'applications')
- def main():
- """Generic command line interface for the Docutils Publisher.
- """
- locale.setlocale(locale.LC_ALL, '')
- description = ('Convert documents into useful formats. '
- + default_description)
- # Update component selection from config file(s)
- components = Publisher().get_settings(settings_spec=CliSettingsSpec)
- # Update component selection from command-line
- argparser = argparse.ArgumentParser(add_help=False, allow_abbrev=False)
- argparser.add_argument('--reader', default=components.reader)
- argparser.add_argument('--parser', default=components.parser)
- argparser.add_argument('--writer', default=components.writer)
- # other options are parsed in a second pass via `publish_cmdline()`
- (args, remainder) = argparser.parse_known_args()
- # Ensure the current component selections are shown in help:
- CliSettingsSpec.settings_default_overrides = args.__dict__
- try:
- publish_cmdline(reader_name=args.reader,
- parser_name=args.parser,
- writer_name=args.writer,
- settings_spec=CliSettingsSpec,
- description=description,
- argv=remainder)
- except ImportError as error:
- print('%s.' % error, file=sys.stderr)
- if '--traceback' in remainder:
- raise
- else:
- print('Use "--traceback" to show details.')
- if __name__ == '__main__':
- if sys.argv[0].endswith('__main__.py'):
- # fix "usage" message
- sys.argv[0] = '%s -m docutils' % sys.executable
- main()
|