changeset 249:f1e8ed3ea141

Merge code changes.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 19 Feb 2015 23:35:31 -0800
parents afc1d2c60854 (current diff) 3f740928043a (diff)
children f250e3c486e4
files
diffstat 3 files changed, 48 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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:
--- 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):