Avoid widows using a template filter

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from django.template import Library, Node

register = Library()

def widont(value):
    bits = value.rsplit(' ', 1)
    try:
        widowless = bits[0] + " " + bits[1]
        return widowless
    except:
        return value

register.filter(widont)

More like this

  1. Filter to add zero-width space to break up long words by jayliew 1 year, 7 months ago
  2. nbsp filter by vitamon 1 year, 5 months ago
  3. XhtmlDegraderMiddleware by dmh 6 years, 8 months ago
  4. Django filter stack to cleanup WYSIWYG output by jbergantine 2 years, 7 months ago
  5. wordbreak filter by soniiic 5 years ago

Comments

obeattie (on February 27, 2007):

Thanks for this - looks like this could prove very useful!

#

paching (on March 1, 2007):

Nice little trick I didn't know about! Just a couple notes;

If there happens to be an HTML tag such as a link on the last word, this would break it. However for simple headers, I suppose this isn't a problem. In my own code I'm putting this inside a text conversion function where I'm already keeping track of tags, anyway :)

Also, it could be implemented as a simple one-liner:

return ' '.join(value.rsplit(' ', 1))

#

obeattie (on March 11, 2007):

Just one little gotcha...

The template should ensure that it is using a string... so Line 6 should read:

bits = str(value).rsplit(' ', 1)

Therefore, if an object which is not a string is passed to it, it's string method will be called to ensure that the filter will work as intended.

Otherwise, this is brilliant!

#

Amr Mostafa (on April 22, 2007):

Nice one! Thanks

#

(Forgotten your password?)