Varia's website https://varia.zone
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.2 KiB

"""
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)