--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/qmsk_www_pages/pages.py Sun Sep 14 00:59:07 2014 +0300
@@ -0,0 +1,101 @@
+from django.conf import settings
+
+import codecs
+import logging; log = logging.getLogger('qmsk_www_pages.pages')
+import os, os.path
+
+class Page (object):
+ ENCODING = 'utf-8'
+
+ @classmethod
+ def lookup (cls, page):
+ """
+ Lookup a Page from disk.
+
+ Returns None if there is no such page.
+ """
+
+ log.info("page=%r", page)
+
+ root = settings.QMSK_WWW_PAGES_DIR
+
+ if page:
+ parts = page.split('/')
+ else:
+ parts = [ ]
+
+ if parts:
+ page_name = parts.pop(-1)
+ else:
+ page_name = ''
+
+ 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
+
+ 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:
+ return None
+
+ return page_type(page_path, page_name)
+
+ def __init__ (self, path, name, encoding=ENCODING):
+ self.path = path
+ self.name = name
+ self.encoding = encoding
+
+ def open (self):
+ return codecs.open(self.path, encoding=self.encoding)
+
+ def render (self, request):
+ raise NotImplementedError()
+
+class HTML_Page (Page):
+ def render (self, request):
+ return self.open().read()
+
+TYPES = {
+ 'html': HTML_Page,
+}