I'm using the python cog module to generate C++ boilerplate code, and it is working great so far, but my only concern is that the resulting code, which is ugly by itself, is made worse by the fact that it's not indented. I'm too lazy to get the indentation right in the string generation function, so I'm wondering if there is a Python util function to indent the content of a multi-line string?
4 Answers
You can indent the lines in a string by just padding each one with proper number of pad characters. This can easily be done by using the textwrap.indent() function which was added to the module in Python 3.3. Alternatively you could use the code below which will also work in earlier Python versions.
try: import textwrap textwrap.indent except AttributeError: # undefined function (wasn't added until Python 3.3) def indent(text, amount, ch=' '): padding = amount * ch return ''.join(padding+line for line in text.splitlines(True)) else: def indent(text, amount, ch=' '): return textwrap.indent(text, amount * ch) text = '''\ And the Lord God said unto the serpent, Because thou hast done this, thou art cursed above all cattle, and above every beast of the field; upon thy belly shalt thou go, and dust shalt thou eat all the days of thy life: And I will put enmity between thee and the woman, and between thy seed and her seed; it shall bruise thy head, and thou shalt bruise his heel. 3:15-King James ''' print('Text indented 4 spaces:\n') print(indent(text, 4)) Result:
Text indented 4 spaces: And the Lord God said unto the serpent, Because thou hast done this, thou art cursed above all cattle, and above every beast of the field; upon thy belly shalt thou go, and dust shalt thou eat all the days of thy life: And I will put enmity between thee and the woman, and between thy seed and her seed; it shall bruise thy head, and thou shalt bruise his heel. 3:15-King James 10 Comments
text in my answer ends with a newline. If you add a print 'another line' at the end of it that will not be indented.return padding + ('\n'+padding).join(lines.rstrip().split('\n')). It keeps removing the @martineau because it'll happen automatically since your comment is under my answer.import textwrap and then textwrap.indent(text, ' ' * 4)If you have a leading newline:
Heredocs can contain a literal newline, or you can prepend one.
indent = ' ' indent_me = ''' Hello World ''' indented = indent_me.replace('\n', '\n' + indent) print(indented) Here is it shown in pprint dump:
>>> pprint(indented)
' Hello\n World\n '
Awkward, but works
If you do not have a leading newline:
indent = ' ' indent_me = '''\ Hello World ''' indented = indent + indent_me.replace('\n', '\n' + indent) print(indented) Optional, trim first newline and trailing spaces/tabs
.lstrip('\n').rstrip(' \t') Comments
Why not pipe the output through a command-line code formatter such as astyle?
There is a script located in the python Tools/Scripts/ directory which is primarily for fixing the indentation of entire python files. However, you can easily tweak the script a little and apply it to sections/lines of code, or other types of files.
The script is also located online, here:
http://svn.python.org/projects/python/trunk/Tools/scripts/reindent.py
Or, as a module here:
http://pypi.python.org/pypi/Reindent/0.1.0
1 Comment
reindent.py is only a hundred or so lines of pretty simple code, what I am suggesting is to customize it a little and apply it to the c/c++. Or even subclass the Reindenter class in reindent.py to make it specific for c++. It may not be the quickest solution, but its an option ).
mytext = re.sub( '^',' '*4, mytext ,flags=re.MULTILINE )