diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py index 64f8e28190d..f55aa072b7e 100644 --- a/django/template/defaultfilters.py +++ b/django/template/defaultfilters.py @@ -12,7 +12,7 @@ from django.conf import settings from django.utils import formats from django.utils.dateformat import format, time_format from django.utils.encoding import force_text, iri_to_uri -from django.utils.html import (conditional_escape, escapejs, fix_ampersands, +from django.utils.html import (conditional_escape, escapejs, escape, urlize as _urlize, linebreaks, strip_tags, avoid_wrapping, remove_tags) from django.utils.http import urlquote @@ -82,12 +82,6 @@ def escapejs_filter(value): return escapejs(value) -@register.filter("fix_ampersands", is_safe=True) -@stringfilter -def fix_ampersands_filter(value): - """Replaces ampersands with ``&`` entities.""" - return fix_ampersands(value) - # Values for testing floatformat input against infinity and NaN representations, # which differ across platforms and Python versions. Some (i.e. old Windows # ones) are not recognized by Decimal but we want to return them unchanged vs. diff --git a/django/utils/html.py b/django/utils/html.py index 6afd6b62fa9..b9444fc01f6 100644 --- a/django/utils/html.py +++ b/django/utils/html.py @@ -3,9 +3,7 @@ from __future__ import unicode_literals import re -import warnings -from django.utils.deprecation import RemovedInDjango18Warning from django.utils.encoding import force_text, force_str from django.utils.functional import allow_lazy from django.utils.safestring import SafeData, mark_safe @@ -174,15 +172,6 @@ def strip_entities(value): strip_entities = allow_lazy(strip_entities, six.text_type) -def fix_ampersands(value): - """Returns the given HTML with all unencoded ampersands encoded correctly.""" - # As fix_ampersands is wrapped in allow_lazy, stacklevel 3 is more useful than 2. - warnings.warn("The fix_ampersands function is deprecated and will be removed in Django 1.8.", - RemovedInDjango18Warning, stacklevel=3) - return unencoded_ampersands_re.sub('&', force_text(value)) -fix_ampersands = allow_lazy(fix_ampersands, six.text_type) - - def smart_urlquote(url): "Quotes a URL if it isn't already quoted." # Handle IDN before quoting. @@ -283,44 +272,6 @@ def urlize(text, trim_url_limit=None, nofollow=False, autoescape=False): urlize = allow_lazy(urlize, six.text_type) -def clean_html(text): - """ - Clean the given HTML. Specifically, do the following: - * Convert and to and . - * Encode all ampersands correctly. - * Remove all "target" attributes from tags. - * Remove extraneous HTML, such as presentational tags that open and - immediately close and
. - * Convert hard-coded bullets into HTML unordered lists. - * Remove stuff like "

  

", but only if it's at the - bottom of the text. - """ - # As clean_html is wrapped in allow_lazy, stacklevel 3 is more useful than 2. - warnings.warn("The clean_html function is deprecated and will be removed in Django 1.8.", - RemovedInDjango18Warning, stacklevel=3) - text = normalize_newlines(text) - text = re.sub(r'<(/?)\s*b\s*>', '<\\1strong>', text) - text = re.sub(r'<(/?)\s*i\s*>', '<\\1em>', text) - text = fix_ampersands(text) - # Remove all target="" attributes from
tags. - text = link_target_attribute_re.sub('\\1', text) - # Trim stupid HTML such as
. - text = html_gunk_re.sub('', text) - # Convert hard-coded bullets into HTML unordered lists. - - def replace_p_tags(match): - s = match.group().replace('

', '') - for d in DOTS: - s = s.replace('

%s' % d, '

  • ') - return '
      \n%s\n
    ' % s - text = hard_coded_bullets_re.sub(replace_p_tags, text) - # Remove stuff like "

      

    ", but only if it's at the bottom - # of the text. - text = trailing_empty_content_re.sub('', text) - return text -clean_html = allow_lazy(clean_html, six.text_type) - - def avoid_wrapping(value): """ Avoid text wrapping in the middle of a phrase by adding non-breaking diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt index 7900e5ed708..4f8102c0031 100644 --- a/docs/ref/templates/builtins.txt +++ b/docs/ref/templates/builtins.txt @@ -1572,35 +1572,6 @@ For example:: If ``value`` is the list ``['a', 'b', 'c']``, the output will be ``'a'``. -.. templatefilter:: fix_ampersands - -fix_ampersands -^^^^^^^^^^^^^^ - -.. note:: - - This is rarely useful as ampersands are automatically escaped. See - :tfilter:`escape` for more information. - -.. deprecated:: 1.7 - This filter has been deprecated and will be removed in Django 1.8. - -Replaces ampersands with ``&`` entities. - -For example:: - - {{ value|fix_ampersands }} - -If ``value`` is ``Tom & Jerry``, the output will be ``Tom & Jerry``. - -However, ampersands used in named entities and numeric character references -will not be replaced. For example, if ``value`` is ``Café``, the output -will *not* be ``Caf&eacute;`` but remain ``Café``. This means that -in some edge cases, such as acronyms followed by semicolons, this filter will -not replace ampersands that need replacing. For example, if ``value`` is -``Contact the R&D;``, the output will remain unchanged because ``&D;`` -resembles a named entity. - .. templatefilter:: floatformat floatformat diff --git a/tests/defaultfilters/tests.py b/tests/defaultfilters/tests.py index ee328f4e384..966e86bbaa9 100644 --- a/tests/defaultfilters/tests.py +++ b/tests/defaultfilters/tests.py @@ -4,12 +4,11 @@ from __future__ import unicode_literals import datetime import decimal import unittest -import warnings from django.template.defaultfilters import ( add, addslashes, capfirst, center, cut, date, default, default_if_none, dictsort, dictsortreversed, divisibleby, escape, escapejs_filter, - filesizeformat, first, fix_ampersands_filter, floatformat, force_escape, + filesizeformat, first, floatformat, force_escape, get_digit, iriencode, join, length, length_is, linebreaksbr, linebreaks_filter, linenumbers, ljust, lower, make_list, phone2numeric_filter, pluralize, removetags, rjust, slice_filter, slugify, @@ -20,7 +19,6 @@ from django.template.defaultfilters import ( from django.test import TestCase from django.utils import six from django.utils import translation -from django.utils.deprecation import RemovedInDjango18Warning from django.utils.encoding import python_2_unicode_compatible from django.utils.safestring import SafeData @@ -125,12 +123,6 @@ class DefaultFiltersTests(TestCase): escapejs_filter('paragraph separator:\u2029and line separator:\u2028'), 'paragraph separator:\\u2029and line separator:\\u2028') - def test_fix_ampersands(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", RemovedInDjango18Warning) - self.assertEqual(fix_ampersands_filter('Jack & Jill & Jeroboam'), - 'Jack & Jill & Jeroboam') - def test_linenumbers(self): self.assertEqual(linenumbers('line 1\nline 2'), '1. line 1\n2. line 2') diff --git a/tests/template_tests/filters.py b/tests/template_tests/filters.py index ad85d0cb0be..371d0325b62 100644 --- a/tests/template_tests/filters.py +++ b/tests/template_tests/filters.py @@ -104,11 +104,6 @@ def get_filter_tests(): 'filter-capfirst01': ("{% autoescape off %}{{ a|capfirst }} {{ b|capfirst }}{% endautoescape %}", {"a": "fred>", "b": mark_safe("fred>")}, "Fred> Fred>"), 'filter-capfirst02': ("{{ a|capfirst }} {{ b|capfirst }}", {"a": "fred>", "b": mark_safe("fred>")}, "Fred> Fred>"), - # Note that applying fix_ampsersands in autoescape mode leads to - # double escaping. - 'filter-fix_ampersands01': ("{% autoescape off %}{{ a|fix_ampersands }} {{ b|fix_ampersands }}{% endautoescape %}", {"a": "a&b", "b": mark_safe("a&b")}, "a&b a&b"), - 'filter-fix_ampersands02': ("{{ a|fix_ampersands }} {{ b|fix_ampersands }}", {"a": "a&b", "b": mark_safe("a&b")}, "a&amp;b a&b"), - 'filter-floatformat01': ("{% autoescape off %}{{ a|floatformat }} {{ b|floatformat }}{% endautoescape %}", {"a": "1.42", "b": mark_safe("1.42")}, "1.4 1.4"), 'filter-floatformat02': ("{{ a|floatformat }} {{ b|floatformat }}", {"a": "1.42", "b": mark_safe("1.42")}, "1.4 1.4"), diff --git a/tests/template_tests/tests.py b/tests/template_tests/tests.py index 784f59ecd9c..0f060d9a2aa 100644 --- a/tests/template_tests/tests.py +++ b/tests/template_tests/tests.py @@ -602,10 +602,7 @@ class TemplateTests(TestCase): failures.append("Template test (Cached='%s', TEMPLATE_STRING_IF_INVALID='%s', TEMPLATE_DEBUG=%s): %s -- FAILED. Template loading invoked method that shouldn't have been invoked." % (is_cached, invalid_str, template_debug, name)) try: - with warnings.catch_warnings(): - # Ignore deprecation of fix_ampersands - warnings.filterwarnings("ignore", category=DeprecationWarning, module='django.template.defaultfilters') - output = self.render(test_template, vals) + output = self.render(test_template, vals) except ShouldNotExecuteException: failures.append("Template test (Cached='%s', TEMPLATE_STRING_IF_INVALID='%s', TEMPLATE_DEBUG=%s): %s -- FAILED. Template rendering invoked method that shouldn't have been invoked." % (is_cached, invalid_str, template_debug, name)) except ContextStackException: diff --git a/tests/utils_tests/test_html.py b/tests/utils_tests/test_html.py index 51ff38d1901..b4e61b9fd6a 100644 --- a/tests/utils_tests/test_html.py +++ b/tests/utils_tests/test_html.py @@ -4,11 +4,9 @@ from __future__ import unicode_literals from datetime import datetime import os from unittest import TestCase -import warnings from django.utils import html, safestring from django.utils._os import upath -from django.utils.deprecation import RemovedInDjango18Warning from django.utils.encoding import force_text @@ -131,31 +129,6 @@ class TestUtilsHtml(TestCase): for in_pattern, output in patterns: self.check_output(f, in_pattern % {'entity': entity}, output) - def test_fix_ampersands(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", RemovedInDjango18Warning) - f = html.fix_ampersands - # Strings without ampersands or with ampersands already encoded. - values = ("a", "b", "&a;", "& &x; ", "asdf") - patterns = ( - ("%s", "%s"), - ("&%s", "&%s"), - ("&%s&", "&%s&"), - ) - - for value in values: - for in_pattern, out_pattern in patterns: - self.check_output(f, in_pattern % value, out_pattern % value) - - # Strings with ampersands that need encoding. - items = ( - ("&#;", "&#;"), - ("ͫ ;", "&#875 ;"), - ("abc;", "&#4abc;"), - ) - for value, output in items: - self.check_output(f, value, output) - def test_escapejs(self): f = html.escapejs items = ( @@ -168,20 +141,6 @@ class TestUtilsHtml(TestCase): for value, output in items: self.check_output(f, value, output) - def test_clean_html(self): - f = html.clean_html - items = ( - ('

    I believe in semantic markup!

    ', '

    I believe in semantic markup!

    '), - ('I escape & I don\'t
    target', 'I escape & I don\'t target'), - ('

    I kill whitespace


     

    ', '

    I kill whitespace

    '), - # also a regression test for #7267: this used to raise an UnicodeDecodeError - ('

    * foo

    * bar

    ', '
      \n
    • foo
    • bar
    • \n
    '), - ) - with warnings.catch_warnings(): - warnings.simplefilter("ignore", RemovedInDjango18Warning) - for value, output in items: - self.check_output(f, value, output) - def test_remove_tags(self): f = html.remove_tags items = (