Find file
Fetching contributors…
Cannot retrieve contributors at this time
101 lines (70 sloc) 3.08 KB


Formats text following the MediaWiki syntax.


To return HTML from Wiki:

from wikimarkup.parser import Parser

parser = Parser()
html = parser.parse(text[, show_toc=True])

To return HTML without certain "annoying" (TODO: define annoying) elements, such as headings:

from wikimarkup.parser import parselite


Adding New Tags

You can add new tags with the registerTagHook method.:

from wikimarkup.parser import Parser
import cgi

def blockquoteTagHook(parser_env, body, attributes={}):
    """<quote[ cite="Person"]>A paragraph of text.</quote>"""
    text = ['<blockquote>']
    if 'cite' in attributes:
        text.append('<cite>%s</cite>' % (cgi.escape(attributes['cite']),))
    return u'\n'.join(text)

parser = Parser()
parser.registerTagHook('quote', blockquoteTagHook)

Adding Internal Links

You can support [[internal links]] with the registerInternalLinkHook method. There is no default handling for internal links. If no hook handles the link, it will appear unchanged in the output. An internal link may have a namespace: prefix. Hooks are registered per namespace, with 'None' for unprefixed links:

def internalLinkHook(parser_env, namespace, body):
    return replacement

parser.registerInternalLinkHook(None, internalLinkHook)  # called for [[link]]
parser.registerInternalLinkHook('Wikipedia', hook)       # called for [[Wikipedia: Link]]
parser.registerInternalLinkHook(':en', hook)             # called for [[:en:link]
parser.registerInternalLinkHook(':', hook)               # called for [[:any:link]]
parser.registerInternalLinkHook('*', hook)               # called for [[anything]]


from wikimarkup.parser import Parser

def wikipediaLinkHook(parser_env, namespace, body):
    # namespace is going to be 'Wikipedia'
    (article, pipe, text) = body.partition('|')
    href = article.strip().capitalize().replace(' ', '_')
    text = (text or article).strip()
    return '<a href="">%s</a>' % (href, text)

parser = Parser()
parser.registerInternalLinkHook('Wikipedia', wikipediaLinkHook)

print parser.parse("[[Wikipedia:public transport|public transportation]]")
print parser.parse("[[Wikipedia: bus]]")

import settings
from pytils.translit import slugify
from blog.models import Post

def byteflowLinkHook(parser_env, namespace, body):
    (article, pipe, text) = body.partition('|')
    slug = slugify(article.strip())
    text = (text or article).strip()
        post = Post.objects.get(slug=slug)
        href = post.get_absolute_url()
    except Post.DoesNotExist:
        href = '#'
    return '<a href="%s">%s</a>' % (href, text)

parser.registerInternalLinkHook(None, byteflowLinkHook)

parser.parse("[[Blog post title]]")