File: FileDetails.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 (143 lines) | stat: -rw-r--r-- 5,523 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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#
# 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.Processor import Parameter
from Synopsis import AST, Util
from Synopsis.Formatters.HTML.View import View
from Synopsis.Formatters.HTML.Tags import *
from Source import *

import os

class FileDetails(View):
   """A view that creates an index of files, and an index for each file.
   First the index of files is created, intended for the top-left frame.
   Second a view is created for each file, listing the major declarations for
   that file, eg: classes, global functions, namespaces, etc."""

   def register(self, processor):

      View.register(self, processor)
      self.__filename = ''
      self.__title = ''
      self.__link_source = processor.has_view('Source')

   def filename(self):
      """since FileTree generates a whole file hierarchy, this method returns the current filename,
      which may change over the lifetime of this object"""

      return self.__filename

   def title(self):
      """since FileTree generates a while file hierarchy, this method returns the current title,
      which may change over the lifetime of this object"""

      return self.__title

   def register_filenames(self, start):
      """Registers a view for each file indexed"""

      for filename, file in self.processor.ast.files().items():
         if file.is_main():
            filename = self.processor.file_layout.file_details(filename)
            self.processor.register_filename(filename, self, file)
    
   def process(self, start):
      """Creates a view for each file using process_scope"""

      for filename, file in self.processor.ast.files().items():
         if file.is_main():
            self.process_file(filename, file)
            
   def process_file(self, filename, file):
      """Creates a view for the given file. The view is just an index,
      containing a list of declarations."""

      # set up filename and title for the current view
      self.__filename = self.processor.file_layout.file_details(filename)
      # (get rid of ../'s in the filename)
      name = string.split(filename, os.sep)
      while len(name) and name[0] == '..': del name[0]
      self.__title = string.join(name, os.sep)+' Details'

      self.start_file()
      self.write(self.processor.navigation_bar(self.filename()))
      self.write(entity('h1', string.join(name, os.sep))+'<br/>')
      if self.__link_source:
         link = rel(self.filename(),
                    self.processor.file_layout.file_source(filename))
         self.write(href(link, '[File Source]', target="main")+'<br/>')

      # Print list of includes
      try:
         sourcefile = self.processor.ast.files()[filename]
         includes = sourcefile.includes()
         # Only show files from the project
         includes = filter(lambda x: x.target().is_main(), includes)
         self.write('<h2 class="heading">Includes from this file:</h2>')
         if not len(includes):
            self.write('No includes.<br/>')
         for include in includes:
            target_filename = include.target().filename()
            if include.is_next(): idesc = 'include_next '
            else: idesc = 'include '
            if include.is_macro(): idesc = idesc + 'from macro '
            link = rel(self.filename(), self.processor.file_layout.file_details(target_filename))
            self.write(idesc + href(link, target_filename)+'<br/>')
      except:
         pass

      self.write('<h2 class="heading">Declarations in this file:</h2>')
      # Sort items (by name)
      items = map(lambda decl: (decl.type(), decl.name(), decl), file.declarations())
      # ignore AST.Builtin
      items = filter(lambda decl: not isinstance(decl[2], AST.Builtin), items)
      items.sort()
      curr_scope = None
      curr_type = None
      br = 0
      for decl_type, name, decl in items:
         # Check scope and type to see if they've changed since the last
         # declaration, thereby forming sections of scope and type
         decl_scope = name[:-1]
         if decl_scope != curr_scope or decl_type != curr_type:
            if curr_scope is not None:
               self.write('\n</div>')
            curr_scope = decl_scope
            curr_type = decl_type
            if len(curr_type) and curr_type[-1] == 's': plural = 'es'
            else: plural = 's'
            if len(curr_scope):
               self.write('<h3>%s%s in %s</h3>\n<div>'%(
                  curr_type.capitalize(), plural,
                  escape(Util.ccolonName(curr_scope))))
            else:
               self.write('<h3>%s%s</h3>\n<div>'%(curr_type.capitalize(),plural))
            br = 0
            
         # Format this declaration
         entry = self.processor.toc[name]
         label = escape(Util.ccolonName(name, curr_scope))
         label = replace_spaces(label)
         if entry:
            link = rel(self.filename(), entry.link)
            text = ' ' + href(link, label)
         else:
            text = ' ' + label
         if br: self.write('<br/>')
         self.write(text)
         # Print summary
         comments = decl.comments()
         if len(comments) and comments[0].summary():
            self.write('<br/>\n' + span('summary', comments[0].summary()))
         br = 1
	
      # Close open DIV
      if curr_scope is not None:
         self.write('\n</div>')
      self.end_file()