diff options
-rw-r--r-- | docs/extensions/meta_data.txt | 24 | ||||
-rw-r--r-- | docs/release-2.6.txt | 6 | ||||
-rw-r--r-- | markdown/extensions/meta.py | 40 | ||||
-rw-r--r-- | tests/test_extensions.py | 20 |
4 files changed, 16 insertions, 74 deletions
diff --git a/docs/extensions/meta_data.txt b/docs/extensions/meta_data.txt index 3057bfa..4a4fe62 100644 --- a/docs/extensions/meta_data.txt +++ b/docs/extensions/meta_data.txt @@ -47,10 +47,11 @@ many lines as desired. The first blank line ends all meta-data for the document. Therefore, the first line of a document must not be blank. -Alternatively, if the first line in the document is `---`, a YAML document -separator, then the meta-data is searched for between it and the next `---` -(or `...`) line. Even though YAML deliminators are supported, meta-data is -not parsed as YAML unless the `yaml` option is set (see below). +Alternatively, You may use YAML style deliminators to mark the start and/or end +of your meta-data. When doing so, the first line of your document must be `---`. +The meta-data ends at the first blank line or the first line containing an end +deliminator (either `---` or `...`), whichever comes first. Even though YAML +deliminators are supported, meta-data is not parsed as YAML. All meta-data is stripped from the document prior to any further processing by Markdown. @@ -61,16 +62,6 @@ Usage See [Extensions](index.html) for general extension usage, specify `markdown.extensions.meta` as the name of the extension. -The following options are provided to configure the output: - -* **`yaml`**: Support meta-data specified in YAML format. - - Default: `False` - - If `yaml` is set to `True`, the lines between `---` separators are parsed - as a full YAML object. PyYAML is required for this, and a warning is - issued if PyYAML (or equivalent) is not available. - Accessing the Meta-Data ----------------------- @@ -100,11 +91,6 @@ line breaks if desired. Or the items could be joined where appropriate. No assumptions are made regarding the data. It is simply passed as found to the `Meta` attribute. -Note, if `yaml` option is set, the resulting `Meta` attribute is the object as -returned by `yaml.load()` and may deviate significantly from the above -description (e.g. may be a list of dictionaries, with value objects other than -strings, ...). - Perhaps the meta-data could be passed into a template system, or used by various Markdown extensions. The possibilities are left to the imagination of the developer. diff --git a/docs/release-2.6.txt b/docs/release-2.6.txt index f79e357..747c81c 100644 --- a/docs/release-2.6.txt +++ b/docs/release-2.6.txt @@ -198,11 +198,15 @@ meta-data. By default, the YAML deliminators are recognized, however, the actual data is parsed as previously. This follows the syntax of [MultiMarkdown], which inspired this extension. -Alternatively, if the `yaml` option is set, then the data is parsed as YAML. +<del>Alternatively, if the `yaml` option is set, then the data is parsed as YAML.</del> +<ins>As the `yaml` option was buggy, it was removed in 2.6.1. It is suggested that a third +party extension be used if you want true YAML support. See [Issue #390][#390] for a full +explanation.</ins> [MultiMarkdown]: http://fletcherpenney.net/MultiMarkdown_Syntax_Guide#metadata [Meta-Data]: extensions/meta_data.html [YAML]: http://yaml.org/ +[#390]: https://github.com/waylan/Python-Markdown/issues/390 ### Table of Contents Extension Refactored diff --git a/markdown/extensions/meta.py b/markdown/extensions/meta.py index cf8074f..711235e 100644 --- a/markdown/extensions/meta.py +++ b/markdown/extensions/meta.py @@ -22,66 +22,40 @@ from ..preprocessors import Preprocessor import re import logging -try: # pragma: no cover - import yaml - try: - from yaml import CSafeLoader as SafeLoader - except ImportError: - from yaml import SafeLoader -except ImportError: - yaml = None - 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>.*)') -YAML_BEGIN_RE = re.compile(r'^-{3}(\s.*)?') -YAML_END_RE = re.compile(r'^(-{3}|\.{3})(\s.*)?') +BEGIN_RE = re.compile(r'^-{3}(\s.*)?') +END_RE = re.compile(r'^(-{3}|\.{3})(\s.*)?') class MetaExtension (Extension): """ Meta-Data extension for Python-Markdown. """ - def __init__(self, *args, **kwargs): - self.config = { - 'yaml': [False, "Parse meta data specified as a " - "'---' delimited YAML front matter"], - } - super(MetaExtension, self).__init__(*args, **kwargs) def extendMarkdown(self, md, md_globals): """ Add MetaPreprocessor to Markdown instance. """ md.preprocessors.add("meta", - MetaPreprocessor(md, self.getConfigs()), + MetaPreprocessor(md), ">normalize_whitespace") class MetaPreprocessor(Preprocessor): """ Get Meta-Data. """ - def __init__(self, md, config): - self.config = config - super(MetaPreprocessor, self).__init__(md) - def run(self, lines): """ Parse Meta-Data and store in Markdown.Meta. """ meta = {} key = None - yaml_block = [] - have_yaml = False - if lines and YAML_BEGIN_RE.match(lines[0]): - have_yaml = True + if lines and BEGIN_RE.match(lines[0]): lines.pop(0) - if self.config['yaml'] and not yaml: # pragma: no cover - log.warning('Document with YAML header, but PyYAML unavailable') while lines: line = lines.pop(0) m1 = META_RE.match(line) - if line.strip() == '' or have_yaml and YAML_END_RE.match(line): + if line.strip() == '' or END_RE.match(line): break # blank line or end of YAML header - done - elif have_yaml and self.config['yaml'] and yaml: - yaml_block.append(line) - elif m1: + if m1: key = m1.group('key').lower().strip() value = m1.group('value').strip() try: @@ -96,8 +70,6 @@ class MetaPreprocessor(Preprocessor): else: lines.insert(0, line) break # no meta data - done - if yaml_block: - meta = yaml.load('\n'.join(yaml_block), SafeLoader) self.markdown.Meta = meta return lines diff --git a/tests/test_extensions.py b/tests/test_extensions.py index 6a57878..38f0be3 100644 --- a/tests/test_extensions.py +++ b/tests/test_extensions.py @@ -8,7 +8,6 @@ continue to work as advertised. This used to be accomplished by doctests. """ from __future__ import unicode_literals -import datetime import unittest import markdown @@ -510,25 +509,6 @@ The body. This is paragraph one.''' self.assertEqual(self.md.convert(text), '') self.assertEqual(self.md.Meta, {'title': ['No newline']}) - def testYamlObjectMetaData(self): - """ Test metadata specified as a complex YAML object. """ - md = markdown.Markdown(extensions=[markdown.extensions.meta.MetaExtension(yaml=True)]) - text = '''--- -Author: John Doe -Date: 2014-11-29 14:15:16 -Integer: 0x16 ---- - -Some content.''' - self.assertEqual(md.convert(text), '<p>Some content.</p>') - self.assertEqual( - md.Meta, { - 'Author': 'John Doe', - 'Date': datetime.datetime(2014, 11, 29, 14, 15, 16), - 'Integer': 22 - } - ) - class TestWikiLinks(unittest.TestCase): """ Test Wikilinks Extension. """ |