0001import sys
0002import simplelog
0003
0004class Context(object):
0005
0006 def __init__(self, fetcher, page_class=None,
0007 log=None):
0008 self.fetcher = fetcher
0009 if page_class is None:
0010 from wsgioverlay import page
0011 page_class = page.Page
0012 self.page_class = page_class
0013 if log is None:
0014 log = simplelog.DummyLog()
0015 elif log in ('stdout', 'stderr'):
0016 if log == 'stdout':
0017 out = sys.stdout
0018 else:
0019 out = sys.stderr
0020 log = simplelog.FileLog(out)
0021 elif log == 'inline':
0022 log = simplelog.InlineLog()
0023 self.log = log
0024 self.namespace = {}
0025 self.content_page = None
0026 self.pages = []
0027
0028 @classmethod
0029 def from_uri(cls, uri, fetcher, page_class=None, log=None):
0030 self = cls(fetcher, page_class=page_class, log=log)
0031 self.get_page(uri, content_page=True)
0032 return self
0033
0034 def add_name(self, page, el, name):
0035 self.namespace.setdefault(name, []).append((page, el))
0036
0037 def get_page(self, uri, content_page=False):
0038 headers, content = self.fetcher(uri)
0039 self.log.info('Fetched page %s' % uri)
0040 return self.add_page(
0041 uri, headers, content, content_page=content_page)
0042
0043 def add_page(self, uri, headers, content, content_page=False):
0044 page = self.page_class(headers, content, uri, self,
0045 content_page=content_page)
0046 if content_page:
0047 assert self.content_page is None, (
0048 "Two content pages: first %r then %r"
0049 % (self.content_page, page))
0050 self.content_page = page
0051 self.pages.append(page)
0052 return page
0053
0054 def render(self):
0055 page = self.content_page
0056 while page.template:
0057 page = page.template
0058 page.resolve()
0059 if hasattr(self.log, 'add_to_page'):
0060 self.log.add_to_page(page)
0061 return str(page)
0062
0063 def get_name(self, name):
0064
0065 return self.namespace.get(name, [(None, None)])[0][1]