annotate piecrust/templating/jinjaengine.py @ 856:9bb22bbe093c

refactor: Make the blog archives functional again. The blog archives are using the same pattern as the taxonomy support.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 06 Jun 2017 01:23:25 -0700
parents 448710d84121
children 5c5b85d4f17d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
1 import os.path
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import logging
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 851
diff changeset
3 from piecrust.sources.base import AbortedSourceUseError
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
4 from piecrust.templating.base import (TemplateEngine, TemplateNotFoundError,
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
5 TemplatingError)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 logger = logging.getLogger(__name__)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 class JinjaTemplateEngine(TemplateEngine):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 # Name `twig` is for backwards compatibility with PieCrust 1.x.
485
c40b7923c474 jinja: Support `.j2` file extensions.
Ludovic Chabant <ludovic@chabant.com>
parents: 454
diff changeset
13 ENGINE_NAMES = ['jinja', 'jinja2', 'j2', 'twig']
c40b7923c474 jinja: Support `.j2` file extensions.
Ludovic Chabant <ludovic@chabant.com>
parents: 454
diff changeset
14 EXTENSIONS = ['html', 'jinja', 'jinja2', 'j2', 'twig']
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 def __init__(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 self.env = None
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
18 self._jinja_syntax_error = None
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
19 self._jinja_not_found = None
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20
454
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
21 def renderSegmentPart(self, path, seg_part, data):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 self._ensureLoaded()
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
23
454
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
24 if not _string_needs_render(seg_part.content):
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
25 return seg_part.content
445
d8d86debea81 performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents: 395
diff changeset
26
454
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
27 part_path = _make_segment_part_path(path, seg_part.offset)
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
28 self.env.loader.segment_parts_cache[part_path] = (
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
29 path, seg_part.content)
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
30 try:
454
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
31 tpl = self.env.get_template(part_path)
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
32 except self._jinja_syntax_error as tse:
454
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
33 raise self._getTemplatingError(tse, filename=path)
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
34 except self._jinja_not_found:
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
35 raise TemplateNotFoundError()
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
36
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 try:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 return tpl.render(data)
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
39 except self._jinja_syntax_error as tse:
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
40 raise self._getTemplatingError(tse)
528
cf3218766fe2 bug: Of course I broke something. Some exceptions need to pass through Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents: 524
diff changeset
41 except AbortedSourceUseError:
cf3218766fe2 bug: Of course I broke something. Some exceptions need to pass through Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents: 524
diff changeset
42 raise
524
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
43 except Exception as ex:
715
a14371c5cda7 debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents: 662
diff changeset
44 if self.app.debug:
a14371c5cda7 debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents: 662
diff changeset
45 raise
524
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
46 msg = "Error rendering Jinja markup"
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
47 rel_path = os.path.relpath(path, self.app.root_dir)
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
48 raise TemplatingError(msg, rel_path) from ex
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 def renderFile(self, paths, data):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 self._ensureLoaded()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 tpl = None
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 logger.debug("Looking for template: %s" % paths)
524
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
54 rendered_path = None
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 for p in paths:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 try:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 tpl = self.env.get_template(p)
524
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
58 rendered_path = p
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 break
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
60 except self._jinja_syntax_error as tse:
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
61 raise self._getTemplatingError(tse)
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
62 except self._jinja_not_found:
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 pass
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
64
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 if tpl is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 raise TemplateNotFoundError()
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
67
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
68 try:
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
69 return tpl.render(data)
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
70 except self._jinja_syntax_error as tse:
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
71 raise self._getTemplatingError(tse)
528
cf3218766fe2 bug: Of course I broke something. Some exceptions need to pass through Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents: 524
diff changeset
72 except AbortedSourceUseError:
cf3218766fe2 bug: Of course I broke something. Some exceptions need to pass through Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents: 524
diff changeset
73 raise
524
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
74 except Exception as ex:
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
75 msg = "Error rendering Jinja markup"
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
76 rel_path = os.path.relpath(rendered_path, self.app.root_dir)
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
77 raise TemplatingError(msg, rel_path) from ex
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
78
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
79 def _getTemplatingError(self, tse, filename=None):
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
80 filename = tse.filename or filename
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
81 if filename and os.path.isabs(filename):
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
82 filename = os.path.relpath(filename, self.env.app.root_dir)
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
83 err = TemplatingError(str(tse), filename, tse.lineno)
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
84 raise err from tse
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 def _ensureLoaded(self):
855
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
87 if self.env is not None:
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 return
59
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
89
855
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
90 stats = self.app.env.stats
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
91 stats.registerTimer('JinjaTemplateEngineEnvironmentSetup',
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
92 raise_if_registered=False)
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
93 with stats.timerScope('JinjaTemplateEngineEnvironmentSetup'):
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
94 self._load()
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
95
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
96 def _load(self):
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
97 get_config = self.app.config.get
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
98
487
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
99 # Get the list of extensions to load.
855
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
100 ext_names = get_config('jinja/extensions', [])
487
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
101 if not isinstance(ext_names, list):
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
102 ext_names = [ext_names]
59
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
103
487
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
104 # Turn on autoescape by default.
855
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
105 autoescape = get_config('twig/auto_escape')
487
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
106 if autoescape is not None:
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
107 logger.warning("The `twig/auto_escape` setting is now called "
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
108 "`jinja/auto_escape`.")
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
109 else:
855
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
110 autoescape = get_config('jinja/auto_escape', True)
487
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
111 if autoescape:
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
112 ext_names.append('autoescape')
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
113
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
114 # Create the final list of extensions.
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
115 from piecrust.templating.jinja.extensions import (
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
116 PieCrustHighlightExtension, PieCrustCacheExtension,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
117 PieCrustSpacelessExtension, PieCrustFormatExtension)
59
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
118 extensions = [
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
119 PieCrustHighlightExtension,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
120 PieCrustCacheExtension,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
121 PieCrustSpacelessExtension,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
122 PieCrustFormatExtension]
487
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
123 for n in ext_names:
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
124 if '.' not in n:
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
125 n = 'jinja2.ext.' + n
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
126 extensions.append(n)
849
8f8bbb2e70e1 templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 802
diff changeset
127 for je in self.app.plugin_loader.getTemplateEngineExtensions('jinja'):
8f8bbb2e70e1 templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 802
diff changeset
128 extensions.append(je)
487
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
129
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
130 # Create the Jinja environment.
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
131 logger.debug("Creating Jinja environment with folders: %s" %
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
132 self.app.templates_dirs)
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
133 from piecrust.templating.jinja.loader import PieCrustLoader
487
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
134 loader = PieCrustLoader(self.app.templates_dirs)
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
135 from piecrust.templating.jinja.environment import PieCrustEnvironment
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 self.env = PieCrustEnvironment(
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
137 self.app,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
138 loader=loader,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
139 extensions=extensions)
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
140
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
141 # Get types we need later.
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
142 from jinja2 import TemplateNotFound
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
143 from jinja2.exceptions import TemplateSyntaxError
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
144 self._jinja_syntax_error = TemplateSyntaxError
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
145 self._jinja_not_found = TemplateNotFound
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147
454
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
148 def _string_needs_render(txt):
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
149 index = txt.find('{')
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
150 while index >= 0:
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
151 ch = txt[index + 1]
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
152 if ch == '{' or ch == '%':
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
153 return True
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
154 index = txt.find('{', index + 1)
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
155 return False
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
156
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
157
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
158 def _make_segment_part_path(path, start):
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
159 return '$part=%s:%d' % (path, start)
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
160
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
161