<%python scope="global"> import sys, string, re # datastructure that will store the whole contents of the documentation class TOCElement: def __init__(self, filename, name, description, parent = None, ext = None, header = None, last_updated = 0): self.filename = filename self.name = name self.parent = parent self.path = self._create_path() self.header = header if self.parent is not None: self.root = parent.root self.root.pathlookup[self.path] = self if self.parent.filename != self.filename: self.root.filelookup[self.filename] = self self.isTop = True else: self.root = self self.pathlookup = {} self.pathlookup[''] = self self.filelookup = {} self.filelookup[filename] = self if ext is not None: self.ext = ext else: self.ext = self.root.ext self.last_updated = last_updated self.description = description self.content = None self.previous = None self.next = None self.children = [] if parent: if len(parent.children): self.previous = parent.children[-1] parent.children[-1].next = self parent.children.append(self) if last_updated > parent.last_updated: parent.last_updated = self.last_updated def get_file(self, name): name = re.sub("\.\w+$", "", name) return self.root.filelookup[name] def lookup(self, path): return self.root.pathlookup[path] def get_link(self, includefile = True, anchor = True): if includefile: if anchor: return "%s%s#%s" % (self.filename, self.ext, self.path) else: return "%s%s" % (self.filename, self.ext) else: if anchor: return "#" + self.path else: return "" def _create_path(self): elem = self tokens = [] while elem.parent is not None: tokens.insert(0, elem.name) elem = elem.parent path = string.join(tokens, '_') return path <%python scope="request"> current = Value() filename = Value() <%args scope="request"> paged = 'yes' <%python scope="init"> try: a = r isdynamic = True ext = ".myt" except: isdynamic = False ext = ".html" request_comp = m.request_comp() if isdynamic and not m.interpreter.attributes.get('docs_static_cache', False): page_cache = True else: page_cache = False # for dynamic page, cache the output of the final page if page_cache: if m.cache_self(key="doc_%s" % paged, component = request_comp): return list_comp = m.fetch_next() files = request_comp.attributes['files'] title = request_comp.attributes.setdefault('title', "Documentation") version = request_comp.attributes['version'] wrapper = request_comp.attributes['wrapper'] index = request_comp.attributes['index'] onepage = request_comp.attributes['onepage'] def buildtoc(): root = TOCElement("", "root", "root element", ext = ext) current.assign(root) for file in files: filename.assign(file) comp = m.fetch_component(file + ".myt") main = m.scomp(comp) return root if not page_cache: # non-dynamic (i.e. command-line) page, cache the datastructure so successive # pages are fast (disables auto-recompiling) cache = m.get_cache(list_comp) toc = cache.get_value('toc', createfunc = buildtoc) else: toc = buildtoc() last_updated = toc.last_updated m.comp(wrapper, isdynamic=isdynamic, ext = ext, toc = toc, comp = request_comp, onepage = onepage, paged = paged, title = title, version = version, index=index, last_updated = last_updated) <%method title> <% m.request_comp().get_attribute('title', inherit = True) or "Documentation" %> <%method item> <%doc>stores an item in the table of contents <%args> # name should be a URL friendly name used for hyperlinking the section name # description is the heading for the item description escapedesc = False header = None <%python scope="init"> if escapedesc: description = m.apply_escapes(description, ['h']) current(TOCElement(filename(), name, description, current(), header = header, last_updated = m.caller.component_source.last_modified)) current().content = m.content() current(current().parent) <%method current> <%init>return current()