/apps/wiki/yaki/page.py

https://github.com/myles/comfy · Python · 88 lines · 47 code · 16 blank · 25 comment · 6 complexity · 1e6a7c135821fe13c40ce6379f71915a MD5 · raw file

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. """
  4. Page.py
  5. Created by Rui Carmo on 2006-08-19.
  6. Published under the MIT license.
  7. """
  8. # ============================================================================
  9. # Wiki Page
  10. # ============================================================================
  11. import rfc822
  12. from django.utils.encoding import smart_str, force_unicode
  13. from django.utils.safestring import mark_safe
  14. from docutils.core import publish_parts as rst
  15. try:
  16. import textile
  17. except ImportError:
  18. from comfy.contrib.markup import textile
  19. try:
  20. import pymarkdown
  21. except ImportError:
  22. from comfy.contrib.markup import pymarkdown
  23. # helper functions for rendering
  24. def _markdown(buffer):
  25. return mark_safe(force_unicode(pymarkdown.Markdown(buffer)))
  26. def _plaintext(buffer):
  27. return mark_safe(force_unicode(u'<pre>\n%s</pre>' % buffer))
  28. def _textile(buffer):
  29. # this one is necessary due to textile's use of kargs
  30. return mark_safe(force_unicode(textile.textile(buffer, head_offset=0, validate=0, sanitize=1, encoding='utf-8', output='utf-8')))
  31. def _restructuredtext(buffer):
  32. docutils_settings = getattr(settings, "RESTRUCTUREDTEXT_FILTER_SETTINGS", {})
  33. return mark_safe(force_unicode(publish_parts(source=buffer, writer_name="html4css1", settings_overrides=docutils_settings)))
  34. def _raw(buffer):
  35. return mark_safe(force_unicode(buffer))
  36. class Page:
  37. """
  38. Wiki Page - handles storage format and markup
  39. """
  40. def __init__(self):
  41. """
  42. Constructor
  43. """
  44. self.headers={}
  45. self.raw = self.html = ''
  46. def rfc2822(self):
  47. """
  48. Render this page into an RFC2822 buffer
  49. """
  50. buffer = ''
  51. for header in self.headers.keys():
  52. buffer = buffer + header + ": " + self.headers[header] + "\n"
  53. buffer = buffer + "\n\n" + self.raw
  54. return buffer
  55. def update(self, markup, text):
  56. self.raw = text
  57. self.headers['content-type'] = markup
  58. def render(self, default='text/x-textile'):
  59. """
  60. Render page contents as HTML
  61. """
  62. try:
  63. format = self.headers['content-type']
  64. except:
  65. format = default
  66. self.html = { u'text/plain': _plaintext,
  67. u'text/x-markdown': _markdown,
  68. u'text/x-textile': _textile,
  69. u'text/x-rst': _restructuredtext,
  70. u'text/html': _raw }[format](unicode(self.raw))
  71. return self.html