from django.conf import settings
import codecs
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'
@classmethod
def lookup (cls, page):
"""
Lookup a Page from disk.
Returns None if there is no such page.
"""
log.info("page=%r", page)
if page:
parts = page.split('/')
else:
parts = [ ]
if parts:
page_name = parts.pop(-1)
tree_parts = parts
else:
page_name = ''
tree_parts = []
if not page_name:
page_name = 'index'
# scan dir
tree = Tree.lookup(tree_parts)
if not tree:
return None
# scan page
page = tree.page(page_name)
if not page:
return None
return page
def __init__ (self, path, name, tree, encoding=ENCODING):
self.path = path
self.name = name
self.tree = tree
self.encoding = encoding
def open (self):
return codecs.open(self.path, encoding=self.encoding)
def breadcrumb (self):
path = []
for part in self.tree.parts + [ self.name ]:
path.append(part)
yield '/'.join(path), part
def render (self, request):
raise NotImplementedError()
class HTML_Page (Page):
def render (self, request):
return self.open().read()
TYPES = {
'html': HTML_Page,
}