--- 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()