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        # @@: Should test for multiple matches
0065        return self.namespace.get(name, [(None, None)])[0][1]