From: Greg Ward Date: Thu, 8 May 2003 01:58:05 +0000 (+0000) Subject: SF patch #598163 (Ville Vainio, vvainio@users.sourceforge.net): X-Git-Tag: v2.3c1~809 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=478cd48dee2e40fe009d07c73360c9abbed2ffe4;p=python SF patch #598163 (Ville Vainio, vvainio@users.sourceforge.net): add dedent() function, to remove indentation from multiline strings (eg. triple-quoted strings). Differs from inspect.getdoc() by not special-casing the first line (often a sensible approach for non-docstring multiline strings). This should make this function more general (symmetric 'indent' also possible), and more fitting for the textwrap module. --- diff --git a/Lib/textwrap.py b/Lib/textwrap.py index b0c7042b54..ec0e7cbe01 100644 --- a/Lib/textwrap.py +++ b/Lib/textwrap.py @@ -306,3 +306,45 @@ def fill(text, width=70, **kwargs): """ w = TextWrapper(width=width, **kwargs) return w.fill(text) + + +# -- Loosely related functionality ------------------------------------- + +def dedent(text): + """dedent(text : string) -> string + + Remove any whitespace than can be uniformly removed from the left + of every line in `text`. + + This can be used e.g. to make triple-quoted strings line up with + the left edge of screen/whatever, while still presenting it in the + source code in indented form. + + For example: + + def test(): + # end first line with \ to avoid the empty line! + s = '''\ + Hey + there + ''' + print repr(s) # prints ' Hey\n there\n ' + print repr(dedent(s)) # prints 'Hey\nthere\n' + """ + lines = text.expandtabs().split('\n') + margin = None + for line in lines: + content = len(line.lstrip()) + if not content: + continue + indent = len(line) - content + if margin is None: + margin = indent + else: + margin = min(margin, indent) + + if margin is not None: + for i in range(len(lines)): + lines[i] = lines[i][margin:] + + return '\n'.join(lines)