MoinMoin.converter package

Submodules

MoinMoin.converter.archive_in module

MoinMoin - Archives converter (e.g. zip, tar)

Make a DOM Tree representation of an archive (== list contents of it in a table).

class MoinMoin.converter.archive_in.ArchiveConverter[source]

Bases: MoinMoin.converter._table.TableMixin

Base class for archive converters, convert an archive to a DOM table with an archive listing.

list_contents(fileobj)[source]

analyze archive we get as fileobj and return data for table rendering.

We return a list of rows, each row is a list of cells.

Usually each row is [size, datetime, name] for each archive member.

In case of problems, it shall raise ArchiveException(error_msg).

process_datetime(dt)[source]
process_name(member_name)[source]
process_size(size)[source]
exception MoinMoin.converter.archive_in.ArchiveException[source]

Bases: exceptions.Exception

exception class used in case of trouble with opening/listing an archive

class MoinMoin.converter.archive_in.TarConverter[source]

Bases: MoinMoin.converter.archive_in.ArchiveConverter

Support listing tar files.

list_contents(fileobj)[source]
class MoinMoin.converter.archive_in.ZipConverter[source]

Bases: MoinMoin.converter.archive_in.ArchiveConverter

Support listing zip files.

list_contents(fileobj)[source]

MoinMoin.converter.audio_video_in module

MoinMoin - Audio/Video converter

Convert audio/video to <object> tag for the DOM Tree.

Note: currently this is quite same as image_in.

class MoinMoin.converter.audio_video_in.Converter(input_type)[source]

Bases: object

Convert audio/video to the corresponding <object> in the DOM Tree

MoinMoin.converter.creole_in module

MoinMoin - Creole input converter

See http://wikicreole.org/ for latest specs.

Notes:

  • No markup allowed in headings. Creole 1.0 does not require us to support this.
  • No markup allowed in table headings. Creole 1.0 does not require us to support this.
  • No (non-bracketed) generic url recognition: this is “mission impossible” except if you want to risk lots of false positives. Only known protocols are recognized.
  • We do not allow ”:” before “//” italic markup to avoid urls with unrecognized schemes (like wtf://server/path) triggering italic rendering for the rest of the paragraph.
class MoinMoin.converter.creole_in.Converter[source]

Bases: MoinMoin.converter._wiki_macro.ConverterMacro

block = ('(?P<line> ^ \\s* $ )', '\n (?P<head>\n ^\n \\s*\n (?P<head_head> =+)\n \\s*\n (?P<head_text> .*?)\n \\s*\n =*\n \\s*\n $\n )\n ', '(?P<separator> ^ \\s* ---- \\s* $ )', '\n ^\n \\s*\n (?P<macro>\n <<\n (?P<macro_name> \\w+)\n (\n \\(\n (?!.*>>.*>>)\n (?P<macro_args> .*?)\n \\)\n )?\n \\s*\n >>\n )\n \\s*\n $\n ', '\n (?P<nowiki>\n ^{{{\n \\s*\n $\n )\n ', '\n (?P<list>\n ^\n \\s*\n [*\\#][^*\\#]\n .*\n $\n )\n ', '\n (?P<table>\n ^ \\s* \\| .* $\n )\n ', '(?P<text> .+ )')
block_head = '\n (?P<head>\n ^\n \\s*\n (?P<head_head> =+)\n \\s*\n (?P<head_text> .*?)\n \\s*\n =*\n \\s*\n $\n )\n '
block_head_repl(_iter_content, stack, head, head_head, head_text)[source]
block_line = '(?P<line> ^ \\s* $ )'
block_line_repl(_iter_content, stack, line)[source]
block_list = '\n (?P<list>\n ^\n \\s*\n [*\\#][^*\\#]\n .*\n $\n )\n '
block_list_repl(iter_content, stack, list)[source]
block_macro = '\n ^\n \\s*\n (?P<macro>\n <<\n (?P<macro_name> \\w+)\n (\n \\(\n (?!.*>>.*>>)\n (?P<macro_args> .*?)\n \\)\n )?\n \\s*\n >>\n )\n \\s*\n $\n '
block_macro_repl(_iter_content, stack, macro, macro_name, macro_args=None)[source]

Handles macros using the placeholder syntax.

block_nowiki = '\n (?P<nowiki>\n ^{{{\n \\s*\n $\n )\n '
block_nowiki_lines(iter_content)[source]

Unescaping generator for the lines in a nowiki block

block_nowiki_repl(iter_content, stack, nowiki)[source]

Handles a complete nowiki block

block_re = <_sre.SRE_Pattern object at 0x4c6b0c0>
block_separator = '(?P<separator> ^ \\s* ---- \\s* $ )'
block_separator_repl(_iter_content, stack, separator, hr_class=u'moin-hr3')[source]
block_table = '\n (?P<table>\n ^ \\s* \\| .* $\n )\n '
block_table_repl(iter_content, stack, table)[source]
block_table_row(content, stack)[source]
block_text = '(?P<text> .+ )'
block_text_repl(_iter_content, stack, text)[source]
classmethod factory(input, output, **kw)[source]
inline = ('\n (?P<url>\n (^ | (?<=\\s | [.,:;!?()/=]))\n (?P<escaped_url>~)?\n (?P<url_target>\n (http|https|ftp|file|mailto|nntp|news|ssh|telnet|irc|ircs|xmpp|mumble|webcal|ed2k|apt|rootz|gopher|notes|rtp|rtsp|rtcp)\n :\n \\S+?\n )\n ($ | (?=\\s | [,.:;!?()] (\\s | $)))\n )\n ', '(?P<escape> ~ (?P<escaped_char>\\S) )', '\n (?P<link>\n \\[\\[\n \\s*\n (\n (?P<link_url>\n (http|https|ftp|file|mailto|nntp|news|ssh|telnet|irc|ircs|xmpp|mumble|webcal|ed2k|apt|rootz|gopher|notes|rtp|rtsp|rtcp):\n [^|]+?\n )\n |\n (\n (?P<link_interwiki_site>[A-Z][a-zA-Z]+)\n :\n (?P<link_interwiki_item>[^|]+) # accept any item name; will verify link_interwiki_site below\n )\n |\n (?P<link_item> [^|]+? )\n )\n \\s*\n ([|] \\s* (?P<link_text>.+?) \\s*)?\n \\]\\]\n )\n ', '\n (?P<macro>\n <<\n (?P<macro_name> \\w+)\n (?:\n \\(\n (?P<macro_args> .*?)\n \\)\n )?\n \\s*\n >>\n )\n ', '\n (?P<nowiki>\n {{{\n (?P<nowiki_text>.*?}*)\n }}}\n )\n ', '\n (?P<object>\n {{\n \\s*\n (\n (?P<object_url>\n [a-zA-Z0-9+.-]+\n ://\n [^|]+?\n )\n |\n (?P<object_page> [^|]+? )\n )\n \\s*\n ([|] \\s* (?P<object_text>.+?) \\s*)?\n }}\n )\n ', '(?P<strong> \\*\\* )', '(?P<emph> (?<!:)// )', '(?P<insert> (?<!:)__ )', '(?P<linebreak> \\\\\\\\ )')
inline_emph = '(?P<emph> (?<!:)// )'
inline_emph_repl(stack, emph)[source]
inline_escape = '(?P<escape> ~ (?P<escaped_char>\\S) )'
inline_escape_repl(stack, escape, escaped_char)[source]
inline_insert = '(?P<insert> (?<!:)__ )'
inline_insert_repl(stack, insert)[source]
inline_linebreak = '(?P<linebreak> \\\\\\\\ )'
inline_linebreak_repl(stack, linebreak)[source]

Handle all kinds of links.

inline_macro = '\n (?P<macro>\n <<\n (?P<macro_name> \\w+)\n (?:\n \\(\n (?P<macro_args> .*?)\n \\)\n )?\n \\s*\n >>\n )\n '
inline_macro_repl(stack, macro, macro_name, macro_args=None)[source]

Handles macros using the placeholder syntax.

inline_nowiki = '\n (?P<nowiki>\n {{{\n (?P<nowiki_text>.*?}*)\n }}}\n )\n '
inline_nowiki_repl(stack, nowiki, nowiki_text)[source]
inline_object = '\n (?P<object>\n {{\n \\s*\n (\n (?P<object_url>\n [a-zA-Z0-9+.-]+\n ://\n [^|]+?\n )\n |\n (?P<object_page> [^|]+? )\n )\n \\s*\n ([|] \\s* (?P<object_text>.+?) \\s*)?\n }}\n )\n '
inline_object_repl(stack, object, object_page=None, object_url=None, object_text=None)[source]

Handles objects included in the page.

inline_re = <_sre.SRE_Pattern object at 0x4c6e870>
inline_strong = '(?P<strong> \\*\\* )'
inline_strong_repl(stack, strong)[source]
inline_url = '\n (?P<url>\n (^ | (?<=\\s | [.,:;!?()/=]))\n (?P<escaped_url>~)?\n (?P<url_target>\n (http|https|ftp|file|mailto|nntp|news|ssh|telnet|irc|ircs|xmpp|mumble|webcal|ed2k|apt|rootz|gopher|notes|rtp|rtsp|rtcp)\n :\n \\S+?\n )\n ($ | (?=\\s | [,.:;!?()] (\\s | $)))\n )\n '
inline_url_repl(stack, url, url_target, escaped_url=None)[source]

Handle raw urls in text.

inlinedesc = ('\n (?P<macro>\n <<\n (?P<macro_name> \\w+)\n (?:\n \\(\n (?P<macro_args> .*?)\n \\)\n )?\n \\s*\n >>\n )\n ', '\n (?P<nowiki>\n {{{\n (?P<nowiki_text>.*?}*)\n }}}\n )\n ', '(?P<emph> (?<!:)// )', '(?P<strong> \\*\\* )', '\n (?P<object>\n {{\n \\s*\n (\n (?P<object_url>\n [a-zA-Z0-9+.-]+\n ://\n [^|]+?\n )\n |\n (?P<object_page> [^|]+? )\n )\n \\s*\n ([|] \\s* (?P<object_text>.+?) \\s*)?\n }}\n )\n ')
inlinedesc_re = <_sre.SRE_Pattern object at 0x4c70600>
list = ('\n (?P<end>\n ^\n (\n # End the list on blank line,\n $\n |\n # heading,\n =\n |\n # table,\n \\|\n |\n # and nowiki block\n {{{\n )\n )\n ', '\n (?P<item>\n ^\n \\s*\n (?P<item_head> [\\#*]+)\n \\s*\n (?P<item_text> .*?)\n $\n )\n ', '(?P<text> .+ )')
list_end = '\n (?P<end>\n ^\n (\n # End the list on blank line,\n $\n |\n # heading,\n =\n |\n # table,\n \\|\n |\n # and nowiki block\n {{{\n )\n )\n '
list_end_repl(_iter_content, stack, end)[source]
list_item = '\n (?P<item>\n ^\n \\s*\n (?P<item_head> [\\#*]+)\n \\s*\n (?P<item_text> .*?)\n $\n )\n '
list_item_repl(_iter_content, stack, item, item_head, item_text)[source]
list_re = <_sre.SRE_Pattern object at 0x365efb0>
list_text = '(?P<text> .+ )'
list_text_repl(_iter_content, stack, text)
macro_text(text)[source]

Return an ET tree branch representing the markup present in the input text. Used for FootNotes, etc.

nowiki_end = '\n ^ (?P<escape> ~ )? (?P<rest> }}} \\s* ) $\n '
nowiki_end_re = <_sre.SRE_Pattern object>
nowiki_interpret = '\n ^\n \\#!\n \\s*\n (?P<nowiki_name> [\\w/]+)?\n \\s*\n (:?\n \\(\n (?P<nowiki_args> .*?)\n \\)\n )?\n \\s*\n $\n '
nowiki_interpret_re = <_sre.SRE_Pattern object>
parse_block(iter_content, arguments)[source]
parse_inline(text, stack, inline_re=<_sre.SRE_Pattern object at 0x4c6e870>)[source]

Recognize inline elements within the given text

table = '\n (?P<table>\n ^ \\s* \\| .* $\n )\n '
table_re = <_sre.SRE_Pattern object>
tablerow = '\n (?P<cell>\n \\|\n \\s*\n (?P<cell_head> [=] )?\n (?P<cell_text> [^|]+ )\n \\s*\n )\n '
tablerow_cell_repl(stack, cell, cell_text, cell_head=None)[source]

Creole has feature that allows table headings to be either row based or column based.

We avoid use of HTML5 row based thead tag and apply CSS styling to any cell marked as a heading.

tablerow_re = <_sre.SRE_Pattern object>

MoinMoin.converter.docbook_in module

MoinMoin - DocBook input converter Converts a DocBook document into an internal document tree.

Currently supports DocBook v5.

Some elements of DocBook v4 specification are also supported for backward compatibility:

  • ulink
class MoinMoin.converter.docbook_in.Converter[source]

Bases: object

Converter application/docbook+xml -> x.moin.document

admonition_tags = set(['danger', 'hint', 'attention', 'tip', 'note', 'important', 'caution', 'error', 'warning'])
block_tags = set(['set', 'subtitle', 'simplesect', 'figure', 'cmdsynopsis', 'synopfragment', 'taskrelated', 'sidebar', 'colophon', 'title', 'setindex', 'book', 'screenshoot', 'taskprerequisites', 'appendix', 'dedication', 'article', 'acknowledgements', 'tasksummary', 'chapter', 'partintro', 'task', 'equation', 'caption', 'synopsis', 'part', 'epigraph', 'example'])
do_children(element, depth)[source]

Function to process the conversion of the children of a given element.

docbook_namespace = {<Namespace('http://docbook.org/ns/docbook')>: 'docbook'}
error(message)[source]

Return a DOM Tree containing an error message.

get_standard_attributes(element)[source]

We will extract the standard attributes of the element, if any. We save the result in our standard attribute.

