Mercurial > piecrust2
annotate piecrust/rendering.py @ 834:10c482d57c79
Allow an individual page to override pretty_urls in it config
author | Ben Artin <ben@artins.org> |
---|---|
date | Mon, 02 Jan 2017 20:33:57 -0500 |
parents | bf9f4e55f751 |
children | dca51cd8147a |
rev | line source |
---|---|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import re |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import os.path |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
3 import copy |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 import logging |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
5 from werkzeug.utils import cached_property |
411
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
6 from piecrust.data.builder import ( |
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
7 DataBuildingContext, build_page_data, build_layout_data) |
324
65e6d72f3877
bake/serve: Fix how taxonomy index pages are setup and rendered.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
8 from piecrust.data.filters import ( |
515
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
9 PaginationFilter, SettingFilterClause, page_value_accessor) |
719
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
10 from piecrust.fastpickle import _pickle_object, _unpickle_object |
23
923699e816d0
Don't try to get the name of a source that doesn't have one.
Ludovic Chabant <ludovic@chabant.com>
parents:
12
diff
changeset
|
11 from piecrust.sources.base import PageSource |
153
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
12 from piecrust.templating.base import TemplateNotFoundError, TemplatingError |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
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 logger = logging.getLogger(__name__) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 content_abstract_re = re.compile(r'^<!--\s*(more|(page)?break)\s*-->\s*$', |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 re.MULTILINE) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 class PageRenderingError(Exception): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 pass |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 |
183
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
26 class TemplateEngineNotFound(Exception): |
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
27 pass |
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
28 |
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
29 |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
30 class QualifiedPage(object): |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
31 def __init__(self, page, route, route_metadata): |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
32 self.page = page |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
33 self.route = route |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
34 self.route_metadata = route_metadata |
834
10c482d57c79
Allow an individual page to override pretty_urls in it config
Ben Artin <ben@artins.org>
parents:
803
diff
changeset
|
35 self.pretty_urls = page.config.get("pretty_urls") |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
36 |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
37 def getUri(self, sub_num=1): |
430
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
427
diff
changeset
|
38 return self.route.getUri(self.route_metadata, sub_num=sub_num) |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
39 |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
40 def __getattr__(self, name): |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
41 return getattr(self.page, name) |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
42 |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
43 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
44 class RenderedSegments(object): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
45 def __init__(self, segments, render_pass_info): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
46 self.segments = segments |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
47 self.render_pass_info = render_pass_info |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
48 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
49 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
50 class RenderedLayout(object): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
51 def __init__(self, content, render_pass_info): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
52 self.content = content |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
53 self.render_pass_info = render_pass_info |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
54 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
55 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 class RenderedPage(object): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 def __init__(self, page, uri, num=1): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 self.page = page |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 self.uri = uri |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 self.num = num |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 self.data = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 self.content = None |
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
63 self.render_info = [None, None] |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 def app(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 return self.page.app |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
69 def copyRenderInfo(self): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
70 return copy.deepcopy(self.render_info) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
71 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 |
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
73 PASS_NONE = -1 |
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
74 PASS_FORMATTING = 0 |
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
75 PASS_RENDERING = 1 |
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
76 |
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
77 |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
78 RENDER_PASSES = [PASS_FORMATTING, PASS_RENDERING] |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
79 |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
80 |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
81 class RenderPassInfo(object): |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
82 def __init__(self): |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
83 self.used_source_names = set() |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
84 self.used_pagination = False |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
85 self.pagination_has_more = False |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
86 self.used_assets = False |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
87 self._custom_info = {} |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
88 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
89 def setCustomInfo(self, key, info): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
90 self._custom_info[key] = info |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
91 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
92 def getCustomInfo(self, key, default=None, create_if_missing=False): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
93 if create_if_missing: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
94 return self._custom_info.setdefault(key, default) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
95 return self._custom_info.get(key, default) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
96 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
97 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 class PageRenderingContext(object): |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
99 def __init__(self, qualified_page, page_num=1, |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
100 force_render=False, is_from_request=False): |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
101 self.page = qualified_page |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 self.page_num = page_num |
174
e9a3d405e18f
serve: Always force render the page being previewed.
Ludovic Chabant <ludovic@chabant.com>
parents:
158
diff
changeset
|
103 self.force_render = force_render |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
104 self.is_from_request = is_from_request |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 self.pagination_source = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 self.pagination_filter = None |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
719
diff
changeset
|
107 self.custom_data = {} |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
108 self.render_passes = [None, None] # Same length as RENDER_PASSES |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
109 self._current_pass = PASS_NONE |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
110 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 def app(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 return self.page.app |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 def source_metadata(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 return self.page.source_metadata |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
119 @cached_property |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
120 def uri(self): |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
121 return self.page.getUri(self.page_num) |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
122 |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
123 @property |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
124 def current_pass_info(self): |
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
125 if self._current_pass != PASS_NONE: |
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
126 return self.render_passes[self._current_pass] |
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
127 return None |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
128 |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
129 def setCurrentPass(self, rdr_pass): |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
130 if rdr_pass != PASS_NONE: |
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
131 self.render_passes[rdr_pass] = RenderPassInfo() |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
132 self._current_pass = rdr_pass |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
133 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 def setPagination(self, paginator): |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
135 self._raiseIfNoCurrentPass() |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
136 pass_info = self.current_pass_info |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
137 if pass_info.used_pagination: |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 raise Exception("Pagination has already been used.") |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
139 assert paginator.is_loaded |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
140 pass_info.used_pagination = True |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
141 pass_info.pagination_has_more = paginator.has_more |
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
142 self.addUsedSource(paginator._source) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 |
23
923699e816d0
Don't try to get the name of a source that doesn't have one.
Ludovic Chabant <ludovic@chabant.com>
parents:
12
diff
changeset
|
144 def addUsedSource(self, source): |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
145 self._raiseIfNoCurrentPass() |
23
923699e816d0
Don't try to get the name of a source that doesn't have one.
Ludovic Chabant <ludovic@chabant.com>
parents:
12
diff
changeset
|
146 if isinstance(source, PageSource): |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
147 pass_info = self.current_pass_info |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
148 pass_info.used_source_names.add(source.name) |
23
923699e816d0
Don't try to get the name of a source that doesn't have one.
Ludovic Chabant <ludovic@chabant.com>
parents:
12
diff
changeset
|
149 |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
150 def _raiseIfNoCurrentPass(self): |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
151 if self._current_pass == PASS_NONE: |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
152 raise Exception("No rendering pass is currently active.") |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
153 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 def render_page(ctx): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 eis = ctx.app.env.exec_info_stack |
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
157 eis.pushPage(ctx.page, ctx) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 # Build the data for both segment and layout rendering. |
586
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
160 with ctx.app.env.timerScope("BuildRenderData"): |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
161 page_data = _build_render_data(ctx) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 # Render content segments. |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
164 ctx.setCurrentPass(PASS_FORMATTING) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 repo = ctx.app.env.rendered_segments_repository |
411
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
166 save_to_fs = True |
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
167 if ctx.app.env.fs_cache_only_for_main_page and not eis.is_main_page: |
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
168 save_to_fs = False |
586
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
169 with ctx.app.env.timerScope("PageRenderSegments"): |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
170 if repo and not ctx.force_render: |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
171 render_result = repo.get( |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
172 ctx.uri, |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
173 lambda: _do_render_page_segments(ctx.page, page_data), |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
174 fs_cache_time=ctx.page.path_mtime, |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
175 save_to_fs=save_to_fs) |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
176 else: |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
177 render_result = _do_render_page_segments(ctx.page, page_data) |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
178 if repo: |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
179 repo.put(ctx.uri, render_result, save_to_fs) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 # Render layout. |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
182 page = ctx.page |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
183 ctx.setCurrentPass(PASS_RENDERING) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 layout_name = page.config.get('layout') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 if layout_name is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 layout_name = page.source.config.get('default_layout', 'default') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 null_names = ['', 'none', 'nil'] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 if layout_name not in null_names: |
586
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
189 with ctx.app.env.timerScope("BuildRenderData"): |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
190 build_layout_data(page, page_data, render_result['segments']) |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
191 |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
192 with ctx.app.env.timerScope("PageRenderLayout"): |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
193 layout_result = _do_render_layout(layout_name, page, page_data) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
194 else: |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
195 layout_result = { |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
196 'content': render_result['segments']['content'], |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
197 'pass_info': None} |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
198 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
199 rp = RenderedPage(page, ctx.uri, ctx.page_num) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
200 rp.data = page_data |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
201 rp.content = layout_result['content'] |
719
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
202 rp.render_info[PASS_FORMATTING] = _unpickle_object( |
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
203 render_result['pass_info']) |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
204 if layout_result['pass_info'] is not None: |
719
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
205 rp.render_info[PASS_RENDERING] = _unpickle_object( |
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
206 layout_result['pass_info']) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
207 return rp |
522
094bdf2f7c4c
serve: Say what page a rendering error happened in.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
208 except Exception as ex: |
715
a14371c5cda7
debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
209 if ctx.app.debug: |
a14371c5cda7
debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
210 raise |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
211 logger.exception(ex) |
574
bc23465ed1b4
bug: Fix a crash when some errors occur during page rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
522
diff
changeset
|
212 page_rel_path = os.path.relpath(ctx.page.path, ctx.app.root_dir) |
522
094bdf2f7c4c
serve: Say what page a rendering error happened in.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
213 raise Exception("Error rendering page: %s" % page_rel_path) from ex |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
214 finally: |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
215 ctx.setCurrentPass(PASS_NONE) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
216 eis.popPage() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
217 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
218 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
219 def render_page_segments(ctx): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
220 eis = ctx.app.env.exec_info_stack |
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
221 eis.pushPage(ctx.page, ctx) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
222 try: |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
223 ctx.setCurrentPass(PASS_FORMATTING) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
224 repo = ctx.app.env.rendered_segments_repository |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
225 save_to_fs = True |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
226 if ctx.app.env.fs_cache_only_for_main_page and not eis.is_main_page: |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
227 save_to_fs = False |
782
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
228 with ctx.app.env.timerScope("PageRenderSegments"): |
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
229 if repo and not ctx.force_render: |
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
230 render_result = repo.get( |
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
231 ctx.uri, |
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
232 lambda: _do_render_page_segments_from_ctx(ctx), |
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
233 fs_cache_time=ctx.page.path_mtime, |
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
234 save_to_fs=save_to_fs) |
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
235 else: |
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
236 render_result = _do_render_page_segments_from_ctx(ctx) |
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
237 if repo: |
df58592b40f8
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
238 repo.put(ctx.uri, render_result, save_to_fs) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
239 finally: |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
240 ctx.setCurrentPass(PASS_NONE) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
241 eis.popPage() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
242 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
243 rs = RenderedSegments( |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
244 render_result['segments'], |
719
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
245 _unpickle_object(render_result['pass_info'])) |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
246 return rs |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
247 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
248 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
249 def _build_render_data(ctx): |
419
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
250 with ctx.app.env.timerScope("PageDataBuild"): |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
251 data_ctx = DataBuildingContext(ctx.page, page_num=ctx.page_num) |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
252 data_ctx.pagination_source = ctx.pagination_source |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
253 data_ctx.pagination_filter = ctx.pagination_filter |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
254 page_data = build_page_data(data_ctx) |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
255 if ctx.custom_data: |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
430
diff
changeset
|
256 page_data._appendMapping(ctx.custom_data) |
419
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
257 return page_data |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
258 |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
259 |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
260 def _do_render_page_segments_from_ctx(ctx): |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
261 page_data = _build_render_data(ctx) |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
262 return _do_render_page_segments(ctx.page, page_data) |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
263 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
264 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
265 def _do_render_page_segments(page, page_data): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
266 app = page.app |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
267 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
268 cpi = app.env.exec_info_stack.current_page_info |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
269 assert cpi is not None |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
270 assert cpi.page == page |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
271 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
272 engine_name = page.config.get('template_engine') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
273 format_name = page.config.get('format') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
274 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
275 engine = get_template_engine(app, engine_name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
276 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
277 formatted_segments = {} |
578
683be25cbdb2
internal: Rename `raw_content` to `segments` since it's what it is.
Ludovic Chabant <ludovic@chabant.com>
parents:
574
diff
changeset
|
278 for seg_name, seg in page.segments.items(): |
5 | 279 seg_text = '' |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
280 for seg_part in seg.parts: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
281 part_format = seg_part.fmt or format_name |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
282 try: |
803
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
784
diff
changeset
|
283 with app.env.timerScope( |
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
784
diff
changeset
|
284 engine.__class__.__name__ + '_segment'): |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
440
diff
changeset
|
285 part_text = engine.renderSegmentPart( |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
440
diff
changeset
|
286 page.path, seg_part, page_data) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
287 except TemplatingError as err: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
288 err.lineno += seg_part.line |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
289 raise err |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
290 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
291 part_text = format_text(app, part_format, part_text) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 seg_text += part_text |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
293 formatted_segments[seg_name] = seg_text |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
294 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
295 if seg_name == 'content': |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
296 m = content_abstract_re.search(seg_text) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
297 if m: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
298 offset = m.start() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
299 content_abstract = seg_text[:offset] |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
300 formatted_segments['content.abstract'] = content_abstract |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
301 |
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
302 pass_info = cpi.render_ctx.render_passes[PASS_FORMATTING] |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
303 res = { |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
304 'segments': formatted_segments, |
719
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
305 'pass_info': _pickle_object(pass_info)} |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
306 return res |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
307 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
308 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
309 def _do_render_layout(layout_name, page, layout_data): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
310 cpi = page.app.env.exec_info_stack.current_page_info |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
311 assert cpi is not None |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
312 assert cpi.page == page |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
313 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
314 names = layout_name.split(',') |
427
3b658190c02b
performance: Compute default layout extensions only once.
Ludovic Chabant <ludovic@chabant.com>
parents:
419
diff
changeset
|
315 default_exts = page.app.env.default_layout_extensions |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 full_names = [] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
317 for name in names: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
318 if '.' not in name: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
319 for ext in default_exts: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
320 full_names.append(name + ext) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
321 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
322 full_names.append(name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
323 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
324 _, engine_name = os.path.splitext(full_names[0]) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
325 engine_name = engine_name.lstrip('.') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
326 engine = get_template_engine(page.app, engine_name) |
183
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
327 |
153
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
328 try: |
803
bf9f4e55f751
rendering: Separate performance timers for renering segments and layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
784
diff
changeset
|
329 with page.app.env.timerScope(engine.__class__.__name__ + '_layout'): |
784
6d8fe8e93a91
internal: Add missing timer scope.
Ludovic Chabant <ludovic@chabant.com>
parents:
782
diff
changeset
|
330 output = engine.renderFile(full_names, layout_data) |
153
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
331 except TemplateNotFoundError as ex: |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
332 logger.exception(ex) |
153
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
333 msg = "Can't find template for page: %s\n" % page.path |
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
334 msg += "Looked for: %s" % ', '.join(full_names) |
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
335 raise Exception(msg) from ex |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
336 |
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
337 pass_info = cpi.render_ctx.render_passes[PASS_RENDERING] |
719
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
338 res = {'content': output, 'pass_info': _pickle_object(pass_info)} |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
339 return res |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
340 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
341 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
342 def get_template_engine(app, engine_name): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
343 if engine_name == 'html': |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
344 engine_name = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
345 engine_name = engine_name or app.config.get('site/default_template_engine') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
346 for engine in app.plugin_loader.getTemplateEngines(): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
347 if engine_name in engine.ENGINE_NAMES: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
348 return engine |
183
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
349 raise TemplateEngineNotFound("No such template engine: %s" % engine_name) |
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
350 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
351 |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
352 def format_text(app, format_name, txt, exact_format=False): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
353 if exact_format and not format_name: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
354 raise Exception("You need to specify a format name.") |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
355 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
356 format_count = 0 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
357 format_name = format_name or app.config.get('site/default_format') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
358 for fmt in app.plugin_loader.getFormatters(): |
457
7d868afc6791
rendering: Truly skip formatters that are not enabled.
Ludovic Chabant <ludovic@chabant.com>
parents:
454
diff
changeset
|
359 if not fmt.enabled: |
7d868afc6791
rendering: Truly skip formatters that are not enabled.
Ludovic Chabant <ludovic@chabant.com>
parents:
454
diff
changeset
|
360 continue |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
361 if fmt.FORMAT_NAMES is None or format_name in fmt.FORMAT_NAMES: |
411
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
362 with app.env.timerScope(fmt.__class__.__name__): |
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
363 txt = fmt.render(format_name, txt) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
364 format_count += 1 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
365 if fmt.OUTPUT_FORMAT is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
366 format_name = fmt.OUTPUT_FORMAT |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
367 if exact_format and format_count == 0: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
368 raise Exception("No such format: %s" % format_name) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
369 return txt |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
370 |