jinja2content.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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, ChoiceLoader
  6. class JinjaMarkdownReader(MarkdownReader):
  7. def __init__(self, *args, **kwargs):
  8. super(JinjaMarkdownReader, self).__init__(*args, **kwargs)
  9. # will look first in 'JINJA2CONTENT_TEMPLATES', by default the
  10. # content root path, then in the theme's templates
  11. local_templates_dir = self.settings.get('JINJA2CONTENT_TEMPLATES', '.')
  12. local_templates_dir = os.path.join(self.settings['PATH'], local_templates_dir)
  13. theme_templates_dir = os.path.join(self.settings['THEME'], 'templates')
  14. loader = ChoiceLoader([
  15. FileSystemLoader(local_templates_dir),
  16. FileSystemLoader(theme_templates_dir)])
  17. self.env = Environment(trim_blocks=True, lstrip_blocks=True,
  18. extensions=self.settings['JINJA_EXTENSIONS'],
  19. loader=loader)
  20. def read(self, source_path):
  21. """Parse content and metadata of markdown files.
  22. Rendering them as jinja templates first.
  23. """
  24. self._source_path = source_path
  25. self._md = Markdown(extensions=self.extensions)
  26. with pelican_open(source_path) as text:
  27. text = self.env.from_string(text).render()
  28. content = self._md.convert(text)
  29. metadata = self._parse_metadata(self._md.Meta)
  30. return content, metadata
  31. def add_reader(readers):
  32. for ext in MarkdownReader.file_extensions:
  33. readers.reader_classes[ext] = JinjaMarkdownReader
  34. def register():
  35. signals.readers_init.connect(add_reader)