ignored_tags = set(['refpurpose', 'itermset', 'otheraddr', 'citerefentry', 'refclass', 'funcsynopsis', 'refsynopsisdivtoc', 'guimenu', 'group', 'copyright', 'revremark', 'methodsynopsis', 'methodparam', 'indexentry', 'orgdiv', 'volumenum', 'secondary', 'calloutlist', 'keywordset', 'classsynopsisinfo', 'interfacename', 'refmeta', 'void', 'issuenum', 'othercredit', 'titleabbrev', 'imageobjectco', 'bibliomisc', 'guimenuitem', 'classsynopsis', 'refsect2', 'msgtext', 'refsect1', 'methodname', 'refnamediv', 'msgaud', 'bibliosource', 'productname', 'bibliolist', 'bibliomixed', 'revnumber', 'pubdate', 'guilabel', 'initializer', 'confdates', 'see', 'arc', 'releaseinfo', 'guiicon', 'tocentry', 'ooexception', 'index', 'destructorsynopsis', 'refmiscinfo', 'tertiaryie', 'constructorsynopsis', 'bibliorelation', 'refname', 'citetitle', 'refentry', 'biblioentry', 'revhistory', 'bibliography', 'confnum', 'funcparams', 'publisher', 'constraint', 'indexdiv', 'areaset', 'refentrytitle', 'ooclass', 'guibutton', 'oointerface', 'guisubmenu', 'info', 'msglevel', 'co', 'contractnum', 'productnumber', 'primary', 'printhistory', 'classname', 'fieldsynopsis', 'tocdiv', 'org', 'contrib', 'msgset', 'msgexplan', 'tertiary', 'bibliomset', 'reference', 'artpagenums', 'area', 'callout', 'authorinitials', 'biblioref', 'editor', 'msg', 'conftitle', 'function', 'refsection', 'funcsynopsisinfo', 'personblurb', 'biblioset', 'legalnotice', 'funcdef', 'nonterminal', 'keyword', 'edition', 'seealso', 'extendedlink', 'msgrel', 'areaspec', 'refsect3', 'bibliodiv', 'contractsponsor', 'seriesvolnums', 'abstract', 'citation', 'msgorig', 'confsponsor', 'author', 'orgname', 'confgroup', 'bridgehead', 'msgentry', 'pagenums', 'revdescription', 'indexterm', 'revision', 'funcprototype', 'subjectset', 'refdescriptor', 'primaryie', 'rhs', 'msgmain', 'collab', 'constraintdef', 'spanspec', 'xref', 'msginfo', 'varargs', 'annotation', 'authorgroup', 'biblioid', 'publishername', 'bibliocoverage', 'cover', 'secondaryie', 'lhs', 'msgsub'])
inline_tags = set(['constant', 'keycombo', 'errorname', 'package', 'hardware', 'affiliation', 'street', 'termdef', 'postcode', 'manvolnum', 'prompt', 'alt', 'shortcut', 'pob', 'wordasword', 'lineannotation', 'city', 'personname', 'jobtitle', 'uri', 'userinput', 'errortext', 'filename', 'errorcode', 'state', 'optional', 'returnvalue', 'honorific', 'varname', 'type', 'firstterm', 'fax', 'option', 'firstname', 'acronym', 'mousebutton', 'replaceable', 'accel', 'phone', 'exceptionname', 'address', 'date', 'foreignphrase', 'holder', 'keycode', 'remark', 'systemitem', 'database', 'country', 'errortype', 'symbol', 'surname', 'person', 'abbrev', 'shortaffil', 'command', 'keycap', 'keysym', 'anchor'])
media_tags = {'audioobject': (['x-wav', 'mpeg', 'ogg', 'webm'], 'audiodata', 'audio/'), 'videoobject': (['ogg', 'webm', 'mp4'], 'videodata', 'video/'), 'imageobject': (['gif', 'png', 'jpeg', 'jpg', 'svg'], 'imagedata', 'image/')}
new(tag, attrib, children)[source]

Return a new element for the DocBook Tree.

new_copy(tag, element, depth, attrib)[source]

Function to copy one element to the DocBook Tree.

It first converts the children of the element, and then the element itself.

root_tags = set(['sect4', 'blockquote', 'sect2', 'sect3', 'sect1', 'section', 'formalpara', 'informalfigure', 'segmentedlist', 'informalequation', 'sect5', 'informalexample', 'simplelist', 'qandaset', 'orderedlist', 'procedure'])
sect_re = <_sre.SRE_Pattern object>
simple_tags = {'programlisting': Name(u'blockcode', u'http://moinmo.in/namespaces/page'), 'code': Name(u'code', u'http://moinmo.in/namespaces/page'), 'varlistentry': Name(u'list-item', u'http://moinmo.in/namespaces/page'), 'simpara': Name(u'p', u'http://moinmo.in/namespaces/page'), 'phrase': Name(u'span', u'http://moinmo.in/namespaces/page'), 'glosslist': Name(u'list', u'http://moinmo.in/namespaces/page'), 'glossentry': Name(u'list-item', u'http://moinmo.in/namespaces/page'), 'row': Name(u'table-row', u'http://moinmo.in/namespaces/page'), 'glossdef': Name(u'list-item-body', u'http://moinmo.in/namespaces/page'), 'tr': Name(u'table-row', u'http://moinmo.in/namespaces/page'), 'tbody': Name(u'table-body', u'http://moinmo.in/namespaces/page'), 'literal': Name(u'code', u'http://moinmo.in/namespaces/page'), 'tfoot': Name(u'table-footer', u'http://moinmo.in/namespaces/page'), 'computeroutput': Name(u'code', u'http://moinmo.in/namespaces/page'), 'thead': Name(u'table-header', u'http://moinmo.in/namespaces/page'), 'para': Name(u'p', u'http://moinmo.in/namespaces/page'), 'quote': Name(u'quote', u'http://moinmo.in/namespaces/page'), 'screen': Name(u'blockcode', u'http://moinmo.in/namespaces/page'), 'term': Name(u'list-item-label', u'http://moinmo.in/namespaces/page'), 'glossterm': Name(u'list-item-label', u'http://moinmo.in/namespaces/page'), 'markup': Name(u'code', u'http://moinmo.in/namespaces/page'), 'listitem': Name(u'list-item-body', u'http://moinmo.in/namespaces/page'), 'variablelist': Name(u'list', u'http://moinmo.in/namespaces/page')}
start_dom_tree(element, depth)[source]

Return the root element of the DOM tree, with all the children.

We also add a <table-of-content> element if needed.

visit(element, depth)[source]

Function called at each element, to process it.

It will just determine the namespace of our element, then call a dedicated function to handle conversion for the given namespace.

visit_data_element(element, depth, object_data, text_object, caption)[source]

We will try to return an object element based on the object_data. If it is not possible, we return a paragraph with the content of text_object.

visit_data_object(element, depth)[source]

Process a mediaobject element. Possible child tags are videoobject, audioobject, imageobject, caption, objectinfo, and textobject.

<mediaobject><videoobject><videodata fileref=”video.mp4”/></videoobject></mediaobject>

visit_docbook(element, depth)[source]

Function called to handle the conversion of DocBook elements to the moin_page DOM Tree.

We will detect the name of the tag, and pick up the correct method to convert it.

visit_docbook_admonition(element, depth)[source]

<tag.name> –> <admonition type=’tag.name’>

visit_docbook_block(element, depth)[source]

Convert a block element which does not have equivalence in the DOM Tree.

<tag.name> –> <div html:class=”db-tag.name”>

visit_docbook_blockquote(element, depth)[source]
<blockquote>
<attribution>Author</attribution> Text
</blockquote>
–> <blockquote source=”Author”>Text</blockquote>
<blockquote>Text</blockquote>
–> <blockquote source=”Unknow”>Text</blockquote>
visit_docbook_emphasis(element, depth)[source]

emphasis element, is the only way to apply some style on a DocBook element directly from the DocBook tree.

Basically, you can use it for “italic” and “bold” style.

However, it is still semantic, so we call it emphasis and strong.

visit_docbook_entry(element, depth)[source]

<td> –> <table-cell>

visit_docbook_entrytbl(element, depth)[source]

Return a table within a table-cell.

visit_docbook_footnote(element, depth)[source]

<footnote> –> <note note-class=”footnote”><note-body>

visit_docbook_formalpara(element, depth)[source]
<formalpara>
<title>Heading</title> <para>Text</para>
</formalpara>
–> <p html:title=”Heading”>Text</p>
visit_docbook_informalequation(element, depth)[source]

<informalequation> –> <div html:class=”equation”>

visit_docbook_informalexample(element, depth)[source]

<informalexample> –> <div html:class=”example”>

visit_docbook_informalfigure(element, depth)[source]

<informalfigure> –> <div html:class=”figure”>

visit_docbook_inline(element, depth)[source]

For some specific tags (defined in inline_tags) We just return <span element=”tag.name”>

visit_docbook_inlinemediaobject(element, depth)[source]
visit_docbook_inlinequation(element, depth)[source]

<inlinequation> –> <span element=”equation”>

visit_docbook_itemizedlist(element, depth)[source]

<itemizedlist> –> <list item-label-generate=”unordered”>

LINK Conversion.

There is two kind of links in DocBook : One using the xlink namespace. The other one using linkend attribute.

The xlink attributes can directly be used in the <a> tag of the DOM Tree since we support xlink.

For the linkend attribute, we need to have a system supporting the anchors.

visit_docbook_literallayout(element, depth)[source]

<literallayout> –> <blockcode html:class=”db-literallayout”>

visit_docbook_mediaobject(element, depth)[source]
<olink targetdoc=’URI’ targetptr=’ptr’>
–> <a xlink:href=’URI#ptr’>
visit_docbook_orderedlist(element, depth)[source]

<orderedlist> –> <list item-label-generate=”ordered”> See attribute_conversion for more details about the attributes.

visit_docbook_procedure(element, depth)[source]

<procedure> –> <list item-label-generate=”ordered”>

visit_docbook_qandaset(element, depth)[source]

See visit_qandaset_* method.

visit_docbook_sbr(element, depth)[source]

<sbr /> –> <line-break />

visit_docbook_sect(element, depth)[source]

This is the function to convert a numbered section.

Numbered section uses tag like <sectN> where N is the number of the section between 1 and 5.

The sections are supposed to be correctly nested.

We only convert a section to an heading if one of the children is a title element.

TODO: See if we can unify with recursive section below. TODO: Add div element, with specific id

visit_docbook_section(element, depth)[source]

This is the function to convert recursive section.

Recursive section use tag like <section> only.

Each section, inside another section is a subsection.

To convert it, we will use the depth of the element, and two attributes of the converter which indicate the current depth of the section and the current level heading.

visit_docbook_seglistitem(element, labels, depth)[source]

A seglistitem is a list-item for a segmented list. It is quite special because it act list definition with label, but the labels are predetermined in the labels list.

So we generate label/body couple according to the content in labels

visit_docbook_segmentedlist(element, depth)[source]

A segmented list is a like a list of definition, but the label are defined at the start with <segtitle> tag and then for each definition, we repeat the label.

So to convert such list, we will first determine and save the labels. Then we will iterate over the object to get the definition.

visit_docbook_simplelist(element, depth)[source]

<simplelist> –> <list item-label-generate=”unordered”>

visit_docbook_subscript(element, depth)[source]

<subscript> –> <span baseline-shift=”sub”>

visit_docbook_substeps(element, depth)[source]

Return the same elements than a procedure

visit_docbook_superscript(element, depth)[source]

<superscript> –> <span baseline-shift=”super”>

visit_docbook_table(element, depth)[source]

<table> –> <table>

visit_docbook_tag(element, depth)[source]
<tag class=”class.name” namespace=”ns.address”>TAG</tag>
–> <span class=”db-tag-class.name”>{ns.address}TAG</tag>
visit_docbook_trademark(element, depth)[source]

Depending of the trademark class, a specific entities is added to the string.

Docbook supports 4 types of trademark: copyright, registered, trade (mark), and service (mark). <trademark> –> <span class=”db-trademark”>

NB : <ulink> is not a part of DocBook v.5 however we support it in our converter since it is still widely used and it helps to keep a compatibility with DocBook v.4

visit_qandaentry_number(element, depth)[source]

Convert:

<question>Q</question><answer>A</answer>

to:

<list-item>
    <list-item-body><p>Q</p><p>A</p></list-item-body>
</list-item>
visit_qandaentry_qanda(element, depth)[source]

Convert:

<question>Q body</question><answer>A Body</answer>

to:

<list-item>
    <list-item-label>Q:</list-item-label>
    <list-item-body>Q Body</list-item-body>
</list-item>
<list-item>
    <list-item-label>A:</list-item-label>
    <list-item-body>A Body</list-item-body>
</list-item>
visit_qandaset_number(element, depth)[source]
<qandaset defaultlabel=”number”>
–> <list item-label-generate=’ordered’>
visit_qandaset_qanda(element, depth)[source]

<qandaset defaultlabel=”qanda”> –> <list>

visit_simple_list(moin_page_tag, attrib, element, depth)[source]

There is different list element in DocBook with different semantic meaning, but with an unique result in the DOM Tree.

Here we handle the conversion of such of list.

visit_simple_tag(element, depth)[source]

Some docbook tags can be converted directly to an equivalent DOM Tree element. We retrieve the equivalent tag from the simple_tags dictionnary defined at the begining of this file.

exception MoinMoin.converter.docbook_in.NameSpaceError[source]

Bases: exceptions.Exception

MoinMoin.converter.docbook_in.XML(text, parser=None)[source]

Copied from EmeraldTree/tree.py to force use of local XMLParser class override.

class MoinMoin.converter.docbook_in.XMLParser(html=0, target=None, encoding=None)[source]

Bases: emeraldtree.tree.XMLParser

Override EmeraldTree/tree.py XMLParser class. Required to add auto-scroll textarea feature.

There is no need to subclass all tree.py classes and procedures with stubs because this modified _start_list is only needed for the initial construction of the DOM when flaskg.add_lineno_attr may be True.

MoinMoin.converter.docbook_out module

MoinMoin - DocBook output converter

Converts an internal document tree into a DocBook v5 document.

class MoinMoin.converter.docbook_out.Converter[source]

Bases: object

Converter application/x.moin.document -> application/docbook+xml

admonition_tags = set(['note', 'tip', 'warning', 'important', 'caution'])
do_children(element)[source]

Function to process the conversion of the children of a given element.

Return a list of elements.

get_standard_attributes(element)[source]

We will extract the standard attributes of the element, if any. We save the result in standard_attribute.

handle_simple_list(docbook_tag, element, attrib)[source]
namespaces_visit = {<Namespace('http://moinmo.in/namespaces/page')>: 'moinpage'}
new(tag, attrib, children)[source]

Return a new element in the DocBook tree.

new_copy(tag, element, attrib)[source]

Function to copy one element to the DocBook tree

It first converts the children of the element, and then the element itself

simple_tags = {'list-item': Name(u'varlistentry', u'http://docbook.org/ns/docbook'), 'emphasis': Name(u'emphasis', u'http://docbook.org/ns/docbook'), 'code': Name(u'literal', u'http://docbook.org/ns/docbook'), 'list-item-label': Name(u'term', u'http://docbook.org/ns/docbook'), 'quote': Name(u'quote', u'http://docbook.org/ns/docbook')}
standard_attribute = {}
unsupported_tags = set(['separator'])
visit(element)[source]

Function called at each element to process it.

It will just determine the namespace of our element, then call a dedicated function to handle conversion for the found namespace.

visit_moinpage(element)[source]

Function called to handle the conversion of elements belonging to the moin_page namespace.

We will choose the most appropriate procedure to convert the element according to the tag name

visit_moinpage_a(element)[source]

LINK Conversion.

Link are defined using the XLINK namespace either for the DOM Tree and in DocBook specification, so the converter can just copy each xlink: attribute into an <link> tag.

visit_moinpage_admonition(element)[source]

There is 5 admonition in DocBook, which are also supported in the DOM Tree.

For instance: <caution> –> <admonition type=’caution’>

visit_moinpage_blockcode(element)[source]

<blockcode>text</blockcode> –> <screen><![CDATA[text]]></scren>

visit_moinpage_blockquote(element)[source]

Convert:

<blockquote>text<blockquote>

to:

<blockquote>
    <attribution>Unknown</attribution>
    <simpara>text</text>
</blockquote>

Expand:

<blockquote source="author">text</blockquote>

output:

<blockquote>
    <attribution>author</attribution>
    <simpara>text</text>
</blockquote>
visit_moinpage_h(element)[source]

