diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index 74ae849..ca1ee44 100644
a
|
b
|
from django.utils.text import truncate_words, truncate_html_words, wrap, phone2n
|
19 | 19 | from django.utils.safestring import mark_safe, SafeData, mark_for_escaping |
20 | 20 | from django.utils.timesince import timesince, timeuntil |
21 | 21 | from django.utils.translation import ugettext, ungettext |
| 22 | from django.utils.text import normalize_newlines |
22 | 23 | |
23 | 24 | register = Library() |
24 | 25 | |
… |
… |
def linebreaks_filter(value, autoescape=None):
|
407 | 408 | return mark_safe(linebreaks(value, autoescape)) |
408 | 409 | linebreaks_filter.is_safe = True |
409 | 410 | linebreaks_filter.needs_autoescape = True |
| 411 | linebreaks = stringfilter(linebreaks) |
410 | 412 | |
411 | 413 | def linebreaksbr(value, autoescape=None): |
412 | 414 | """ |
413 | 415 | Converts all newlines in a piece of plain text to HTML line breaks |
414 | 416 | (``<br />``). |
415 | 417 | """ |
416 | | if autoescape and not isinstance(value, SafeData): |
| 418 | autoescape = autoescape and not isinstance(value, SafeData) |
| 419 | value = normalize_newlines(value) |
| 420 | if autoescape: |
417 | 421 | value = escape(value) |
418 | 422 | return mark_safe(value.replace('\n', '<br />')) |
419 | 423 | linebreaksbr.is_safe = True |
diff --git a/django/utils/html.py b/django/utils/html.py
index 7fda015..2687eb5 100644
a
|
b
|
from django.utils.safestring import SafeData, mark_safe
|
7 | 7 | from django.utils.encoding import force_unicode |
8 | 8 | from django.utils.functional import allow_lazy |
9 | 9 | from django.utils.http import urlquote |
| 10 | from django.utils.text import normalize_newlines |
10 | 11 | |
11 | 12 | # Configuration for urlize() function. |
12 | 13 | LEADING_PUNCTUATION = ['(', '<', '<'] |
… |
… |
def conditional_escape(html):
|
70 | 71 | |
71 | 72 | def linebreaks(value, autoescape=False): |
72 | 73 | """Converts newlines into <p> and <br />s.""" |
73 | | value = re.sub(r'\r\n|\r|\n', '\n', force_unicode(value)) # normalize newlines |
| 74 | value = normalize_newlines(value) |
74 | 75 | paras = re.split('\n{2,}', value) |
75 | 76 | if autoescape: |
76 | 77 | paras = [u'<p>%s</p>' % escape(p).replace('\n', '<br />') for p in paras] |
diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py
index 77bd2ba..cbd4776 100644
a
|
b
|
class DefaultFiltersTests(TestCase):
|
266 | 266 | self.assertEqual(linebreaks(u'line 1'), u'<p>line 1</p>') |
267 | 267 | self.assertEqual(linebreaks(u'line 1\nline 2'), |
268 | 268 | u'<p>line 1<br />line 2</p>') |
| 269 | self.assertEqual(linebreaks(u'line 1\rline 2'), |
| 270 | u'<p>line 1<br />line 2</p>') |
| 271 | self.assertEqual(linebreaks(u'line 1\r\nline 2'), |
| 272 | u'<p>line 1<br />line 2</p>') |
| 273 | |
| 274 | def test_linebreaksbr(self): |
| 275 | self.assertEqual(linebreaksbr(u'line 1\nline 2'), |
| 276 | u'line 1<br />line 2') |
| 277 | self.assertEqual(linebreaksbr(u'line 1\rline 2'), |
| 278 | u'line 1<br />line 2') |
| 279 | self.assertEqual(linebreaksbr(u'line 1\r\nline 2'), |
| 280 | u'line 1<br />line 2') |
269 | 281 | |
270 | 282 | def test_removetags(self): |
271 | 283 | self.assertEqual(removetags(u'some <b>html</b> with <script>alert'\ |