Skip to content

Commit 16d129c

Browse files
committed
Added examples of how our different text wrapper functions work to ietf.utils.text. Run 'python ietf/utils/text.py | less' to see the results.
- Legacy-Id: 13498
1 parent be28c2b commit 16d129c

1 file changed

Lines changed: 283 additions & 0 deletions

File tree

ietf/utils/text.py

Lines changed: 283 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,254 @@
1+
"""
2+
We have a plethora of different wrapping functions in use, and probably should
3+
reduce the number. In some cases, we should not wrap at all, instead letting
4+
the browser wrap, using for instance this css:
5+
6+
.pasted {
7+
white-space: pre-wrap;
8+
word-break: keep-all;
9+
}
10+
11+
In order to get a grasp of what we have got, and how the different variations
12+
behave, here are some doctests to verify the output of each function, and
13+
a __main__ which will print all the examples if this file is run as
14+
$ python ietf/utils/text.py
15+
16+
17+
This is the input text, with long lines in all 4 paragraphs. 2 Paragraphs are
18+
indented:
19+
20+
>>> text = '''
21+
... Lorem ipsum dolor sit amet, consectetur adipiscing elit.
22+
... Aliquam euismod semper hendrerit. Morbi fringilla semper
23+
... libero, eu auctor mauris ullamcorper et. Phasellus quis dolor in nibh pretium cursus et molestie lacus. Morbi ut
24+
... magna mauris. Sed feugiat maximus finibus. Nullam dapibus
25+
... aliquam nibh sed varius. Curabitur elit nunc, lacinia
26+
... gravida lectus non, interdum porttitor magna.
27+
...
28+
... Sed suscipit, libero vel ullamcorper malesuada, enim odio vestibulum quam,
29+
... nec luctus ligula diam eget sapien. Proin a lectus at eros ullamcorper
30+
... mollis. Aenean vehicula lacinia arcu, sed auctor mi cursus ut.
31+
...
32+
...
33+
... Pellentesque porta felis nec odio tincidunt pellentesque luctus in massa. Duis lacus augue, facilisis eu congue eu, ultricies eget urna. In id risus
34+
... vestibulum, suscipit lorem sit amet, tempus libero.
35+
...
36+
... Etiam a purus pretium, mollis elit at, iaculis odio. Donec imperdiet lacinia odio at ultrices. Duis hendrerit consequat augue ac efficitur. Etiam vel placerat arcu. Aenean sodales lorem ut auctor rutrum. Vestibulum auctor fringilla felis ac tempor. Nullam tincidunt pellentesque sapien, non facilisis lectus sagittis ac. Vivamus tempus nibh a laoreet hendrerit. Suspendisse tempor neque erat, quis commodo ex aliquam ut. Duis egestas dignissim risus, non semper lectus commodo non.
37+
...
38+
... '''
39+
40+
41+
Some preliminary setup for the tests ...
42+
43+
>>> import os
44+
>>> os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings"
45+
>>> import django
46+
>>> django.setup()
47+
>>>
48+
>>> from ietf.doc.templatetags.ietf_filters import wrap_text, wrap_long_lines
49+
>>> from django.utils.text import wrap as django_wrap
50+
>>> from ietf.utils.text import fill, wrap, wrap_text_if_unwrapped
51+
>>>
52+
53+
The first two tests here give reasonable results. The difference lies in
54+
how they deal with remaining lines in a paragraph where there's been a
55+
too long line:
56+
57+
58+
>>> # ----------------------------------------------------------------------
59+
>>> print(wrap_text(text, width=80))
60+
<BLANKLINE>
61+
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
62+
Aliquam euismod semper hendrerit. Morbi fringilla semper
63+
libero, eu auctor mauris ullamcorper et. Phasellus quis dolor in nibh pretium
64+
cursus et molestie lacus. Morbi ut magna mauris. Sed feugiat maximus finibus.
65+
Nullam dapibus aliquam nibh sed varius. Curabitur elit nunc, lacinia gravida
66+
lectus non, interdum porttitor magna.
67+
<BLANKLINE>
68+
Sed suscipit, libero vel ullamcorper malesuada, enim odio vestibulum quam,
69+
nec luctus ligula diam eget sapien. Proin a lectus at eros ullamcorper
70+
mollis. Aenean vehicula lacinia arcu, sed auctor mi cursus ut.
71+
<BLANKLINE>
72+
Pellentesque porta felis nec odio tincidunt pellentesque luctus in massa.
73+
Duis lacus augue, facilisis eu congue eu, ultricies eget urna. In id risus
74+
vestibulum, suscipit lorem sit amet, tempus libero.
75+
<BLANKLINE>
76+
Etiam a purus pretium, mollis elit at, iaculis odio. Donec imperdiet lacinia
77+
odio at ultrices. Duis hendrerit consequat augue ac efficitur. Etiam vel
78+
placerat arcu. Aenean sodales lorem ut auctor rutrum. Vestibulum auctor
79+
fringilla felis ac tempor. Nullam tincidunt pellentesque sapien, non facilisis
80+
lectus sagittis ac. Vivamus tempus nibh a laoreet hendrerit. Suspendisse tempor
81+
neque erat, quis commodo ex aliquam ut. Duis egestas dignissim risus, non
82+
semper lectus commodo non.
83+
<BLANKLINE>
84+
<BLANKLINE>
85+
>>> # ----------------------------------------------------------------------
86+
87+
>>> # ----------------------------------------------------------------------
88+
>>> print(wrap(text, width=80))
89+
<BLANKLINE>
90+
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
91+
Aliquam euismod semper hendrerit. Morbi fringilla semper
92+
libero, eu auctor mauris ullamcorper et. Phasellus quis dolor in nibh pretium
93+
cursus et molestie lacus. Morbi ut
94+
magna mauris. Sed feugiat maximus finibus. Nullam dapibus
95+
aliquam nibh sed varius. Curabitur elit nunc, lacinia
96+
gravida lectus non, interdum porttitor magna.
97+
<BLANKLINE>
98+
Sed suscipit, libero vel ullamcorper malesuada, enim odio vestibulum quam,
99+
nec luctus ligula diam eget sapien. Proin a lectus at eros ullamcorper
100+
mollis. Aenean vehicula lacinia arcu, sed auctor mi cursus ut.
101+
<BLANKLINE>
102+
<BLANKLINE>
103+
Pellentesque porta felis nec odio tincidunt pellentesque luctus in massa.
104+
Duis lacus augue, facilisis eu congue eu, ultricies eget urna. In id risus
105+
vestibulum, suscipit lorem sit amet, tempus libero.
106+
<BLANKLINE>
107+
Etiam a purus pretium, mollis elit at, iaculis odio. Donec imperdiet lacinia
108+
odio at ultrices. Duis hendrerit consequat augue ac efficitur. Etiam vel
109+
placerat arcu. Aenean sodales lorem ut auctor rutrum. Vestibulum auctor
110+
fringilla felis ac tempor. Nullam tincidunt pellentesque sapien, non facilisis
111+
lectus sagittis ac. Vivamus tempus nibh a laoreet hendrerit. Suspendisse tempor
112+
neque erat, quis commodo ex aliquam ut. Duis egestas dignissim risus, non semper
113+
lectus commodo non.
114+
<BLANKLINE>
115+
<BLANKLINE>
116+
>>> # ----------------------------------------------------------------------
117+
118+
In the next few functions, things start to go more or less awry:
119+
120+
121+
>>> # ----------------------------------------------------------------------
122+
>>> print(wrap_long_lines(text, width=80))
123+
<BLANKLINE>
124+
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
125+
Aliquam euismod semper hendrerit. Morbi fringilla semper
126+
libero, eu auctor mauris ullamcorper et. Phasellus quis dolor in nibh pretium
127+
cursus et molestie lacus. Morbi ut magna mauris. Sed feugiat maximus finibus.
128+
Nullam dapibus aliquam nibh sed varius. Curabitur elit nunc, lacinia gravida
129+
lectus non, interdum porttitor magna.
130+
<BLANKLINE>
131+
Sed suscipit, libero vel ullamcorper malesuada, enim odio vestibulum quam,
132+
nec luctus ligula diam eget sapien. Proin a lectus at eros ullamcorper
133+
mollis. Aenean vehicula lacinia arcu, sed auctor mi cursus ut.
134+
<BLANKLINE>
135+
Pellentesque porta felis nec odio tincidunt pellentesque luctus in massa.
136+
Duis lacus augue, facilisis eu congue eu, ultricies eget urna. In id risus
137+
vestibulum, suscipit lorem sit amet, tempus libero.
138+
<BLANKLINE>
139+
Etiam a purus pretium, mollis elit at, iaculis odio. Donec imperdiet lacinia
140+
odio at ultrices. Duis hendrerit consequat augue ac efficitur. Etiam vel
141+
placerat arcu. Aenean sodales lorem ut auctor rutrum. Vestibulum auctor
142+
fringilla felis ac tempor. Nullam tincidunt pellentesque sapien, non facilisis
143+
lectus sagittis ac. Vivamus tempus nibh a laoreet hendrerit. Suspendisse tempor
144+
neque erat, quis commodo ex aliquam ut. Duis egestas dignissim risus, non
145+
semper lectus commodo non.
146+
<BLANKLINE>
147+
<BLANKLINE>
148+
>>> # ----------------------------------------------------------------------
149+
150+
151+
>>> # ----------------------------------------------------------------------
152+
>>> print(fill(text, width=80))
153+
<BLANKLINE>
154+
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
155+
Aliquam euismod semper
156+
hendrerit. Morbi fringilla semper
157+
libero, eu auctor mauris ullamcorper et.
158+
Phasellus quis dolor in nibh pretium cursus et molestie lacus. Morbi ut
159+
magna
160+
mauris. Sed feugiat maximus finibus. Nullam dapibus
161+
aliquam nibh sed varius.
162+
Curabitur elit nunc, lacinia
163+
gravida lectus non, interdum porttitor magna.
164+
<BLANKLINE>
165+
Sed suscipit, libero vel ullamcorper malesuada, enim odio vestibulum quam,
166+
nec luctus ligula diam eget sapien. Proin a lectus at eros ullamcorper
167+
mollis. Aenean vehicula lacinia arcu, sed auctor mi cursus ut.
168+
<BLANKLINE>
169+
<BLANKLINE>
170+
Pellentesque porta felis nec odio tincidunt pellentesque luctus in
171+
massa. Duis lacus augue, facilisis eu congue eu, ultricies eget urna. In id
172+
risus
173+
vestibulum, suscipit lorem sit amet, tempus libero.
174+
<BLANKLINE>
175+
Etiam a purus pretium, mollis elit at, iaculis odio. Donec imperdiet lacinia
176+
odio at ultrices. Duis hendrerit consequat augue ac efficitur. Etiam vel
177+
placerat arcu. Aenean sodales lorem ut auctor rutrum. Vestibulum auctor
178+
fringilla felis ac tempor. Nullam tincidunt pellentesque sapien, non facilisis
179+
lectus sagittis ac. Vivamus tempus nibh a laoreet hendrerit. Suspendisse tempor
180+
neque erat, quis commodo ex aliquam ut. Duis egestas dignissim risus, non semper
181+
lectus commodo non.
182+
>>> # ----------------------------------------------------------------------
183+
184+
185+
>>> # ----------------------------------------------------------------------
186+
>>> print(django_wrap(text, width=80))
187+
<BLANKLINE>
188+
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
189+
Aliquam euismod semper hendrerit. Morbi fringilla semper
190+
libero, eu auctor mauris ullamcorper et. Phasellus quis dolor in nibh pretium
191+
cursus et molestie lacus. Morbi ut
192+
magna mauris. Sed feugiat maximus finibus. Nullam dapibus
193+
aliquam nibh sed varius. Curabitur elit nunc, lacinia
194+
gravida lectus non, interdum porttitor magna.
195+
<BLANKLINE>
196+
Sed suscipit, libero vel ullamcorper malesuada, enim odio vestibulum quam,
197+
nec luctus ligula diam eget sapien. Proin a lectus at eros ullamcorper
198+
mollis. Aenean vehicula lacinia arcu, sed auctor mi cursus ut.
199+
<BLANKLINE>
200+
<BLANKLINE>
201+
Pellentesque porta felis nec odio tincidunt pellentesque luctus in massa.
202+
Duis lacus augue, facilisis eu congue eu, ultricies eget urna. In id risus
203+
vestibulum, suscipit lorem sit amet, tempus libero.
204+
<BLANKLINE>
205+
Etiam a purus pretium, mollis elit at, iaculis odio. Donec imperdiet lacinia
206+
odio at ultrices. Duis hendrerit consequat augue ac efficitur. Etiam vel
207+
placerat arcu. Aenean sodales lorem ut auctor rutrum. Vestibulum auctor
208+
fringilla felis ac tempor. Nullam tincidunt pellentesque sapien, non facilisis
209+
lectus sagittis ac. Vivamus tempus nibh a laoreet hendrerit. Suspendisse tempor
210+
neque erat, quis commodo ex aliquam ut. Duis egestas dignissim risus, non semper
211+
lectus commodo non.
212+
<BLANKLINE>
213+
<BLANKLINE>
214+
>>> # ----------------------------------------------------------------------
215+
216+
This last one is just a wrapper around django.utils.text.wrap() above, so
217+
has the same deficiencies as that one. Using one of the two first options
218+
instead of the django.wrap() here might be better:
219+
220+
>>> # ----------------------------------------------------------------------
221+
>>> print(wrap_text_if_unwrapped(text, width=80))
222+
<BLANKLINE>
223+
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
224+
Aliquam euismod semper hendrerit. Morbi fringilla semper
225+
libero, eu auctor mauris ullamcorper et. Phasellus quis dolor in nibh pretium
226+
cursus et molestie lacus. Morbi ut
227+
magna mauris. Sed feugiat maximus finibus. Nullam dapibus
228+
aliquam nibh sed varius. Curabitur elit nunc, lacinia
229+
gravida lectus non, interdum porttitor magna.
230+
<BLANKLINE>
231+
Sed suscipit, libero vel ullamcorper malesuada, enim odio vestibulum quam,
232+
nec luctus ligula diam eget sapien. Proin a lectus at eros ullamcorper
233+
mollis. Aenean vehicula lacinia arcu, sed auctor mi cursus ut.
234+
<BLANKLINE>
235+
<BLANKLINE>
236+
Pellentesque porta felis nec odio tincidunt pellentesque luctus in massa.
237+
Duis lacus augue, facilisis eu congue eu, ultricies eget urna. In id risus
238+
vestibulum, suscipit lorem sit amet, tempus libero.
239+
<BLANKLINE>
240+
Etiam a purus pretium, mollis elit at, iaculis odio. Donec imperdiet lacinia
241+
odio at ultrices. Duis hendrerit consequat augue ac efficitur. Etiam vel
242+
placerat arcu. Aenean sodales lorem ut auctor rutrum. Vestibulum auctor
243+
fringilla felis ac tempor. Nullam tincidunt pellentesque sapien, non facilisis
244+
lectus sagittis ac. Vivamus tempus nibh a laoreet hendrerit. Suspendisse tempor
245+
neque erat, quis commodo ex aliquam ut. Duis egestas dignissim risus, non semper
246+
lectus commodo non.
247+
<BLANKLINE>
248+
<BLANKLINE>
249+
>>> # ----------------------------------------------------------------------
250+
"""
251+
1252
from __future__ import unicode_literals
2253