There is not really heading in DocBook, but rather section with title. The section is a root tag for all the elements which in the dom tree will be between two heading tags.

So we need to process child manually to determine correctly the children of each section.

A section is closed when we have a new heading with an equal or higher level.

visit_moinpage_line_break(element)[source]
visit_moinpage_list(element)[source]

Function called to handle the conversion of list.

It will called a specific function to handle (un)ordered list, with the appropriate DocBook tag.

Or a specific function to handle definition list.

visit_moinpage_list_item_body(element)[source]
visit_moinpage_note(element)[source]
<note note-class=”footnote”><note-body>text</note-body></note>
–> <footnote><simpara>text</simpara></footnote>
visit_moinpage_object(element)[source]

Convert:

<object type='image/' xlink:href='uri'/>

to:

<inlinemediaobject>
      <imageobject>
            <imagedata fileref="uri" />
      </imageobject>
</inlinemediaobject>

Similar for video and audio object.

visit_moinpage_p(element)[source]

If we have a title attribute for p, we return a para, with a <title> child. Otherwise we return a <simpara>.

visit_moinpage_page(element)[source]
visit_moinpage_span(element)[source]

The span element is used in the DOM Tree to define some specific formatting. So each attribute will give different resulting tag.

TODO: Add support for text-decoration attribute TODO: Add support for font-size attribute

visit_moinpage_strong(element)[source]

<strong> –> <emphasis role=strong>

visit_moinpage_table(element)[source]
visit_moinpage_table_body(element)[source]
visit_moinpage_table_cell(element)[source]
visit_moinpage_table_header(element)[source]
visit_moinpage_table_row(element)[source]
visit_simple_tag(element)[source]

MoinMoin.converter.everything module

MoinMoin - converter for all items (fallback)

Convert any item to a DOM Tree (we just create a link to download it).

class MoinMoin.converter.everything.Converter[source]

Bases: object

Convert a unsupported item to DOM Tree.

MoinMoin.converter.highlight module

MoinMoin - Text highlighting converter

class MoinMoin.converter.highlight.Converter(re)[source]

Bases: object

recurse(elem)[source]

MoinMoin.converter.html_in module

MoinMoin - HTML input converter

Converts an XHTML document into an internal document tree.

TODO : Add support for style

class MoinMoin.converter.html_in.Converter[source]

Bases: object

Converter html -> .x.moin.document

base_url = ''
convert_attributes(element)[source]
do_children(element)[source]

Function to process the conversion of the child of a given elements.

heading_re = <_sre.SRE_Pattern object>
html_namespace = {<Namespace('http://www.w3.org/1999/xhtml')>: 'xhtml'}
ignored_tags = set(['frameset', 'frame', 'select', 'noframes', 'noscript', 'style', 'area', 'menu', 'param', 'label', 'script', 'var', 'input', 'map', 'head', 'fieldset', 'option', 'form', 'link', 'optgroup', 'legend', 'center', 'textarea', 'button', 'isindex', 'caption', 'applet', 'iframe', 'title'])
inline_tags = set(['acronym', 'dfn', 'abbr', 'kbd', 'address'])
list_tags = set(['ul', 'ol', 'dir'])
new(tag, attrib, children)[source]

Return a new element for the DOM Tree

new_copy(tag, element, attrib)[source]

Function to copy one element to the DOM Tree.

It first converts the child of the element, and the element itself.

new_copy_symmetric(element, attrib)[source]

Create a new QName, with the same tag of the element, but with a different namespace.

Then, we handle the copy normally.

simple_tags = {'em': Name(u'emphasis', u'http://moinmo.in/namespaces/page'), 'pre': Name(u'blockcode', u'http://moinmo.in/namespaces/page'), 'b': Name(u'strong', u'http://moinmo.in/namespaces/page'), 'dt': Name(u'list-item-label', u'http://moinmo.in/namespaces/page'), 'i': Name(u'emphasis', u'http://moinmo.in/namespaces/page'), 'tt': Name(u'code', u'http://moinmo.in/namespaces/page'), 'strong': Name(u'strong', u'http://moinmo.in/namespaces/page'), 'samp': Name(u'code', u'http://moinmo.in/namespaces/page'), 'dd': Name(u'list-item-body', u'http://moinmo.in/namespaces/page')}
standard_attributes = set(['style', 'class', 'alt', 'title'])
symmetric_tags = set(['code', 'span', 'quote', 'p', 'blockquote', 'div', 'strong'])
visit(element)[source]

Function called at each element, to process it.

It will just determine the namespace of our element, then call a dedicated function to handle conversion for the found namespace.

visit_xhtml(element)[source]

Function called to handle the conversion of elements belonging to the XHTML namespace.

We will detect the name of the tag, and apply an appropriate procedure to convert it.

visit_xhtml_a(element)[source]

<a href=”URI”>Text</a> –> <a xlink:href=”URI”>Text</a>

visit_xhtml_base(element)[source]

Function to store the base url for the relative url of the document

visit_xhtml_big(element)[source]

<big>Text</big> –> <span font-size=120%>Text</span>

visit_xhtml_br(element)[source]

<br /> –> <line-break />

visit_xhtml_caption(element)[source]
visit_xhtml_del(element)[source]

<del>Text</del> –> <del>Text</del>

visit_xhtml_dl(element)[source]

Convert a list of definition. The starting structure:

<dl>
    <dt>Label 1</dt><dd>Text 1</dd>
    <dt>Label 2</dt><dd>Text 2</dd>
</dl>

will be converted to:

<list>
    <list-item>
        <list-item-label>Label 1</list-item-label>
        <list-item-body>Text 1</list-item-body>
    </list-item>
    <list-item>
        <list-item-label>Label 2</list-item-label>
        <list-item-body>Text 2</list-item-body>
    </list-item>
</list>
visit_xhtml_heading(element)[source]

Function to convert an heading tag into the proper element in our moin_page namespace

visit_xhtml_hr(element, min_class=u'moin-hr1', max_class=u'moin-hr6', default_class=u'moin-hr3')[source]

<hr /> –> <separator />

visit_xhtml_img(element)[source]

<img src=”URI” /> –> <object xlink:href=”URI />

visit_xhtml_inline(element)[source]

For some specific inline tags (defined in inline_tags) We just return <span element=”tag.name”>

visit_xhtml_ins(element)[source]

<ins>Text</ins> –> <ins>Text</ins>

visit_xhtml_li(element)[source]

NB : A list item (<li>) is like the following snippet:

<list-item>
    <list-item-label>label</list-item-label>
    <list-item-body>Body</list-item-body>
</list-item>

For <li> element, there is no label

visit_xhtml_list(element)[source]

Convert a list of items (whatever the type : ordered or unordered) So we have html code like:

<ul>
    <li>Item 1</li>
    <li>Item 2</li>
</ul>

Which will be converted to:

<list>
    <list-item>
        <list-item-body>Item 1</list-item-body>
    </list-item>
    <list-item>
        <list-item-body>Item 2</list-item-body>
    </list-item>
</list>
visit_xhtml_object(element)[source]

<object data=”href”></object> –> <object xlink=”href” />

visit_xhtml_s(element)[source]

<s>Text</s> –> <s>Text</s>

visit_xhtml_small(element)[source]

<small>Text</small> –> <span font-size=85%>Text</span>

visit_xhtml_strike(element)[source]

<strike>Text</strike> –> <s>Text</s> # strike is not a valid tag in html5

visit_xhtml_sub(element)[source]

<sub>Text</sub> –> <span base-line-shift=”sub”>Text</span>

visit_xhtml_sup(element)[source]

<sup>Text</sup> –> <span base-line-shift=”super”>Text</span>

visit_xhtml_table(element)[source]
visit_xhtml_tbody(element)[source]
visit_xhtml_td(element, attr={})[source]
visit_xhtml_tfoot(element)[source]
visit_xhtml_th(element)[source]

html_out does not support th tags, so we do td tags like all other converters.

visit_xhtml_thead(element)[source]
visit_xhtml_tr(element)[source]
visit_xhtml_u(element)[source]

<u>Text</u> –> <u>Text</u>

MoinMoin.converter.html_out module

MoinMoin - HTML output converter

Converts an internal document tree into a HTML tree.

class MoinMoin.converter.html_out.Attribute(key)[source]

Bases: object

Adds the attribute with the HTML namespace to the output.

key
class MoinMoin.converter.html_out.Attributes(element)[source]

Bases: object

convert()[source]
get(name)[source]
namespaces_valid_output = frozenset([<Namespace('http://www.w3.org/1999/xhtml')>])
visit_class = <MoinMoin.converter.html_out.Attribute object>
visit_id = <MoinMoin.converter.html_out.Attribute object>
visit_number_columns_spanned = <MoinMoin.converter.html_out.Attribute object>
visit_number_rows_spanned = <MoinMoin.converter.html_out.Attribute object>
visit_style = <MoinMoin.converter.html_out.Attribute object>
visit_title = <MoinMoin.converter.html_out.Attribute object>
visit_type = <MoinMoin.converter.html_out.Attribute object>
class MoinMoin.converter.html_out.Converter[source]

Bases: object

Converter application/x.moin.document -> application/x.moin.document

direct_inline_tags = set(['dfn', 'abbr', 'kbd', 'address'])
do_children(element)[source]
eval_object_type(mimetype, href)[source]

Returns the type of an object as a str, one of the following: img, video, audio, object

namespaces_visit = {<Namespace('http://moinmo.in/namespaces/page')>: 'moinpage'}
new_copy(tag, element, attrib={})[source]
visit(elem)[source]
visit_moinpage(elem)[source]
visit_moinpage_a(elem, _tag_html_a=Name(u'a', u'http://www.w3.org/1999/xhtml'), _tag_html_href=Name(u'href', u'http://www.w3.org/1999/xhtml'), _tag_xlink_href=Name(u'href', u'http://www.w3.org/1999/xlink'))[source]
visit_moinpage_admonition(elem)[source]

Used by ReST and docbook.

visit_moinpage_block_comment(elem)[source]
visit_moinpage_blockcode(elem)[source]
visit_moinpage_blockquote(elem)[source]
visit_moinpage_code(elem)[source]
visit_moinpage_del(elem)[source]
visit_moinpage_div(elem)[source]
visit_moinpage_emphasis(elem)[source]
visit_moinpage_h(elem)[source]
visit_moinpage_inline_part(elem)[source]
visit_moinpage_ins(elem)[source]
visit_moinpage_line_break(elem)[source]
visit_moinpage_list(elem)[source]
visit_moinpage_list_item(elem)[source]

Used for markdown definition lists.

Compared to moinwiki and ReST parsers, the markdown parser creates definition lists using only one list-item tag.name for entire list where moinwiki and ReST have one list-item tag.name for each entry in list.

visit_moinpage_nowiki(elem)[source]
visit_moinpage_object(elem)[source]

elem of type img are converted to img tags here, others are left as object tags.

We do not use Attributes.convert to convert all attributes, but copy selected attributes and follow html5 validation rules to place right attributes within img and object tags.

visit_moinpage_p(elem)[source]
visit_moinpage_page(elem)[source]
visit_moinpage_part(elem)[source]
visit_moinpage_quote(elem)[source]
visit_moinpage_s(elem)[source]
visit_moinpage_samp(elem)[source]
visit_moinpage_separator(elem)[source]
visit_moinpage_span(elem)[source]
visit_moinpage_strong(elem)[source]
visit_moinpage_table(elem)[source]
visit_moinpage_table_cell(elem)[source]
visit_moinpage_table_row(elem)[source]
visit_moinpage_u(elem)[source]
class MoinMoin.converter.html_out.ConverterDocument[source]

Bases: MoinMoin.converter.html_out.ConverterPage

Converter application/x.moin.document -> application/xhtml+xml

class MoinMoin.converter.html_out.ConverterPage[source]

Bases: MoinMoin.converter.html_out.Converter

Converter application/x.moin.document -> application/x-xhtml-moin-page

create_footnotes(top)[source]

Return footnotes formatted into an ET structure.

visit(elem, _tag_moin_page_page_href=Name(u'page-href', u'http://moinmo.in/namespaces/page'))[source]
visit_moinpage_h(elem, _tag_html_id=Name(u'id', u'http://www.w3.org/1999/xhtml'))[source]
visit_moinpage_note(elem)[source]
visit_moinpage_table_of_content(elem)[source]
exception MoinMoin.converter.html_out.ElementException[source]

Bases: exceptions.RuntimeError

class MoinMoin.converter.html_out.SpecialId[source]

Bases: object

gen_id(id)[source]
gen_text(text)[source]
get_id(id)[source]
zero_id(id)[source]
class MoinMoin.converter.html_out.SpecialPage[source]

Bases: object

add_footnote(elem)[source]
add_heading(elem, level, id=None)[source]
add_toc(elem, maxlevel)[source]
extend(page)[source]
footnotes()[source]
headings(maxlevel)[source]
remove_footnotes()[source]
tocs()[source]

If the incoming transclusion reference is within this domain, then remove “+get/<revision number>/”.

MoinMoin.converter.html_out.mark_item_as_transclusion(elem, href)[source]

Return elem after adding a “moin-transclusion” class and a “data-href” attribute with a link to the transcluded item.

On the client side, a Javascript function will wrap the element (or a parent element) in a span or div and 2 overlay siblings will be created.

MoinMoin.converter.html_out.style_attr_filter(style)[source]

If allow_style_attributes option is True check style attribute for suspect strings, else return ‘’.

MoinMoin.converter.image_in module

MoinMoin - Image converter

Convert image to <object> tag for the DOM Tree.

class MoinMoin.converter.image_in.Converter(input_type)[source]

Bases: object

Convert an image to the corresponding <object> in the DOM Tree

MoinMoin.converter.include module

MoinMoin - Include handling

Expands include elements in an internal Moin document.

Although this module is named include.py, many comments within and the moin docs use the word transclude as defined by http://www.linfo.org/transclusion.html, etc.

Adjusting the DOM

After expanding the include elements, in many cases it is necessary to adjust the DOM to prevent the generation of invalid HTML. Using a simple example, ” {{SomeItem}} ”, the starting DOM structure created by the moinwiki_in.py (or other parser) is:

Page > Body > P > Include

After expansion of the Include, the structure will be:

Page > Body > P > Page > Body > (P | Div | Object |...)

moinwiki_in.py (or other parser) does not adjust the DOM structure based upon whether the contents of the transcluded item are inline or block. Sometime after include processing is complete, html_out.py will convert the transcluded Body > Page into a Div or Span wrapping the transclusion contents.

This works well for things like ” ||mytable||{{BlockOrInline}}|| ” where almost any type of element is valid within a table cell’s td.

But without DOM adjustment, ” {{Block}} ” will generate invalid HTML because html_out.py will convert the DOM structure:

Page > Body > P > Page > Body > (Pre | Div | P, P... | ...)

into:

...<body><p><div>...</div></p></body>...

where the </p> is invalid.

In some cases it is desirable to coerce a transcluded small image or phrase into a inline element embedded within a paragraph. Here html_out.py will wrap the transclusion in a Span rather than a Div or convert a P-tag containing a phrase into a Span:

"My pet {{bird.jpg}} flys.", "[[SomePage|{{Logo.png}}]]" or "Yes, we have {{no}} bananas."

In complex cases where a block level item is transcluded within the midst of several levels of text markup, such as:

