class MarkdownUtils(object): encoder = mistune.Markdown(renderer=HTMLRenderer(escape=False)) @classmethod def extract_metadata(cls, value): regex = r"^<!--\n(.*?)-->" # extract the metadata for processing and convert it to yaml match = re.match(regex, value, re.S) if not match: return {}, value raw_metadata = match.group(1) metadata = Yaml.load(raw_metadata) # now remove the metadata from the original value cregex = re.compile(regex, re.S) res = cregex.sub('', value) return metadata, res @classmethod def to_html(cls, value): if value is None: return metadata, value = cls.extract_metadata(value) return cls.encoder(value), metadata
class TestPlugin(BaseTestCase): md = Markdown(renderer=HTMLRenderer(escape=False), plugins=[_plugin])
import os import json from mistune import Markdown, AstRenderer, HTMLRenderer from mistune.plugins import PluginDirective from tests import fixtures from tests.fixtures import ROOT from unittest import TestCase md = Markdown(renderer=HTMLRenderer(escape=False)) md.use(PluginDirective()) class TestPluginDirective(TestCase): def test_include(self): html = md.read(os.path.join(ROOT, 'include/text.md')) self.assertIn('Could not include self', html) self.assertIn('Could not find file', html) self.assertIn('<div>include html</div>', html) self.assertIn('<blockquote>', html) self.assertIn('# Table of Contents', html) def test_warn_admonition(self): s = '.. warn:: Warnning\n\n message' html = md(s) self.assertIn('class="admonition warn"', html) self.assertIn('<h1>Warnning</h1>', html) def test_ast_directive(self): data = fixtures.load_json('directive.json') md = Markdown(renderer=AstRenderer()) md.use(PluginDirective())