diff --git a/django/core/template/defaulttags.py b/django/core/template/defaulttags.py index 518498664d..daad1c2dfa 100644 --- a/django/core/template/defaulttags.py +++ b/django/core/template/defaulttags.py @@ -249,6 +249,14 @@ class NowNode(Node): df = DateFormat(datetime.now()) return df.format(self.format_string) +class SpacelessNode(Node): + def __init__(self, nodelist): + self.nodelist = nodelist + + def render(self, context): + from django.utils.html import strip_spaces_between_tags + return strip_spaces_between_tags(self.nodelist.render(context).strip()) + class TemplateTagNode(Node): mapping = {'openblock': BLOCK_TAG_START, 'closeblock': BLOCK_TAG_END, @@ -726,6 +734,12 @@ def regroup(parser, token): return RegroupNode(target, expression, var_name) regroup = register.tag(regroup) +def spaceless(parser, token): + nodelist = parser.parse(('endspaceless',)) + parser.delete_first_token() + return SpacelessNode(nodelist) +spaceless = register.tag(spaceless) + #@register.tag def templatetag(parser, token): """ diff --git a/django/utils/html.py b/django/utils/html.py index 730744c9e1..d89067106e 100644 --- a/django/utils/html.py +++ b/django/utils/html.py @@ -37,6 +37,10 @@ def strip_tags(value): "Returns the given HTML with all tags stripped" return re.sub(r'<[^>]*?>', '', value) +def strip_spaces_between_tags(value): + "Returns the given HTML with spaces between tags stripped" + return re.sub(r'>\s+<', '><', value) + def strip_entities(value): "Returns the given HTML with all entities (&something;) stripped" return re.sub(r'&(?:\w+|#\d);', '', value) diff --git a/docs/templates.txt b/docs/templates.txt index d4bb468bd5..0fbe1f6ae8 100644 --- a/docs/templates.txt +++ b/docs/templates.txt @@ -663,6 +663,34 @@ i.e.:: {% regroup people|dictsort:"gender" by gender as grouped %} +spaceless +~~~~~~~~~ + +**New in Django development version.** + +Strips whitespace between HTML tags. This includes tab characters and newlines. + +Example usage:: + + {% spaceless %} +

+ Foo +

+ {% spaceless %} + +This example would return this HTML:: + +

Foo

+ +Only space between *tags* is stripped -- not space between tags and text. In +this example, the space around ``Hello`` won't be stripped:: + + {% spaceless %} + + Hello + + {% spaceless %} + ssi ~~~ diff --git a/tests/othertests/templates.py b/tests/othertests/templates.py index f4f94e579d..5e3afd01e4 100644 --- a/tests/othertests/templates.py +++ b/tests/othertests/templates.py @@ -298,6 +298,11 @@ TEMPLATE_TESTS = { gentlemen. """), + # {% spaceless %} tag + 'spaceless01': ("{% spaceless %} text {% endspaceless %}", {}, " text "), + 'spaceless02': ("{% spaceless %} \n text \n {% endspaceless %}", {}, " text "), + 'spaceless03': ("{% spaceless %}text{% endspaceless %}", {}, "text"), + # simple translation of a string delimited by ' 'i18n01': ("{% load i18n %}{% trans 'xxxyyyxxx' %}", {}, "xxxyyyxxx"),