freakydog: Lightbox für alle (Django Template-Filter)

Lightbox für alle (Django Template-Filter)

Seit Jahr und Tag verwende ich das bekannte Lightbox um die Großversion von Vorschaubildern anzuzeigen. Dazu muss lediglich das Attribut rel="lightbox an den Link gesetzt werden. Leider war ich nicht ganz so konsequent in der Nutzung so das einige Bilder in Blogbeiträgen Lightbox unterstützen, bei anderen habe ich es vergessen.

Diesem Umstand habe ich nun mit einem kleinen Template-Filter nachgeholfen:

1
2
3
4
5
6
7
8
9
import re
from django.utils.encoding import smart_unicode

r_lightbox = re.compile('<a (?=[^>]*\.(jpg|gif|png))(?![^>]*lightbox)')
s_lightbox = '<a rel="lightbox" '

@register.filter
def lightbox(content):
    return r_lightbox.sub(s_lightbox, smart_unicode(content))

Der Aufruf in meinem Template schaut dann so aus:

1
{{ Entry.body_text|markdown|lightbox }}

Der Filter erkennt, ob ein Link auf eine .jpg, .gif oder .png Datei leitet und fügt – wenn nicht schon vorhanden – das rel="lightbox" Attribut hinzu. Ein kleiner Bug steckt noch drin, so würde z.B. ein Link zu http://www.jpgmag.com/ auch als Bild gewertet werden (da .jpg im String vorkommt), aber damit kann ich leben. Smiley:  :-)

Geschrieben am: 16. Aug. 2007 um 14:06 Uhr, Abgelegt in Django & Python

Kommentare zu diesem Artikel (2):

  1. Marco Gabriel schrieb am 16. August 2007:

    du setzt doch auf deiner seite auch jquery ein. damit würd's noch einfacher und ohne regex gehen. ne passende lösung hab ich gerade nicht zur hand, aber da lightbox ja auch js-only ist, würde sich das doch ergänzen.

  2. Martin schrieb am 17. August 2007:

    Mit JQuery würde es sicher auch gehen, aber mir gefällt die Idee nicht, diese Arbeit auf den Client auszulagern.

    Der Server macht das für lau und höchstwahrscheinlich schneller. Wenn man Caching einsetzt bzw. den Beitrag danach neu speichert bleibt es zudem noch eine einmalige Sache.

Kommentar schreiben

Kommentar hinzufügen

Neue Kommentare sind nur noch über diese Seite möglich.