File: Synopsis/Formatters/HTML/Views/ModuleListing.py 1
2
3
4
5
6
7
8
9from Synopsis.Processor import Parameter
10from Synopsis import ASG
11from Synopsis.Formatters.HTML.View import View
12from Synopsis.Formatters.HTML.Tags import *
13
14class ModuleListing(View):
15 """Create an index of all modules."""
16
17 short_title = Parameter('Modules', 'short title')
18 child_types = Parameter(None, 'the types of children to include')
19
20 def register(self, frame):
21
22 super(ModuleListing, self).register(frame)
23 self._children_cache = {}
24
25 def filename(self):
26
27 return self.directory_layout.special('ModuleListing')
28
29 def title(self):
30
31 return self.short_title
32
33 def root(self):
34
35 return self.filename(), self.title()
36
37 def process(self):
38 """Create a view with an index of all modules."""
39
40
41 self.start_file()
42 self.write_navigation_bar()
43 self.write('<ul class="tree">')
44
45 module = self.processor.ir.asg.declarations[0]
46 self.index_module(module, module.name)
47 self.write('</ul>')
48 self.end_file()
49
50 def _link_href(self, module):
51 """Returns the link to the given declaration"""
52
53 return rel(self.filename(),
54 self.directory_layout.module_index(module.name))
55
56 def get_children(self, decl):
57 """Returns the children of the given declaration"""
58
59 try: return self._children_cache[decl]
60 except KeyError: pass
61 children = [c for c in decl.declarations
62 if isinstance(c, ASG.Module) and
63 (not self.child_types or child.type in self.child_types)]
64 self._children_cache[decl] = children
65 return children
66
67 def index_module(self, module, rel_scope):
68 "Write a link for this module and recursively visit child modules."
69
70 my_scope = module.name
71
72 children = self.get_children(module)
73 children.sort(lambda a,b,g=self.get_children:
74 cmp(len(g(b)),len(g(a))))
75
76 name = str(rel_scope.prune(my_scope)) or 'Global %s'%module.type.capitalize()
77 link = self._link_href(module)
78 text = href(link, name, target='detail')
79 if not len(children):
80 self.write('<li>%s</li>'%text)
81 else:
82 self.write('<li>%s<ul class="tree">'%text)
83
84 for child in children:
85 self.index_module(child, my_scope)
86 self.write('</ul></li>')
87
88
Generated on Thu Apr 16 16:27:15 2009 by
synopsis (version devel)