lib/page.py
changeset 44 d09cc8b3709c
parent 28 b68145b5ce24
parent 43 fc11c4e86a82
child 45 e94ab812c0c8
--- a/lib/page.py	Sat Feb 07 05:12:57 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-
-"""
-    Handling page requests
-"""
-
-# for filesystem ops
-import os, os.path
-import time
-
-# for ResponseError
-import http
-
-# for TemplatePage
-import template
-
-from page_tree import page_tree
-import config
-
-# path to directory containing the page heirarcy
-PAGE_DIR = "pages"
-
-class PageError (http.ResponseError) :
-    """
-        Error looking up/handling a page
-    """
-
-    pass
-
-# XXX: should inherit from PageInfo
-class Page (object) :
-    """
-        This object represents the information about our attempt to render some specific page
-    """
-
-    def __init__ (self, url, path, basename, url_tail, charset='utf8') :
-        """
-            Initialize the page at the given location
-
-            @param url the URL leading to this page
-            @param path the filesystem path to this page's file
-            @param basename the filesystem name of this page's file, without the file extension
-            @param url_trail trailing URL for this page
-            @param charset file charset
-        """
-        
-        # store
-        self.url = url
-        self.path = path
-        self.basename = basename
-        self.url_tail = url_tail
-        self.charset = charset
-
-        # unbound
-        self.request = None
-
-        # sub-init
-        self._init()
-
-    def _init (self) :
-        """
-            Do initial data loading, etc
-        """
-        
-        pass
-
-    def bind_request (self, request) :
-        """
-            Bind this page-render to the given request
-        """
-
-        self.request = request
-
-    @property
-    def title (self) :
-        """
-            Return the page's title
-
-            Defaults to the retreiving the page title from page_list, or basename in Titlecase.
-        """
-        
-        # lookup in page_list
-        page_info = page_tree.get_page(self.url)
-        
-        # fallback to titlecase
-        if page_info :
-            title = page_info.title
-
-        else :
-            title = self.basename.title()
-
-        return title
-    
-    @property
-    def content (self) :
-        """
-            Return the page content as a string
-        """
-
-        abstract
-    
-    @property
-    def modified (self) :
-        """
-            Returns the page modification timestamp
-        """
-        
-        # stat
-        timestamp = os.stat(self.path).st_mtime
-
-        return time.strftime(config.DATETIME_FMT, time.gmtime(timestamp))
-
-class HTMLPage (Page) :
-    """
-        A simple .html page that's just passed through directly
-    """
-
-    @property
-    def content (self) :
-        """
-            Opens the .html file, reads and returns contents
-        """
-
-        return open(self.path, 'rb').read().decode(self.charset)
-
-class TemplatePage (Page) :
-    """
-        A template that's rendered using our template library
-    """
-    
-    @property
-    def content (self) :
-        """
-            Loads the .tmpl file, and renders it
-        """
-
-        return template.render_file(self.path,
-            request     = self.request,
-            page_tree   = page_tree
-        )
-
-# list of page handlers, by type
-TYPE_HANDLERS = [
-    ('html',                    HTMLPage        ),
-    (template.TEMPLATE_EXT,     TemplatePage    ),
-]
-
-def _lookup_handler (url, path, filename, basename, extension, tail) :
-    """
-        We found the file that we looked for, now get its handler
-    """
-
-    # find appropriate handler
-    for handler_ext, handler in TYPE_HANDLERS :
-        # match against file extension?
-        if handler_ext == extension :
-            # found handler, return instance
-            return handler(url, path, basename, tail)
-
-    # no handler found
-    raise PageError("No handler found for page %r of type %r" % (url, extension))
-
-def lookup (name) :
-    """
-        Look up and return a Page object for the given page, or raise an error
-    """
-
-    # inital path
-    path = PAGE_DIR
-    url_segments = []
-
-    # name segments
-    segments = name.split('/')
-
-    # iterate through the parts of the page segments
-    while True :
-        segment = None
-
-        # pop segment
-        if segments :
-            segment = segments.pop(0)
-
-            url_segments.append(segment)
-
-        # translate empty -> index
-        if not segment :
-            segment = 'index'
-
-        # look for it in the dir
-        for filename in os.listdir(path) :
-            # build full file path
-            file_path = os.path.join(path, filename)
-
-            # stat, recurse into subdirectory?
-            if os.path.isdir(file_path) and filename == segment :
-                # use new dir
-                path = file_path
-
-                # break for-loop to look at next segment
-                break
- 
-            # split into basename + extension
-            basename, extension = os.path.splitext(filename)
-
-            # ...remove that dot
-            extension = extension.lstrip('.')
-            
-            # match against requested page name?
-            if basename == segment :
-                # found the file we wanted
-                return _lookup_handler('/'.join(url_segments), file_path, filename, basename, extension, '/'.join(segments))
-            
-            else :
-                # inspect next file in dir
-                continue
-
-        else :
-            # did not find any dir or file, break out of while loop
-            break
-
-    # did not find the filename we were looking for in os.listdir
-    raise PageError("Page not found: %s" % name, status='404 Not Found')
-