"""Functions that convert from text markup languages to HTML.
"""
import re
from webhelpers.html import HTML, escape, literal, lit_sub
import webhelpers.textile as textile
import webhelpers.markdown as _markdown
__all__ = [
"markdown",
"textilize",
"nl2br",
"format_paragraphs",
]
_universal_newline_rx = re.compile(R"\r\n|\n|\r") # All types of newline.
_paragraph_rx = re.compile(R"\n{2,}") # Paragraph break: 2 or more newlines.
br = HTML.br() + "\n"
def markdown(text, **kwargs):
"""Format the text to HTML with MarkDown formatting.
This function uses the `Python MarkDown library
`_
which is included with WebHelpers. It does not include extensions
due to circular import issues. If you need the footnotes or RSS
extensions, use the full Markdown package instead.
IMPORTANT:
If your source text is untrusted and may contain malicious HTML markup,
pass ``safe_mode="escape"`` to escape it, ``safe_mode="replace"`` to
replace it with a scolding message, or ``safe_mode="remove"`` to strip it.
There is at least one other Markdown package for Python. python-markdown2
(http://code.google.com/p/python-markdown2/), which claims to be faster and
to handle edge cases better. WebHelpers is sticking to the original Python
Markdown for now for backward compatibility and because nobody has
complained about the speed.
"""
return literal(_markdown.markdown(text, **kwargs))
def textilize(text, sanitize=False):
"""Format the text to HTML with Textile formatting.
This function uses the `PyTextile library `_
which is included with WebHelpers.
Additionally, the output can be sanitized which will fix tags like
,
and
for proper XHTML output.
"""
texer = textile.Textiler(text)
return literal(texer.process(sanitize=sanitize))
def nl2br(text):
"""Insert a
before each newline.
"""
if text is None:
return literal("")
text = lit_sub(_universal_newline_rx, "\n", text)
text = HTML(text).replace("\n", br)
return text
def format_paragraphs(text, preserve_lines=False):
"""Convert text to HTML paragraphs.
``text``:
the text to convert. Split into paragraphs at blank lines (i.e.,
wherever two or more consecutive newlines appear), and wrap each
paragraph in a .
``preserve_lines``:
If true, add
before each single line break
"""
if text is None:
return literal("")
text = lit_sub(_universal_newline_rx, "\n", text)
paragraphs = _paragraph_rx.split(text)
for i, para in enumerate(paragraphs):
if preserve_lines:
para = HTML(para)
para = para.replace("\n", br)
paragraphs[i] = HTML.p(para)
return "\n\n".join(paragraphs)