summaryrefslogtreecommitdiff
path: root/doc/build/lib/toc.py
blob: ebf7e954718e7dea9ccd6170b551b7e65c6b1e4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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)