jinja2content.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import os
  2. from pelican import signals
  3. from pelican.readers import Markdown, MarkdownReader
  4. from pelican.utils import pelican_open
  5. from jinja2 import Environment, FileSystemLoader
  6. class JinjaMarkdownReader(MarkdownReader):
  7. def __init__(self, *args, **kwargs):
  8. super(JinjaMarkdownReader, self).__init__(*args, **kwargs)
  9. templates_dir = os.path.join(self.settings['THEME'], 'templates')
  10. self._env = Environment(
  11. trim_blocks=True, lstrip_blocks=True,
  12. loader=FileSystemLoader(templates_dir),
  13. extensions=self.settings['JINJA_EXTENSIONS'])
  14. def read(self, source_path):
  15. """Parse content and metadata of markdown files.
  16. Rendering them as jinja templates first.
  17. """
  18. self._source_path = source_path
  19. self._md = Markdown(extensions=self.extensions)
  20. with pelican_open(source_path) as text:
  21. text = self._env.from_string(text).render()
  22. content = self._md.convert(text)
  23. metadata = self._parse_metadata(self._md.Meta)
  24. return content, metadata
  25. def add_reader(readers):
  26. for ext in MarkdownReader.file_extensions:
  27. readers.reader_classes[ext] = JinjaMarkdownReader
  28. def register():
  29. signals.readers_init.connect(add_reader)