|
@@ -6,26 +6,23 @@ Pelican plugin that processes Markdown files as jinja templates.
|
|
|
|
|
|
"""
|
|
|
|
|
|
-from os import path
|
|
|
+from jinja2 import Environment, FileSystemLoader, ChoiceLoader
|
|
|
+import os
|
|
|
from pelican import signals
|
|
|
-from pelican.readers import Markdown, MarkdownReader
|
|
|
+from pelican.readers import MarkdownReader, HTMLReader, RstReader
|
|
|
from pelican.utils import pelican_open
|
|
|
-from jinja2 import Environment, FileSystemLoader, ChoiceLoader
|
|
|
-
|
|
|
-
|
|
|
-class JinjaMarkdownReader(MarkdownReader):
|
|
|
+from tempfile import NamedTemporaryFile
|
|
|
|
|
|
+class JinjaContentMixin:
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
- super(JinjaMarkdownReader, self).__init__(*args, **kwargs)
|
|
|
+ super().__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
local_dirs = self.settings.get('JINJA2CONTENT_TEMPLATES', ['.'])
|
|
|
- local_dirs = [path.join(self.settings['PATH'], folder)
|
|
|
+ local_dirs = [os.path.join(self.settings['PATH'], folder)
|
|
|
for folder in local_dirs]
|
|
|
- theme_dir = path.join(self.settings['THEME'], 'templates')
|
|
|
+ theme_dir = os.path.join(self.settings['THEME'], 'templates')
|
|
|
|
|
|
loaders = [FileSystemLoader(_dir) for _dir
|
|
|
in local_dirs + [theme_dir]]
|
|
@@ -41,28 +38,32 @@ class JinjaMarkdownReader(MarkdownReader):
|
|
|
loader=ChoiceLoader(loaders),
|
|
|
**jinja_environment)
|
|
|
|
|
|
- def read(self, source_path):
|
|
|
- """Parse content and metadata of markdown files.
|
|
|
|
|
|
- Rendering them as jinja templates first.
|
|
|
+ def read(self, source_path):
|
|
|
+ with pelican_open(source_path) as text:
|
|
|
+ text = self.env.from_string(text).render()
|
|
|
|
|
|
- """
|
|
|
+ with NamedTemporaryFile(delete=False) as f:
|
|
|
+ f.write(text.encode())
|
|
|
+ f.close()
|
|
|
+ content, metadata = super().read(f.name)
|
|
|
+ os.unlink(f.name)
|
|
|
+ return content, metadata
|
|
|
|
|
|
- self._source_path = source_path
|
|
|
- self._md = Markdown(extensions=self.settings['MARKDOWN']['extensions'])
|
|
|
|
|
|
- with pelican_open(source_path) as text:
|
|
|
- text = self.env.from_string(text).render()
|
|
|
- content = self._md.convert(text)
|
|
|
+class JinjaMarkdownReader(JinjaContentMixin, MarkdownReader):
|
|
|
+ pass
|
|
|
|
|
|
- metadata = self._parse_metadata(self._md.Meta)
|
|
|
- return content, metadata
|
|
|
+class JinjaRstReader(JinjaContentMixin, RstReader):
|
|
|
+ pass
|
|
|
|
|
|
+class JinjaHTMLReader(JinjaContentMixin, HTMLReader):
|
|
|
+ pass
|
|
|
|
|
|
def add_reader(readers):
|
|
|
- for ext in MarkdownReader.file_extensions:
|
|
|
- readers.reader_classes[ext] = JinjaMarkdownReader
|
|
|
-
|
|
|
+ for Reader in [JinjaMarkdownReader, JinjaRstReader, JinjaHTMLReader]:
|
|
|
+ for ext in Reader.file_extensions:
|
|
|
+ readers.reader_classes[ext] = Reader
|
|
|
|
|
|
def register():
|
|
|
signals.readers_init.connect(add_reader)
|