Initial checkin

This commit is contained in:
Bernhard Fisseni 2014-07-20 11:15:27 +02:00
commit 1ee78f5f62
3 changed files with 183 additions and 0 deletions

30
LICENSE.md Normal file
View File

@ -0,0 +1,30 @@
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.

47
README.md Normal file
View File

@ -0,0 +1,47 @@
# YAML Meta Data Extension for [Python-Markdown](https://github.com/waylan/Python-Markdown)
This extension adds YAML meta data handling to markdown.
As in the original, meta data is parsed but not used in processing.
(YAML meta data is used e.g. by [pandoc](http://johnmacfarlane.net/pandoc/))
Dependencies: [PyYAML](http://pyyaml.org/)
## Basic Usage
>>> import markdown
>>> text = '''---
... Title: Test Doc.
... Author: Waylan Limberg
... Blank_Data:
... ...
...
... The body. This is paragraph one.
... '''
>>> md = markdown.Markdown(['meta'])
>>> print(md.convert(text))
<p>The body. This is paragraph one.</p>
>>> print(md.Meta) # doctest: +SKIP
{'blank_data': [''], 'author': ['Waylan Limberg'], 'title': ['Test Doc.']}
Copyright 2014 Bernhard Fisseni
Based on the meta data extension included with Python-Markdown,
Copyright 2007-2008 [Waylan Limberg](http://achinghead.com).
License: BSD (see LICENSE.md for details)
## Use in Sublime Text 3 with [OmniMarkupPreviewer](https://github.com/timonwong/OmniMarkupPreviewer)
- copy python code e.g. to `Packages/User`
- enable as extension in User Preferences
"extensions": [
...
"User.meta_yaml", // if installed in Packages/User
...
]

106
meta_yaml.py Normal file
View File

@ -0,0 +1,106 @@
"""
# YAML Meta Data Extension for [Python-Markdown](https://github.com/waylan/Python-Markdown)
This extension adds YAML meta data handling to markdown.
As in the original, meta data is parsed but not used in processing.
(YAML meta data is used e.g. by [pandoc](http://johnmacfarlane.net/pandoc/))
Dependencies: [PyYAML](http://pyyaml.org/)
Basic Usage:
>>> import markdown
>>> text = '''---
... Title: Test Doc.
... Author: Waylan Limberg
... Blank_Data:
... ...
...
... The body. This is paragraph one.
... '''
>>> md = markdown.Markdown(['meta'])
>>> print(md.convert(text))
<p>The body. This is paragraph one.</p>
>>> print(md.Meta) # doctest: +SKIP
{'blank_data': [''], 'author': ['Waylan Limberg'], 'title': ['Test Doc.']}
Make sure text without Meta Data still works (markdown < 1.6b returns a <p>).
>>> text = ' Some Code - not extra lines of meta data.'
>>> md = markdown.Markdown(['meta'])
>>> print(md.convert(text))
<pre><code>Some Code - not extra lines of meta data.
</code></pre>
>>> md.Meta
{}
Copyright 2014 Bernhard Fisseni
Based on the meta data extension included with Python-Markdown,
Copyright 2007-2008 [Waylan Limberg](http://achinghead.com).
License: BSD (see LICENSE.md for details)
"""
from __future__ import absolute_import
from __future__ import unicode_literals
from markdown import Extension
from markdown.preprocessors import Preprocessor
import re
import yaml
# from yaml.scanner import ScannerError
class MetaYamlExtension (Extension):
"""Extension for parsing YAML-Metadata with Python-Markdown."""
def extendMarkdown(self, md, md_globals):
"""Add MetaYamlPreprocessor to Markdown instance."""
md.preprocessors.add("meta", MetaYamlPreprocessor(md), "_begin")
class MetaYamlPreprocessor(Preprocessor):
"""
Get Meta-Data.
A YAML block is delimited by
- a line '---' at the start
- and a '...' or '---' line
at the end.
"""
def run(self, lines):
""" Parse Meta-Data and store in Markdown.Meta. """
in_yaml = False
yaml_block = []
line = lines.pop(0)
if re.match(r'-{3}', line):
in_yaml = True
else:
lines.insert(0, line)
while in_yaml and lines:
line = lines.pop(0)
if re.match(r'(?:\.{3}|-{3})', line):
break
yaml_block.append(line)
if yaml_block:
yaml_block = "\n".join(yaml_block)
meta = yaml.load(yaml_block)
# case-insensitize meta data keys:
meta = {
dkey.lower(): meta[dkey] for dkey in meta
}
self.markdown.Meta = meta
return lines
def makeExtension(configs={}):
"""set up extension."""
return MetaYamlExtension(configs=configs)