Mercurial > piecrust2
changeset 247:d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
The `family` object is special in that it's "attached" to the current page, so make an object dedicated to that. It removes special code in `Linker`, and makes it possible to go `family.children` directly to get a page's children (i.e. pages in a directory of the same name).
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 19 Feb 2015 23:33:54 -0800 |
parents | f130365568ff |
children | 3f740928043a |
files | piecrust/data/builder.py piecrust/data/linker.py |
diffstat | 2 files changed, 44 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/piecrust/data/builder.py Wed Feb 18 18:35:03 2015 -0800 +++ b/piecrust/data/builder.py Thu Feb 19 23:33:54 2015 -0800 @@ -5,7 +5,7 @@ from piecrust.configuration import merge_dicts from piecrust.data.assetor import Assetor from piecrust.data.debug import build_debug_info -from piecrust.data.linker import Linker +from piecrust.data.linker import PageLinkerData from piecrust.data.paginator import Paginator from piecrust.uriutil import get_slug, get_first_sub_uri @@ -36,13 +36,13 @@ paginator = Paginator(page, pgn_source, first_uri, ctx.page_num, ctx.pagination_filter) assetor = Assetor(page, first_uri) - recursive_linker = Linker(page.source, page_path=page.rel_path) + linker = PageLinkerData(page.source, page.rel_path) data = { 'piecrust': pc_data, 'page': dict(page.config.get()), 'assets': assetor, 'pagination': paginator, - 'family': recursive_linker + 'family': linker } page_data = data['page'] page_data['url'] = ctx.uri
--- a/piecrust/data/linker.py Wed Feb 18 18:35:03 2015 -0800 +++ b/piecrust/data/linker.py Thu Feb 19 23:33:54 2015 -0800 @@ -9,6 +9,33 @@ logger = logging.getLogger(__name__) +class PageLinkerData(object): + """ Entry template data to get access to related pages from a given + root page. + """ + def __init__(self, source, page_path): + self._linker = Linker(source, page_path) + + @property + def siblings(self): + return self._linker + + @property + def children(self): + self._linker._load() + print("GOT ", self._linker._items.keys()) + if self._linker._self_item is None: + return None + return self._linker._self_item.config.get('__linker_child') + + @property + def root(self): + return self._linker.root + + def forpath(self, rel_path): + return self._linker.forpath(rel_path) + + class LinkedPageData(PaginationData): """ Class whose instances get returned when iterating on a `Linker` or `RecursiveLinker`. It's just like what gets usually returned by @@ -77,12 +104,13 @@ class Linker(object): debug_render_doc = """Provides access to sibling and children pages.""" - def __init__(self, source, *, name=None, dir_path=None, page_path=None): + def __init__(self, source, root_page_path, *, name=None, dir_path=None): self._source = source + self._root_page_path = root_page_path self._name = name self._dir_path = dir_path - self._root_page_path = page_path self._items = None + self._self_item = None self.is_dir = True self.is_page = False @@ -138,9 +166,8 @@ return self.forpath('/') def forpath(self, rel_path): - return Linker(self._source, - name='.', dir_path=rel_path, - page_path=self._root_page_path) + return Linker(self._source, self._root_page_path, + name='.', dir_path=rel_path) def _iterItems(self, max_depth=-1, filter_func=None): items = walk_linkers(self, max_depth=max_depth, @@ -156,11 +183,10 @@ if not is_listable: raise Exception("Source '%s' can't be listed." % self._source.name) - if self._root_page_path is not None: - if self._name is None: - self._name = self._source.getBasename(self._root_page_path) - if self._dir_path is None: - self._dir_path = self._source.getDirpath(self._root_page_path) + if self._name is None: + self._name = self._source.getBasename(self._root_page_path) + if self._dir_path is None: + self._dir_path = self._source.getDirpath(self._root_page_path) if self._dir_path is None: raise Exception("This linker has no directory to start from.") @@ -172,13 +198,15 @@ # If `is_dir` is true, `data` will be the directory's source # path. If not, it will be a page factory. if is_dir: - item = Linker(self._source, + item = Linker(self._source, self._root_page_path, name=name, dir_path=data) else: item = data.buildPage() + is_self = (item.rel_path == self._root_page_path) item.config.set('__linker_name', name) - item.config.set('__linker_is_self', - item.rel_path == self._root_page_path) + item.config.set('__linker_is_self', is_self) + if is_self: + self._self_item = item existing = self._items.get(name) if existing is None: