| Index: third_party/markdown/extensions/def_list.py
|
| diff --git a/third_party/markdown/extensions/def_list.py b/third_party/markdown/extensions/def_list.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a9c18340ba81226b4ae374a244f507f52d57f408
|
| --- /dev/null
|
| +++ b/third_party/markdown/extensions/def_list.py
|
| @@ -0,0 +1,150 @@
|
| +# markdown is released under the BSD license
|
| +# Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later)
|
| +# Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b)
|
| +# Copyright 2004 Manfred Stienstra (the original version)
|
| +#
|
| +# All rights reserved.
|
| +#
|
| +# Redistribution and use in source and binary forms, with or without
|
| +# modification, are permitted provided that the following conditions are met:
|
| +#
|
| +# * Redistributions of source code must retain the above copyright
|
| +# notice, this list of conditions and the following disclaimer.
|
| +# * Redistributions in binary form must reproduce the above copyright
|
| +# notice, this list of conditions and the following disclaimer in the
|
| +# documentation and/or other materials provided with the distribution.
|
| +# * Neither the name of the <organization> nor the
|
| +# names of its contributors may be used to endorse or promote products
|
| +# derived from this software without specific prior written permission.
|
| +#
|
| +# THIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''AS IS'' AND ANY
|
| +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
| +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
| +# DISCLAIMED. IN NO EVENT SHALL ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT
|
| +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
| +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
| +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
| +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
| +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
| +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
| +# POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| +
|
| +"""
|
| +Definition List Extension for Python-Markdown
|
| +=============================================
|
| +
|
| +Added parsing of Definition Lists to Python-Markdown.
|
| +
|
| +A simple example:
|
| +
|
| + Apple
|
| + : Pomaceous fruit of plants of the genus Malus in
|
| + the family Rosaceae.
|
| + : An american computer company.
|
| +
|
| + Orange
|
| + : The fruit of an evergreen tree of the genus Citrus.
|
| +
|
| +Copyright 2008 - [Waylan Limberg](http://achinghead.com)
|
| +
|
| +"""
|
| +
|
| +from __future__ import absolute_import
|
| +from __future__ import unicode_literals
|
| +from . import Extension
|
| +from ..blockprocessors import BlockProcessor, ListIndentProcessor
|
| +from ..util import etree
|
| +import re
|
| +
|
| +
|
| +class DefListProcessor(BlockProcessor):
|
| + """ Process Definition Lists. """
|
| +
|
| + RE = re.compile(r'(^|\n)[ ]{0,3}:[ ]{1,3}(.*?)(\n|$)')
|
| + NO_INDENT_RE = re.compile(r'^[ ]{0,3}[^ :]')
|
| +
|
| + def test(self, parent, block):
|
| + return bool(self.RE.search(block))
|
| +
|
| + def run(self, parent, blocks):
|
| +
|
| + raw_block = blocks.pop(0)
|
| + m = self.RE.search(raw_block)
|
| + terms = [l.strip() for l in raw_block[:m.start()].split('\n') if l.strip()]
|
| + block = raw_block[m.end():]
|
| + no_indent = self.NO_INDENT_RE.match(block)
|
| + if no_indent:
|
| + d, theRest = (block, None)
|
| + else:
|
| + d, theRest = self.detab(block)
|
| + if d:
|
| + d = '%s\n%s' % (m.group(2), d)
|
| + else:
|
| + d = m.group(2)
|
| + sibling = self.lastChild(parent)
|
| + if not terms and sibling is None:
|
| + # This is not a definition item. Most likely a paragraph that
|
| + # starts with a colon at the begining of a document or list.
|
| + blocks.insert(0, raw_block)
|
| + return False
|
| + if not terms and sibling.tag == 'p':
|
| + # The previous paragraph contains the terms
|
| + state = 'looselist'
|
| + terms = sibling.text.split('\n')
|
| + parent.remove(sibling)
|
| + # Aquire new sibling
|
| + sibling = self.lastChild(parent)
|
| + else:
|
| + state = 'list'
|
| +
|
| + if sibling and sibling.tag == 'dl':
|
| + # This is another item on an existing list
|
| + dl = sibling
|
| + if len(dl) and dl[-1].tag == 'dd' and len(dl[-1]):
|
| + state = 'looselist'
|
| + else:
|
| + # This is a new list
|
| + dl = etree.SubElement(parent, 'dl')
|
| + # Add terms
|
| + for term in terms:
|
| + dt = etree.SubElement(dl, 'dt')
|
| + dt.text = term
|
| + # Add definition
|
| + self.parser.state.set(state)
|
| + dd = etree.SubElement(dl, 'dd')
|
| + self.parser.parseBlocks(dd, [d])
|
| + self.parser.state.reset()
|
| +
|
| + if theRest:
|
| + blocks.insert(0, theRest)
|
| +
|
| +class DefListIndentProcessor(ListIndentProcessor):
|
| + """ Process indented children of definition list items. """
|
| +
|
| + ITEM_TYPES = ['dd']
|
| + LIST_TYPES = ['dl']
|
| +
|
| + def create_item(self, parent, block):
|
| + """ Create a new dd and parse the block with it as the parent. """
|
| + dd = etree.SubElement(parent, 'dd')
|
| + self.parser.parseBlocks(dd, [block])
|
| +
|
| +
|
| +
|
| +class DefListExtension(Extension):
|
| + """ Add definition lists to Markdown. """
|
| +
|
| + def extendMarkdown(self, md, md_globals):
|
| + """ Add an instance of DefListProcessor to BlockParser. """
|
| + md.parser.blockprocessors.add('defindent',
|
| + DefListIndentProcessor(md.parser),
|
| + '>indent')
|
| + md.parser.blockprocessors.add('deflist',
|
| + DefListProcessor(md.parser),
|
| + '>ulist')
|
| +
|
| +
|
| +def makeExtension(configs={}):
|
| + return DefListExtension(configs=configs)
|
| +
|
|
|