"plain ''italic '''bold {{BlockItem}} bold''' italic'' plain"

then we must avoid generating invalid html like:

<p>plain <emphasis>italic <strong>bold <div>
...</div> bold</strong> italic</emphasis> plain</p>

where <div>...</div> contains the transcluded item, but rather:

<p>plain <emphasis>italic <strong>bold</strong></emphasis></p><div>
...</div><p><emphasis><strong> bold</strong> italic</emphasis> plain</p>

In these complex cases, we must build a DOM structure that will replace the containing element’s parent, grand-parent, great-grand-parent...

When a block element is embedded within a comment, it is important that the class=”comment” is copied to the transclusion to provide the show/hide and highlighted styles normally applied to comments:

/* normal ''italic ~-small {{detail.csv}} small-~ italic'' normal */

Conveniently, the class=”comment” is added to the span element within the moinwiki_in.py parser and is available to include.py. However, the moin-big and moin-small classes are applied to span elements by html_out.py so those classes are not available. Italic, bold, stroke, and underline styling effects are implemented through specialized tags rather than CSS classes. In the example above, only class=”comment” will be applied to detail.csv.

class MoinMoin.converter.include.Converter[source]

Bases: object

recurse(elem, page_href)[source]
tag_a = Name(u'a', u'http://moinmo.in/namespaces/page')
tag_div = Name(u'div', u'http://moinmo.in/namespaces/page')
tag_h = Name(u'h', u'http://moinmo.in/namespaces/page')
tag_href = Name(u'href', u'http://www.w3.org/1999/xlink')
tag_outline_level = Name(u'outline-level', u'http://moinmo.in/namespaces/page')
tag_page_href = Name(u'page-href', u'http://moinmo.in/namespaces/page')
tag_xi_href = Name(u'href', u'http://www.w3.org/2001/XInclude')
tag_xi_include = Name(u'include', u'http://www.w3.org/2001/XInclude')
tag_xi_xpointer = Name(u'xpointer', u'http://www.w3.org/2001/XInclude')
class MoinMoin.converter.include.XPointer(input)[source]

Bases: list

Simple XPointer parser

class Entry(name, data)[source]

Bases: object

data
data_unescape
name
XPointer.tokenizer_re = <_sre.SRE_Pattern object>
XPointer.tokenizer_rules = '\n # Match escaped syntax elements\n \\^[()^]\n |\n (?P<bracket_open> \\( )\n |\n (?P<bracket_close> \\) )\n |\n (?P<whitespace> \\s+ )\n |\n # Anything else\n [^()^]+\n '

MoinMoin.converter.macro module

MoinMoin - Macro handling

Expands all macro elements in an internal Moin document.

class MoinMoin.converter.macro.Converter[source]

Bases: object

handle_macro(elem, page)[source]
recurse(elem, page)[source]

MoinMoin.converter.markdown_in module

MoinMoin - Markdown input converter

http://daringfireball.net/projects/markdown/

class MoinMoin.converter.markdown_in.Converter[source]

Bases: object

convert_align_to_class(attrib)[source]
convert_attributes(element)[source]
convert_embedded_markup(node)[source]

Recurse through tree looking for embedded markup.

Parameters:node – a tree node
convert_invalid_p_nodes(node)[source]

Processing embedded HTML tags within markup or output from extensions with embedded markup can result in invalid HTML output caused by <p> tags enclosing a block element.

The solution is to search for these occurances and change the <p> tag to a <div>.

Parameters:node – a tree node
count_lines(text)[source]

Create a list of line numbers corresponding to the first line of each markdown block.

The markdown parser does not provide text line numbers nor is there an easy way to add line numbers. As an alternative, we try to split the input text into the same blocks as the parser does, then calculate the starting line number of each block. The list will be processed by the do_children method above.

This method has unresolved problems caused by splitting the text into blocks based upon the presence of 2 adjacent line end characters, including:

  • blank lines within lists create separate blocks
  • omitting a blank line after a heading combines 2 elements into one block
  • using more than one blank lines between blocks

The net result is we either have too few or too many line numbers in the generated list which will cause the double-click-to-edit autoscroll textarea to sometimes be off by several lines.

do_children(element, add_lineno=False)[source]
embedded_markup(text)[source]

Per http://meta.stackexchange.com/questions/1777/what-html-tags-are-allowed-on-stack-exchange-sites markdown markup allows users to specify several “safe” HTML tags within a document. These tags include:

a b blockquote code del dd dl dt em h1 h2 h3 i img kbd li ol p pre s sup sub strong strike ul br hr

In addition, some markdown extensions output raw HTML tags (e.g. fenced outputs “<pre><code>...”). To prevent the <, > characters from being escaped, the embedded tags are converted to nodes by using the converter in html_in.py.

heading_re = <_sre.SRE_Pattern object>
ignored_tags = set(['frameset', 'frame', 'select', 'noframes', 'noscript', 'style', 'area', 'menu', 'param', 'label', 'script', 'var', 'input', 'map', 'head', 'fieldset', 'option', 'form', 'link', 'optgroup', 'legend', 'center', 'textarea', 'button', 'isindex', 'caption', 'applet', 'iframe', 'title'])
inline_tags = set(['acronym', 'dfn', 'abbr', 'kbd', 'address'])
list_tags = set(['ul', 'ol'])
new(tag, attrib, children)[source]

Return a new element for the DOM Tree

new_copy(tag, element, attrib)[source]

Function to copy one element to the DOM Tree.

It first converts the child of the element, and the element itself.

new_copy_symmetric(element, attrib)[source]

Create a new QName, with the same tag of the element, but with a different namespace.

Then, we handle the copy normally.

simple_tags = {'em': Name(u'emphasis', u'http://moinmo.in/namespaces/page'), 'pre': Name(u'blockcode', u'http://moinmo.in/namespaces/page'), 'dl': Name(u'list-item', u'http://moinmo.in/namespaces/page'), 'dd': Name(u'list-item-body', u'http://moinmo.in/namespaces/page'), 'table': Name(u'table', u'http://moinmo.in/namespaces/page'), 'dt': Name(u'list-item-label', u'http://moinmo.in/namespaces/page'), 'strong': Name(u'strong', u'http://moinmo.in/namespaces/page'), 'b': Name(u'strong', u'http://moinmo.in/namespaces/page'), 'i': Name(u'emphasis', u'http://moinmo.in/namespaces/page'), 'tt': Name(u'code', u'http://moinmo.in/namespaces/page'), 'tr': Name(u'table-row', u'http://moinmo.in/namespaces/page'), 'tbody': Name(u'table-body', u'http://moinmo.in/namespaces/page'), 'samp': Name(u'code', u'http://moinmo.in/namespaces/page'), 'thead': Name(u'table-header', u'http://moinmo.in/namespaces/page')}
standard_attributes = set(['style', 'class', 'title'])
symmetric_tags = set(['code', 'quote', 'p', 'blockquote', 'div', 'strong'])
visit(element)[source]
visit_a(element)[source]
visit_big(element)[source]
visit_br(element)[source]
visit_del(element)[source]
visit_heading(element)[source]

Function to convert an heading tag into a proper element in our moin_page namespace

visit_hr(element, default_class=u'moin-hr3')[source]
visit_img(element)[source]

<img src=”URI” /> –> <object xlink:href=”URI />

visit_inline(element)[source]

For some specific inline tags (defined in inline_tags) We just return <span element=”tag.name”>

visit_ins(element)[source]
visit_li(element)[source]

NB : A list item (<li>) is like the following snippet:

<list-item>
    <list-item-label>label</list-item-label>
    <list-item-body>Body</list-item-body>
</list-item>

For <li> element, there is no label

visit_list(element)[source]

Convert a list of item (whatever the type : ordered or unordered) So we have html code like:

<ul>
    <li>Item 1</li>
    <li>Item 2</li>
</ul>

Which will be converted to:

<list>
    <list-item>
        <list-item-body>Item 1</list-item-body>
    </list-item>
    <list-item>
        <list-item-body>Item 2</list-item-body>
    </list-item>
</list>
visit_object(element)[source]

<object data=”href”></object> –> <object xlink=”href” />

visit_s(element)[source]
visit_small(element)[source]
visit_strike(element)[source]
visit_sub(element)[source]
visit_sup(element)[source]
visit_td(element)[source]
visit_th(element)[source]
visit_u(element)[source]
MoinMoin.converter.markdown_in.postproc_text(markdown, text)[source]

Removes HTML or XML character references and entities from a text string.

Parameters:text – The HTML (or XML) source text.
Returns:The plain text, as a Unicode string, if necessary.

MoinMoin.converter.mediawiki_in module

MoinMoin - Media Wiki input converter

class MoinMoin.converter.mediawiki_in.Converter[source]

Bases: MoinMoin.converter._wiki_macro.ConverterMacro

class Mediawiki_preprocessor[source]

Bases: object

class Preprocessor_tag(name='', text='', tag='', status=True)[source]

Bases: object

Converter.Mediawiki_preprocessor.all_tags = ['br', 'blockquotedel', 'pre', 'code', 'tt', 'nowiki', 'ref', 's', 'sub', 'sup']
Converter.Mediawiki_preprocessor.block_tags = ['blockquote']
Converter.Mediawiki_preprocessor.nowiki_tags = ['pre', 'code', 'tt', 'nowiki']
Converter.Mediawiki_preprocessor.pop()[source]
Converter.Mediawiki_preprocessor.push(status=[])[source]
Converter.block = ('(?P<line> ^ \\s* $ )', '\n ^\n (?P<table>\n \\{\\|\n \\s*\n (?P<table_args> .*?)\n )\n $\n ', '\n (?P<head>\n ^\n \\s*\n (?P<head_head> =+ )\n \\s*\n (?P<head_text> .*? )\n \\s*\n (?P=head_head)\n \\s*\n $\n )\n ', '(?P<separator> ^ \\s* -{4,} \\s* $ )', '(?P<text> .+ )')
Converter.block_head = '\n (?P<head>\n ^\n \\s*\n (?P<head_head> =+ )\n \\s*\n (?P<head_text> .*? )\n \\s*\n (?P=head_head)\n \\s*\n $\n )\n '
Converter.block_head_repl(_iter_content, stack, head, head_head, head_text)[source]
Converter.block_line = '(?P<line> ^ \\s* $ )'
Converter.block_line_repl(_iter_content, stack, line)[source]
Converter.block_re = <_sre.SRE_Pattern object at 0x35e11f0>
Converter.block_separator = '(?P<separator> ^ \\s* -{4,} \\s* $ )'
Converter.block_separator_repl(_iter_content, stack, separator)[source]
Converter.block_table = '\n ^\n (?P<table>\n \\{\\|\n \\s*\n (?P<table_args> .*?)\n )\n $\n '
Converter.block_table_lines(iter_content)[source]

Unescaping generator for the lines in a table block

Converter.block_table_repl(iter_content, stack, table, table_args='')[source]
Converter.block_text = '(?P<text> .+ )'
Converter.block_text_repl(_iter_content, stack, text)[source]
classmethod Converter.factory(input, output, **kw)[source]
Converter.indent = '\n ^\n (?P<indent> [*#:]* )\n (?P<list_begin>\n (?P<list_definition> ;\n )\n \\s*\n |\n (?P<list_numbers> \\# )\n \\s+\n |\n (?P<list_bullet> \\* )\n \\s+\n |\n (?P<list_none> \\: )\n \\s+\n )\n (?P<text> .*? )\n $\n '
Converter.indent_iter(iter_content, line, level, is_list)[source]
Converter.indent_re = <_sre.SRE_Pattern object at 0x35c4880>
Converter.indent_repl(iter_content, stack, line, indent, text, list_begin=None, list_definition=None, list_definition_text=None, list_numbers=None, list_bullet=None, list_none=None)[source]
Converter.inline = ('\n (?P<link>\n \\[\\[\n \\s*\n (\n (?P<link_url>\n [a-zA-Z0-9+.-]+\n :\n [^|]+?\n )\n |\n (?P<link_item> [^|]+? )\n )\n \\s*\n (?P<link_args>\n (\n [|]\n \\s*\n [^|]*?\n \\s*\n )*\n )?\n \\]\\]\n |\n \\[\n \\s*\n (?P<external_link_url>\n (http|https|ftp|file|mailto|nntp|news|ssh|telnet|irc|ircs|xmpp|mumble|webcal|ed2k|apt|rootz|gopher|notes|rtp|rtsp|rtcp)\n :\n [^ ]*\n )\n \\s*\n (?P<alt_text> [^\\]]*? )\n \\s*\n \\]\n )\n ', '\n (?P<breakline>\n \\<br\\ \\/\\>\n )\n ', '\n (?P<blockquote>\n (?P<blockquote_begin>\n \\<blockquote.*?\\>\n )\n |\n (?P<blockquote_end>\n \\<\\/blockquote\\>\n )\n )\n ', '\n (?P<nowiki>\n <nowiki>\n (?P<nowiki_text> .*? )\n </nowiki>\n |\n <pre>\n (?P<nowiki_text_pre> .*? )\n </pre>\n |\n <code>\n (?P<nowiki_text_code> .*? )\n </code>\n |\n <tt>\n (?P<nowiki_text_tt> .*? )\n </tt>\n )\n ', "\n (?P<emphstrong>\n '{2,6}\n (?=\n [^']+\n (?P<emphstrong_follow>\n '{2,3}\n (?!')\n )\n )?\n )\n ", '\n (?P<comment>\n (?P<comment_begin>\n (^|(?<=\\s))\n /\\*\n \\s+\n )\n |\n (?P<comment_end>\n \\s+\n \\*/\n (?=\\s)\n )\n )\n ', '\n (?P<footnote>\n (?P<footnote_begin>\n \\<ref.*?\\>\n )\n |\n (?P<footnote_end>\n \\<\\/ref\\>\n )\n )\n ', '\n (?P<strike>\n \\<s\\>\n |\n \\<\\/s\\>\n )\n ', '\n (?P<delete>\n \\<del\\>\n |\n \\<\\/del\\>\n )\n ', '\n (?P<subscript>\n <sub>\n (?P<subscript_text> .*? )\n </sub>\n )\n ', '\n (?P<superscript>\n <sup>\n (?P<superscript_text> .*? )\n </sup>\n )\n ', '\n (?P<underline>\n \\<u\\>\n |\n \\<\\/u\\>\n )\n ', '\n (?P<insert>\n \\<ins\\>\n |\n \\<\\/ins\\>\n )\n ', '\n (?P<entity>\n &\n (?:\n # symbolic entity, like &uuml;\n [0-9a-zA-Z]{2,6}\n |\n # numeric decimal entities, like &#42;\n \\#\\d{1,5}\n |\n # numeric hexadecimal entities, like &#x42;\n \\#x[0-9a-fA-F]{1,6}\n )\n ;\n )\n ')
Converter.inline_blockquote = '\n (?P<blockquote>\n (?P<blockquote_begin>\n \\<blockquote.*?\\>\n )\n |\n (?P<blockquote_end>\n \\<\\/blockquote\\>\n )\n )\n '
Converter.inline_blockquote_repl(stack, blockquote, blockquote_begin=None, blockquote_end=None)[source]
Converter.inline_breakline = '\n (?P<breakline>\n \\<br\\ \\/\\>\n )\n '
Converter.inline_breakline_repl(stack, breakline)[source]
Converter.inline_comment = '\n (?P<comment>\n (?P<comment_begin>\n (^|(?<=\\s))\n /\\*\n \\s+\n )\n |\n (?P<comment_end>\n \\s+\n \\*/\n (?=\\s)\n )\n )\n '
Converter.inline_comment_repl(stack, comment, comment_begin=None, comment_end=None)[source]
Converter.inline_delete = '\n (?P<delete>\n \\<del\\>\n |\n \\<\\/del\\>\n )\n '
Converter.inline_delete_repl(stack, delete)[source]
Converter.inline_emphstrong = "\n (?P<emphstrong>\n '{2,6}\n (?=\n [^']+\n (?P<emphstrong_follow>\n '{2,3}\n (?!')\n )\n )?\n )\n "
Converter.inline_emphstrong_repl(stack, emphstrong, emphstrong_follow='')[source]
Converter.inline_entity = '\n (?P<entity>\n &\n (?:\n # symbolic entity, like &uuml;\n [0-9a-zA-Z]{2,6}\n |\n # numeric decimal entities, like &#42;\n \\#\\d{1,5}\n |\n # numeric hexadecimal entities, like &#x42;\n \\#x[0-9a-fA-F]{1,6}\n )\n ;\n )\n '
Converter.inline_entity_repl(stack, entity)[source]
Converter.inline_footnote = '\n (?P<footnote>\n (?P<footnote_begin>\n \\<ref.*?\\>\n )\n |\n (?P<footnote_end>\n \\<\\/ref\\>\n )\n )\n '
Converter.inline_footnote_repl(stack, footnote, footnote_begin=None, footnote_text=None, footnote_end=None, footnote_start=None)[source]
Converter.inline_insert = '\n (?P<insert>\n \\<ins\\>\n |\n \\<\\/ins\\>\n )\n '
Converter.inline_insert_repl(stack, insert)[source]

