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