Skip to content

Instantly share code, notes, and snippets.

Created July 7, 2011 03:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/1068831 to your computer and use it in GitHub Desktop.
Save anonymous/1068831 to your computer and use it in GitHub Desktop.
import re
import logging
from django import template
from datetime import timedelta
import urllib, hashlib
register = template.Library()
def timezone(value, offset):
if offset > 12:
offset = 12 - offset
return value + timedelta(hours=offset)
register.filter(timezone)
# auto convert img.ly/abcd links to image tags
def imgly(value):
imgs = re.findall('(http://img.ly/[a-zA-Z0-9]+)\s?', value)
if (len(imgs) > 0):
for img in imgs:
img_id = re.findall('http://img.ly/([a-zA-Z0-9]+)', img)
if (img_id[0] != 'system' and img_id[0] != 'api'):
value = value.replace('http://img.ly/' + img_id[0], '<a href="http://img.ly/' + img_id[0] + '" target="_blank"><img src="http://zdxproxy.appspot.com/img.ly/show/large/' + img_id[0] + '" class="imgly" border="0" /></a>')
return value
else:
return value
register.filter(imgly)
# auto convert cl.ly/abcd links to image tags
def clly(value):
imgs = re.findall('(http://cl.ly/[a-zA-Z0-9]+)\s?', value)
if (len(imgs) > 0):
for img in imgs:
img_id = re.findall('http://cl.ly/([a-zA-Z0-9]+)', img)
if (img_id[0] != 'demo' and img_id[0] != 'whatever'):
value = value.replace('http://cl.ly/' + img_id[0], '<a href="http://cl.ly/' + img_id[0] + '" target="_blank"><img src="http://cl.ly/' + img_id[0] + '/content" class="imgly" border="0" /></a>')
return value
else:
return value
register.filter(clly)
def bbcode_content(value):
pat = re.compile(r'<([^>]*?)>', re.DOTALL | re.M)
value = re.sub(pat, '&lt;\\1&gt;', value)
bbdata = [
(r'\[url\](.+?)\[/url\]', r'<a href="\1">\1</a>'),
(r'\[url=(.+?)\](.+?)\[/url\]', r'<a class="link-segment" href="\1">\2</a>'),
(r'\[email\](.+?)\[/email\]', r'<a href="mailto:\1">\1</a>'),
(r'\[email=(.+?)\](.+?)\[/email\]', r'<a href="mailto:\1">\2</a>'),
(r'\[img\](.+?)\[/img\]', r'<img src="\1">'),
(r'\[img=(.+?)\](.+?)\[/img\]', r'<img src="\1" alt="\2">'),
(r'\[b\](.+?)\[/b\]', r'<b>\1</b>'),
(r'\[i\](.+?)\[/i\]', r'<i>\1</i>'),
(r'\[u\](.+?)\[/u\]', r'<u>\1</u>'),
(r'\[quote\](.+?)\[/quote\]', r'<blockquote class="content-quote">\1</blockquote>'),
(r'\[center\](.+?)\[/center\]', r'<div align="center">\1</div>'),
(r'\[code\]\s?(.+?)\[/code\]', r'<blockquote class="code-segment"><code><pre>\1</pre></code></blockquote>'),
(r'\[big\](.+?)\[/big\]', r'<big>\1</big>'),
(r'\[small\](.+?)\[/small\]', r'<small>\1</small>'),
]
for bbset in bbdata:
p = re.compile(bbset[0], re.DOTALL)
value = p.sub(bbset[1], value)
return value
register.filter(bbcode_content)
# auto convert youtube.com links to player
def youtube(value):
videos = re.findall('(http://www.youtube.com/watch\?v=[a-zA-Z0-9\-\_]+)\s?', value)
if (len(videos) > 0):
for video in videos:
video_id = re.findall('http://www.youtube.com/watch\?v=([a-zA-Z0-9\-\_]+)', video)
value = value.replace('http://www.youtube.com/watch?v=' + video_id[0], '<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/' + video_id[0] + '?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/' + video_id[0] + '?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>')
return value
else:
return value
register.filter(youtube)
# auto convert youku.com links to player
# example: http://v.youku.com/v_show/id_XMjA1MDU2NTY0.html
def youku(value):
videos = re.findall('(http://v.youku.com/v_show/id_[a-zA-Z0-9\=]+.html)\s?', value)
logging.error(value)
logging.error(videos)
if (len(videos) > 0):
for video in videos:
video_id = re.findall('http://v.youku.com/v_show/id_([a-zA-Z0-9\=]+).html', video)
value = value.replace('http://v.youku.com/v_show/id_' + video_id[0] + '.html', '<embed src="http://player.youku.com/player.php/sid/' + video_id[0] + '/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>')
return value
else:
return value
register.filter(youku)
# auto convert @username to clickable links
def mentions(value):
ms = re.findall('(@[a-zA-Z0-9\_]+\.?)\s?', value)
if (len(ms) > 0):
for m in ms:
m_id = re.findall('@([a-zA-Z0-9\_]+\.?)', m)
if (len(m_id) > 0):
if (m_id[0].endswith('.') != True):
value = value.replace('@' + m_id[0], '@<a href="/member/' + m_id[0] + '">' + m_id[0] + '</a>')
return value
else:
return value
register.filter(mentions)
# gravatar filter
def avatar(value,arg):
default = "http://s.nextonce.com/static/img/avatar_" + str(arg) + ".png"
if type(value).__name__ != 'Member':
return '<img src="' + default + '" border="0" align="absmiddle" />'
if arg == 'large':
number_size = 73
member_avatar_url = value.avatar_large_url
elif arg == 'normal':
number_size = 48
member_avatar_url = value.avatar_normal_url
elif arg == 'mini':
number_size = 24
member_avatar_url = value.avatar_mini_url
if member_avatar_url:
return '<img src="'+ member_avatar_url +'" border="0" alt="' + value.username + '" />'
else:
gravatar_url = "http://www.gravatar.com/avatar/" + hashlib.md5(value.email.lower()).hexdigest() + "?"
gravatar_url += urllib.urlencode({'s' : str(number_size), 'd' : default})
return '<img src="' + gravatar_url + '" border="0" alt="' + value.username + '" align="absmiddle" />'
register.filter(avatar)
# avatar filter
def v2_avatar(value, arg):
default = "http://s.nextonce.com/static/img/avatar_" + str(arg) + ".png"
if type(value).__name__ != 'Member':
return '<img src="' + default + '" border="0" align="absmiddle" />'
if arg == 'large':
number_size = 73
member_avatar_url = value.avatar_large_url
elif arg == 'normal':
number_size = 48
member_avatar_url = value.avatar_normal_url
elif arg == 'mini':
number_size = 24
member_avatar_url = value.avatar_mini_url
if member_avatar_url:
return '<img src="'+ member_avatar_url +'" border="0" alt="' + value.username + '" align="absmiddle" />'
else:
return '<img src="' + default + '" border="0" alt="' + value.username + '" align="absmiddle" />'
register.filter(v2_avatar)
# github gist script support
def gist(value):
return re.sub(r'(http://gist.github.com/[\d]+)', r'<script src="\1.js"></script>', value)
register.filter(gist)
_base_js_escapes = (
('\\', r'\u005C'),
('\'', r'\u0027'),
('"', r'\u0022'),
('>', r'\u003E'),
('<', r'\u003C'),
('&', r'\u0026'),
('=', r'\u003D'),
('-', r'\u002D'),
(';', r'\u003B'),
(u'\u2028', r'\u2028'),
(u'\u2029', r'\u2029')
)
# Escape every ASCII character with a value less than 32.
_js_escapes = (_base_js_escapes +
tuple([('%c' % z, '\\u%04X' % z) for z in range(32)]))
def escapejs(value):
"""Hex encodes characters for use in JavaScript strings."""
for bad, good in _js_escapes:
value = value.replace(bad, good)
return value
register.filter(escapejs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment