bgneal@124: """
bgneal@128: Markup related utitlities useful for the entire project.
bgneal@124: """
bgneal@124: import markdown as _markdown
bgneal@124: from django.utils.encoding import force_unicode
bgneal@124: 
bgneal@211: from smiley import SmilifyMarkdown
bgneal@124: 
bgneal@124: class Markdown(object):
bgneal@128:     """
bgneal@128:     This is a thin wrapper around the Markdown class which deals with the
bgneal@128:     differences in Markdown versions on the production and development server.
bgneal@352:     This code was inspired by the code in
bgneal@128:     django/contrib/markup/templatetags/markup.py.
bgneal@128:     Currently, we only have to worry about Markdown 1.6b and 2.0.
bgneal@128:     """
bgneal@124:     def __init__(self, safe_mode='escape'):
bgneal@124:         # Unicode support only in markdown v1.7 or above. Version_info
bgneal@124:         # exists only in markdown v1.6.2rc-2 or above.
bgneal@124:         self.unicode_support = getattr(_markdown, "version_info", None) >= (1, 7)
bgneal@353:         self.md = _markdown.Markdown(safe_mode=safe_mode,
bgneal@356:                                 extensions=['urlize', 'nl2br', 'del'])
bgneal@124: 
bgneal@124:     def convert(self, s):
bgneal@124:         if self.unicode_support:
bgneal@124:             return self.md.convert(force_unicode(s))
bgneal@124:         else:
bgneal@124:             return force_unicode(self.md.convert(s))
bgneal@124: 
bgneal@124: 
bgneal@124: def markdown(s):
bgneal@128:     """
bgneal@128:     A convenience function for one-off markdown jobs.
bgneal@128:     """
bgneal@124:     md = Markdown()
bgneal@124:     return md.convert(s)
bgneal@128: 
bgneal@128: 
bgneal@128: class SiteMarkup(object):
bgneal@128:     """
bgneal@128:     This class provides site markup by combining markdown and
bgneal@128:     our own smiley markup.
bgneal@128:     """
bgneal@128:     def __init__(self):
bgneal@128:         self.md = Markdown()
bgneal@211:         self.smiley = SmilifyMarkdown()
bgneal@128: 
bgneal@128:     def convert(self, s):
bgneal@211:         return self.md.convert(self.smiley.convert(s))
bgneal@128: 
bgneal@128: 
bgneal@128: def site_markup(s):
bgneal@128:     """
bgneal@128:     Convenience function for one-off site markup jobs.
bgneal@128:     """
bgneal@128:     sm = SiteMarkup()
bgneal@128:     return sm.convert(s)