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(
path = page_path,
name = page_name,
parents = parts,
)
def __init__ (self, path, name, parents, encoding=ENCODING):
self.path = path
self.name = name
self.parents = parents
self.encoding = encoding
def open (self):
return codecs.open(self.path, encoding=self.encoding)
def breadcrumb (self):
path = []
for parent in self.parents + [ self.name ]:
path.append(parent)
yield '/'.join(path), parent
def render (self, request):
raise NotImplementedError()
class HTML_Page (Page):
def render (self, request):
return self.open().read()
TYPES = {
'html': HTML_Page,
}