| #!/usr/bin/env python |
| ## |
| ## Copyright (c) 2021, Alliance for Open Media. All rights reserved |
| ## |
| ## This source code is subject to the terms of the BSD 3-Clause Clear License and the |
| ## Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear License was |
| ## not distributed with this source code in the LICENSE file, you can obtain it |
| ## at aomedia.org/license/software-license/bsd-3-c-c/. If the Alliance for Open Media Patent |
| ## License 1.0 was not distributed with this source code in the PATENTS file, you |
| ## can obtain it at aomedia.org/license/patent-license/. |
| ## |
| """Wraps paragraphs of text, preserving manual formatting |
| |
| This is like fold(1), but has the special convention of not modifying lines |
| that start with whitespace. This allows you to intersperse blocks with |
| special formatting, like code blocks, with written prose. The prose will |
| be wordwrapped, and the manual formatting will be preserved. |
| |
| * This won't handle the case of a bulleted (or ordered) list specially, so |
| manual wrapping must be done. |
| |
| Occasionally it's useful to put something with explicit formatting that |
| doesn't look at all like a block of text inline. |
| |
| indicator = has_leading_whitespace(line); |
| if (indicator) |
| preserve_formatting(line); |
| |
| The intent is that this docstring would make it through the transform |
| and still be legible and presented as it is in the source. If additional |
| cases are handled, update this doc to describe the effect. |
| """ |
| |
| __author__ = "jkoleszar@google.com" |
| import textwrap |
| import sys |
| |
| def wrap(text): |
| if text: |
| return textwrap.fill(text, break_long_words=False) + '\n' |
| return "" |
| |
| |
| def main(fileobj): |
| text = "" |
| output = "" |
| while True: |
| line = fileobj.readline() |
| if not line: |
| break |
| |
| if line.lstrip() == line: |
| text += line |
| else: |
| output += wrap(text) |
| text="" |
| output += line |
| output += wrap(text) |
| |
| # Replace the file or write to stdout. |
| if fileobj == sys.stdin: |
| fileobj = sys.stdout |
| else: |
| fileobj.seek(0) |
| fileobj.truncate(0) |
| fileobj.write(output) |
| |
| if __name__ == "__main__": |
| if len(sys.argv) > 1: |
| main(open(sys.argv[1], "r+")) |
| else: |
| main(sys.stdin) |