diff options
Diffstat (limited to 'markdown/extensions/meta.py')
-rw-r--r-- | markdown/extensions/meta.py | 83 |
1 files changed, 36 insertions, 47 deletions
diff --git a/markdown/extensions/meta.py b/markdown/extensions/meta.py index 1b555b2..10dee11 100644 --- a/markdown/extensions/meta.py +++ b/markdown/extensions/meta.py @@ -1,75 +1,68 @@ -#!usr/bin/python - """ Meta Data Extension for Python-Markdown ======================================= This extension adds Meta Data handling to markdown. -Basic Usage: - - >>> import markdown - >>> text = '''Title: A Test Doc. - ... Author: Waylan Limberg - ... John Doe - ... Blank_Data: - ... - ... The body. This is paragraph one. - ... ''' - >>> md = markdown.Markdown(['meta']) - >>> md.convert(text) - u'<p>The body. This is paragraph one.</p>' - >>> md.Meta - {u'blank_data': [u''], u'author': [u'Waylan Limberg', u'John Doe'], u'title': [u'A Test Doc.']} - -Make sure text without Meta Data still works (markdown < 1.6b returns a <p>). +See <https://Python-Markdown.github.io/extensions/meta_data> +for documentation. - >>> text = ' Some Code - not extra lines of meta data.' - >>> md = markdown.Markdown(['meta']) - >>> md.convert(text) - u'<pre><code>Some Code - not extra lines of meta data.\\n</code></pre>' - >>> md.Meta - {} +Original code Copyright 2007-2008 [Waylan Limberg](http://achinghead.com). -Copyright 2007-2008 [Waylan Limberg](http://achinghead.com). +All changes Copyright 2008-2014 The Python Markdown Project -Project website: <http://www.freewisdom.org/project/python-markdown/Meta-Data> -Contact: markdown@freewisdom.org - -License: BSD (see ../docs/LICENSE for details) +License: [BSD](https://opensource.org/licenses/bsd-license.php) """ -import markdown, re +from . import Extension +from ..preprocessors import Preprocessor +import re +import logging + +log = logging.getLogger('MARKDOWN') # Global Vars META_RE = re.compile(r'^[ ]{0,3}(?P<key>[A-Za-z0-9_-]+):\s*(?P<value>.*)') META_MORE_RE = re.compile(r'^[ ]{4,}(?P<value>.*)') +BEGIN_RE = re.compile(r'^-{3}(\s.*)?') +END_RE = re.compile(r'^(-{3}|\.{3})(\s.*)?') + -class MetaExtension (markdown.Extension): +class MetaExtension (Extension): """ Meta-Data extension for Python-Markdown. """ - def extendMarkdown(self, md, md_globals): + def extendMarkdown(self, md): """ Add MetaPreprocessor to Markdown instance. """ + md.registerExtension(self) + self.md = md + md.preprocessors.register(MetaPreprocessor(md), 'meta', 27) - md.preprocessors.add("meta", MetaPreprocessor(md), "_begin") + def reset(self): + self.md.Meta = {} -class MetaPreprocessor(markdown.preprocessors.Preprocessor): +class MetaPreprocessor(Preprocessor): """ Get Meta-Data. """ def run(self, lines): """ Parse Meta-Data and store in Markdown.Meta. """ meta = {} key = None - while 1: + if lines and BEGIN_RE.match(lines[0]): + lines.pop(0) + while lines: line = lines.pop(0) - if line.strip() == '': - break # blank line - done m1 = META_RE.match(line) + if line.strip() == '' or END_RE.match(line): + break # blank line or end of YAML header - done if m1: key = m1.group('key').lower().strip() - meta[key] = [m1.group('value').strip()] + value = m1.group('value').strip() + try: + meta[key].append(value) + except KeyError: + meta[key] = [value] else: m2 = META_MORE_RE.match(line) if m2 and key: @@ -77,14 +70,10 @@ class MetaPreprocessor(markdown.preprocessors.Preprocessor): meta[key].append(m2.group('value').strip()) else: lines.insert(0, line) - break # no meta data - done - self.markdown.Meta = meta + break # no meta data - done + self.md.Meta = meta return lines - -def makeExtension(configs={}): - return MetaExtension(configs=configs) -if __name__ == "__main__": - import doctest - doctest.testmod() +def makeExtension(**kwargs): # pragma: no cover + return MetaExtension(**kwargs) |