File: ModuleListingJS.py

package info (click to toggle)
synopsis 0.8.0-5
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 10,112 kB
  • ctags: 12,996
  • sloc: cpp: 34,254; ansic: 33,620; python: 10,975; sh: 7,261; xml: 6,369; makefile: 773; asm: 445
file content (87 lines) | stat: -rw-r--r-- 2,807 bytes parent folder | download | duplicates (2)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#
# Copyright (C) 2000 Stephen Davies
# Copyright (C) 2000 Stefan Seefeld
# All rights reserved.
# Licensed to the public under the terms of the GNU LGPL (>= 2),
# see the file COPYING for details.
#

from Synopsis import config
from Synopsis import AST, Util
from Synopsis.Formatters.HTML.Tags import *
from JSTree import JSTree

import os

class ModuleListingJS(JSTree):
   """Create an index of all modules with JS. The JS allows the user to
   expand/collapse sections of the tree!"""

   def register(self, processor):

      JSTree.register(self, processor)
      self._children_cache = {}
      filename = self.processor.file_layout.special('ModuleTree')
      self.processor.set_contents_view(filename)
      self.processor.add_root_view(filename, 'Modules', 'contents', 2)
      self._link_target = 'index'

   def filename(self): return self.processor.file_layout.special('ModuleTree')
   def title(self): return 'Module Tree'

   def process(self, start):
      """Create a view with an index of all modules"""
      # Init tree
      share = config.datadir
      self.js_init(os.path.join(share, 'syn-down.png'),
                   os.path.join(share, 'syn-right.png'),
                   os.path.join(share, 'syn-dot.png'),
                   'tree_%s.png', 0)
      self.__share = share
      # Creare the file
      self.start_file()
      self.write(self.processor.navigation_bar(self.filename(), 2))
      self.indexModule(start, start.name())
      self.end_file()

   def _child_filter(self, child):

      return isinstance(child, AST.Module)

   def _link_href(self, ns):

      return self.processor.file_layout.module_index(ns.name())

   def get_children(self, decl):

      try: return self._children_cache[decl]
      except KeyError: pass
      sorter = self.processor.sorter
      sorter.set_scope(decl)
      sorter.sort_sections()
      children = sorter.children()
      children = filter(self._child_filter, children)
      self._children_cache[decl] = children
      return children

   def indexModule(self, ns, rel_scope):
      "Write a link for this module and recursively visit child modules."

      my_scope = ns.name()
      # Find children, and sort so that compound children (packages) go first
      children = self.get_children(ns)
      children.sort(lambda a,b,g=self.get_children:
                    cmp(len(g(b)),len(g(a))))
      # Print link to this module
      name = Util.ccolonName(my_scope, rel_scope) or "Global Namespace"
      link = self._link_href(ns)
      text = href(link, name, target=self._link_target)
      if not len(children):
         self.writeLeaf(text)
      else:
         self.writeNodeStart(text)
         # Add children
         for child in children:
            self.indexModule(child, my_scope)
         self.writeNodeEnd()