pages: Tree
authorTero Marttila <terom@paivola.fi>
Sun, 14 Sep 2014 01:17:41 +0300
changeset 199 9fd827df377f
parent 198 66cf32a10222
child 200 1757261f2b95
pages: Tree
qmsk_www_pages/pages.py
--- a/qmsk_www_pages/pages.py	Sun Sep 14 01:07:54 2014 +0300
+++ b/qmsk_www_pages/pages.py	Sun Sep 14 01:17:41 2014 +0300
@@ -4,6 +4,70 @@
 import logging; log = logging.getLogger('qmsk_www_pages.pages')
 import os, os.path
 
+class Tree (object):
+    @classmethod
+    def lookup (cls, parts):
+        path = settings.QMSK_WWW_PAGES_DIR
+
+        for part in parts:
+            if part.startswith('.'):
+                # evil
+                return None
+            
+            if not part:
+                continue
+        
+            path = os.path.join(path, part)
+
+            if not os.path.exists(path):
+                return None
+            
+            if not os.path.isdir(path):
+                return None
+        
+        return cls(path, parts)
+
+    def __init__ (self, path, parts):
+        self.path = path
+        self.parts = parts
+
+    def page (self, name):
+        """
+            Scans through tree looking for a matching page.
+            
+            Returns Page.
+        """
+
+        page_type = None
+
+        for filename in os.listdir(self.path):
+            if filename.startswith('.'):
+                continue
+            
+            if '.' not in filename:
+                continue
+
+            file_name, file_type = filename.rsplit('.', 1)
+            path = os.path.join(self.path, filename)
+
+            if not file_name:
+                continue
+
+            if file_name != name:
+                continue
+            
+            # page_name matches
+            page_type = TYPES.get(file_type)
+
+            if not page_type:
+                continue
+
+            return page_type(
+                path    = path,
+                name    = name,
+                tree    = self,
+            )
+
 class Page (object):
     ENCODING = 'utf-8'
 
@@ -17,8 +81,6 @@
         
         log.info("page=%r", page)
 
-        root = settings.QMSK_WWW_PAGES_DIR
-
         if page:
             parts = page.split('/')
         else:
@@ -26,69 +88,32 @@
             
         if parts:
             page_name = parts.pop(-1)
+            tree_parts = parts
         else:
             page_name = ''
+            tree_parts = []
 
         if not page_name:
             page_name = 'index'
 
         # scan dir
-        dirpath = root
-
-        for part in parts:
-            if part.startswith('.'):
-                # evil
-                return None
-            
-            if not part:
-                continue
-        
-            dirpath = os.path.join(dirpath, part)
-
-            if not os.path.exists(dirpath):
-                return None
-            
-            if not os.path.isdir(dirpath):
-                return None
-
-        # scan for page
-        page_type = None
+        tree = Tree.lookup(tree_parts)
 
-        for filename in os.listdir(dirpath):
-            if filename.startswith('.'):
-                continue
-            
-            if '.' not in filename:
-                continue
-
-            file_name, file_type = filename.rsplit('.', 1)
-            page_path = os.path.join(dirpath, filename)
-
-            if not file_name:
-                continue
-
-            if file_name != page_name:
-                continue
-            
-            # page_name matches
-            page_type = TYPES.get(file_type)
-
-            if page_type:
-                break
-
-        if not page_type:
+        if not tree:
             return None
 
-        return page_type(
-            path    = page_path,
-            name    = page_name,
-            parents = parts,
-        )
+        # scan page
+        page = tree.page(page_name)
 
-    def __init__ (self, path, name, parents, encoding=ENCODING):
+        if not page:
+            return None
+
+        return page
+
+    def __init__ (self, path, name, tree, encoding=ENCODING):
         self.path = path
         self.name = name
-        self.parents = parents
+        self.tree = tree
         self.encoding = encoding
 
     def open (self):
@@ -97,10 +122,10 @@
     def breadcrumb (self):
         path = []
 
-        for parent in self.parents + [ self.name ]:
-            path.append(parent)
+        for part in self.tree.parts + [ self.name ]:
+            path.append(part)
 
-            yield '/'.join(path), parent
+            yield '/'.join(path), part
 
     def render (self, request):
         raise NotImplementedError()