annotate piecrust/templating/jinjaengine.py @ 1195:ae9387338db1 draft default tip

admin: add option to publish immediately
author Ludovic Chabant <ludovic@chabant.com>
date Fri, 30 Dec 2022 16:48:04 -0800
parents 8adc27285d93
children
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):
907
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
12 ENGINE_NAMES = ['jinja', 'jinja2', 'j2']
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
13 EXTENSIONS = ['html', 'jinja', 'jinja2', 'j2']
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 def __init__(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 self.env = None
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
17 self._jinja_syntax_error = None
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
18 self._jinja_not_found = None
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19
924
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 907
diff changeset
20 def renderSegment(self, path, segment, data):
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 907
diff changeset
21 if not _string_needs_render(segment.content):
989
8adc27285d93 bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents: 924
diff changeset
22 return segment.content, False
445
d8d86debea81 performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents: 395
diff changeset
23
907
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
24 self._ensureLoaded()
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
25
924
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 907
diff changeset
26 seg_path = _make_segment_path(path, segment.offset)
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 907
diff changeset
27 self.env.loader.segments_cache[seg_path] = (
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 907
diff changeset
28 path, segment.content)
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
29 try:
924
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 907
diff changeset
30 tpl = self.env.get_template(seg_path)
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
31 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
32 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
33 except self._jinja_not_found:
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
34 raise TemplateNotFoundError()
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
35
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 try:
989
8adc27285d93 bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents: 924
diff changeset
37 return tpl.render(data), True
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
38 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
39 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
40 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
41 raise
524
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
42 except Exception as ex:
715
a14371c5cda7 debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents: 662
diff changeset
43 if self.app.debug:
a14371c5cda7 debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents: 662
diff changeset
44 raise
524
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
45 msg = "Error rendering Jinja markup"
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
46 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
47 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
48
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 def renderFile(self, paths, data):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 self._ensureLoaded()
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
51
907
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
52 try:
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
53 tpl = self.env.select_template(paths)
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
54 except self._jinja_syntax_error as tse:
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
55 raise self._getTemplatingError(tse)
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
56 except self._jinja_not_found:
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 raise TemplateNotFoundError()
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
58
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
59 try:
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
60 return tpl.render(data)
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
61 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
62 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
63 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
64 raise
524
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
65 except Exception as ex:
864
5c5b85d4f17d debug: Raise Jinja template exceptions the same way in both render passes.
Ludovic Chabant <ludovic@chabant.com>
parents: 855
diff changeset
66 if self.app.debug:
5c5b85d4f17d debug: Raise Jinja template exceptions the same way in both render passes.
Ludovic Chabant <ludovic@chabant.com>
parents: 855
diff changeset
67 raise
524
4bca25f99463 serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents: 506
diff changeset
68 msg = "Error rendering Jinja markup"
907
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
69 name = getattr(tpl, 'name', '<unknown template>')
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
70 raise TemplatingError(msg, name) from ex
128
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
71
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
72 def _getTemplatingError(self, tse, filename=None):
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
73 filename = tse.filename or filename
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
74 if filename and os.path.isabs(filename):
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
75 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
76 err = TemplatingError(str(tse), filename, tse.lineno)
28444014ce7d Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
77 raise err from tse
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 def _ensureLoaded(self):
855
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
80 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
81 return
59
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
82
855
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
83 stats = self.app.env.stats
907
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
84 stats.registerTimer('JinjaTemplateEngine_setup',
855
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
85 raise_if_registered=False)
907
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
86 stats.registerTimer('JinjaTemplateEngine_extensions',
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
87 raise_if_registered=False)
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
88 with stats.timerScope('JinjaTemplateEngine_setup'):
855
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
89 self._load()
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
90
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
91 def _load(self):
448710d84121 refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
92 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
93
487
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
94 # 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
95 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
96 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
97 ext_names = [ext_names]
59
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
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 # Turn on autoescape by default.
907
3e69f18912f5 jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents: 864
diff changeset
100 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
101 if autoescape:
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
102 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
103
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
104 # 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
105 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
106 PieCrustHighlightExtension, PieCrustCacheExtension,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
107 PieCrustSpacelessExtension, PieCrustFormatExtension)
59
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
108 extensions = [
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
109 PieCrustHighlightExtension,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
110 PieCrustCacheExtension,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
111 PieCrustSpacelessExtension,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
112 PieCrustFormatExtension]
487
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
113 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
114 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
115 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
116 extensions.append(n)
849
8f8bbb2e70e1 templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 802
diff changeset
117 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
118 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
119
61508ae67488 templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 485
diff changeset
120 # 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
121 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
122 self.app.templates_dirs)
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
123 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
124 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
125 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
126 self.env = PieCrustEnvironment(
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
127 self.app,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
128 loader=loader,
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
129 extensions=extensions)
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
130
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
131 # Get types we need later.
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
132 from jinja2 import TemplateNotFound
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
133 from jinja2.exceptions import TemplateSyntaxError
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
134 self._jinja_syntax_error = TemplateSyntaxError
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents: 849
diff changeset
135 self._jinja_not_found = TemplateNotFound
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137
454
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
138 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
139 index = txt.find('{')
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
140 while index >= 0:
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
141 ch = txt[index + 1]
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
142 if ch == '{' or ch == '%':
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
143 return True
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
144 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
145 return False
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
146
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
147
924
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 907
diff changeset
148 def _make_segment_path(path, start):
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 907
diff changeset
149 return '$seg=%s:%d' % (path, start)
454
96d363e2da4b templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents: 446
diff changeset
150