~certify-web-dev/twisted/certify-trunk

« back to all changes in this revision

Viewing changes to twisted/python/text.py

  • Committer: Bazaar Package Importer
  • Author(s): Moshe Zadka
  • Date: 2002-03-08 07:14:16 UTC
  • Revision ID: james.westby@ubuntu.com-20020308071416-oxvuw76tpcpi5v1q
Tags: upstream-0.15.5
ImportĀ upstreamĀ versionĀ 0.15.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
# Twisted, the Framework of Your Internet
 
3
# Copyright (C) 2001 Matthew W. Lefkowitz
 
4
#
 
5
# This library is free software; you can redistribute it and/or
 
6
# modify it under the terms of version 2.1 of the GNU Lesser General Public
 
7
# License as published by the Free Software Foundation.
 
8
#
 
9
# This library is distributed in the hope that it will be useful,
 
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
12
# Lesser General Public License for more details.
 
13
#
 
14
# You should have received a copy of the GNU Lesser General Public
 
15
# License along with this library; if not, write to the Free Software
 
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
17
 
 
18
"""Miscellany of text-munging functions.
 
19
"""
 
20
 
 
21
import string, types
 
22
 
 
23
def stringyString(object, indentation=''):
 
24
    """Expansive string formatting for sequence types.
 
25
 
 
26
    list.__str__ and dict.__str__ use repr() to display their
 
27
    elements.  This function also turns these sequence types
 
28
    into strings, but uses str() on their elements instead.
 
29
 
 
30
    Sequence elements are also displayed on seperate lines,
 
31
    and nested sequences have nested indentation.
 
32
    """
 
33
    braces = ''
 
34
    sl = []
 
35
 
 
36
    if type(object) is types.DictType:
 
37
        braces = '{}'
 
38
        for key, value in object.items():
 
39
            value = stringyString(value, indentation + '   ')
 
40
            if isMultiline(value):
 
41
                if endsInNewline(value):
 
42
                    value = value[:-len('\n')]
 
43
                sl.append("%s %s:\n%s" % (indentation, key, value))
 
44
            else:
 
45
                # Oops.  Will have to move that indentation.
 
46
                sl.append("%s %s: %s" % (indentation, key,
 
47
                                         value[len(indentation) + 3:]))
 
48
 
 
49
    elif type(object) in (types.TupleType, types.ListType):
 
50
        if type(object) is types.TupleType:
 
51
            braces = '()'
 
52
        else:
 
53
            braces = '[]'
 
54
 
 
55
        for element in object:
 
56
            element = stringyString(element, indentation + ' ')
 
57
            sl.append(string.rstrip(element) + ',')
 
58
    else:
 
59
        sl[:] = map(lambda s, i=indentation: i+s,
 
60
                    string.split(str(object),'\n'))
 
61
 
 
62
    if not sl:
 
63
        sl.append(indentation)
 
64
 
 
65
    if braces:
 
66
        sl[0] = indentation + braces[0] + sl[0][len(indentation) + 1:]
 
67
        sl[-1] = sl[-1] + braces[-1]
 
68
 
 
69
    s = string.join(sl, "\n")
 
70
 
 
71
    if isMultiline(s) and not endsInNewline(s):
 
72
        s = s + '\n'
 
73
 
 
74
    return s
 
75
 
 
76
def isMultiline(s):
 
77
    """Returns True if this string has a newline in it."""
 
78
    return (string.find(s, '\n') != -1)
 
79
 
 
80
def endsInNewline(s):
 
81
    """Returns True if this string ends in a newline."""
 
82
    return (s[-len('\n'):] == '\n')
 
83
 
 
84
def docstringLStrip(docstring):
 
85
    """Gets rid of unsightly lefthand docstring whitespace residue.
 
86
 
 
87
    You'd think someone would have done this already, but apparently
 
88
    not in 1.5.2.
 
89
    """
 
90
 
 
91
    if not docstring:
 
92
        return docstring
 
93
 
 
94
    docstring = string.replace(docstring, '\t', ' ' * 8)
 
95
    lines = string.split(docstring,'\n')
 
96
 
 
97
    leading = 0
 
98
    for l in xrange(1,len(lines)):
 
99
        line = lines[l]
 
100
        if string.strip(line):
 
101
            while 1:
 
102
                if line[leading] == ' ':
 
103
                    leading = leading + 1
 
104
                else:
 
105
                    break
 
106
        if leading:
 
107
            break
 
108
 
 
109
    outlines = lines[0:1]
 
110
    for l in xrange(1,len(lines)):
 
111
        outlines.append(lines[l][leading:])
 
112
 
 
113
    return string.join(outlines, '\n')
 
114
 
 
115
def greedyWrap(inString, width=80):
 
116
    """Given a string and a column width, return a list of lines.
 
117
 
 
118
    Caveat: I'm use a stupid greedy word-wrapping
 
119
    algorythm.  I won't put two spaces at the end
 
120
    of a sentence.  I don't do full justification.
 
121
    And no, I've never even *heard* of hypenation.
 
122
    """
 
123
 
 
124
    outLines = []
 
125
 
 
126
    inWords = string.split(inString)
 
127
 
 
128
    column = 0
 
129
    ptr_line = 0
 
130
    while inWords:
 
131
        column = column + len(inWords[ptr_line])
 
132
        ptr_line = ptr_line + 1
 
133
 
 
134
        if (column > width):
 
135
            if ptr_line == 1:
 
136
                # This single word is too long, it will be the whole line.
 
137
                pass
 
138
            else:
 
139
                # We've gone too far, stop the line one word back.
 
140
                ptr_line = ptr_line - 1
 
141
            (l, inWords) = (inWords[0:ptr_line], inWords[ptr_line:])
 
142
            outLines.append(string.join(l,' '))
 
143
 
 
144
            ptr_line = 0
 
145
            column = 0
 
146
        elif not (len(inWords) > ptr_line):
 
147
            # Clean up the last bit.
 
148
            outLines.append(string.join(inWords, ' '))
 
149
            del inWords[:]
 
150
        else:
 
151
            # Space
 
152
            column = column + 1
 
153
    # next word
 
154
 
 
155
    return outLines
 
156
 
 
157
 
 
158
wordWrap = greedyWrap