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)