Fixed #241 -- added django.contrib.markup app with markup templatetags for Textile, ReST and Markdown
git-svn-id: http://code.djangoproject.com/svn/django/trunk@467 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
f65350b197
commit
8e2d275390
|
@ -0,0 +1,46 @@
|
||||||
|
"""
|
||||||
|
Set of "markup" template filters for Django. These filters transform plain text
|
||||||
|
markup syntaxes to HTML; currently there is support for:
|
||||||
|
|
||||||
|
* Textile, which requires the PyTextile library available at
|
||||||
|
http://dealmeida.net/projects/textile/
|
||||||
|
|
||||||
|
* Markdown, which requires the Python-markdown library from
|
||||||
|
http://www.freewisdom.org/projects/python-markdown
|
||||||
|
|
||||||
|
* ReStructuredText, which requires docutils from http://docutils.sf.net/
|
||||||
|
|
||||||
|
In each case, if the required library is not installed, the filter will
|
||||||
|
silently fail and return the un-marked-up text.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from django.core import template
|
||||||
|
|
||||||
|
def textile(value, _):
|
||||||
|
try:
|
||||||
|
import textile
|
||||||
|
except ImportError:
|
||||||
|
return value
|
||||||
|
else:
|
||||||
|
return textile.textile(value)
|
||||||
|
|
||||||
|
def markdown(value, _):
|
||||||
|
try:
|
||||||
|
import markdown
|
||||||
|
except ImportError:
|
||||||
|
return value
|
||||||
|
else:
|
||||||
|
return markdown.markdown(value)
|
||||||
|
|
||||||
|
def restructuredtext(value, _):
|
||||||
|
try:
|
||||||
|
from docutils.core import publish_parts
|
||||||
|
except ImportError:
|
||||||
|
return value
|
||||||
|
else:
|
||||||
|
parts = publish_parts(source=value, writer_name="html4css1")
|
||||||
|
return parts["fragment"]
|
||||||
|
|
||||||
|
template.register_filter("textile", textile, False)
|
||||||
|
template.register_filter("markdown", markdown, False)
|
||||||
|
template.register_filter("restructuredtext", restructuredtext, False)
|
|
@ -0,0 +1,45 @@
|
||||||
|
# Quick tests for the markup templatetags (django.contrib.markup)
|
||||||
|
#
|
||||||
|
# Requires that all supported markup modules be installed
|
||||||
|
# (http://dealmeida.net/projects/textile/,
|
||||||
|
# http://www.freewisdom.org/projects/python-markdown, and
|
||||||
|
# http://docutils.sf.net/)
|
||||||
|
|
||||||
|
|
||||||
|
from django.core.template import Template, Context
|
||||||
|
import django.contrib.markup.templatetags.markup # this registers the filters
|
||||||
|
|
||||||
|
# simple examples 'cause this isn't actually testing the markup, just
|
||||||
|
# that the filters work as advertised
|
||||||
|
|
||||||
|
textile_content = """Paragraph 1
|
||||||
|
|
||||||
|
Paragraph 2 with "quotes" and @code@"""
|
||||||
|
|
||||||
|
markdown_content = """Paragraph 1
|
||||||
|
|
||||||
|
## An h2 with *italics*"""
|
||||||
|
|
||||||
|
rest_content = """Paragraph 1
|
||||||
|
|
||||||
|
Paragraph 2 with a link_
|
||||||
|
|
||||||
|
.. _link: http://www.example.com/"""
|
||||||
|
|
||||||
|
t = Template("""{{ textile_content|textile }}
|
||||||
|
----
|
||||||
|
{{ markdown_content|markdown }}
|
||||||
|
----
|
||||||
|
{{ rest_content|restructuredtext }}""")
|
||||||
|
|
||||||
|
rendered = t.render(Context(locals()))
|
||||||
|
|
||||||
|
assert rendered.strip() == """<p>Paragraph 1</p>
|
||||||
|
|
||||||
|
<p>Paragraph 2 with “quotes” and <code>code</code></p>
|
||||||
|
----
|
||||||
|
<p>Paragraph 1</p><h2>An h2 with *italics*</h2>
|
||||||
|
|
||||||
|
----
|
||||||
|
<p>Paragraph 1</p>
|
||||||
|
<p>Paragraph 2 with a <a class="reference" href="http://www.example.com/">link</a></p>"""
|
Loading…
Reference in New Issue