srcanamdw/codescanner/pyinstaller/optik/help.py
author noe\swadi
Thu, 18 Feb 2010 12:29:02 +0530
changeset 1 22878952f6e2
permissions -rw-r--r--
Committing the CodeScanner Core tool This component has been moved from the StaticAnaApps package. BUG : 5889 (http://developer.symbian.org/webbugs/show_bug.cgi?id=5889).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     1
"""optik.help
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     3
Provides HelpFormatter and subclasses -- used by OptionParser
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     4
to generate formatted help text.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     5
"""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     6
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     7
# Copyright (c) 2001-2004 Gregory P. Ward.  All rights reserved.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     8
# See the README.txt distributed with Optik for licensing terms.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     9
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    10
import os
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    11
import string
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    12
import textwrap
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    13
from optik.option import NO_DEFAULT
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    14
from optik.errors import gettext
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    15
_ = gettext
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    16
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    17
__revision__ = "$Id: help.py,v 1.1 2009/02/05 23:03:30 stechong Exp $"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    18
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    19
__all__ = ['HelpFormatter', 'IndentedHelpFormatter', 'TitledHelpFormatter']
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    20
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    21
class HelpFormatter:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    22
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    23
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    24
    Abstract base class for formatting option help.  OptionParser
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    25
    instances should use one of the HelpFormatter subclasses for
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    26
    formatting help; by default IndentedHelpFormatter is used.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    27
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    28
    Instance attributes:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    29
      parser : OptionParser
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    30
        the controlling OptionParser instance
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    31
      indent_increment : int
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    32
        the number of columns to indent per nesting level
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    33
      max_help_position : int
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    34
        the maximum starting column for option help text
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    35
      help_position : int
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    36
        the calculated starting column for option help text;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    37
        initially the same as the maximum
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    38
      width : int
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    39
        total number of columns for output (pass None to constructor for
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    40
        this value to be taken from the $COLUMNS environment variable)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    41
      level : int
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    42
        current indentation level
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    43
      current_indent : int
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    44
        current indentation level (in columns)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    45
      help_width : int
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    46
        number of columns available for option help text (calculated)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    47
      default_tag : str
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    48
        text to replace with each option's default value, "%default"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    49
        by default.  Set to false value to disable default value expansion.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    50
      option_strings : { Option : str }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    51
        maps Option instances to the snippet of help text explaining
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    52
        the syntax of that option, e.g. "-h, --help" or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    53
        "-fFILE, --file=FILE"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    54
      _short_opt_fmt : str
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    55
        format string controlling how short options with values are
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    56
        printed in help text.  Must be either "%s%s" ("-fFILE") or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    57
        "%s %s" ("-f FILE"), because those are the two syntaxes that
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    58
        Optik supports.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    59
      _long_opt_fmt : str
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    60
        similar but for long options; must be either "%s %s" ("--file FILE")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    61
        or "%s=%s" ("--file=FILE").
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    62
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    63
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    64
    NO_DEFAULT_VALUE = "none"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    65
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    66
    def __init__(self,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    67
                 indent_increment,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    68
                 max_help_position,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    69
                 width,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    70
                 short_first):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    71
        self.parser = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    72
        self.indent_increment = indent_increment
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    73
        self.help_position = self.max_help_position = max_help_position
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    74
        if width is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    75
            try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    76
                width = int(os.environ['COLUMNS'])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    77
            except (KeyError, ValueError):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    78
                width = 80
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    79
            width = width - 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    80
        self.width = width
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    81
        self.current_indent = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    82
        self.level = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    83
        self.help_width = None          # computed later
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    84
        self.short_first = short_first
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    85
        self.default_tag = "%default"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    86
        self.option_strings = {}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    87
        self._short_opt_fmt = "%s %s"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    88
        self._long_opt_fmt = "%s=%s"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    89
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    90
    def set_parser(self, parser):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    91
        self.parser = parser
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    92
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    93
    def set_short_opt_delimiter(self, delim):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    94
        if delim not in ("", " "):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    95
            raise ValueError(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    96
                "invalid metavar delimiter for short options: %r" % delim)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    97
        self._short_opt_fmt = "%s" + delim + "%s"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    98
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    99
    def set_long_opt_delimiter(self, delim):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   100
        if delim not in ("=", " "):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   101
            raise ValueError(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   102
                "invalid metavar delimiter for long options: %r" % delim)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   103
        self._long_opt_fmt = "%s" + delim + "%s"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   104
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   105
    def indent(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   106
        self.current_indent = self.current_indent + self.indent_increment
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   107
        self.level = self.level + 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   108
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   109
    def dedent(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   110
        self.current_indent = self.current_indent - self.indent_increment
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   111
        assert self.current_indent >= 0, "Indent decreased below 0."
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   112
        self.level = self.level - 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   113
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   114
    def format_usage(self, usage):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   115
        raise NotImplementedError, "subclasses must implement"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   116
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   117
    def format_heading(self, heading):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   118
        raise NotImplementedError, "subclasses must implement"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   119
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   120
    def format_description(self, description):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   121
        if not description:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   122
            return ""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   123
        desc_width = self.width - self.current_indent
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   124
        indent = " "*self.current_indent
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   125
        return textwrap.fill(description,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   126
                             desc_width,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   127
                             initial_indent=indent,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   128
                             subsequent_indent=indent) + "\n"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   129
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   130
    def expand_default(self, option):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   131
        if self.parser is None or not self.default_tag:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   132
            return option.help
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   133
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   134
        default_value = self.parser.defaults.get(option.dest)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   135
        if default_value is NO_DEFAULT or default_value is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   136
            default_value = self.NO_DEFAULT_VALUE
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   137
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   138
        return string.replace(option.help, self.default_tag, str(default_value))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   139
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   140
    def format_option(self, option):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   141
        # The help for each option consists of two parts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   142
        #   * the opt strings and metavars
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   143
        #     eg. ("-x", or "-fFILENAME, --file=FILENAME")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   144
        #   * the user-supplied help string
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   145
        #     eg. ("turn on expert mode", "read data from FILENAME")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   146
        #
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   147
        # If possible, we write both of these on the same line:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   148
        #   -x      turn on expert mode
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   149
        #
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   150
        # But if the opt string list is too long, we put the help
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   151
        # string on a second line, indented to the same column it would
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   152
        # start in if it fit on the first line.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   153
        #   -fFILENAME, --file=FILENAME
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   154
        #           read data from FILENAME
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   155
        result = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   156
        opts = self.option_strings[option]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   157
        opt_width = self.help_position - self.current_indent - 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   158
        if len(opts) > opt_width:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   159
            opts = "%*s%s\n" % (self.current_indent, "", opts)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   160
            indent_first = self.help_position
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   161
        else:                       # start help on same line as opts
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   162
            opts = "%*s%-*s  " % (self.current_indent, "", opt_width, opts)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   163
            indent_first = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   164
        result.append(opts)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   165
        if option.help:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   166
            help_text = self.expand_default(option)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   167
            help_lines = textwrap.wrap(help_text, self.help_width)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   168
            result.append("%*s%s\n" % (indent_first, "", help_lines[0]))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   169
            for line in help_lines[1:]:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   170
                result.append("%*s%s\n" % (self.help_position, "", line))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   171
        elif opts[-1] != "\n":
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   172
            result.append("\n")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   173
        return string.join(result, "")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   174
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   175
    def store_option_strings(self, parser):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   176
        self.indent()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   177
        max_len = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   178
        for opt in parser.option_list:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   179
            strings = self.format_option_strings(opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   180
            self.option_strings[opt] = strings
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   181
            max_len = max(max_len, len(strings) + self.current_indent)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   182
        self.indent()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   183
        for group in parser.option_groups:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   184
            for opt in group.option_list:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   185
                strings = self.format_option_strings(opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   186
                self.option_strings[opt] = strings
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   187
                max_len = max(max_len, len(strings) + self.current_indent)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   188
        self.dedent()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   189
        self.dedent()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   190
        self.help_position = min(max_len + 2, self.max_help_position)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   191
        self.help_width = self.width - self.help_position
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   192
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   193
    def format_option_strings(self, option):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   194
        """Return a comma-separated list of option strings & metavariables."""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   195
        if option.takes_value():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   196
            metavar = option.metavar or string.upper(option.dest)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   197
            short_opts = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   198
            for sopt in option._short_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   199
                short_opts.append(self._short_opt_fmt % (sopt, metavar))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   200
            long_opts = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   201
            for lopt in option._long_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   202
                long_opts.append(self._long_opt_fmt % (lopt, metavar))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   203
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   204
            short_opts = option._short_opts
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   205
            long_opts = option._long_opts
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   206
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   207
        if self.short_first:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   208
            opts = short_opts + long_opts
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   209
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   210
            opts = long_opts + short_opts
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   211
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   212
        return string.join(opts, ", ")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   213
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   214
class IndentedHelpFormatter (HelpFormatter):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   215
    """Format help with indented section bodies.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   216
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   217
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   218
    def __init__(self,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   219
                 indent_increment=2,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   220
                 max_help_position=24,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   221
                 width=None,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   222
                 short_first=1):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   223
        HelpFormatter.__init__(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   224
            self, indent_increment, max_help_position, width, short_first)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   225
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   226
    def format_usage(self, usage):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   227
        return _("usage: %s\n") % usage
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   228
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   229
    def format_heading(self, heading):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   230
        return "%*s%s:\n" % (self.current_indent, "", heading)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   231
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   232
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   233
class TitledHelpFormatter (HelpFormatter):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   234
    """Format help with underlined section headers.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   235
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   236
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   237
    def __init__(self,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   238
                 indent_increment=0,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   239
                 max_help_position=24,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   240
                 width=None,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   241
                 short_first=0):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   242
        HelpFormatter.__init__ (
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   243
            self, indent_increment, max_help_position, width, short_first)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   244
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   245
    def format_usage(self, usage):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   246
        return "%s  %s\n" % (self.format_heading(_("Usage")), usage)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   247
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   248
    def format_heading(self, heading):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   249
        return "%s\n%s\n" % (heading, "=-"[self.level] * len(heading))