123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- """
- jinja2content.py
- ----------------
- Pelican plugin that processes Markdown files as jinja templates.
- """
- from os import path
- from pelican import signals
- from pelican.readers import Markdown, MarkdownReader
- from pelican.utils import pelican_open
- from jinja2 import Environment, FileSystemLoader, ChoiceLoader
- class JinjaMarkdownReader(MarkdownReader):
- def __init__(self, *args, **kwargs):
- super(JinjaMarkdownReader, self).__init__(*args, **kwargs)
- # will look first in 'JINJA2CONTENT_TEMPLATES', by default the
- # content root path, then in the theme's templates
- # local_templates_dirs = self.settings.get('JINJA2CONTENT_TEMPLATES', ['.'])
- # local_templates_dirs = path.join(self.settings['PATH'], local_templates_dirs)
- local_dirs = self.settings.get('JINJA2CONTENT_TEMPLATES', ['.'])
- local_dirs = [path.join(self.settings['PATH'], folder)
- for folder in local_dirs]
- theme_dir = path.join(self.settings['THEME'], 'templates')
- loaders = [FileSystemLoader(_dir) for _dir
- in local_dirs + [theme_dir]]
- if 'JINJA_ENVIRONMENT' in self.settings: # pelican 3.7
- jinja_environment = self.settings['JINJA_ENVIRONMENT']
- else:
- jinja_environment = {
- 'trim_blocks': True,
- 'lstrip_blocks': True,
- 'extensions': self.settings['JINJA_EXTENSIONS']
- }
- self.env = Environment(
- loader=ChoiceLoader(loaders),
- **jinja_environment)
- def read(self, source_path):
- """Parse content and metadata of markdown files.
- Rendering them as jinja templates first.
- """
- 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)
- metadata = self._parse_metadata(self._md.Meta)
- return content, metadata
- def add_reader(readers):
- for ext in MarkdownReader.file_extensions:
- readers.reader_classes[ext] = JinjaMarkdownReader
- def register():
- signals.readers_init.connect(add_reader)
|