From 478cd48dee2e40fe009d07c73360c9abbed2ffe4 Mon Sep 17 00:00:00 2001 From: Greg Ward Date: Thu, 8 May 2003 01:58:05 +0000 Subject: 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. --- Lib/textwrap.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/Lib/textwrap.py b/Lib/textwrap.py index b0c7042..ec0e7cb 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) -- cgit v0.12