15c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#!/usr/bin/env python
25c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org##  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
35c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org##
45c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org##  Use of this source code is governed by a BSD-style license
55c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org##  that can be found in the LICENSE file in the root of the source
65c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org##  tree. An additional intellectual property rights grant can be found
75c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org##  in the file PATENTS.  All contributing project authors may
85c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org##  be found in the AUTHORS file in the root of the source tree.
95c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org##
105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org"""Wraps paragraphs of text, preserving manual formatting
115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgThis is like fold(1), but has the special convention of not modifying lines
135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgthat start with whitespace. This allows you to intersperse blocks with
145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgspecial formatting, like code blocks, with written prose. The prose will
155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgbe wordwrapped, and the manual formatting will be preserved.
165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * This won't handle the case of a bulleted (or ordered) list specially, so
185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org   manual wrapping must be done.
195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgOccasionally it's useful to put something with explicit formatting that
215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgdoesn't look at all like a block of text inline.
225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org  indicator = has_leading_whitespace(line);
245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org  if (indicator)
255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    preserve_formatting(line);
265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgThe intent is that this docstring would make it through the transform
285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.organd still be legible and presented as it is in the source. If additional
295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgcases are handled, update this doc to describe the effect.
305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org"""
315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org__author__ = "jkoleszar@google.com"
335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgimport textwrap
345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgimport sys
355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgdef wrap(text):
375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if text:
385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        return textwrap.fill(text, break_long_words=False) + '\n'
395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    return ""
405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgdef main(fileobj):
435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    text = ""
445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    output = ""
455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    while True:
465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        line = fileobj.readline()
475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        if not line:
485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            break
495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        if line.lstrip() == line:
515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            text += line
525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        else:
535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            output += wrap(text)
545c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            text=""
555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            output += line
565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    output += wrap(text)
575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    # Replace the file or write to stdout.
595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if fileobj == sys.stdin:
605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        fileobj = sys.stdout
615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    else:
625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        fileobj.seek(0)
635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        fileobj.truncate(0)
645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    fileobj.write(output)
655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgif __name__ == "__main__":
675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if len(sys.argv) > 1:
685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        main(open(sys.argv[1], "r+"))
695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    else:
705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        main(sys.stdin)
71