Handle all kinds of links.

Converter.inline_nowiki = '\n (?P<nowiki>\n <nowiki>\n (?P<nowiki_text> .*? )\n </nowiki>\n |\n <pre>\n (?P<nowiki_text_pre> .*? )\n </pre>\n |\n <code>\n (?P<nowiki_text_code> .*? )\n </code>\n |\n <tt>\n (?P<nowiki_text_tt> .*? )\n </tt>\n )\n '
Converter.inline_nowiki_repl(stack, nowiki, nowiki_text=None, nowiki_text_pre=None, pre_args='', nowiki_text_code=None, nowiki_text_tt=None)[source]
Converter.inline_re = <_sre.SRE_Pattern object at 0x3652b30>
Converter.inline_strike = '\n (?P<strike>\n \\<s\\>\n |\n \\<\\/s\\>\n )\n '
Converter.inline_strike_repl(stack, strike)[source]
Converter.inline_subscript = '\n (?P<subscript>\n <sub>\n (?P<subscript_text> .*? )\n </sub>\n )\n '
Converter.inline_subscript_repl(stack, subscript, subscript_text)[source]
Converter.inline_superscript = '\n (?P<superscript>\n <sup>\n (?P<superscript_text> .*? )\n </sup>\n )\n '
Converter.inline_superscript_repl(stack, superscript, superscript_text)[source]
Converter.inline_underline = '\n (?P<underline>\n \\<u\\>\n |\n \\<\\/u\\>\n )\n '
Converter.inline_underline_repl(stack, underline)[source]
Converter.inlinedesc = ('\n (?P<breakline>\n \\<br\\ \\/\\>\n )\n ', '\n (?P<nowiki>\n <nowiki>\n (?P<nowiki_text> .*? )\n </nowiki>\n |\n <pre>\n (?P<nowiki_text_pre> .*? )\n </pre>\n |\n <code>\n (?P<nowiki_text_code> .*? )\n </code>\n |\n <tt>\n (?P<nowiki_text_tt> .*? )\n </tt>\n )\n ', "\n (?P<emphstrong>\n '{2,6}\n (?=\n [^']+\n (?P<emphstrong_follow>\n '{2,3}\n (?!')\n )\n )?\n )\n ")
Converter.inlinedesc_re = <_sre.SRE_Pattern object at 0x35e4d70>
Converter.parse_args(input)[source]

Parses media wiki arguments, this is taken from _args_wiki > parse function. The primary difference being that mediawiki breaks on pipes whereas the default parser breaks on spaces. Apart from that this parser also supports a few extra characters such as “<, >, ., /”, mostly for URL linking.

Parameters:input – can be like a|b|c=f|something else caption|g=’long caption’|link=http://google.com
Returns:Arguments instance
Converter.parse_block(iter_content, arguments)[source]
Converter.parse_inline(text, stack, inline_re)[source]

Recognize inline elements within the given text

Converter.table = '\n ^\n (?P<table>\n \\{\\|\n \\s*\n (?P<table_args> .*?)\n )\n $\n '
Converter.table_end = '\n ^\n (?P<table_end>\n \\|\\}\n \\s*\n )\n $\n '
Converter.table_end_re = <_sre.SRE_Pattern object>
Converter.table_re = <_sre.SRE_Pattern object>
Converter.tablerow = '\n ^\n [|!]\n (?P<tablerow>\n (?P<caption> \\+.* )\n |\n (?P<newrow> \\-\\s* )\n |\n (?P<cells> .* )\n )\n |\n (?P<text> .* )\n $\n '
Converter.tablerow_re = <_sre.SRE_Pattern object>

MoinMoin.converter.moinwiki19_in module

MoinMoin - Moin Wiki 1.9 input converter

class MoinMoin.converter.moinwiki19_in.ConverterFormat19[source]

Bases: MoinMoin.converter.moinwiki_in.Converter

