14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""A collection of string operations (most are no longer used).
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWarning: most of the code you see here isn't normally used nowadays.
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmBeginning with Python 1.6, many of these functions are implemented as
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmethods on the standard string object. They used to be implemented by
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma built-in module called strop, but strop is now obsolete itself.
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPublic module variables:
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhitespace -- a string containing all characters considered whitespace
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlowercase -- a string containing all characters considered lowercase letters
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmuppercase -- a string containing all characters considered uppercase letters
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmletters -- a string containing all characters considered letters
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdigits -- a string containing all characters considered decimal digits
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhexdigits -- a string containing all characters considered hexadecimal digits
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmoctdigits -- a string containing all characters considered octal digits
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpunctuation -- a string containing all characters considered punctuation
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprintable -- a string containing all characters considered printable
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Some strings for ctype-style character classification
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhitespace = ' \t\n\r\v\f'
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlowercase = 'abcdefghijklmnopqrstuvwxyz'
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmuppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmletters = lowercase + uppercase
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmascii_lowercase = lowercase
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmascii_uppercase = uppercase
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmascii_letters = ascii_lowercase + ascii_uppercase
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdigits = '0123456789'
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhexdigits = digits + 'abcdef' + 'ABCDEF'
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmoctdigits = '01234567'
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpunctuation = """!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprintable = digits + letters + punctuation + whitespace
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Case conversion helpers
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Use str to convert Unicode literal in case of -U
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylml = map(chr, xrange(256))
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_idmap = str('').join(l)
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdel l
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Functions which aren't available as string methods.
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Capitalize the words in a string, e.g. " aBc  dEf " -> "Abc Def".
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef capwords(s, sep=None):
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """capwords(s [,sep]) -> string
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Split the argument into words using split, capitalize each
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    word using capitalize, and join the capitalized words using
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    join.  If the optional second argument sep is absent or None,
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    runs of whitespace characters are replaced by a single space
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    and leading and trailing whitespace are removed, otherwise
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sep is used to split and join the words.
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (sep or ' ').join(x.capitalize() for x in s.split(sep))
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Construct a translation string
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_idmapL = None
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef maketrans(fromstr, tostr):
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """maketrans(frm, to) -> string
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a translation table (a string of 256 bytes long)
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suitable for use in string.translate.  The strings frm and to
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    must be of the same length.
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if len(fromstr) != len(tostr):
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise ValueError, "maketrans arguments must have same length"
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    global _idmapL
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if not _idmapL:
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        _idmapL = list(_idmap)
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    L = _idmapL[:]
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fromstr = map(ord, fromstr)
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for i in range(len(fromstr)):
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        L[fromstr[i]] = tostr[i]
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ''.join(L)
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm####################################################################
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport re as _re
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _multimap:
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Helper class for combining multiple mappings.
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Used by .{safe_,}substitute() to combine the mapping and keyword
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arguments.
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, primary, secondary):
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._primary = primary
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._secondary = secondary
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __getitem__(self, key):
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return self._primary[key]
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except KeyError:
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return self._secondary[key]
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass _TemplateMetaclass(type):
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pattern = r"""
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    %(delim)s(?:
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      (?P<escaped>%(delim)s) |   # Escape sequence of two delimiters
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      (?P<named>%(id)s)      |   # delimiter and a Python identifier
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      {(?P<braced>%(id)s)}   |   # delimiter and a braced identifier
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      (?P<invalid>)              # Other ill-formed delimiter exprs
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    )
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(cls, name, bases, dct):
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        super(_TemplateMetaclass, cls).__init__(name, bases, dct)
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 'pattern' in dct:
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pattern = cls.pattern
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pattern = _TemplateMetaclass.pattern % {
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                'delim' : _re.escape(cls.delimiter),
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                'id'    : cls.idpattern,
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cls.pattern = _re.compile(pattern, _re.IGNORECASE | _re.VERBOSE)
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Template:
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """A string class for supporting $-substitutions."""
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    __metaclass__ = _TemplateMetaclass
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    delimiter = '$'
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    idpattern = r'[_a-z][_a-z0-9]*'
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, template):
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.template = template
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Search for $$, $identifier, ${identifier}, and any bare $'s
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _invalid(self, mo):
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        i = mo.start('invalid')
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        lines = self.template[:i].splitlines(True)
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not lines:
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            colno = 1
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            lineno = 1
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            colno = i - len(''.join(lines[:-1]))
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            lineno = len(lines)
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise ValueError('Invalid placeholder in string: line %d, col %d' %
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         (lineno, colno))
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def substitute(self, *args, **kws):
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if len(args) > 1:
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise TypeError('Too many positional arguments')
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not args:
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mapping = kws
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif kws:
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mapping = _multimap(kws, args[0])
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mapping = args[0]
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Helper function for .sub()
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def convert(mo):
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Check the most common path first.
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            named = mo.group('named') or mo.group('braced')
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if named is not None:
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                val = mapping[named]
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # We use this idiom instead of str() because the latter will
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # fail if val is a Unicode containing non-ASCII characters.
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return '%s' % (val,)
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if mo.group('escaped') is not None:
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return self.delimiter
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if mo.group('invalid') is not None:
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._invalid(mo)
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise ValueError('Unrecognized named group in pattern',
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             self.pattern)
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.pattern.sub(convert, self.template)
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def safe_substitute(self, *args, **kws):
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if len(args) > 1:
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise TypeError('Too many positional arguments')
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not args:
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mapping = kws
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif kws:
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mapping = _multimap(kws, args[0])
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mapping = args[0]
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Helper function for .sub()
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def convert(mo):
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            named = mo.group('named')
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if named is not None:
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # We use this idiom instead of str() because the latter
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    # will fail if val is a Unicode containing non-ASCII
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return '%s' % (mapping[named],)
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except KeyError:
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return self.delimiter + named
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            braced = mo.group('braced')
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if braced is not None:
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return '%s' % (mapping[braced],)
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except KeyError:
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return self.delimiter + '{' + braced + '}'
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if mo.group('escaped') is not None:
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return self.delimiter
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if mo.group('invalid') is not None:
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return self.delimiter
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise ValueError('Unrecognized named group in pattern',
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             self.pattern)
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.pattern.sub(convert, self.template)
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm####################################################################
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# NOTE: Everything below here is deprecated.  Use string methods instead.
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# This stuff will go away in Python 3.0.
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Backward compatible names for exceptions
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmindex_error = ValueError
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmatoi_error = ValueError
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmatof_error = ValueError
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmatol_error = ValueError
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# convert UPPER CASE letters to lower case
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef lower(s):
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """lower(s) -> string
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s converted to lowercase.
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.lower()
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Convert lower case letters to UPPER CASE
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef upper(s):
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """upper(s) -> string
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s converted to uppercase.
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.upper()
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Swap lower case letters and UPPER CASE
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef swapcase(s):
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """swapcase(s) -> string
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with upper case characters
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    converted to lowercase and vice versa.
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.swapcase()
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Strip leading and trailing tabs and spaces
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef strip(s, chars=None):
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """strip(s [,chars]) -> string
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with leading and trailing
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    whitespace removed.
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    If chars is given and not None, remove characters in chars instead.
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    If chars is unicode, S will be converted to unicode before stripping.
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.strip(chars)
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Strip leading tabs and spaces
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef lstrip(s, chars=None):
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """lstrip(s [,chars]) -> string
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with leading whitespace removed.
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    If chars is given and not None, remove characters in chars instead.
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.lstrip(chars)
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Strip trailing tabs and spaces
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef rstrip(s, chars=None):
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """rstrip(s [,chars]) -> string
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with trailing whitespace removed.
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    If chars is given and not None, remove characters in chars instead.
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.rstrip(chars)
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Split a string into a list of space/tab-separated words
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef split(s, sep=None, maxsplit=-1):
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """split(s [,sep [,maxsplit]]) -> list of strings
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a list of the words in the string s, using sep as the
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    delimiter string.  If maxsplit is given, splits at no more than
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    maxsplit places (resulting in at most maxsplit+1 words).  If sep
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    is not specified or is None, any whitespace string is a separator.
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (split and splitfields are synonymous)
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.split(sep, maxsplit)
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsplitfields = split
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Split a string into a list of space/tab-separated words
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef rsplit(s, sep=None, maxsplit=-1):
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """rsplit(s [,sep [,maxsplit]]) -> list of strings
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a list of the words in the string s, using sep as the
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    delimiter string, starting at the end of the string and working
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    to the front.  If maxsplit is given, at most maxsplit splits are
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    done. If sep is not specified or is None, any whitespace string
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    is a separator.
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.rsplit(sep, maxsplit)
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Join fields with optional separator
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef join(words, sep = ' '):
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """join(list [,sep]) -> string
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a string composed of the words in list, with
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    intervening occurrences of sep.  The default separator is a
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    single space.
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (joinfields and join are synonymous)
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return sep.join(words)
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmjoinfields = join
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Find substring, raise exception if not found
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef index(s, *args):
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """index(s, sub [,start [,end]]) -> int
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Like find but raises ValueError when the substring is not found.
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.index(*args)
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Find last substring, raise exception if not found
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef rindex(s, *args):
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """rindex(s, sub [,start [,end]]) -> int
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Like rfind but raises ValueError when the substring is not found.
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.rindex(*args)
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Count non-overlapping occurrences of substring
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef count(s, *args):
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """count(s, sub[, start[,end]]) -> int
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the number of occurrences of substring sub in string
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s[start:end].  Optional arguments start and end are
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    interpreted as in slice notation.
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.count(*args)
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Find substring, return -1 if not found
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef find(s, *args):
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """find(s, sub [,start [,end]]) -> in
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the lowest index in s where substring sub is found,
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    such that sub is contained within s[start,end].  Optional
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arguments start and end are interpreted as in slice notation.
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return -1 on failure.
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.find(*args)
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Find last substring, return -1 if not found
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef rfind(s, *args):
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """rfind(s, sub [,start [,end]]) -> int
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the highest index in s where substring sub is found,
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    such that sub is contained within s[start,end].  Optional
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arguments start and end are interpreted as in slice notation.
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return -1 on failure.
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.rfind(*args)
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# for a bit of speed
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_float = float
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_int = int
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_long = long
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Convert string to float
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef atof(s):
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """atof(s) -> float
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the floating point number represented by the string s.
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _float(s)
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Convert string to integer
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef atoi(s , base=10):
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """atoi(s [,base]) -> int
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the integer represented by the string s in the given
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    base, which defaults to 10.  The string s must consist of one
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    or more digits, possibly preceded by a sign.  If base is 0, it
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    is chosen from the leading characters of s, 0 for octal, 0x or
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0X for hexadecimal.  If base is 16, a preceding 0x or 0X is
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    accepted.
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _int(s, base)
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Convert string to long integer
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef atol(s, base=10):
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """atol(s [,base]) -> long
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return the long integer represented by the string s in the
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    given base, which defaults to 10.  The string s must consist
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    of one or more digits, possibly preceded by a sign.  If base
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    is 0, it is chosen from the leading characters of s, 0 for
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    octal, 0x or 0X for hexadecimal.  If base is 16, a preceding
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0x or 0X is accepted.  A trailing L or l is not accepted,
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unless base is 0.
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _long(s, base)
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Left-justify a string
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef ljust(s, width, *args):
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """ljust(s, width[, fillchar]) -> string
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a left-justified version of s, in a field of the
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    specified width, padded with spaces as needed.  The string is
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    never truncated.  If specified the fillchar is used instead of spaces.
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.ljust(width, *args)
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Right-justify a string
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef rjust(s, width, *args):
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """rjust(s, width[, fillchar]) -> string
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a right-justified version of s, in a field of the
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    specified width, padded with spaces as needed.  The string is
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    never truncated.  If specified the fillchar is used instead of spaces.
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.rjust(width, *args)
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Center a string
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef center(s, width, *args):
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """center(s, width[, fillchar]) -> string
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a center version of s, in a field of the specified
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    width. padded with spaces as needed.  The string is never
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    truncated.  If specified the fillchar is used instead of spaces.
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.center(width, *args)
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03'
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Decadent feature: the argument may be a string or a number
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# (Use of this is deprecated; it should be a string as with ljust c.s.)
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef zfill(x, width):
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """zfill(x, width) -> string
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Pad a numeric string x with zeros on the left, to fill a field
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    of the specified width.  The string x is never truncated.
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if not isinstance(x, basestring):
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = repr(x)
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return x.zfill(width)
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Expand tabs in a string.
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Doesn't take non-printing chars into account, but does understand \n.
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef expandtabs(s, tabsize=8):
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """expandtabs(s [,tabsize]) -> string
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with all tab characters replaced
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    by the appropriate number of spaces, depending on the current
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    column, and the tabsize (default 8).
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.expandtabs(tabsize)
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Character translation through look-up table.
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef translate(s, table, deletions=""):
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """translate(s,table [,deletions]) -> string
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s, where all characters occurring
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    in the optional argument deletions are removed, and the
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    remaining characters have been mapped through the given
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    translation table, which must be a string of length 256.  The
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    deletions argument is not allowed for Unicode strings.
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if deletions or table is None:
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s.translate(table, deletions)
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Add s[:0] so that if s is Unicode and table is an 8-bit string,
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # table is converted to Unicode.  This means that table *cannot*
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # be a dictionary -- for that feature, use u.translate() directly.
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s.translate(table + s[:0])
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Capitalize a string, e.g. "aBc  dEf" -> "Abc  def".
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef capitalize(s):
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """capitalize(s) -> string
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of the string s with only its first character
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    capitalized.
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.capitalize()
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Substring replacement (global)
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef replace(s, old, new, maxreplace=-1):
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """replace (str, old, new[, maxreplace]) -> string
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Return a copy of string str with all occurrences of substring
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    old replaced by new. If the optional argument maxreplace is
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    given, only the first maxreplace occurrences are replaced.
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s.replace(old, new, maxreplace)
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Try importing optional built-in module "strop" -- if it exists,
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# it redefines some string operations that are 100-1000 times faster.
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# It also defines values for whitespace, lowercase and uppercase
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# that match <ctype.h>'s definitions.
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from strop import maketrans, lowercase, uppercase, whitespace
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    letters = lowercase + uppercase
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError:
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pass                                          # Use the original versions
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm########################################################################
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# the Formatter class
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# see PEP 3101 for details and purpose of this class
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# The hard parts are reused from the C implementation.  They're exposed as "_"
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# prefixed methods of str and unicode.
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# The overall parser is implemented in str._formatter_parser.
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# The field name parser is implemented in str._formatter_field_name_split
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Formatter(object):
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def format(self, format_string, *args, **kwargs):
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.vformat(format_string, args, kwargs)
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def vformat(self, format_string, args, kwargs):
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        used_args = set()
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = self._vformat(format_string, args, kwargs, used_args, 2)
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_unused_args(used_args, args, kwargs)
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return result
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _vformat(self, format_string, args, kwargs, used_args, recursion_depth):
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if recursion_depth < 0:
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise ValueError('Max string recursion exceeded')
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = []
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for literal_text, field_name, format_spec, conversion in \
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.parse(format_string):
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # output the literal text
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if literal_text:
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                result.append(literal_text)
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # if there's a field, output it
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if field_name is not None:
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # this is some markup, find the object and do
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                #  the formatting
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # given the field_name, find the object it references
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                #  and the argument it came from
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                obj, arg_used = self.get_field(field_name, args, kwargs)
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                used_args.add(arg_used)
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # do any conversion on the resulting object
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                obj = self.convert_field(obj, conversion)
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # expand the format spec, if needed
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                format_spec = self._vformat(format_spec, args, kwargs,
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                            used_args, recursion_depth-1)
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # format the object and append to the result
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                result.append(self.format_field(obj, format_spec))
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ''.join(result)
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_value(self, key, args, kwargs):
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if isinstance(key, (int, long)):
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return args[key]
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return kwargs[key]
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def check_unused_args(self, used_args, args, kwargs):
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pass
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def format_field(self, value, format_spec):
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return format(value, format_spec)
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def convert_field(self, value, conversion):
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # do any conversion on the resulting object
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if conversion == 'r':
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return repr(value)
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif conversion == 's':
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return str(value)
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif conversion is None:
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return value
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise ValueError("Unknown conversion specifier {0!s}".format(conversion))
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # returns an iterable that contains tuples of the form:
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # (literal_text, field_name, format_spec, conversion)
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # literal_text can be zero length
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # field_name can be None, in which case there's no
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #  object to format and output
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # if field_name is not None, it is looked up, formatted
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #  with format_spec and conversion and then used
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def parse(self, format_string):
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return format_string._formatter_parser()
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # given a field_name, find the object it references.
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #  field_name:   the field being looked up, e.g. "0.name"
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #                 or "lookup[3]"
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #  used_args:    a set of which args have been used
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #  args, kwargs: as passed in to vformat
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def get_field(self, field_name, args, kwargs):
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        first, rest = field_name._formatter_field_name_split()
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        obj = self.get_value(first, args, kwargs)
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # loop through the rest of the field_name, doing
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        #  getattr or getitem as needed
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for is_attr, i in rest:
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if is_attr:
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                obj = getattr(obj, i)
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                obj = obj[i]
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return obj, first
643