annotate piecrust/data/linker.py @ 404:27b10024f8d8

linker: Add ability to return the parent and ancestors of a page. Add reference documentation. Add tests.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 24 May 2015 18:15:22 -0700
parents 043b9d8304c7
children fd8e39254da0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
1 import logging
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
2 import collections
381
4c9eab0e283b data: Fix problems with using non-existing metadata on a linked page.
Ludovic Chabant <ludovic@chabant.com>
parents: 368
diff changeset
3 from piecrust.data.base import PaginationData, LazyPageConfigLoaderHasNoValue
212
701591ebfcba data: Improve the Linker and RecursiveLinker features. Add tests.
Ludovic Chabant <ludovic@chabant.com>
parents: 172
diff changeset
4 from piecrust.data.iterators import PageIterator
242
f130365568ff internal: Code reorganization to put less stuff in `sources.base`.
Ludovic Chabant <ludovic@chabant.com>
parents: 237
diff changeset
5 from piecrust.sources.interfaces import IPaginationSource, IListableSource
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
6
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
7
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
8 logger = logging.getLogger(__name__)
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
9
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
10
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
11 class PageLinkerData(object):
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
12 """ Entry template data to get access to related pages from a given
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
13 root page.
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
14 """
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
15 def __init__(self, source, page_path):
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
16 self._source = source
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
17 self._root_page_path = page_path
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
18 self._linker = None
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
19
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
20 @property
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
21 def parent(self):
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
22 self._load()
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
23 return self._linker.parent
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
24
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
25 @property
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
26 def ancestors(self):
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
27 cur = self.parent
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
28 while cur:
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
29 yield cur
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
30 cur = cur.parent
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
31
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
32 @property
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
33 def siblings(self):
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
34 self._load()
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
35 return self._linker
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
36
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
37 @property
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
38 def children(self):
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
39 self._load()
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
40 self._linker._load()
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
41 if self._linker._self_item is None:
401
8e1e55ad35fb linker: Fix error when trying to list non-existing children.
Ludovic Chabant <ludovic@chabant.com>
parents: 381
diff changeset
42 return []
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
43 children = self._linker._self_item._linker_info.child_linker
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
44 if children is None:
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
45 return []
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
46 return children
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
47
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
48 @property
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
49 def root(self):
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
50 self._load()
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
51 return self._linker.root
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
52
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
53 def forpath(self, rel_path):
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
54 self._load()
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
55 return self._linker.forpath(rel_path)
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
56
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
57 def _load(self):
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
58 if self._linker is not None:
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
59 return
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
60
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
61 dir_path = self._source.getDirpath(self._root_page_path)
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
62 self._linker = Linker(self._source, dir_path,
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
63 root_page_path=self._root_page_path)
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
64
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
65
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
66 class LinkedPageData(PaginationData):
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
67 """ Class whose instances get returned when iterating on a `Linker`
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
68 or `RecursiveLinker`. It's just like what gets usually returned by
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
69 `Paginator` and other page iterators, but with a few additional data
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
70 like hierarchical data.
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
71 """
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
72 debug_render = ['is_dir', 'is_self'] + PaginationData.debug_render
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
73
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
74 def __init__(self, page):
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
75 super(LinkedPageData, self).__init__(page)
368
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
76 self.name = page._linker_info.name
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
77 self.is_self = page._linker_info.is_self
402
043b9d8304c7 linker: Fix linker returning the wrong value for `is_dir` in some situations.
Ludovic Chabant <ludovic@chabant.com>
parents: 401
diff changeset
78 self.is_dir = page._linker_info.is_dir
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
79 self.is_page = True
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
80 self._child_linker = page._linker_info.child_linker
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
81
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
82 self.mapLoader('*', self._linkerChildLoader)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
83
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
84 @property
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
85 def parent(self):
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
86 if self._child_linker is not None:
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
87 return self._child_linker.parent
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
88 print("No parent for ", self.url, self.title)
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
89 return None
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
90
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
91 @property
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
92 def children(self):
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
93 if self._child_linker is not None:
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
94 return self._child_linker
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
95 return []
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
96
381
4c9eab0e283b data: Fix problems with using non-existing metadata on a linked page.
Ludovic Chabant <ludovic@chabant.com>
parents: 368
diff changeset
97 def _linkerChildLoader(self, data, name):
4c9eab0e283b data: Fix problems with using non-existing metadata on a linked page.
Ludovic Chabant <ludovic@chabant.com>
parents: 368
diff changeset
98 if self.children and hasattr(self.children, name):
4c9eab0e283b data: Fix problems with using non-existing metadata on a linked page.
Ludovic Chabant <ludovic@chabant.com>
parents: 368
diff changeset
99 return getattr(self.children, name)
4c9eab0e283b data: Fix problems with using non-existing metadata on a linked page.
Ludovic Chabant <ludovic@chabant.com>
parents: 368
diff changeset
100 raise LazyPageConfigLoaderHasNoValue
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
101
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
102
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
103 class LinkedPageDataBuilderIterator(object):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
104 """ Iterator that builds `LinkedPageData` out of pages.
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
105 """
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
106 def __init__(self, it):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
107 self.it = it
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
108
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
109 def __iter__(self):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
110 for item in self.it:
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
111 yield LinkedPageData(item)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113
227
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
114 class LinkerSource(IPaginationSource):
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
115 """ Source iterator that returns pages given by `Linker`.
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
116 """
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
117 def __init__(self, pages, orig_source):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
118 self._pages = list(pages)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
119 self._orig_source = None
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
120 if isinstance(orig_source, IPaginationSource):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
121 self._orig_source = orig_source
227
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
122
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
123 def getItemsPerPage(self):
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
124 raise NotImplementedError()
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
125
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
126 def getSourceIterator(self):
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
127 return self._pages
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
128
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
129 def getSorterIterator(self, it):
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
130 # We don't want to sort the pages -- we expect the original source
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
131 # to return hierarchical items in the order it wants already.
227
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
132 return None
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
133
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
134 def getTailIterator(self, it):
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
135 return LinkedPageDataBuilderIterator(it)
227
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
136
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
137 def getPaginationFilter(self, page):
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
138 return None
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
139
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
140 def getSettingAccessor(self):
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
141 if self._orig_source:
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
142 return self._orig_source.getSettingAccessor()
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
143 return None
212
701591ebfcba data: Improve the Linker and RecursiveLinker features. Add tests.
Ludovic Chabant <ludovic@chabant.com>
parents: 172
diff changeset
144
701591ebfcba data: Improve the Linker and RecursiveLinker features. Add tests.
Ludovic Chabant <ludovic@chabant.com>
parents: 172
diff changeset
145
368
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
146 class _LinkerInfo(object):
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
147 def __init__(self):
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
148 self.name = None
402
043b9d8304c7 linker: Fix linker returning the wrong value for `is_dir` in some situations.
Ludovic Chabant <ludovic@chabant.com>
parents: 401
diff changeset
149 self.is_dir = False
368
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
150 self.is_self = False
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
151 self.child_linker = None
368
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
152
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
153
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
154 class _LinkedPage(object):
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
155 def __init__(self, page):
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
156 self._page = page
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
157 self._linker_info = _LinkerInfo()
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
158
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
159 def __getattr__(self, name):
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
160 return getattr(self._page, name)
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
161
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
162
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163 class Linker(object):
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
164 debug_render_doc = """Provides access to sibling and children pages."""
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
165
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
166 def __init__(self, source, dir_path, *, root_page_path=None):
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
167 self._source = source
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
168 self._dir_path = dir_path
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
169 self._root_page_path = root_page_path
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
170 self._items = None
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
171 self._parent = None
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
172 self._self_item = None
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
173
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
174 self.is_dir = True
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
175 self.is_page = False
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
176 self.is_self = False
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
177
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
178 def __iter__(self):
227
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
179 return iter(self.pages)
212
701591ebfcba data: Improve the Linker and RecursiveLinker features. Add tests.
Ludovic Chabant <ludovic@chabant.com>
parents: 172
diff changeset
180
227
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
181 def __getattr__(self, name):
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
182 self._load()
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
183 try:
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
184 item = self._items[name]
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
185 except KeyError:
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
186 raise AttributeError()
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
187
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
188 if isinstance(item, Linker):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
189 return item
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
190
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
191 return LinkedPageData(item)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
192
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
193 def __str__(self):
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
194 return self.name
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
195
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
196 @property
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
197 def name(self):
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
198 return self._source.getBasename(self._dir_path)
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
199
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
200 @property
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
201 def children(self):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
202 return self._iterItems(0)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
203
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
204 @property
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
205 def parent(self):
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
206 if self._dir_path == '':
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
207 return None
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
208
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
209 if self._parent is None:
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
210 parent_name = self._source.getBasename(self._dir_path)
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
211 parent_dir_path = self._source.getDirpath(self._dir_path)
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
212 for is_dir, name, data in self._source.listPath(parent_dir_path):
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
213 if not is_dir and name == parent_name:
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
214 parent_page = data.buildPage()
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
215 item = _LinkedPage(parent_page)
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
216 item._linker_info.name = parent_name
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
217 item._linker_info.child_linker = Linker(
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
218 self._source, parent_dir_path,
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
219 root_page_path=self._root_page_path)
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
220 self._parent = LinkedPageData(item)
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
221 break
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
222 else:
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
223 self._parent = Linker(self._source, parent_dir_path,
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
224 root_page_path=self._root_page_path)
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
225
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
226 return self._parent
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
227
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
228 @property
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
229 def pages(self):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
230 return self._iterItems(0, filter_page_items)
227
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
231
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
232 @property
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
233 def directories(self):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
234 return self._iterItems(0, filter_directory_items)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
235
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
236 @property
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
237 def all(self):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
238 return self._iterItems()
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
239
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
240 @property
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
241 def allpages(self):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
242 return self._iterItems(-1, filter_page_items)
227
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
243
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
244 @property
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
245 def alldirectories(self):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
246 return self._iterItems(-1, filter_directory_items)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
247
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
248 @property
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
249 def root(self):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
250 return self.forpath('/')
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
251
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
252 def forpath(self, rel_path):
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
253 return Linker(self._source, rel_path,
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
254 root_page_path=self._root_page_path)
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
255
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
256 def _iterItems(self, max_depth=-1, filter_func=None):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
257 items = walk_linkers(self, max_depth=max_depth,
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
258 filter_func=filter_func)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
259 src = LinkerSource(items, self._source)
227
d6d0e4976beb data: Make the `Linekr` use the new `getSettingAccessor` API.
Ludovic Chabant <ludovic@chabant.com>
parents: 212
diff changeset
260 return PageIterator(src)
212
701591ebfcba data: Improve the Linker and RecursiveLinker features. Add tests.
Ludovic Chabant <ludovic@chabant.com>
parents: 172
diff changeset
261
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
262 def _load(self):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
263 if self._items is not None:
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
264 return
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
265
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
266 is_listable = isinstance(self._source, IListableSource)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
267 if not is_listable:
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
268 raise Exception("Source '%s' can't be listed." % self._source.name)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
269
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
270 items = list(self._source.listPath(self._dir_path))
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
271 self._items = collections.OrderedDict()
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
272 with self._source.app.env.page_repository.startBatchGet():
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
273 for is_dir, name, data in items:
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
274 # If `is_dir` is true, `data` will be the directory's source
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
275 # path. If not, it will be a page factory.
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
276 if is_dir:
404
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
277 item = Linker(self._source, data,
27b10024f8d8 linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents: 402
diff changeset
278 root_page_path=self._root_page_path)
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
279 else:
368
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
280 page = data.buildPage()
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
281 is_self = (page.rel_path == self._root_page_path)
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
282 item = _LinkedPage(page)
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
283 item._linker_info.name = name
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
284 item._linker_info.is_self = is_self
247
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
285 if is_self:
d9d5c5de02a8 data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
286 self._self_item = item
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
287
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
288 existing = self._items.get(name)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
289 if existing is None:
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
290 self._items[name] = item
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
291 elif is_dir:
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
292 # The current item is a directory. The existing item
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
293 # should be a page.
368
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
294 existing._linker_info.child_linker = item
402
043b9d8304c7 linker: Fix linker returning the wrong value for `is_dir` in some situations.
Ludovic Chabant <ludovic@chabant.com>
parents: 401
diff changeset
295 existing._linker_info.is_dir = True
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
296 else:
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
297 # The current item is a page. The existing item should
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
298 # be a directory.
368
2408eb6f4da8 linker: Don't put linker stuff in the config.
Ludovic Chabant <ludovic@chabant.com>
parents: 250
diff changeset
299 item._linker_info.child_linker = existing
402
043b9d8304c7 linker: Fix linker returning the wrong value for `is_dir` in some situations.
Ludovic Chabant <ludovic@chabant.com>
parents: 401
diff changeset
300 item._linker_info.is_dir = True
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
301 self._items[name] = item
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
302
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
303
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
304 def filter_page_items(item):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
305 return not isinstance(item, Linker)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
306
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
307
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
308 def filter_directory_items(item):
401
8e1e55ad35fb linker: Fix error when trying to list non-existing children.
Ludovic Chabant <ludovic@chabant.com>
parents: 381
diff changeset
309 return isinstance(item, Linker)
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
310
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
311
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
312 def walk_linkers(linker, depth=0, max_depth=-1, filter_func=None):
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
313 linker._load()
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
314 for item in linker._items.values():
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
315 if not filter_func or filter_func(item):
172
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
316 yield item
4fc1d306046b linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
317
237
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
318 if (isinstance(item, Linker) and
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
319 (max_depth < 0 or depth + 1 <= max_depth)):
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
320 yield from walk_linkers(item, depth + 1, max_depth)
879fe1457e48 data: `Linker` refactor.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
321