Mercurial > piecrust2
annotate piecrust/rendering.py @ 721:234d0c7c02cf
bake: Add the timestamp of the page to each record entry.
| author | Ludovic Chabant <ludovic@chabant.com> |
|---|---|
| date | Sun, 29 May 2016 20:15:30 -0700 |
| parents | a066f4ac9094 |
| children | 606f6d57b5df |
| 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 |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
35 |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
36 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
|
37 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
|
38 |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
39 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
|
40 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
|
41 |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
42 |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
43 class RenderedSegments(object): |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
44 def __init__(self, segments, render_pass_info): |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
45 self.segments = segments |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
46 self.render_pass_info = render_pass_info |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
47 |
|
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 class RenderedLayout(object): |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
50 def __init__(self, content, render_pass_info): |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
51 self.content = content |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
52 self.render_pass_info = render_pass_info |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
53 |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
54 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 class RenderedPage(object): |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 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
|
57 self.page = page |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 self.uri = uri |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 self.num = num |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 self.data = None |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 self.content = None |
|
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
62 self.render_info = [None, None] |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 @property |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 def app(self): |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 return self.page.app |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
68 def copyRenderInfo(self): |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
69 return copy.deepcopy(self.render_info) |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
70 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 |
|
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
72 PASS_NONE = -1 |
|
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
73 PASS_FORMATTING = 0 |
|
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
74 PASS_RENDERING = 1 |
|
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
75 |
|
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
76 |
|
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
77 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
|
78 |
|
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 class RenderPassInfo(object): |
|
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
81 def __init__(self): |
|
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
82 self.used_source_names = set() |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
83 self.used_pagination = False |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
84 self.pagination_has_more = False |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
85 self.used_assets = False |
|
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
86 self._custom_info = {} |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
87 |
|
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
88 def setCustomInfo(self, key, info): |
|
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
89 self._custom_info[key] = info |
|
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
90 |
|
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
91 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
|
92 if create_if_missing: |
|
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
93 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
|
94 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
|
95 |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
96 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 class PageRenderingContext(object): |
|
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
98 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
|
99 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
|
100 self.page = qualified_page |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 self.page_num = page_num |
|
174
e9a3d405e18f
serve: Always force render the page being previewed.
Ludovic Chabant <ludovic@chabant.com>
parents:
158
diff
changeset
|
102 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
|
103 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
|
104 self.pagination_source = None |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 self.pagination_filter = None |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 self.custom_data = None |
|
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
107 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
|
108 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
|
109 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 @property |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 def app(self): |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 return self.page.app |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 @property |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 def source_metadata(self): |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 return self.page.source_metadata |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 |
|
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
118 @cached_property |
|
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
119 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
|
120 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
|
121 |
|
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
122 @property |
|
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
123 def current_pass_info(self): |
|
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
124 if self._current_pass != PASS_NONE: |
|
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
125 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
|
126 return None |
|
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
127 |
|
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
128 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
|
129 if rdr_pass != PASS_NONE: |
|
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
130 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
|
131 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
|
132 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 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
|
134 self._raiseIfNoCurrentPass() |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
135 pass_info = self.current_pass_info |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
136 if pass_info.used_pagination: |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 raise Exception("Pagination has already been used.") |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
138 assert paginator.is_loaded |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
139 pass_info.used_pagination = True |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
140 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
|
141 self.addUsedSource(paginator._source) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 |
|
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
|
143 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
|
144 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
|
145 if isinstance(source, PageSource): |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
146 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
|
147 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
|
148 |
|
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
149 def _raiseIfNoCurrentPass(self): |
|
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
150 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
|
151 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
|
152 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 def render_page(ctx): |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 eis = ctx.app.env.exec_info_stack |
|
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
156 eis.pushPage(ctx.page, ctx) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 try: |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 # 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
|
159 with ctx.app.env.timerScope("BuildRenderData"): |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
160 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
|
161 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 # 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
|
163 ctx.setCurrentPass(PASS_FORMATTING) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 repo = ctx.app.env.rendered_segments_repository |
|
411
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
165 save_to_fs = True |
|
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
166 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
|
167 save_to_fs = False |
|
586
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
168 with ctx.app.env.timerScope("PageRenderSegments"): |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
169 if repo and not ctx.force_render: |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
170 render_result = repo.get( |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
171 ctx.uri, |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
172 lambda: _do_render_page_segments(ctx.page, page_data), |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
173 fs_cache_time=ctx.page.path_mtime, |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
174 save_to_fs=save_to_fs) |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
175 else: |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
176 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
|
177 if repo: |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
178 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
|
179 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 # Render layout. |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
181 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
|
182 ctx.setCurrentPass(PASS_RENDERING) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 layout_name = page.config.get('layout') |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 if layout_name is None: |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 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
|
186 null_names = ['', 'none', 'nil'] |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 if layout_name not in null_names: |
|
586
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
188 with ctx.app.env.timerScope("BuildRenderData"): |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
189 build_layout_data(page, page_data, render_result['segments']) |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
190 |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
191 with ctx.app.env.timerScope("PageRenderLayout"): |
|
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
192 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
|
193 else: |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
194 layout_result = { |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
195 'content': render_result['segments']['content'], |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
196 'pass_info': None} |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
197 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
198 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
|
199 rp.data = page_data |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
200 rp.content = layout_result['content'] |
|
719
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
201 rp.render_info[PASS_FORMATTING] = _unpickle_object( |
|
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
202 render_result['pass_info']) |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
203 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
|
204 rp.render_info[PASS_RENDERING] = _unpickle_object( |
|
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
205 layout_result['pass_info']) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 return rp |
|
522
094bdf2f7c4c
serve: Say what page a rendering error happened in.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
207 except Exception as ex: |
|
715
a14371c5cda7
debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
208 if ctx.app.debug: |
|
a14371c5cda7
debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
209 raise |
|
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
210 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
|
211 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
|
212 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
|
213 finally: |
|
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
214 ctx.setCurrentPass(PASS_NONE) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
215 eis.popPage() |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
216 |
|
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 def render_page_segments(ctx): |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
219 eis = ctx.app.env.exec_info_stack |
|
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
220 eis.pushPage(ctx.page, ctx) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
221 try: |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
222 ctx.setCurrentPass(PASS_FORMATTING) |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
223 repo = ctx.app.env.rendered_segments_repository |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
224 save_to_fs = True |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
225 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
|
226 save_to_fs = False |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
227 if repo and not ctx.force_render: |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
228 render_result = repo.get( |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
229 ctx.uri, |
|
419
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
230 lambda: _do_render_page_segments_from_ctx(ctx), |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
231 fs_cache_time=ctx.page.path_mtime, |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
232 save_to_fs=save_to_fs) |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
233 else: |
|
419
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
234 render_result = _do_render_page_segments_from_ctx(ctx) |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
235 if repo: |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
236 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
|
237 finally: |
|
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
238 ctx.setCurrentPass(PASS_NONE) |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
239 eis.popPage() |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
241 rs = RenderedSegments( |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
242 render_result['segments'], |
|
719
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
243 _unpickle_object(render_result['pass_info'])) |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
244 return rs |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
245 |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
246 |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
247 def _build_render_data(ctx): |
|
419
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
248 with ctx.app.env.timerScope("PageDataBuild"): |
|
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
249 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
|
250 data_ctx.pagination_source = ctx.pagination_source |
|
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
251 data_ctx.pagination_filter = ctx.pagination_filter |
|
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
252 page_data = build_page_data(data_ctx) |
|
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
253 if ctx.custom_data: |
|
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
430
diff
changeset
|
254 page_data._appendMapping(ctx.custom_data) |
|
419
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
255 return page_data |
|
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
256 |
|
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
257 |
|
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
258 def _do_render_page_segments_from_ctx(ctx): |
|
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
259 page_data = _build_render_data(ctx) |
|
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
260 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
|
261 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
262 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
263 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
|
264 app = page.app |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
265 |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
266 cpi = app.env.exec_info_stack.current_page_info |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
267 assert cpi is not None |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
268 assert cpi.page == page |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
269 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
270 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
|
271 format_name = page.config.get('format') |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
272 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
273 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
|
274 |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
275 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
|
276 for seg_name, seg in page.segments.items(): |
| 5 | 277 seg_text = '' |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
278 for seg_part in seg.parts: |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
279 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
|
280 try: |
|
411
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
281 with app.env.timerScope(engine.__class__.__name__): |
|
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
440
diff
changeset
|
282 part_text = engine.renderSegmentPart( |
|
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
440
diff
changeset
|
283 page.path, seg_part, page_data) |
|
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
284 except TemplatingError as err: |
|
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
285 err.lineno += seg_part.line |
|
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
286 raise err |
|
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
287 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
288 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
|
289 seg_text += part_text |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
290 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
|
291 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 if seg_name == 'content': |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
293 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
|
294 if m: |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
295 offset = m.start() |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
296 content_abstract = seg_text[:offset] |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
297 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
|
298 |
|
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
299 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
|
300 res = { |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
301 'segments': formatted_segments, |
|
719
a066f4ac9094
rendering: Use `fastpickle` serialization before JSON.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
302 'pass_info': _pickle_object(pass_info)} |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
303 return res |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
304 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
305 |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
306 def _do_render_layout(layout_name, page, layout_data): |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
307 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
|
308 assert cpi is not None |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
309 assert cpi.page == page |
|
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
310 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
311 names = layout_name.split(',') |
|
427
3b658190c02b
performance: Compute default layout extensions only once.
Ludovic Chabant <ludovic@chabant.com>
parents:
419
diff
changeset
|
312 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
|
313 full_names = [] |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
314 for name in names: |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 if '.' not in name: |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 for ext in default_exts: |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
317 full_names.append(name + ext) |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
318 else: |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
319 full_names.append(name) |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
320 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
321 _, 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
|
322 engine_name = engine_name.lstrip('.') |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
323 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
|
324 |
|
153
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
325 try: |
|
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
326 output = engine.renderFile(full_names, layout_data) |
|
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
327 except TemplateNotFoundError as ex: |
|
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
698
diff
changeset
|
328 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
|
329 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
|
330 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
|
331 raise Exception(msg) from ex |
|
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
332 |
|
698
33ab9badfd7a
render: Change how we store render passes info.
Ludovic Chabant <ludovic@chabant.com>
parents:
586
diff
changeset
|
333 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
|
334 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
|
335 return res |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
336 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
337 |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
338 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
|
339 if engine_name == 'html': |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
340 engine_name = None |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
341 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
|
342 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
|
343 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
|
344 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
|
345 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
|
346 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
347 |
|
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
348 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
|
349 if exact_format and not format_name: |
|
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
350 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
|
351 |
|
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
352 format_count = 0 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
353 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
|
354 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
|
355 if not fmt.enabled: |
|
7d868afc6791
rendering: Truly skip formatters that are not enabled.
Ludovic Chabant <ludovic@chabant.com>
parents:
454
diff
changeset
|
356 continue |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
357 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
|
358 with app.env.timerScope(fmt.__class__.__name__): |
|
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
359 txt = fmt.render(format_name, txt) |
|
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
360 format_count += 1 |
|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
361 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
|
362 format_name = fmt.OUTPUT_FORMAT |
|
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
363 if exact_format and format_count == 0: |
|
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
364 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
|
365 return txt |
|
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
366 |
