Django

Code

Ticket #3532: spaceless.diff

File spaceless.diff, 5.0 kB (added by Rob Hudson <treborhudson@gmail.com>, 2 years ago)

Spaceless with optional numeric argument patch

  • django/utils/html.py

    old new  
    3838    "Returns the given HTML with all tags stripped" 
    3939    return re.sub(r'<[^>]*?>', '', value) 
    4040 
    41 def strip_spaces_between_tags(value): 
    42     "Returns the given HTML with spaces between tags normalized to a single space
    43     return re.sub(r'>\s+<', '> <', value) 
     41def strip_spaces_between_tags(value, num_spaces=1): 
     42    "Returns the given HTML with the given number spaces between tags
     43    return re.sub(r'>\s+<', '>%s<' % (' ' * num_spaces), value) 
    4444 
    4545def strip_entities(value): 
    4646    "Returns the given HTML with all entities (&something;) stripped" 
  • django/template/defaulttags.py

    old new  
    291291        return df.format(self.format_string) 
    292292 
    293293class SpacelessNode(Node): 
    294     def __init__(self, nodelist): 
     294    def __init__(self, nodelist, num_spaces): 
    295295        self.nodelist = nodelist 
     296        self.num_spaces = num_spaces 
    296297 
    297298    def render(self, context): 
    298299        from django.utils.html import strip_spaces_between_tags 
    299         return strip_spaces_between_tags(self.nodelist.render(context).strip()
     300        return strip_spaces_between_tags(self.nodelist.render(context).strip(), self.num_spaces
    300301 
    301302class TemplateTagNode(Node): 
    302303    mapping = {'openblock': BLOCK_TAG_START, 
     
    825826 
    826827def spaceless(parser, token): 
    827828    """ 
    828     Normalize whitespace between HTML tags to a single space. This includes tab 
    829     characters and newlines. 
     829    Adjusts whitespace between HTML tags to a given number of spaces, defaulting 
     830    to a single space if no numeric value given. This includes tab characters 
     831    and newlines. 
    830832 
    831833    Example usage:: 
    832834 
     
    840842 
    841843        <p> <a href="foo/">Foo</a> </p> 
    842844 
     845    Alternatively, providing a numeric value works as well as in this example:: 
     846 
     847        {% spaceless 0 %} 
     848            <p> 
     849                <a href="foo/">Foo</a> 
     850            </p> 
     851        {% endspaceless %} 
     852 
     853    This example would return this HTML:: 
     854 
     855        <p><a href="foo/">Foo</a></p> 
     856 
    843857    Only space between *tags* is normalized -- not space between tags and text. In 
    844858    this example, the space around ``Hello`` won't be stripped:: 
    845859 
     
    849863            </strong> 
    850864        {% endspaceless %} 
    851865    """ 
     866    num_spaces = 1 # default to 1 space between tags 
     867    bits = token.contents.split() 
     868    if len(bits) > 1: 
     869        # User specified number of spaces between tags 
     870        num_spaces = int(bits[1]) 
    852871    nodelist = parser.parse(('endspaceless',)) 
    853872    parser.delete_first_token() 
    854     return SpacelessNode(nodelist
     873    return SpacelessNode(nodelist, num_spaces
    855874spaceless = register.tag(spaceless) 
    856875 
    857876#@register.tag 
  • tests/regressiontests/templates/tests.py

    old new  
    488488            'spaceless01': ("{% spaceless %} <b>    <i> text </i>    </b> {% endspaceless %}", {}, "<b> <i> text </i> </b>"), 
    489489            'spaceless02': ("{% spaceless %} <b> \n <i> text </i> \n </b> {% endspaceless %}", {}, "<b> <i> text </i> </b>"), 
    490490            'spaceless03': ("{% spaceless %}<b><i>text</i></b>{% endspaceless %}", {}, "<b><i>text</i></b>"), 
     491            # {% spaceless %} with optional numeric argument 
     492            'spaceless04': ("{% spaceless 0 %} <b>    <i> text </i>    </b> {% endspaceless %}", {}, "<b><i> text </i></b>"), 
     493            'spaceless05': ("{% spaceless 0 %} <b> \n <i> text </i> \n </b> {% endspaceless %}", {}, "<b><i> text </i></b>"), 
     494            'spaceless06': ("{% spaceless 3 %}<b> <i>text</i> </b>{% endspaceless %}", {}, "<b>   <i>text</i>   </b>"), 
    491495 
    492496            # simple translation of a string delimited by ' 
    493497            'i18n01': ("{% load i18n %}{% trans 'xxxyyyxxx' %}", {}, "xxxyyyxxx"), 
  • docs/templates.txt

    old new  
    757757spaceless 
    758758~~~~~~~~~ 
    759759 
    760 Normalizes whitespace between HTML tags to a single space. This includes tab 
    761 characters and newlines. 
     760Adjusts whitespace between HTML tags to a given number of spaces, defaulting 
     761to a single space if no numeric value given. This includes tab characters 
     762and newlines. 
    762763 
    763764Example usage:: 
    764765 
     
    772773 
    773774    <p> <a href="foo/">Foo</a> </p> 
    774775 
     776Alternatively, providing a numeric value works as well as in this example:: 
     777 
     778    {% spaceless 0 %} 
     779        <p> 
     780            <a href="foo/">Foo</a> 
     781        </p> 
     782    {% endspaceless %} 
     783 
     784This example would return this HTML:: 
     785 
     786    <p><a href="foo/">Foo</a></p> 
     787 
    775788Only space between *tags* is normalized -- not space between tags and text. In 
    776789this example, the space around ``Hello`` won't be stripped:: 
    777790