classmethod factory(input, output, **kw)[source]
inline = ('\n (?P<link>\n \\[\\[\n \\s*\n (\n (?P<link_url>\n (http|https|ftp|file|mailto|nntp|news|ssh|telnet|irc|ircs|xmpp|mumble|webcal|ed2k|apt|rootz|gopher|notes|rtp|rtsp|rtcp):\n [^|]+?\n )\n |\n (\n (?P<link_interwiki_site>[A-Z][a-zA-Z]+)\n :\n (?P<link_interwiki_item>[^|]+) # accept any item name; will verify link_interwiki_site below\n )\n |\n (?P<link_item> [^|]+? )\n )\n \\s*\n (\n [|]\n \\s*\n (?P<link_text> [^|]*? )\n \\s*\n )?\n (\n [|]\n \\s*\n (?P<link_args> .*? )\n \\s*\n )?\n \\]\\]\n )\n ', '\n (?P<macro>\n <<\n (?P<macro_name> \\w+ )\n (\n \\(\n (?P<macro_args> .*? )\n \\)\n )?\n \\s*\n >>\n )\n ', '\n (?P<nowiki>\n {{{\n (?P<nowiki_text>.*?}*)\n }}}\n |\n `\n (?P<nowiki_text_backtick> .*? )\n `\n )\n ', '\n (?P<object>\n {{\n \\s*\n (\n (?P<object_url>\n [a-zA-Z0-9+.-]+\n ://\n [^|]+?\n )\n |\n (?P<object_item> [^|]+? )\n )\n \\s*\n (\n [|]\n \\s*\n (?P<object_text> [^|]*? )\n \\s*\n )?\n (\n [|]\n \\s*\n (?P<object_args> .*? )\n \\s*\n )?\n }}\n )\n ', "\n (?P<emphstrong>\n '{2,6}\n (?=\n [^']+\n (?P<emphstrong_follow>\n '{2,3}\n (?!')\n )\n )?\n )\n ", '\n (?P<comment>\n (?P<comment_begin>\n (^|(?<=\\s))\n /\\*\n \\s+\n )\n |\n (?P<comment_end>\n \\s+\n \\*/\n ((?=\\s)|$)\n )\n )\n ', '\n (?P<size>\n (?P<size_begin>\n ~[-+]\n )\n |\n (?P<size_end>\n [-+]~\n )\n )\n ', '\n (?P<strike>\n (?P<strike_begin>)\n --\\(\n |\n \\)--\n )\n ', '\n (?P<subscript>\n ,,\n (?P<subscript_text> .*? )\n ,,\n )\n ', '\n (?P<superscript>\n \\^\n (?P<superscript_text> .*? )\n \\^\n )\n ', '\n (?P<underline>\n __\n )\n ', '\n (?P<entity>\n &\n (?:\n # symbolic entity, like &uuml;\n [0-9a-zA-Z]{2,6}\n |\n # numeric decimal entities, like &#42;\n \\#\\d{1,5}\n |\n # numeric hexadecimal entities, like &#x42;\n \\#x[0-9a-fA-F]{1,6}\n )\n ;\n )\n ', u'\n (?:\n (?<![ABCDEFGHIJKLMNOPQRSTUVWXYZ\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189\u018a\u018b\u018e\u018f\u0190\u0191\u0193\u0194\u0196\u0197\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1\u01b2\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6\u01f7\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03d2\u03d3\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f8\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054a\u054b\u054c\u054d\u054e\u054f\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f28\u1f29\u1f2a\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68\u1f69\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1fb8\u1fb9\u1fba\u1fbb\u1fc8\u1fc9\u1fca\u1fcb\u1fd8\u1fd9\u1fda\u1fdb\u1fe8\u1fe9\u1fea\u1feb\u1fec\u1ff8\u1ff9\u1ffa\u1ffb\u2102\u2107\u210b\u210c\u210d\u2110\u2111\u2112\u2115\u2119\u211a\u211b\u211c\u211d\u2124\u2126\u2128\u212a\u212b\u212c\u212d\u2130\u2131\u2133\u213e\u213f\u2145\uff21\uff22\uff23\uff24\uff25\uff26\uff27\uff28\uff29\uff2a\uff2b\uff2c\uff2d\uff2e\uff2f\uff30\uff31\uff32\uff33\uff34\uff35\uff36\uff37\uff38\uff39\uff3aabcdefghijklmnopqrstuvwxyz\xaa\xb5\xba\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e\u017f\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199\u019a\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd\u01be\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029a\u029b\u029c\u029d\u029e\u029f\u02a0\u02a1\u02a2\u02a3\u02a4\u02a5\u02a6\u02a7\u02a8\u02a9\u02aa\u02ab\u02ac\u02ad\u0390\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\u03d0\u03d1\u03d5\u03d6\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef\u03f0\u03f1\u03f2\u03f3\u03f5\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f9\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95\u1e96\u1e97\u1e98\u1e99\u1e9a\u1e9b\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f10\u1f11\u1f12\u1f13\u1f14\u1f15\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u1f30\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f50\u1f51\u1f52\u1f53\u1f54\u1f55\u1f56\u1f57\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f90\u1f91\u1f92\u1f93\u1f94\u1f95\u1f96\u1f97\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2\u1fc3\u1fc4\u1fc6\u1fc7\u1fd0\u1fd1\u1fd2\u1fd3\u1fd6\u1fd7\u1fe0\u1fe1\u1fe2\u1fe3\u1fe4\u1fe5\u1fe6\u1fe7\u1ff2\u1ff3\u1ff4\u1ff6\u1ff7\u2071\u207f\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213d\u2146\u2147\u2148\u2149\ufb00\ufb01\ufb02\ufb03\ufb04\ufb05\ufb06\ufb13\ufb14\ufb15\ufb16\ufb17\uff41\uff42\uff43\uff44\uff45\uff46\uff47\uff48\uff49\uff4a\uff4b\uff4c\uff4d\uff4e\uff4f\uff50\uff51\uff52\uff53\uff54\uff55\uff56\uff57\uff58\uff59\uff5a0123456789\xb2\xb3\xb9\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1369\u136a\u136b\u136c\u136d\u136e\u136f\u1370\u1371\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u2070\u2074\u2075\u2076\u2077\u2078\u2079\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2474\u2475\u2476\u2477\u2478\u2479\u247a\u247b\u247c\u2488\u2489\u248a\u248b\u248c\u248d\u248e\u248f\u2490\u24ea\u24f5\u24f6\u24f7\u24f8\u24f9\u24fa\u24fb\u24fc\u24fd\u2776\u2777\u2778\u2779\u277a\u277b\u277c\u277d\u277e\u2780\u2781\u2782\u2783\u2784\u2785\u2786\u2787\u2788\u278a\u278b\u278c\u278d\u278e\u278f\u2790\u2791\u2792\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19/]) # require anything not upper/lower/slash before\n |\n ^ # ... or beginning of line\n )\n (?P<freelink_bang>\\!)? # configurable: avoid getting CamelCase rendered as link\n (?P<freelink>\n (?P<freelink_interwiki_ref>\n [A-Z][a-zA-Z]+\n )\n \\:\n (?P<freelink_interwiki_page>\n (?=\\S*[ABCDEFGHIJKLMNOPQRSTUVWXYZ\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189\u018a\u018b\u018e\u018f\u0190\u0191\u0193\u0194\u0196\u0197\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1\u01b2\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6\u01f7\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03d2\u03d3\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f8\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054a\u054b\u054c\u054d\u054e\u054f\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f28\u1f29\u1f2a\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68\u1f69\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1fb8\u1fb9\u1fba\u1fbb\u1fc8\u1fc9\u1fca\u1fcb\u1fd8\u1fd9\u1fda\u1fdb\u1fe8\u1fe9\u1fea\u1feb\u1fec\u1ff8\u1ff9\u1ffa\u1ffb\u2102\u2107\u210b\u210c\u210d\u2110\u2111\u2112\u2115\u2119\u211a\u211b\u211c\u211d\u2124\u2126\u2128\u212a\u212b\u212c\u212d\u2130\u2131\u2133\u213e\u213f\u2145\uff21\uff22\uff23\uff24\uff25\uff26\uff27\uff28\uff29\uff2a\uff2b\uff2c\uff2d\uff2e\uff2f\uff30\uff31\uff32\uff33\uff34\uff35\uff36\uff37\uff38\uff39\uff3aabcdefghijklmnopqrstuvwxyz\xaa\xb5\xba\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e\u017f\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199\u019a\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd\u01be\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029a\u029b\u029c\u029d\u029e\u029f\u02a0\u02a1\u02a2\u02a3\u02a4\u02a5\u02a6\u02a7\u02a8\u02a9\u02aa\u02ab\u02ac\u02ad\u0390\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\u03d0\u03d1\u03d5\u03d6\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef\u03f0\u03f1\u03f2\u03f3\u03f5\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f9\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95\u1e96\u1e97\u1e98\u1e99\u1e9a\u1e9b\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f10\u1f11\u1f12\u1f13\u1f14\u1f15\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u1f30\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f50\u1f51\u1f52\u1f53\u1f54\u1f55\u1f56\u1f57\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f90\u1f91\u1f92\u1f93\u1f94\u1f95\u1f96\u1f97\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2\u1fc3\u1fc4\u1fc6\u1fc7\u1fd0\u1fd1\u1fd2\u1fd3\u1fd6\u1fd7\u1fe0\u1fe1\u1fe2\u1fe3\u1fe4\u1fe5\u1fe6\u1fe7\u1ff2\u1ff3\u1ff4\u1ff6\u1ff7\u2071\u207f\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213d\u2146\u2147\u2148\u2149\ufb00\ufb01\ufb02\ufb03\ufb04\ufb05\ufb06\ufb13\ufb14\ufb15\ufb16\ufb17\uff41\uff42\uff43\uff44\uff45\uff46\uff47\uff48\uff49\uff4a\uff4b\uff4c\uff4d\uff4e\uff4f\uff50\uff51\uff52\uff53\uff54\uff55\uff56\uff57\uff58\uff59\uff5a0123456789\xb2\xb3\xb9\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1369\u136a\u136b\u136c\u136d\u136e\u136f\u1370\u1371\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u2070\u2074\u2075\u2076\u2077\u2078\u2079\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2474\u2475\u2476\u2477\u2478\u2479\u247a\u247b\u247c\u2488\u2489\u248a\u248b\u248c\u248d\u248e\u248f\u2490\u24ea\u24f5\u24f6\u24f7\u24f8\u24f9\u24fa\u24fb\u24fc\u24fd\u2776\u2777\u2778\u2779\u277a\u277b\u277c\u277d\u277e\u2780\u2781\u2782\u2783\u2784\u2785\u2786\u2787\u2788\u278a\u278b\u278c\u278d\u278e\u278f\u2790\u2791\u2792\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff190..9]\\S* ) # make sure there is something non-blank with at >= 1 alphanum letter following\n [^\\s"\\\'}\\]|:,.\\)?!]+ # we take all until we hit some blank or punctuation char ...\n )\n |\n (?P<freelink_page>\n (?:\n (\\.\\.\\/)* # there might be either ../ parent prefix(es)\n |\n ((?<!\\/)\\/)? # or maybe a single / child prefix (but not if we already had it before)\n )\n (\n ((?<!\\/)\\/)? # there might be / child prefix (but not if we already had it before)\n (?:[ABCDEFGHIJKLMNOPQRSTUVWXYZ\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189\u018a\u018b\u018e\u018f\u0190\u0191\u0193\u0194\u0196\u0197\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1\u01b2\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6\u01f7\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03d2\u03d3\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f8\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054a\u054b\u054c\u054d\u054e\u054f\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f28\u1f29\u1f2a\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68\u1f69\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1fb8\u1fb9\u1fba\u1fbb\u1fc8\u1fc9\u1fca\u1fcb\u1fd8\u1fd9\u1fda\u1fdb\u1fe8\u1fe9\u1fea\u1feb\u1fec\u1ff8\u1ff9\u1ffa\u1ffb\u2102\u2107\u210b\u210c\u210d\u2110\u2111\u2112\u2115\u2119\u211a\u211b\u211c\u211d\u2124\u2126\u2128\u212a\u212b\u212c\u212d\u2130\u2131\u2133\u213e\u213f\u2145\uff21\uff22\uff23\uff24\uff25\uff26\uff27\uff28\uff29\uff2a\uff2b\uff2c\uff2d\uff2e\uff2f\uff30\uff31\uff32\uff33\uff34\uff35\uff36\uff37\uff38\uff39\uff3a][abcdefghijklmnopqrstuvwxyz\xaa\xb5\xba\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e\u017f\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199\u019a\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd\u01be\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029a\u029b\u029c\u029d\u029e\u029f\u02a0\u02a1\u02a2\u02a3\u02a4\u02a5\u02a6\u02a7\u02a8\u02a9\u02aa\u02ab\u02ac\u02ad\u0390\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\u03d0\u03d1\u03d5\u03d6\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef\u03f0\u03f1\u03f2\u03f3\u03f5\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f9\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95\u1e96\u1e97\u1e98\u1e99\u1e9a\u1e9b\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f10\u1f11\u1f12\u1f13\u1f14\u1f15\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u1f30\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f50\u1f51\u1f52\u1f53\u1f54\u1f55\u1f56\u1f57\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f90\u1f91\u1f92\u1f93\u1f94\u1f95\u1f96\u1f97\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2\u1fc3\u1fc4\u1fc6\u1fc7\u1fd0\u1fd1\u1fd2\u1fd3\u1fd6\u1fd7\u1fe0\u1fe1\u1fe2\u1fe3\u1fe4\u1fe5\u1fe6\u1fe7\u1ff2\u1ff3\u1ff4\u1ff6\u1ff7\u2071\u207f\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213d\u2146\u2147\u2148\u2149\ufb00\ufb01\ufb02\ufb03\ufb04\ufb05\ufb06\ufb13\ufb14\ufb15\ufb16\ufb17\uff41\uff42\uff43\uff44\uff45\uff46\uff47\uff48\uff49\uff4a\uff4b\uff4c\uff4d\uff4e\uff4f\uff50\uff51\uff52\uff53\uff54\uff55\uff56\uff57\uff58\uff59\uff5a0123456789\xb2\xb3\xb9\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1369\u136a\u136b\u136c\u136d\u136e\u136f\u1370\u1371\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u2070\u2074\u2075\u2076\u2077\u2078\u2079\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2474\u2475\u2476\u2477\u2478\u2479\u247a\u247b\u247c\u2488\u2489\u248a\u248b\u248c\u248d\u248e\u248f\u2490\u24ea\u24f5\u24f6\u24f7\u24f8\u24f9\u24fa\u24fb\u24fc\u24fd\u2776\u2777\u2778\u2779\u277a\u277b\u277c\u277d\u277e\u2780\u2781\u2782\u2783\u2784\u2785\u2786\u2787\u2788\u278a\u278b\u278c\u278d\u278e\u278f\u2790\u2791\u2792\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19]+){2,} # at least 2 upper>lower transitions make CamelCase\n )+ # we can have MainPage/SubPage/SubSubPage ...\n (?:\n \\# # anchor separator TODO check if this does not make trouble at places where word_rule is used\n \\S+ # some anchor name\n )?\n )\n |\n (?P<freelink_email>\n [-\\w._+]+ # name\n \\@ # at\n [\\w-]+(\\.[\\w-]+)+ # server/domain\n )\n )\n (?:\n (?![ABCDEFGHIJKLMNOPQRSTUVWXYZ\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189\u018a\u018b\u018e\u018f\u0190\u0191\u0193\u0194\u0196\u0197\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1\u01b2\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6\u01f7\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03d2\u03d3\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f8\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054a\u054b\u054c\u054d\u054e\u054f\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f28\u1f29\u1f2a\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68\u1f69\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1fb8\u1fb9\u1fba\u1fbb\u1fc8\u1fc9\u1fca\u1fcb\u1fd8\u1fd9\u1fda\u1fdb\u1fe8\u1fe9\u1fea\u1feb\u1fec\u1ff8\u1ff9\u1ffa\u1ffb\u2102\u2107\u210b\u210c\u210d\u2110\u2111\u2112\u2115\u2119\u211a\u211b\u211c\u211d\u2124\u2126\u2128\u212a\u212b\u212c\u212d\u2130\u2131\u2133\u213e\u213f\u2145\uff21\uff22\uff23\uff24\uff25\uff26\uff27\uff28\uff29\uff2a\uff2b\uff2c\uff2d\uff2e\uff2f\uff30\uff31\uff32\uff33\uff34\uff35\uff36\uff37\uff38\uff39\uff3aabcdefghijklmnopqrstuvwxyz\xaa\xb5\xba\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e\u017f\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199\u019a\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd\u01be\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029a\u029b\u029c\u029d\u029e\u029f\u02a0\u02a1\u02a2\u02a3\u02a4\u02a5\u02a6\u02a7\u02a8\u02a9\u02aa\u02ab\u02ac\u02ad\u0390\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\u03d0\u03d1\u03d5\u03d6\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef\u03f0\u03f1\u03f2\u03f3\u03f5\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f9\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95\u1e96\u1e97\u1e98\u1e99\u1e9a\u1e9b\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f10\u1f11\u1f12\u1f13\u1f14\u1f15\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u1f30\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f50\u1f51\u1f52\u1f53\u1f54\u1f55\u1f56\u1f57\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f90\u1f91\u1f92\u1f93\u1f94\u1f95\u1f96\u1f97\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2\u1fc3\u1fc4\u1fc6\u1fc7\u1fd0\u1fd1\u1fd2\u1fd3\u1fd6\u1fd7\u1fe0\u1fe1\u1fe2\u1fe3\u1fe4\u1fe5\u1fe6\u1fe7\u1ff2\u1ff3\u1ff4\u1ff6\u1ff7\u2071\u207f\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213d\u2146\u2147\u2148\u2149\ufb00\ufb01\ufb02\ufb03\ufb04\ufb05\ufb06\ufb13\ufb14\ufb15\ufb16\ufb17\uff41\uff42\uff43\uff44\uff45\uff46\uff47\uff48\uff49\uff4a\uff4b\uff4c\uff4d\uff4e\uff4f\uff50\uff51\uff52\uff53\uff54\uff55\uff56\uff57\uff58\uff59\uff5a0123456789\xb2\xb3\xb9\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1369\u136a\u136b\u136c\u136d\u136e\u136f\u1370\u1371\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u2070\u2074\u2075\u2076\u2077\u2078\u2079\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2474\u2475\u2476\u2477\u2478\u2479\u247a\u247b\u247c\u2488\u2489\u248a\u248b\u248c\u248d\u248e\u248f\u2490\u24ea\u24f5\u24f6\u24f7\u24f8\u24f9\u24fa\u24fb\u24fc\u24fd\u2776\u2777\u2778\u2779\u277a\u277b\u277c\u277d\u277e\u2780\u2781\u2782\u2783\u2784\u2785\u2786\u2787\u2788\u278a\u278b\u278c\u278d\u278e\u278f\u2790\u2791\u2792\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19/]) # require anything not upper/lower/slash following\n |\n $ # ... or end of line\n )\n ', '\n (?P<url>\n (\n ^\n |\n (?<=\n \\s\n |\n [.,:;!?()/=]\n )\n )\n (?P<url_target>\n (http|https|ftp|file|mailto|nntp|news|ssh|telnet|irc|ircs|xmpp|mumble|webcal|ed2k|apt|rootz|gopher|notes|rtp|rtsp|rtcp):\n \\S+?\n )\n (\n $\n |\n (?=\n \\s\n |\n [,.:;!?()]\n (\\s | $)\n )\n )\n )\n ')
inline_re = <_sre.SRE_Pattern object at 0x4c95300>
inline_url = '\n (?P<url>\n (\n ^\n |\n (?<=\n \\s\n |\n [.,:;!?()/=]\n )\n )\n (?P<url_target>\n (http|https|ftp|file|mailto|nntp|news|ssh|telnet|irc|ircs|xmpp|mumble|webcal|ed2k|apt|rootz|gopher|notes|rtp|rtsp|rtcp):\n \\S+?\n )\n (\n $\n |\n (?=\n \\s\n |\n [,.:;!?()]\n (\\s | $)\n )\n )\n )\n '
inline_url_repl(stack, url, url_target)[source]

MoinMoin.converter.moinwiki_in module

MoinMoin - Moin Wiki input converter

class MoinMoin.converter.moinwiki_in.Converter[source]

Bases: MoinMoin.converter._wiki_macro.ConverterMacro

block = ('(?P<line> ^ \\s* $ )', '\n (?P<comment>\n ^ \\#\\#.*$\n )\n ', '\n (?P<head>\n ^\n \\s*\n (?P<head_head> =+ )\n \\s+ # for better moin 1.x compatibility, we require 1+ blank(s)\n (?P<head_text> .*? )\n \\s+ # for better moin 1.x compatibility, ...\n (?P=head_head)\n \\s*\n $\n )\n ', '(?P<separator> ^ \\s* -{4,} \\s* $ )', '\n ^\n \\s*\n (?P<macro>\n <<\n (?P<macro_name> \\w+ )\n (\n \\(\n (?!.*>>.*>>)\n (?P<macro_args> .*? )\n \\)\n )?\n \\s*\n >>\n )\n \\s*\n $\n ', '\n (?P<nowiki>\n ^\n \\s*\n (?P<nowiki_marker> \\{{3,} )\n \\s* # spaces not defined here, but accepted with no error messages\n (?P<nowiki_interpret>\n \\#!\n \\s* # spaces not allowed here, error message generated\n (?P<nowiki_name> [\\w/.-]+ )? # wiki | csv | highlight | creole (same result as highlight creole)\n \\s*\n (:?\n \\(\n (?P<nowiki_args> .*? ) # (style="color: red;")\n \\)\n |\n (?P<optional_args> .+ ) # csv , -2 -3 | highlight python numbers=on start=222\n )?\n )?\n \\s*\n $\n )\n ', '\n ^\n \\s*\n (?P<table>\n \\|\\|\n .*\n )\n \\|\\|\n \\s*\n $\n ', '(?P<text> .+ )')
block_comment = '\n (?P<comment>\n ^ \\#\\#.*$\n )\n '
block_comment_repl(_iter_content, stack, comment)[source]
block_head = '\n (?P<head>\n ^\n \\s*\n (?P<head_head> =+ )\n \\s+ # for better moin 1.x compatibility, we require 1+ blank(s)\n (?P<head_text> .*? )\n \\s+ # for better moin 1.x compatibility, ...\n (?P=head_head)\n \\s*\n $\n )\n '
block_head_repl(_iter_content, stack, head, head_head, head_text)[source]
block_line = '(?P<line> ^ \\s* $ )'
block_line_repl(_iter_content, stack, line)[source]
block_macro = '\n ^\n \\s*\n (?P<macro>\n <<\n (?P<macro_name> \\w+ )\n (\n \\(\n (?!.*>>.*>>)\n (?P<macro_args> .*? )\n \\)\n )?\n \\s*\n >>\n )\n \\s*\n $\n '
block_macro_repl(_iter_content, stack, macro, macro_name, macro_args=u'')[source]

Handles macros using the placeholder syntax.

Arguments are passed as a single positional parameter, each macro must parse as required.

block_nowiki = '\n (?P<nowiki>\n ^\n \\s*\n (?P<nowiki_marker> \\{{3,} )\n \\s* # spaces not defined here, but accepted with no error messages\n (?P<nowiki_interpret>\n \\#!\n \\s* # spaces not allowed here, error message generated\n (?P<nowiki_name> [\\w/.-]+ )? # wiki | csv | highlight | creole (same result as highlight creole)\n \\s*\n (:?\n \\(\n (?P<nowiki_args> .*? ) # (style="color: red;")\n \\)\n |\n (?P<optional_args> .+ ) # csv , -2 -3 | highlight python numbers=on start=222\n )?\n )?\n \\s*\n $\n )\n '
block_nowiki_lines(iter_content, marker_len)[source]

Unescaping generator for the lines in a nowiki block

