mirror of
				https://github.com/django/django.git
				synced 2025-11-04 09:57:47 +03:00 
			
		
		
		
	Fixed #14288 -- Fixed linebreaksbr template filter to normalize newlines first. Thanks, Julien Phalip.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@16573 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		
							parent
							
								
									0fbadfd1c8
								
							
						
					
					
						commit
						343b4f1ea5
					
				| 
						 | 
				
			
			@ -19,6 +19,7 @@ from django.utils.text import Truncator, wrap, phone2numeric
 | 
			
		|||
from django.utils.safestring import mark_safe, SafeData, mark_for_escaping
 | 
			
		||||
from django.utils.timesince import timesince, timeuntil
 | 
			
		||||
from django.utils.translation import ugettext, ungettext
 | 
			
		||||
from django.utils.text import normalize_newlines
 | 
			
		||||
 | 
			
		||||
register = Library()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -421,13 +422,16 @@ def linebreaks_filter(value, autoescape=None):
 | 
			
		|||
    return mark_safe(linebreaks(value, autoescape))
 | 
			
		||||
linebreaks_filter.is_safe = True
 | 
			
		||||
linebreaks_filter.needs_autoescape = True
 | 
			
		||||
linebreaks = stringfilter(linebreaks)
 | 
			
		||||
 | 
			
		||||
def linebreaksbr(value, autoescape=None):
 | 
			
		||||
    """
 | 
			
		||||
    Converts all newlines in a piece of plain text to HTML line breaks
 | 
			
		||||
    (``<br />``).
 | 
			
		||||
    """
 | 
			
		||||
    if autoescape and not isinstance(value, SafeData):
 | 
			
		||||
    autoescape = autoescape and not isinstance(value, SafeData)
 | 
			
		||||
    value = normalize_newlines(value)
 | 
			
		||||
    if autoescape:
 | 
			
		||||
        value = escape(value)
 | 
			
		||||
    return mark_safe(value.replace('\n', '<br />'))
 | 
			
		||||
linebreaksbr.is_safe = True
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,7 @@ from django.utils.safestring import SafeData, mark_safe
 | 
			
		|||
from django.utils.encoding import force_unicode
 | 
			
		||||
from django.utils.functional import allow_lazy
 | 
			
		||||
from django.utils.http import urlquote
 | 
			
		||||
from django.utils.text import normalize_newlines
 | 
			
		||||
 | 
			
		||||
# Configuration for urlize() function.
 | 
			
		||||
LEADING_PUNCTUATION  = ['(', '<', '<']
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +71,7 @@ def conditional_escape(html):
 | 
			
		|||
 | 
			
		||||
def linebreaks(value, autoescape=False):
 | 
			
		||||
    """Converts newlines into <p> and <br />s."""
 | 
			
		||||
    value = re.sub(r'\r\n|\r|\n', '\n', force_unicode(value)) # normalize newlines
 | 
			
		||||
    value = normalize_newlines(value)
 | 
			
		||||
    paras = re.split('\n{2,}', value)
 | 
			
		||||
    if autoescape:
 | 
			
		||||
        paras = [u'<p>%s</p>' % escape(p).replace('\n', '<br />') for p in paras]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -266,6 +266,18 @@ class DefaultFiltersTests(TestCase):
 | 
			
		|||
        self.assertEqual(linebreaks(u'line 1'), u'<p>line 1</p>')
 | 
			
		||||
        self.assertEqual(linebreaks(u'line 1\nline 2'),
 | 
			
		||||
                          u'<p>line 1<br />line 2</p>')
 | 
			
		||||
        self.assertEqual(linebreaks(u'line 1\rline 2'),
 | 
			
		||||
                          u'<p>line 1<br />line 2</p>')
 | 
			
		||||
        self.assertEqual(linebreaks(u'line 1\r\nline 2'),
 | 
			
		||||
                          u'<p>line 1<br />line 2</p>')
 | 
			
		||||
 | 
			
		||||
    def test_linebreaksbr(self):
 | 
			
		||||
        self.assertEqual(linebreaksbr(u'line 1\nline 2'),
 | 
			
		||||
                          u'line 1<br />line 2')
 | 
			
		||||
        self.assertEqual(linebreaksbr(u'line 1\rline 2'),
 | 
			
		||||
                          u'line 1<br />line 2')
 | 
			
		||||
        self.assertEqual(linebreaksbr(u'line 1\r\nline 2'),
 | 
			
		||||
                          u'line 1<br />line 2')
 | 
			
		||||
 | 
			
		||||
    def test_removetags(self):
 | 
			
		||||
        self.assertEqual(removetags(u'some <b>html</b> with <script>alert'\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user