diff --git a/docs/settings.rst b/docs/settings.rst index 937d51e4..9134d570 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -81,9 +81,11 @@ Basic settings OUTPUT_RETENTION = [".hg", ".git", ".bzr"] -.. data:: JINJA_EXTENSIONS = [] +.. data:: JINJA_ENVIRONMENT = {'trim_blocks': True, 'lstrip_blocks': True} - A list of any Jinja2 extensions you want to use. + A dictionary of custom Jinja2 environment variables you want to use. This + also includes a list of extensions you may want to include. + See `Jinja Environment documentation`_. .. data:: JINJA_FILTERS = {} @@ -1215,4 +1217,5 @@ Example settings .. _Jinja custom filters documentation: http://jinja.pocoo.org/docs/api/#custom-filters +.. _Jinja Environment documentation: http://jinja.pocoo.org/docs/dev/api/#jinja2.Environment .. _Docutils Configuration: http://docutils.sourceforge.net/docs/user/config.html diff --git a/pelican/generators.py b/pelican/generators.py index af3e3513..a7a7fb25 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -61,14 +61,12 @@ class Generator(object): simple_loader = FileSystemLoader(os.path.join(theme_path, "themes", "simple", "templates")) self.env = Environment( - trim_blocks=True, - lstrip_blocks=True, loader=ChoiceLoader([ FileSystemLoader(self._templates_path), simple_loader, # implicit inheritance PrefixLoader({'!simple': simple_loader}) # explicit one ]), - extensions=self.settings['JINJA_EXTENSIONS'], + **self.settings['JINJA_ENVIRONMENT'] ) logger.debug('Template list: %s', self.env.list_templates()) diff --git a/pelican/settings.py b/pelican/settings.py index 5773b925..b7ddb814 100644 --- a/pelican/settings.py +++ b/pelican/settings.py @@ -109,8 +109,12 @@ DEFAULT_CONFIG = { }, 'output_format': 'html5', }, - 'JINJA_EXTENSIONS': [], 'JINJA_FILTERS': {}, + 'JINJA_ENVIRONMENT': { + 'trim_blocks': True, + 'lstrip_blocks': True, + 'extensions': [], + }, 'LOG_FILTER': [], 'LOCALE': [''], # defaults to user locale 'DEFAULT_PAGINATION': False, @@ -162,6 +166,12 @@ def read_settings(path=None, override=None): 'PLUGIN_PATHS, moving it to the new setting name.') local_settings['PLUGIN_PATHS'] = local_settings['PLUGIN_PATH'] del local_settings['PLUGIN_PATH'] + if 'JINJA_EXTENSIONS' in local_settings: + logger.warning('JINJA_EXTENSIONS setting has been deprecated, ' + 'moving it to JINJA_ENVIRONMENT setting.') + local_settings['JINJA_ENVIRONMENT']['extensions'] = \ + local_settings['JINJA_EXTENSIONS'] + del local_settings['JINJA_EXTENSIONS'] if isinstance(local_settings['PLUGIN_PATHS'], six.string_types): logger.warning("Defining PLUGIN_PATHS setting as string " "has been deprecated (should be a list)") @@ -215,6 +225,20 @@ def get_settings_from_file(path, default_settings=DEFAULT_CONFIG): return get_settings_from_module(module, default_settings=default_settings) +def get_jinja_environment(settings): + """Sets the environment for Jinja""" + + jinja_env = settings.setdefault('JINJA_ENVIRONMENT', + DEFAULT_CONFIG['JINJA_ENVIRONMENT']) + + # Make sure we include the defaults if the user has set env variables + for key, value in DEFAULT_CONFIG['JINJA_ENVIRONMENT'].items(): + if key not in jinja_env: + jinja_env[key] = value + + return settings + + def configure_settings(settings): """Provide optimizations, error checking, and warnings for the given settings. @@ -251,6 +275,9 @@ def configure_settings(settings): if key in settings: settings[key] = settings[key].lower() + # set defaults for Jinja environment + settings = get_jinja_environment(settings) + # standardize strings to lists for key in ['LOCALE']: if key in settings and isinstance(settings[key], six.string_types): @@ -355,7 +382,6 @@ def configure_settings(settings): 'EXTRA_TEMPLATES_PATHS', 'FILES_TO_COPY', 'IGNORE_FILES', - 'JINJA_EXTENSIONS', 'PAGINATED_DIRECT_TEMPLATES', 'PLUGINS', 'STATIC_EXCLUDES', diff --git a/pelican/tests/test_generators.py b/pelican/tests/test_generators.py index feded3e8..3c4684df 100644 --- a/pelican/tests/test_generators.py +++ b/pelican/tests/test_generators.py @@ -98,6 +98,25 @@ class TestGenerator(unittest.TestCase): 'subdir.md', found_files, "get_files() excluded a subdirectory by name, ignoring its path") + def test_custom_jinja_environment(self): + """ + Test that setting the JINJA_ENVIRONMENT + properly gets set from the settings config + """ + settings = get_settings() + comment_start_string = 'abc' + comment_end_string = '/abc' + settings['JINJA_ENVIRONMENT'] = { + 'comment_start_string': comment_start_string, + 'comment_end_string': comment_end_string + } + generator = Generator(settings.copy(), settings, + CUR_DIR, settings['THEME'], None) + self.assertEqual(comment_start_string, + generator.env.comment_start_string) + self.assertEqual(comment_end_string, + generator.env.comment_end_string) + class TestArticlesGenerator(unittest.TestCase):