"""
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, re
toc_by_file = {}
toc_by_path = {}
filenames = []
class TOCElement(object):
def __init__(self, filename, name, description, parent=None, version=None, last_updated=None, doctitle=None, **kwargs):
self.filename = filename
self.name = re.sub(r'[<>&;%]', '', name)
self.description = description
self.parent = parent
self.content = None
self.filenames = filenames
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
if self.filename:
filenames.append(self.filename)
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, usefilename=True):
if usefilename:
if anchor:
return "%s.%s#%s" % (self.filename, extension, self.path)
else:
return "%s.%s" % (self.filename, extension)
else:
return "#%s" % (self.path)
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)
|