diff options
Diffstat (limited to 'doc/build/lib/toc.py')
-rw-r--r-- | doc/build/lib/toc.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/doc/build/lib/toc.py b/doc/build/lib/toc.py new file mode 100644 index 000000000..ebf7e9547 --- /dev/null +++ b/doc/build/lib/toc.py @@ -0,0 +1,70 @@ +""" +defines a pickleable, recursive "table of contents" datastructure. + +TOCElements define a name, a description, and also a uniquely-identifying "path" which is +used to generate hyperlinks between document sections. +""" +import time + +toc_by_file = {} +toc_by_path = {} + +class TOCElement(object): + def __init__(self, filename, name, description, parent=None, version=None, last_updated=None, doctitle=None, **kwargs): + self.filename = filename + self.name = name + self.description = description + self.parent = parent + self.content = None + self.toc_by_path = toc_by_path + self.toc_by_file = toc_by_file + self.last_updated = time.time() + self.version = version + self.doctitle = doctitle + (self.path, self.depth) = self._create_path() + #print "NEW TOC:", self.path + for key, value in kwargs.iteritems(): + setattr(self, key, value) + + toc_by_path[self.path] = self + + self.is_top = (self.parent is not None and self.parent.filename != self.filename) or self.parent is None + if self.is_top: + toc_by_file[self.filename] = self + + self.root = self.parent or self + + 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) + + def get_page_root(self): + return self.toc_by_file[self.filename] + + def get_by_path(self, path): + return self.toc_by_path.get(path) + + def get_by_file(self, filename): + return self.toc_by_file[filename] + + def get_link(self, extension='html', anchor=True): + if anchor: + return "%s.%s#%s" % (self.filename, extension, self.path) + else: + return "%s.%s" % (self.filename, extension) + + def _create_path(self): + elem = self + tokens = [] + depth = 0 + while elem.parent is not None: + tokens.insert(0, elem.name) + elem = elem.parent + depth +=1 + return ('_'.join(tokens), depth) |