block_nowiki_repl(iter_content, stack, nowiki, nowiki_marker, nowiki_interpret='', nowiki_name=None, nowiki_args=None, optional_args=None)[source]
block_re = <_sre.SRE_Pattern object at 0x4c5fcd0>
block_separator = '(?P<separator> ^ \\s* -{4,} \\s* $ )'
block_separator_repl(_iter_content, stack, separator, hr_class=u'moin-hr{0}')[source]
block_table = '\n ^\n \\s*\n (?P<table>\n \\|\\|\n .*\n )\n \\|\\|\n \\s*\n $\n '
block_table_repl(iter_content, stack, table)[source]
block_table_row(content, stack, table)[source]
block_text = '(?P<text> .+ )'
block_text_repl(_iter_content, stack, text)[source]
classmethod factory(input, output, **kw)[source]
indent = '\n ^\n (?P<indent> \\s* )\n (?P<list_begin>\n (?P<list_definition>\n (?P<list_definition_text> .*? )\n ::\n )\n \\s*\n |\n (?P<list_numbers> [0-9]+\\. (\\#(?P<list_start_number>[0-9]+))?)\n \\s+\n |\n (?P<list_alpha> [aA]\\. (\\#(?P<list_start_alpha>[0-9]+))?)\n \\s+\n |\n (?P<list_roman> [iI]\\. (\\#(?P<list_start_roman>[0-9]+))?)\n \\s+\n |\n (?P<list_bullet> \\* )\n \\s*\n |\n (?P<list_none> \\. )\n \\s*\n )?\n (?P<text> .*? )\n $\n '
indent_iter(iter_content, line, level)[source]
indent_re = <_sre.SRE_Pattern object at 0x4c604b0>
indent_repl(iter_content, stack, line, indent, text, list_begin=None, list_definition=None, list_definition_text=None, list_numbers=None, list_alpha=None, list_roman=None, list_bullet=None, list_start_number=None, list_start_roman=None, list_start_alpha=None, list_none=None)[source]
inline = ('\n (?P<link>\n \\[\\[\n \\s*\n (\n (?P<link_url>\n (http|https|ftp|file|mailto|nntp|news|ssh|telnet|irc|ircs|xmpp|mumble|webcal|ed2k|apt|rootz|gopher|notes|rtp|rtsp|rtcp):\n [^|]+?\n )\n |\n (\n (?P<link_interwiki_site>[A-Z][a-zA-Z]+)\n :\n (?P<link_interwiki_item>[^|]+) # accept any item name; will verify link_interwiki_site below\n )\n |\n (?P<link_item> [^|]+? )\n )\n \\s*\n (\n [|]\n \\s*\n (?P<link_text> [^|]*? )\n \\s*\n )?\n (\n [|]\n \\s*\n (?P<link_args> .*? )\n \\s*\n )?\n \\]\\]\n )\n ', '\n (?P<macro>\n <<\n (?P<macro_name> \\w+ )\n (\n \\(\n (?P<macro_args> .*? )\n \\)\n )?\n \\s*\n >>\n )\n ', '\n (?P<nowiki>\n {{{\n (?P<nowiki_text>.*?}*)\n }}}\n |\n `\n (?P<nowiki_text_backtick> .*? )\n `\n )\n ', '\n (?P<object>\n {{\n \\s*\n (\n (?P<object_url>\n [a-zA-Z0-9+.-]+\n ://\n [^|]+?\n )\n |\n (?P<object_item> [^|]+? )\n )\n \\s*\n (\n [|]\n \\s*\n (?P<object_text> [^|]*? )\n \\s*\n )?\n (\n [|]\n \\s*\n (?P<object_args> .*? )\n \\s*\n )?\n }}\n )\n ', "\n (?P<emphstrong>\n '{2,6}\n (?=\n [^']+\n (?P<emphstrong_follow>\n '{2,3}\n (?!')\n )\n )?\n )\n ", '\n (?P<comment>\n (?P<comment_begin>\n (^|(?<=\\s))\n /\\*\n \\s+\n )\n |\n (?P<comment_end>\n \\s+\n \\*/\n ((?=\\s)|$)\n )\n )\n ', '\n (?P<size>\n (?P<size_begin>\n ~[-+]\n )\n |\n (?P<size_end>\n [-+]~\n )\n )\n ', '\n (?P<strike>\n (?P<strike_begin>)\n --\\(\n |\n \\)--\n )\n ', '\n (?P<subscript>\n ,,\n (?P<subscript_text> .*? )\n ,,\n )\n ', '\n (?P<superscript>\n \\^\n (?P<superscript_text> .*? )\n \\^\n )\n ', '\n (?P<underline>\n __\n )\n ', '\n (?P<entity>\n &\n (?:\n # symbolic entity, like &uuml;\n [0-9a-zA-Z]{2,6}\n |\n # numeric decimal entities, like &#42;\n \\#\\d{1,5}\n |\n # numeric hexadecimal entities, like &#x42;\n \\#x[0-9a-fA-F]{1,6}\n )\n ;\n )\n ')
inline_comment = '\n (?P<comment>\n (?P<comment_begin>\n (^|(?<=\\s))\n /\\*\n \\s+\n )\n |\n (?P<comment_end>\n \\s+\n \\*/\n ((?=\\s)|$)\n )\n )\n '
inline_comment_repl(stack, comment, comment_begin=None, comment_end=None)[source]
inline_emphstrong = "\n (?P<emphstrong>\n '{2,6}\n (?=\n [^']+\n (?P<emphstrong_follow>\n '{2,3}\n (?!')\n )\n )?\n )\n "
inline_emphstrong_repl(stack, emphstrong, emphstrong_follow='')[source]
inline_entity = '\n (?P<entity>\n &\n (?:\n # symbolic entity, like &uuml;\n [0-9a-zA-Z]{2,6}\n |\n # numeric decimal entities, like &#42;\n \\#\\d{1,5}\n |\n # numeric hexadecimal entities, like &#x42;\n \\#x[0-9a-fA-F]{1,6}\n )\n ;\n )\n '
inline_entity_repl(stack, entity)[source]

Handle all kinds of links.

inline_macro = '\n (?P<macro>\n <<\n (?P<macro_name> \\w+ )\n (\n \\(\n (?P<macro_args> .*? )\n \\)\n )?\n \\s*\n >>\n )\n '
inline_macro_repl(stack, macro, macro_name, macro_args=u'')[source]

Handles macros using the placeholder syntax.

inline_nowiki = '\n (?P<nowiki>\n {{{\n (?P<nowiki_text>.*?}*)\n }}}\n |\n `\n (?P<nowiki_text_backtick> .*? )\n `\n )\n '
inline_nowiki_repl(stack, nowiki, nowiki_text=None, nowiki_text_backtick=None)[source]
inline_object = '\n (?P<object>\n {{\n \\s*\n (\n (?P<object_url>\n [a-zA-Z0-9+.-]+\n ://\n [^|]+?\n )\n |\n (?P<object_item> [^|]+? )\n )\n \\s*\n (\n [|]\n \\s*\n (?P<object_text> [^|]*? )\n \\s*\n )?\n (\n [|]\n \\s*\n (?P<object_args> .*? )\n \\s*\n )?\n }}\n )\n '
inline_object_repl(stack, object, object_url=None, object_item=None, object_text=None, object_args=None)[source]

Handles objects included in the page.

inline_re = <_sre.SRE_Pattern object at 0x4c63e60>
inline_size = '\n (?P<size>\n (?P<size_begin>\n ~[-+]\n )\n |\n (?P<size_end>\n [-+]~\n )\n )\n '
inline_size_repl(stack, size, size_begin=None, size_end=None)[source]
inline_strike = '\n (?P<strike>\n (?P<strike_begin>)\n --\\(\n |\n \\)--\n )\n '
inline_strike_repl(stack, strike, strike_begin=None)[source]
inline_subscript = '\n (?P<subscript>\n ,,\n (?P<subscript_text> .*? )\n ,,\n )\n '
inline_subscript_repl(stack, subscript, subscript_text)[source]
inline_superscript = '\n (?P<superscript>\n \\^\n (?P<superscript_text> .*? )\n \\^\n )\n '
inline_superscript_repl(stack, superscript, superscript_text)[source]
inline_underline = '\n (?P<underline>\n __\n )\n '
inline_underline_repl(stack, underline)[source]
inlinedesc = ('\n (?P<macro>\n <<\n (?P<macro_name> \\w+ )\n (\n \\(\n (?P<macro_args> .*? )\n \\)\n )?\n \\s*\n >>\n )\n ', '\n (?P<nowiki>\n {{{\n (?P<nowiki_text>.*?}*)\n }}}\n |\n `\n (?P<nowiki_text_backtick> .*? )\n `\n )\n ', '\n (?P<object>\n {{\n \\s*\n (\n (?P<object_url>\n [a-zA-Z0-9+.-]+\n ://\n [^|]+?\n )\n |\n (?P<object_item> [^|]+? )\n )\n \\s*\n (\n [|]\n \\s*\n (?P<object_text> [^|]*? )\n \\s*\n )?\n (\n [|]\n \\s*\n (?P<object_args> .*? )\n \\s*\n )?\n }}\n )\n ', "\n (?P<emphstrong>\n '{2,6}\n (?=\n [^']+\n (?P<emphstrong_follow>\n '{2,3}\n (?!')\n )\n )?\n )\n ", '\n (?P<comment>\n (?P<comment_begin>\n (^|(?<=\\s))\n /\\*\n \\s+\n )\n |\n (?P<comment_end>\n \\s+\n \\*/\n ((?=\\s)|$)\n )\n )\n ', '\n (?P<size>\n (?P<size_begin>\n ~[-+]\n )\n |\n (?P<size_end>\n [-+]~\n )\n )\n ', '\n (?P<strike>\n (?P<strike_begin>)\n --\\(\n |\n \\)--\n )\n ', '\n (?P<subscript>\n ,,\n (?P<subscript_text> .*? )\n ,,\n )\n ', '\n (?P<superscript>\n \\^\n (?P<superscript_text> .*? )\n \\^\n )\n ', '\n (?P<underline>\n __\n )\n ', '\n (?P<entity>\n &\n (?:\n # symbolic entity, like &uuml;\n [0-9a-zA-Z]{2,6}\n |\n # numeric decimal entities, like &#42;\n \\#\\d{1,5}\n |\n # numeric hexadecimal entities, like &#x42;\n \\#x[0-9a-fA-F]{1,6}\n )\n ;\n )\n ')
inlinedesc_re = <_sre.SRE_Pattern object at 0x4c63100>
macro_text(text)[source]

Return an ET tree branch representing the markup present in the input text. Used for FootNotes, etc.

nowiki_end = '\n ^\n \\s*\n (?P<marker> }{3,} )\n \\s*\n $\n '
nowiki_end_re = <_sre.SRE_Pattern object>
parse_block(iter_content, arguments)[source]
parse_inline(text, stack, inline_re)[source]

Recognize inline elements within the given text

table = '\n ^\n \\s*\n (?P<table>\n \\|\\|\n .*\n )\n \\|\\|\n \\s*\n $\n '
table_re = <_sre.SRE_Pattern object>
tablerow = '\n (?P<cell>\n (?P<cell_marker>\n (\\|\\|)+\n )\n (\n <\n (?P<cell_args> ([^<])*? )\n >\n )?\n (?P<cell_text> .*? )\n (?=\n \\|\\|\n |\n $\n )\n )\n '
tablerow_cell_repl(stack, table, row, cell, cell_marker, cell_text, cell_args=None)[source]
tablerow_re = <_sre.SRE_Pattern object>

MoinMoin.converter.moinwiki_out module

MoinMoin - Moinwiki markup output converter

Converts an internal document tree into moinwiki markup.

class MoinMoin.converter.moinwiki_out.Converter[source]

Bases: object

Converter application/x.moin.document -> text/x.moin.wiki

classmethod factory(input, output, **kw)[source]
namespaces = {<Namespace('http://www.w3.org/2001/XInclude')>: 'xinclude', <Namespace('http://moinmo.in/namespaces/page')>: 'moinpage'}
open(elem)[source]
open_children(elem)[source]
open_moinpage(elem)[source]
open_moinpage_a(elem)[source]
open_moinpage_block_comment(elem)[source]
open_moinpage_blockcode(elem)[source]
open_moinpage_body(elem)[source]
open_moinpage_code(elem)[source]
open_moinpage_del(elem)[source]
open_moinpage_div(elem)[source]
open_moinpage_emphasis(elem)[source]
open_moinpage_h(elem)[source]
open_moinpage_inline_part(elem)[source]
open_moinpage_ins(elem)[source]
open_moinpage_line_break(elem)[source]
open_moinpage_list(elem)[source]
open_moinpage_list_item(elem)[source]
open_moinpage_list_item_body(elem)[source]
open_moinpage_list_item_label(elem)[source]
open_moinpage_note(elem)[source]
open_moinpage_nowiki(elem)[source]

