15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# markdown is released under the BSD license
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later)
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b)
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Copyright 2004 Manfred Stienstra (the original version)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# All rights reserved.
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Redistribution and use in source and binary forms, with or without
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# modification, are permitted provided that the following conditions are met:
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# *   Redistributions of source code must retain the above copyright
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#     notice, this list of conditions and the following disclaimer.
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# *   Redistributions in binary form must reproduce the above copyright
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#     notice, this list of conditions and the following disclaimer in the
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#     documentation and/or other materials provided with the distribution.
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# *   Neither the name of the <organization> nor the
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#     names of its contributors may be used to endorse or promote products
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#     derived from this software without specific prior written permission.
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''AS IS'' AND ANY
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# DISCLAIMED. IN NO EVENT SHALL ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# POSSIBILITY OF SUCH DAMAGE.
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)'''
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WikiLinks Extension for Python-Markdown
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)======================================
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Converts [[WikiLinks]] to relative links.  Requires Python-Markdown 2.0+
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Basic usage:
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> import markdown
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> text = "Some text with a [[WikiLink]]."
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> html = markdown.markdown(text, ['wikilinks'])
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> print html
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    <p>Some text with a <a class="wikilink" href="/WikiLink/">WikiLink</a>.</p>
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Whitespace behavior:
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> print markdown.markdown('[[ foo bar_baz ]]', ['wikilinks'])
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    <p><a class="wikilink" href="/foo_bar_baz/">foo bar_baz</a></p>
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> print markdown.markdown('foo [[ ]] bar', ['wikilinks'])
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    <p>foo  bar</p>
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)To define custom settings the simple way:
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> print markdown.markdown(text,
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ...     ['wikilinks(base_url=/wiki/,end_url=.html,html_class=foo)']
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ... )
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    <p>Some text with a <a class="foo" href="/wiki/WikiLink.html">WikiLink</a>.</p>
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Custom settings the complex way:
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> md = markdown.Markdown(
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ...     extensions = ['wikilinks'],
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ...     extension_configs = {'wikilinks': [
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ...                                 ('base_url', 'http://example.com/'),
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ...                                 ('end_url', '.html'),
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ...                                 ('html_class', '') ]},
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ...     safe_mode = True)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> print md.convert(text)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    <p>Some text with a <a href="http://example.com/WikiLink.html">WikiLink</a>.</p>
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Use MetaData with mdx_meta.py (Note the blank html_class in MetaData):
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> text = """wiki_base_url: http://example.com/
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ... wiki_end_url:   .html
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ... wiki_html_class:
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ...
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ... Some text with a [[WikiLink]]."""
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> md = markdown.Markdown(extensions=['meta', 'wikilinks'])
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> print md.convert(text)
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    <p>Some text with a <a href="http://example.com/WikiLink.html">WikiLink</a>.</p>
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetaData should not carry over to next document:
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> print md.convert("No [[MetaData]] here.")
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    <p>No <a class="wikilink" href="/MetaData/">MetaData</a> here.</p>
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Define a custom URL builder:
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> def my_url_builder(label, base, end):
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ...     return '/bar/'
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> md = markdown.Markdown(extensions=['wikilinks'],
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ...         extension_configs={'wikilinks' : [('build_url', my_url_builder)]})
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    >>> print md.convert('[[foo]]')
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    <p><a class="wikilink" href="/bar/">foo</a></p>
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)From the command line:
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    python markdown.py -x wikilinks(base_url=http://example.com/,end_url=.html,html_class=foo) src.txt
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)By [Waylan Limberg](http://achinghead.com/).
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)License: [BSD](http://www.opensource.org/licenses/bsd-license.php)
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Dependencies:
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)* [Python 2.3+](http://python.org)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)* [Markdown 2.0+](http://packages.python.org/Markdown/)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)'''
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from __future__ import absolute_import
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from __future__ import unicode_literals
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from . import Extension
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from ..inlinepatterns import Pattern
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from ..util import etree
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import re
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def build_url(label, base, end):
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    """ Build a url from the label, a base, and an end. """
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    clean_label = re.sub(r'([ ]+_)|(_[ ]+)|([ ]+)', '_', label)
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return '%s%s%s'% (base, clean_label, end)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WikiLinkExtension(Extension):
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    def __init__(self, configs):
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        # set extension defaults
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        self.config = {
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        'base_url' : ['/', 'String to append to beginning or URL.'],
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        'end_url' : ['/', 'String to append to end of URL.'],
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        'html_class' : ['wikilink', 'CSS hook. Leave blank for none.'],
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        'build_url' : [build_url, 'Callable formats URL from label.'],
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        }
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        # Override defaults with user settings
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        for key, value in configs :
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            self.setConfig(key, value)
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    def extendMarkdown(self, md, md_globals):
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        self.md = md
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        # append to end of inline patterns
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        WIKILINK_RE = r'\[\[([\w0-9_ -]+)\]\]'
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        wikilinkPattern = WikiLinks(WIKILINK_RE, self.getConfigs())
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        wikilinkPattern.md = md
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        md.inlinePatterns.add('wikilink', wikilinkPattern, "<not_strong")
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WikiLinks(Pattern):
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    def __init__(self, pattern, config):
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        super(WikiLinks, self).__init__(pattern)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        self.config = config
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    def handleMatch(self, m):
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if m.group(2).strip():
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base_url, end_url, html_class = self._getMeta()
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            label = m.group(2).strip()
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            url = self.config['build_url'](label, base_url, end_url)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            a = etree.Element('a')
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            a.text = label
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            a.set('href', url)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            if html_class:
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                a.set('class', html_class)
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        else:
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            a = ''
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return a
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    def _getMeta(self):
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        """ Return meta data or config data. """
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base_url = self.config['base_url']
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        end_url = self.config['end_url']
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        html_class = self.config['html_class']
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if hasattr(self.md, 'Meta'):
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            if 'wiki_base_url' in self.md.Meta:
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base_url = self.md.Meta['wiki_base_url'][0]
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            if 'wiki_end_url' in self.md.Meta:
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                end_url = self.md.Meta['wiki_end_url'][0]
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            if 'wiki_html_class' in self.md.Meta:
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                html_class = self.md.Meta['wiki_html_class'][0]
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return base_url, end_url, html_class
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def makeExtension(configs=None) :
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return WikiLinkExtension(configs=configs)
184