Mercurial > piecrust2
comparison piecrust/data/linker.py @ 368:2408eb6f4da8
linker: Don't put linker stuff in the config.
Now that we want to deep-copy configuration, we can't put objects in there.
We create a wrapper for pages that will store linker-specific objects in
a separate attribute.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 03 May 2015 18:43:28 -0700 |
parents | 311447fe3dd0 |
children | 4c9eab0e283b |
comparison
equal
deleted
inserted
replaced
367:734f2abf361c | 368:2408eb6f4da8 |
---|---|
23 @property | 23 @property |
24 def children(self): | 24 def children(self): |
25 self._linker._load() | 25 self._linker._load() |
26 if self._linker._self_item is None: | 26 if self._linker._self_item is None: |
27 return None | 27 return None |
28 return self._linker._self_item.config.get('__linker_child') | 28 return self._linker._self_item._linker_info.child_linker |
29 | 29 |
30 @property | 30 @property |
31 def root(self): | 31 def root(self): |
32 return self._linker.root | 32 return self._linker.root |
33 | 33 |
43 """ | 43 """ |
44 debug_render = ['is_dir', 'is_self'] + PaginationData.debug_render | 44 debug_render = ['is_dir', 'is_self'] + PaginationData.debug_render |
45 | 45 |
46 def __init__(self, page): | 46 def __init__(self, page): |
47 super(LinkedPageData, self).__init__(page) | 47 super(LinkedPageData, self).__init__(page) |
48 self.name = page.config.get('__linker_name') | 48 self.name = page._linker_info.name |
49 self.is_self = page.config.get('__linker_is_self') | 49 self.is_self = page._linker_info.is_self |
50 self.children = page.config.get('__linker_child') | 50 self.children = page._linker_info.child_linker |
51 self.is_dir = (self.children is not None) | 51 self.is_dir = (self.children is not None) |
52 self.is_page = True | 52 self.is_page = True |
53 | 53 |
54 self.mapLoader('*', self._linkerChildLoader) | 54 self.mapLoader('*', self._linkerChildLoader) |
55 | 55 |
96 | 96 |
97 def getSettingAccessor(self): | 97 def getSettingAccessor(self): |
98 if self._orig_source: | 98 if self._orig_source: |
99 return self._orig_source.getSettingAccessor() | 99 return self._orig_source.getSettingAccessor() |
100 return None | 100 return None |
101 | |
102 | |
103 class _LinkerInfo(object): | |
104 def __init__(self): | |
105 self.name = None | |
106 self.is_self = False | |
107 self.child_linker = None | |
108 | |
109 | |
110 class _LinkedPage(object): | |
111 def __init__(self, page): | |
112 self._page = page | |
113 self._linker_info = _LinkerInfo() | |
114 | |
115 def __getattr__(self, name): | |
116 return getattr(self._page, name) | |
101 | 117 |
102 | 118 |
103 class Linker(object): | 119 class Linker(object): |
104 debug_render_doc = """Provides access to sibling and children pages.""" | 120 debug_render_doc = """Provides access to sibling and children pages.""" |
105 | 121 |
198 # path. If not, it will be a page factory. | 214 # path. If not, it will be a page factory. |
199 if is_dir: | 215 if is_dir: |
200 item = Linker(self._source, self._root_page_path, | 216 item = Linker(self._source, self._root_page_path, |
201 name=name, dir_path=data) | 217 name=name, dir_path=data) |
202 else: | 218 else: |
203 item = data.buildPage() | 219 page = data.buildPage() |
204 is_self = (item.rel_path == self._root_page_path) | 220 is_self = (page.rel_path == self._root_page_path) |
205 item.config.set('__linker_name', name) | 221 item = _LinkedPage(page) |
206 item.config.set('__linker_is_self', is_self) | 222 item._linker_info.name = name |
223 item._linker_info.is_self = is_self | |
207 if is_self: | 224 if is_self: |
208 self._self_item = item | 225 self._self_item = item |
209 | 226 |
210 existing = self._items.get(name) | 227 existing = self._items.get(name) |
211 if existing is None: | 228 if existing is None: |
212 self._items[name] = item | 229 self._items[name] = item |
213 elif is_dir: | 230 elif is_dir: |
214 # The current item is a directory. The existing item | 231 # The current item is a directory. The existing item |
215 # should be a page. | 232 # should be a page. |
216 existing.config.set('__linker_child', item) | 233 existing._linker_info.child_linker = item |
217 else: | 234 else: |
218 # The current item is a page. The existing item should | 235 # The current item is a page. The existing item should |
219 # be a directory. | 236 # be a directory. |
220 item.config.set('__linker_child', existing) | 237 item._linker_info.child_linker = existing |
221 self._items[name] = item | 238 self._items[name] = item |
222 | 239 |
223 | 240 |
224 def filter_page_items(item): | 241 def filter_page_items(item): |
225 return not isinstance(item, Linker) | 242 return not isinstance(item, Linker) |