Login

smart spaceless

Author:
nedbatchelder
Posted:
February 26, 2008
Language:
Python
Version:
.96
Score:
2 (after 2 ratings)

Just like {% spaceless %}, except a single space is preserved between two inline tags (such as <a>, <em>, and so on). This lets you use the tag on running text without fear of running two spans of styled text together incorrectly.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
@register.tag
def smartspaceless(parser, token):
    nodelist = parser.parse(('endsmartspaceless',))
    parser.delete_first_token()
    return SmartSpacelessNode(nodelist)

class SmartSpacelessNode(Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist

    def render(self, context):
        s = self.nodelist.render(context).strip()
        inline_tags = 'a|b|i|u|em|strong|sup|sub|tt|font|small|big'
        inlines_with_spaces = r'</(%s)>\s+<(%s)\b' % (inline_tags, inline_tags)
        s = re.sub(inlines_with_spaces, r'</\1>&#preservespace;<\2', s)
        s = re.sub(r'>\s+<', '><', s)
        s = s.replace('&#preservespace;', ' ')
        return s

More like this

  1. Template tag - list punctuation for a list of items by shapiromatron 2 months, 2 weeks ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 2 months, 3 weeks ago
  3. Serializer factory with Django Rest Framework by julio 9 months, 2 weeks ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 10 months, 1 week ago
  5. Help text hyperlinks by sa2812 11 months ago

Comments

johnboxall (on October 6, 2010):

Had the same problem - ended up using something similar with a single pass regex:

import re

spaces_re = re.compile(r'>\s{2,}<')

def sane_spaces(value):
    return spaces_re.sub('> <', force_unicode(value))
sane_spaces = allow_lazy(sane_spaces, unicode)

#

Please login first before commenting.