terom@2: terom@2: import os.path terom@2: terom@2: def get_site_url (script_name) : terom@2: """ terom@2: Get the URL that points to the site root (i.e. where style.css is) using the given value of SCRIPT_NAME terom@2: terom@2: /foo/bar/quux.py -> /foo terom@2: /~terom/qmsk.net/site/index.py -> /~terom/qmsk.net terom@2: None -> / terom@2: """ terom@2: terom@2: if script_name : terom@2: return os.path.dirname(os.path.dirname(script_name)) terom@2: else : terom@2: return "/" terom@2: terom@2: def get_page_path (path_info, default) : terom@2: """ terom@2: Get the path of the page that was requested, or the given default is empty/invalid. terom@2: The path will never begin with an /. terom@2: terom@2: /quux -> quux terom@2: / -> terom@2: None -> terom@2: """ terom@2: terom@2: if path_info : terom@2: # remove prefixed slashes terom@2: path_info = path_info.lstrip('/') terom@2: terom@2: if path_info : terom@2: return path_info terom@2: else : terom@2: return default terom@2: terom@2: terom@2: class Request (object) : terom@2: # The name of the site itself, this can be used to reference e.g. style.css terom@2: site_url = None terom@2: terom@2: # The page root url, for links to pages terom@2: page_root = None terom@2: terom@2: # The full path to the requested page terom@2: page_path = None terom@2: terom@2: def __init__ (self, environ, default_page='main') : terom@2: self.site_url = get_site_url(environ.get("SCRIPT_NAME")) terom@2: self.page_root = environ.get("SCRIPT_NAME") terom@2: self.page_path = get_page_path(environ.get("PATH_INFO"), default_page) terom@2: terom@2: def page_name_parts (self) : terom@2: """ terom@2: Returns a list of page name components terom@2: """ terom@2: terom@2: return self.page_path.split('/') terom@2: terom@2: def page_name_prefixes (self) : terom@2: """ terom@2: Iterate over the components of the page name, yielding (prefix, suffix) pairs terom@2: """ terom@2: terom@2: prefix = self.page_name_parts() terom@2: suffix = [] terom@2: terom@2: while prefix : terom@2: yield ('/'.join(prefix), '/'.join(suffix)) terom@2: terom@2: suffix.insert(0, prefix.pop(-1)) terom@2: