# HG changeset patch # User Ludovic Chabant # Date 1424417731 28800 # Node ID f1e8ed3ea141843c9355071b776b6598dc5f032e # Parent afc1d2c60854978ba920089305c719f7a6b6ce76# Parent 3f740928043a28117937e3d66d6ed8bd9beeee4b Merge code changes. diff -r afc1d2c60854 -r f1e8ed3ea141 piecrust/data/builder.py --- a/piecrust/data/builder.py Thu Feb 19 23:30:08 2015 -0800 +++ b/piecrust/data/builder.py Thu Feb 19 23:35:31 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 diff -r afc1d2c60854 -r f1e8ed3ea141 piecrust/data/linker.py --- a/piecrust/data/linker.py Thu Feb 19 23:30:08 2015 -0800 +++ b/piecrust/data/linker.py Thu Feb 19 23:35:31 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: diff -r afc1d2c60854 -r f1e8ed3ea141 piecrust/sources/autoconfig.py --- a/piecrust/sources/autoconfig.py Thu Feb 19 23:30:08 2015 -0800 +++ b/piecrust/sources/autoconfig.py Thu Feb 19 23:35:31 2015 -0800 @@ -254,10 +254,12 @@ items = [] names = sorted(os.listdir(path)) for name in names: + clean_name = self.re_pattern.sub('', name) + clean_name, _ = os.path.splitext(clean_name) if os.path.isdir(os.path.join(path, name)): if filter_page_dirname(name): rel_subdir = os.path.join(rel_path, name) - items.append((True, name, rel_subdir)) + items.append((True, clean_name, rel_subdir)) else: if filter_page_filename(name): slug = self._makeSlug(os.path.join(rel_path, name)) @@ -272,7 +274,7 @@ fac = PageFactory(self, fac_path, metadata) name, _ = os.path.splitext(name) - items.append((False, name, fac)) + items.append((False, clean_name, fac)) return items def _makeSlug(self, rel_path):