{{{#!wiki ... or {{{#!highlight ... etc.

open_moinpage_object(elem)[source]

Process objects and xincludes.

open_moinpage_p(elem)[source]
open_moinpage_page(elem)[source]
open_moinpage_part(elem)[source]
open_moinpage_samp(elem)[source]
open_moinpage_separator(elem, hr_class_prefix=u'moin-hr')[source]
open_moinpage_span(elem)[source]
open_moinpage_strong(elem)[source]
open_moinpage_table(elem)[source]
open_moinpage_table_body(elem)[source]
open_moinpage_table_cell(elem)[source]
open_moinpage_table_header(elem)[source]
open_moinpage_table_of_content(elem)[source]
open_moinpage_table_row(elem)[source]
open_xinclude(elem)[source]

Processing of transclusions is similar to objects.

supported_tag = {'xinclude': ('include',), 'moinpage': ('a', 'blockcode', 'break_line', 'code', 'div', 'emphasis', 'h', 'list', 'list_item', 'list_item_label', 'list_item_body', 'nowiki', 'p', 'page', 'separator', 'span', 'strong', 'object', 'table', 'table_header', 'table_footer', 'table_body', 'table_row', 'table_cell')}
class MoinMoin.converter.moinwiki_out.Moinwiki[source]

Bases: object

Moinwiki syntax elements It’s dummy

a_close = u']]'
a_open = u'[['
a_separator = u'|'
definition_list_marker = u'::'
emphasis = u"''"
h = u'='
larger_close = u'+~'
larger_open = u'~+'
linebreak = u'<<BR>>'
list_type = {(u'ordered', None): u'1.', (u'unordered', u'no-bullet'): u'.', (u'ordered', u'upper-alpha'): u'A.', (u'unordered', None): u'*', (u'definition', None): u'', (u'ordered', u'lower-alpha'): u'a.', (u'ordered', u'lower-roman'): u'i.', (u'ordered', u'upper-roman'): u'I.', (None, None): u'::'}
monospace = u'`'
object_close = u'}}'
object_open = u'{{'
p = u'\n'
samp_close = u'}}}'
samp_open = u'{{{'
separator = u'----'
smaller_close = u'-~'
smaller_open = u'~-'
stroke_close = u')--'
stroke_open = u'--('
strong = u"'''"
table_marker = u'||'
underline = u'__'
verbatim_close = u'}'
verbatim_open = u'{'

MoinMoin.converter.nonexistent_in module

MoinMoin - converter for non-existing items

Convert a non-existent item to the DOM Tree.

class MoinMoin.converter.nonexistent_in.Converter[source]

Bases: object

Convert a non-existing item to DOM Tree.

MoinMoin.converter.opendocument_in module

MoinMoin - OpenDocument Format (ODF) input converter

ODF documents can be created with OpenOffice.org, Libre Office and other software.

class MoinMoin.converter.opendocument_in.OpenDocumentIndexingConverter[source]

Bases: object

MoinMoin.converter.opendocument_in.OpenOfficeIndexingConverter

alias of OpenDocumentIndexingConverter

MoinMoin.converter.pdf_in module

MoinMoin - PDF input converter

class MoinMoin.converter.pdf_in.PDFIndexingConverter[source]

Bases: object

class MoinMoin.converter.pdf_in.UnicodeConverter(rsrcmgr, pageno=1, laparams=None, showpageno=False)[source]

Bases: pdfminer.converter.TextConverter

read_result()[source]
write_text(text)[source]

MoinMoin.converter.pygments_in module

MoinMoin - Pygments driven syntax highlighting input converter

class MoinMoin.converter.pygments_in.Converter(lexer=None, contenttype=None)[source]

Bases: object

class MoinMoin.converter.pygments_in.TreeFormatter(**options)[source]

Bases: pygments.formatter.Formatter

format(tokensource, element)[source]

MoinMoin.converter.rst_in module

MoinMoin - ReStructured Text input converter

It’s based on docutils rst parser. Conversion of docutils document tree to moinmoin document tree.

This converter based on ReStructuredText 2006-09-22. Works with docutils version 0.5 (2008-06-25) or higher.

class MoinMoin.converter.rst_in.Converter[source]

Bases: object

classmethod factory(input, output, **kw)[source]
class MoinMoin.converter.rst_in.MoinDirectives[source]

Bases: object

Class to handle all custom directive handling. This code is called as part of the parsing stage.

include(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine)[source]
macro(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine)[source]
parser(name, arguments, options, content, lineo, content_offset, block_text, state, state_machine)[source]
table_of_content(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine)[source]
class MoinMoin.converter.rst_in.NodeVisitor[source]

Bases: object

Part of docutils which converts docutils DOM tree to Moin DOM tree

close_moin_page_node()[source]
depart_Text(node)[source]
depart_admonition(node=None)[source]
depart_attention(node=None)
depart_attribution(node)[source]
depart_author(node)[source]
depart_block_quote(node)[source]
depart_bullet_list(node)[source]
depart_caution(node=None)
depart_comment(node)[source]
depart_danger(node=None)
depart_definition(node)[source]
depart_definition_list(node)[source]
depart_definition_list_item(node)[source]
depart_description(node)
depart_docinfo(node)[source]
depart_emphasis(node)[source]
depart_entry(node)[source]
depart_enumerated_list(node)[source]
depart_error(node=None)
depart_field(node)[source]
depart_field_body(node)[source]
depart_field_list(node)[source]
depart_field_name(node)[source]
depart_figure(node)[source]
depart_footnote(node)[source]
depart_footnote_reference(node)[source]
depart_header(node)[source]
depart_hint(node=None)
depart_image(node)[source]
depart_important(node=None)
depart_inline(node)[source]
depart_label(node)[source]
depart_line(node)[source]
depart_line_block(node)[source]
depart_list_item(node)[source]
depart_literal_block(node)[source]
depart_note(node=None)
depart_option(node)[source]
depart_option_list(node)[source]
depart_option_list_item(node)[source]
depart_paragraph(node)[source]
depart_problematic(node)[source]
depart_reference(node)[source]
depart_row(node)[source]
depart_rubric(node)[source]
depart_section(node)[source]
depart_sidebar(node)[source]
depart_strong(node)[source]
depart_subscript(node)[source]
depart_substitution_definition(node)[source]
depart_subtitle(node)[source]
depart_superscript(node)[source]
depart_system_message(node)[source]
depart_table(node)[source]
depart_target(node)[source]
depart_tbody(node)[source]
depart_term(node)[source]
depart_tgroup(node)[source]
depart_thead(node)[source]
depart_tip(node=None)
depart_title(node)[source]
depart_title_reference(node)[source]
depart_topic(node)[source]
depart_transition(node)[source]
depart_version(node)[source]
depart_warning(node=None)
dispatch_departure(node)[source]

Call self.”depart_ + node class name” with node as parameter. If the depart_... method does not exist, call self.unknown_departure.

dispatch_visit(node)[source]

Call self.”visit_ + node class name” with node as parameter. If the visit_... method does not exist, call self.unknown_visit.

open_moin_page_node(mointree_element)[source]
tree()[source]
unimplemented_visit(node)[source]
unknown_departure(node)[source]

Called before exiting unknown Node types.

Raise exception unless overridden.

unknown_visit(node)[source]

Called when entering unknown Node types.

Raise an exception unless overridden.

visit_Text(node)[source]
visit_admonition(node)[source]
visit_attention(node)[source]
visit_attribution(node)[source]
visit_author(node)[source]
visit_block_quote(node)[source]
visit_bullet_list(node)[source]
visit_caution(node)[source]
visit_comment(node)[source]

Create moinwiki style hidden comment rather than html style: <!– a comment –>

visit_danger(node)[source]
visit_definition(node)[source]
visit_definition_list(node)[source]
visit_definition_list_item(node)[source]
visit_description(node)
visit_docinfo(node)[source]
visit_emphasis(node)[source]
visit_entry(node)[source]
visit_enumerated_list(node)[source]
visit_error(node)[source]
visit_field(node)[source]
visit_field_body(node)[source]
visit_field_list(node)[source]
visit_field_name(node)[source]
visit_figure(node)[source]
visit_footnote(node)[source]
visit_footnote_reference(node)[source]
visit_header(node)[source]
visit_hint(node)[source]
visit_image(node)[source]

Processes images and other transcluded objects.

visit_important(node)[source]
visit_inline(node)[source]
visit_label(node)[source]
visit_line(node)[source]
visit_line_block(node)[source]
visit_list_item(node)[source]
visit_literal(node)[source]
visit_literal_block(node)[source]
visit_note(node)[source]
visit_option(node)[source]
visit_option_list(node)[source]
visit_option_list_item(node)[source]
visit_paragraph(node)[source]
visit_problematic(node)[source]
visit_reference(node)[source]
visit_row(node)[source]
visit_rubric(node)[source]
visit_section(node)[source]
visit_sidebar(node)[source]
visit_strong(node)[source]
visit_subscript(node)[source]
visit_substitution_definition(node)[source]
visit_subtitle(node)[source]
visit_superscript(node)[source]
visit_system_message(node)[source]
visit_table(node)[source]
visit_target(node)[source]
visit_tbody(node)[source]
visit_term(node)[source]
visit_tgroup(node)[source]

The tgroup node is presented as the parent of thead and tbody. These should be siblings. Other children are colspec which have a colwidth attribute. Using these numbers to specify a width on the col element similar to Sphinx results in an HTML validation error. There is no markup to specify styling such as background color. Best result is to discard this node.

visit_thead(node)[source]
visit_tip(node)[source]
visit_title(node)[source]
visit_title_reference(node)[source]
visit_topic(node)[source]
visit_transition(node, default_class=u'moin-hr3')[source]
visit_version(node)[source]
visit_warning(node)[source]
class MoinMoin.converter.rst_in.Writer[source]

Bases: docutils.writers.Writer

config_section = 'MoinMoin writer'
config_section_dependencies = ('writers',)
output = None
supported = ('moin-x-document',)
translate()[source]
visitor_attributes = []
MoinMoin.converter.rst_in.walkabout(node, visitor)[source]

This is tree traversal part of docutils without docutils logging.

MoinMoin.converter.rst_out module

MoinMoin - reStructuredText markup output converter

Converts an internal document tree into reStructuredText markup.

This converter based on ReStructuredText 2006-09-22.

class MoinMoin.converter.rst_out.Cell(text)[source]

Bases: object

height()[source]
width()[source]
class MoinMoin.converter.rst_out.Converter[source]

Bases: object

Converter application/x.moin.document -> text/x.moin.rst

define_references()[source]

Adds defenitions of founded links and objects to the converter output.

classmethod factory(input, output, **kw)[source]
namespaces = {<Namespace('http://moinmo.in/namespaces/page')>: 'moinpage'}
open(elem)[source]
open_children(elem)[source]
open_moinpage(elem)[source]
open_moinpage_a(elem)[source]
open_moinpage_blockcode(elem)[source]
open_moinpage_body(elem)[source]
open_moinpage_code(elem)[source]
open_moinpage_emphasis(elem)[source]
open_moinpage_h(elem)[source]
open_moinpage_inline_part(elem)[source]
open_moinpage_line_break(elem)[source]
open_moinpage_list(elem)[source]
open_moinpage_list_item(elem)[source]
open_moinpage_list_item_body(elem)[source]
open_moinpage_list_item_label(elem)[source]
open_moinpage_note(elem)[source]
open_moinpage_object(elem)[source]
open_moinpage_p(elem)[source]
open_moinpage_page(elem)[source]
open_moinpage_part(elem)[source]
open_moinpage_separator(elem)[source]
open_moinpage_span(elem)[source]
open_moinpage_strong(elem)[source]
open_moinpage_table(elem)[source]
open_moinpage_table_body(elem)[source]
open_moinpage_table_cell(elem)[source]
open_moinpage_table_header(elem)[source]
open_moinpage_table_of_content(elem)[source]
open_moinpage_table_row(elem)[source]
supported_tag = {'moinpage': ('a', 'blockcode', 'break_line', 'code', 'div', 'emphasis', 'h', 'list', 'list_item', 'list_item_label', 'list_item_body', 'p', 'page', 'separator', 'span', 'strong', 'object', 'table', 'table_header', 'teble_footer', 'table_body', 'table_row', 'table_cell')}
class MoinMoin.converter.rst_out.ReST[source]

Bases: object

ReST syntax elements It’s dummy

a_separator = u'|'
emphasis = u'*'
h = [u'=', u'-', u'`', u':', u"'", u'"', u'~', u'^', u'_', u'*', u'+', u'#', u'<', u'>']
linebreak = u'\n\n'
list_type = {(u'ordered', None): u'1.', (u'ordered', u'upper-alpha'): u'A.', (u'unordered', None): u'*', (u'definition', None): u'', (u'ordered', u'lower-alpha'): u'a.', (u'ordered', u'lower-roman'): u'i.', (u'ordered', u'upper-roman'): u'I.', (None, None): u' '}
monospace = u'``'
p = u'\n'
separator = u'----'
strong = u'**'
verbatim = u'::'
class MoinMoin.converter.rst_out.Table[source]

Bases: object

An object of this class collects the structure of a table and represent it in ReStructuredText syntax.

add_cell(cs, rs, cell)[source]

Adds cell to the row.

Parameters:cs – number of columns spanned
add_row()[source]

Add new row to the table.

col_width(col)[source]

Counts the width of the column in ReSturcturedText representation.

Parameters:col – index of the column
Returns:number of characters
end_row()[source]

Adds empyt cells to current row if it’s too short.

Moves the row to the head of the table if it is table header.

height()[source]
Returns:number of rows in the table
row_height(row)[source]

Counts lines in ReSturcturedText representation of the row

Parameters:row – index of the row
Returns:number of lines
width()[source]
Returns:width of rows in the table or zero if rows have different width

MoinMoin.converter.smiley module

MoinMoin - Smiley converter

Replace all the text corresponding to a smiley, by the corresponding element for the DOM Tree.

class MoinMoin.converter.smiley.Converter[source]

Bases: object

Replace each smiley by the corresponding element in the DOM Tree

do_children(element)[source]
do_smiley(element)[source]

From a text, return a list with smileys replaced by the appropriate elements, and the former text for the other elements of the list.

replace_smiley(text)[source]

Replace a given string by the appropriate element if the string is exactly a smiley. Otherwise return the string without any change.

s = ':))'
smiley_re = <_sre.SRE_Pattern object at 0x4d220d0>
smiley_rule = u'\n (^|(?<=\\s)) # we require either beginning of line or some space before a smiley\n (\\<\\:\\(|X\\-\\(|\\:\\)|\\:\\-\\)\\)|\\:\\(|\\/\\!\\\\|\\{X\\}|\\{OK\\}|B\\-\\)|\\{2\\}|\\>\\:\\>|\\;\\-\\)|\\<\\!\\>|\\:o|\\|\\-\\)|\\;\\)|\\|\\)|\\(\\!\\)|\\:\\-\\(|\\:\\-\\)|\\{o\\}|\\:D|\\(\\.\\/\\)|B\\)|\\{\\*\\}|\\:\\\\|\\:\\-\\?|\\{i\\}|\\{3\\}|\\{1\\}|\\:\\)\\)) # one of the smileys\n ($|(?=\\s)) # we require either ending of line or some space after a smiley\n'
smileys = {'<:(': 'frown', 'X-(': 'angry', ':)': 'smile', ':-))': 'smile3', ':(': 'sad', '/!\\': 'alert', '{X}': 'icon-error', '{OK}': 'thumbs-up', 'B-)': 'smile2', '{2}': 'prio2', '>:>': 'devil', ';-)': 'smile4', '<!>': 'attention', ':o': 'redface', '|-)': 'tired', ';)': 'smile4', '|)': 'tired', '(!)': 'idea', ':-(': 'sad', ':-)': 'smile', '{o}': 'star_off', ':D': 'biggrin', '(./)': 'checkmark', 'B)': 'smile2', '{*}': 'star_on', ':\\': 'ohwell', ':-?': 'tongue', '{i}': 'icon-info', '{3}': 'prio3', '{1}': 'prio1', ':))': 'smile3'}
tags_to_ignore = set(['blockcode', 'code', 'nowiki'])

MoinMoin.converter.text_csv_in module

MoinMoin - CSV text data to DOM converter

class MoinMoin.converter.text_csv_in.Converter[source]

Bases: MoinMoin.converter._table.TableMixin

Parse the raw text and create a document object that can be converted into output using Emitter.

MoinMoin.converter.text_in module

MoinMoin - Simple text input converter.

It just puts all text into a code block. It acts as a wildcard for text/* input.

We keep it at MIDDLE+2 prio in the registry, one after pygments converter, so it is a fallback for the case we have no pygments or pygments has no support for the input mimetype.

class MoinMoin.converter.text_in.Converter[source]

Bases: object

Parse the raw text and create a document object that can be converted into output using Emitter.

MoinMoin.converter.text_out module

MoinMoin - plain text output converter

Converts an internal document tree into plain, unformatted text.

The purpose of this converter is mainly to be used in a converter chain like markup -> dom -> text and get rid of the (wiki, rst, docbook, ...) markup that way, so we get indexable plain text for our search index.

class MoinMoin.converter.text_out.Converter[source]

Bases: object

Converter application/x.moin.document -> text/plain

classmethod factory(input, output, **kw)[source]

MoinMoin.converter.xml_in module

MoinMoin - Generic XML input converter

class MoinMoin.converter.xml_in.XMLIndexingConverter[source]

Bases: object

We try to generically extract contents from XML documents by just throwing away all XML tags. This is for indexing, so this might be good enough.

MoinMoin.converter.xml_in.strip_xml(text)[source]

Module contents

MoinMoin - Converter support

Converters are used to convert between formats or between different featuresets of one format.

There are usually three types of converters:

  • Between an input format like Moin Wiki or Creole and the internal tree representation.
  • Between the internal tree and an output format like HTML.
  • Between different featuresets of the internal tree representation like URI types or macro expansion.

TODO: Merge with new-style macros.

class MoinMoin.converter.RegistryConverter[source]

Bases: MoinMoin.util.registry.RegistryBase

class Entry[source]

Bases: MoinMoin.converter.Entry

RegistryConverter.register(factory, type_input, type_output, priority=0)[source]

Register a factory

Parameters:factory – Factory to register. Callable, must return an object.