3254
import re
@@ -8,6 +259,10 @@
8259
from django.utils import six
9260
from django.utils.safestring import mark_safe
10261

262+
if __name__ == '__main__':
263+
print __doc__.replace('<BLANKLINE>','')
264+
265+
11266
def xslugify(value):
12267
"""
13268
Converts to ASCII. Converts spaces to hyphens. Removes characters that
@@ -49,6 +304,34 @@ def fill(text, width):
49304
wrapped.append(para)
50305
return "\n\n".join(wrapped)
51306

307+
def wrap(text, width=80):
308+
309+
textLines = text.split('\n')
310+
wrapped_lines = []
311+
# Preserve any indent (after the general indent)
312+
for line in textLines:
313+
preservedIndent = ''
314+
existIndent = re.search(r'^(\W+)', line)
315+
# Change the existing wrap indent to the original one
316+
if (existIndent):
317+
preservedIndent = existIndent.groups()[0]
318+
wrapped_lines.append(textwrap.fill(line, width=80, subsequent_indent=preservedIndent))
319+
text = '\n'.join(wrapped_lines)
320+
return text
321+
322+
def wrap_text_if_unwrapped(text, width=72, max_tolerated_line_length=100):
323+
from django.utils.text import wrap
324+
text = re.sub(" *\r\n", "\n", text) # get rid of DOS line endings
325+
text = re.sub(" *\r", "\n", text) # get rid of MAC line endings
326+
327+
contains_long_lines = any(" " in l and len(l) > max_tolerated_line_length
328+
for l in text.split("\n"))
329+
330+
if contains_long_lines:
331+
return wrap(text, width)
332+
else:
333+
return text
334+
52335
def isascii(text):
53336
try:
54337
text.encode('ascii')

0 commit comments

Comments
 (0)