DocumentationTools/IndexGenerator.py

changeset 0
de9c2efb9d02
child 12
1d8dd9706f46
equal deleted inserted replaced
-1:000000000000 0:de9c2efb9d02
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2003 - 2009 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the index generator for the builtin documentation generator.
8 """
9
10 import sys
11 import os
12
13 import TemplatesListsStyle
14 import TemplatesListsStyleCSS
15
16 from Utilities import joinext
17
18 class IndexGenerator(object):
19 """
20 Class implementing the index generator for the builtin documentation generator.
21 """
22 def __init__(self, outputDir, colors, stylesheet = None):
23 """
24 Constructor
25
26 @param outputDir The output directory for the files. (string)
27 @param colors Dictionary specifying the various colors for the output.
28 (dictionary of strings)
29 @param stylesheet the style to be used for the generated pages (string)
30 """
31 self.outputDir = outputDir
32 self.packages = {
33 "00index" : {
34 "description" : "",
35 "subpackages" : {},
36 "modules" : {}
37 }
38 }
39 self.remembered = False
40
41 self.stylesheet = stylesheet
42
43 if self.stylesheet:
44 self.headerTemplate = TemplatesListsStyleCSS.headerTemplate
45 self.footerTemplate = TemplatesListsStyleCSS.footerTemplate
46 self.indexBodyTemplate = TemplatesListsStyleCSS.indexBodyTemplate
47 self.indexListPackagesTemplate = \
48 TemplatesListsStyleCSS.indexListPackagesTemplate
49 self.indexListModulesTemplate = \
50 TemplatesListsStyleCSS.indexListModulesTemplate
51 self.indexListEntryTemplate = TemplatesListsStyleCSS.indexListEntryTemplate
52 else:
53 self.headerTemplate = TemplatesListsStyle.headerTemplate % colors
54 self.footerTemplate = TemplatesListsStyle.footerTemplate % colors
55 self.indexBodyTemplate = TemplatesListsStyle.indexBodyTemplate % colors
56 self.indexListPackagesTemplate = \
57 TemplatesListsStyle.indexListPackagesTemplate % colors
58 self.indexListModulesTemplate = \
59 TemplatesListsStyle.indexListModulesTemplate % colors
60 self.indexListEntryTemplate = \
61 TemplatesListsStyle.indexListEntryTemplate % colors
62
63 def remember(self, file, moduleDocument, basename=""):
64 """
65 Public method to remember a documentation file.
66
67 @param file The filename to be remembered. (string)
68 @param moduleDocument The ModuleDocument object containing the
69 information for the file.
70 @param basename The basename of the file hierarchy to be documented.
71 The basename is stripped off the filename if it starts with
72 the basename.
73 """
74 self.remembered = True
75 if basename:
76 file = file.replace(basename, "")
77
78 if "__init__" in file:
79 dir = os.path.dirname(file)
80 udir = os.path.dirname(dir)
81 base = os.path.basename(dir)
82 if udir:
83 upackage = udir.replace(os.sep, ".")
84 try:
85 elt = self.packages[upackage]
86 except KeyError:
87 elt = self.packages["00index"]
88 else:
89 elt = self.packages["00index"]
90 package = dir.replace(os.sep, ".")
91 elt["subpackages"][package] = moduleDocument.shortDescription()
92
93 self.packages[package] = {
94 "description" : moduleDocument.description(),
95 "subpackages" : {},
96 "modules" : {}
97 }
98
99 if moduleDocument.isEmpty():
100 return
101
102 package = os.path.dirname(file).replace(os.sep, ".")
103 name = os.path.splitext(file)[0].replace(os.sep, ".")
104 try:
105 elt = self.packages[package]
106 except KeyError:
107 elt = self.packages["00index"]
108 elt["modules"][moduleDocument.name()] = \
109 moduleDocument.shortDescription()
110
111 def __writeIndex(self, packagename, package):
112 """
113 Private method to generate an index file for a package.
114
115 @param packagename The name of the package. (string)
116 @param package A dictionary with information about the package.
117 @return The name of the generated index file.
118 """
119 if packagename == "00index":
120 f = os.path.join(self.outputDir, "index")
121 title = "Table of contents"
122 else:
123 f = os.path.join(self.outputDir, "index-%s" % packagename)
124 title = packagename
125
126 filename = joinext(f, ".html")
127
128 subpackages = ""
129 modules = ""
130
131 # 1) subpackages
132 if package["subpackages"]:
133 subpacks = package["subpackages"]
134 names = subpacks.keys()
135 names.sort()
136 lst = []
137 for name in names:
138 link = joinext("index-%s" % name, ".html")
139 lst.append(self.indexListEntryTemplate % {
140 "Description" : subpacks[name],
141 "Name" : name.split(".")[-1],
142 "Link" : link,
143 })
144 subpackages = self.indexListPackagesTemplate % {
145 "Entries" : "".join(lst),
146 }
147
148 # 2) modules
149 if package["modules"]:
150 mods = package["modules"]
151 names = mods.keys()
152 names.sort()
153 lst = []
154 for name in names:
155 link = joinext(name, ".html")
156 nam = name.split(".")[-1]
157 if nam == "__init__":
158 nam = name.split(".")[-2]
159 lst.append(self.indexListEntryTemplate % {
160 "Description" : mods[name],
161 "Name" : nam,
162 "Link" : link,
163 })
164 modules = self.indexListModulesTemplate % {
165 "Entries" : "".join(lst),
166 }
167
168 doc = self.headerTemplate % { \
169 "Title" : title,
170 "Style" : self.stylesheet} + \
171 self.indexBodyTemplate % { \
172 "Title" : title,
173 "Description" : package["description"],
174 "Subpackages" : subpackages,
175 "Modules" : modules,
176 } + \
177 self.footerTemplate
178
179 f = open(filename, "wb")
180 f.write(doc)
181 f.close()
182
183 return filename
184
185 def writeIndices(self, basename = ""):
186 """
187 Public method to generate all index files.
188
189 @param basename The basename of the file hierarchy to be documented.
190 The basename is stripped off the filename if it starts with
191 the basename.
192 """
193 if not self.remembered:
194 sys.stderr.write("No index to generate.\n")
195 return
196
197 if basename:
198 basename = basename.replace(os.sep, ".")
199 if not basename.endswith("."):
200 basename = "%s." % basename
201 for package, element in self.packages.items():
202 try:
203 if basename:
204 package = package.replace(basename,"")
205 out = self.__writeIndex(package, element)
206 except IOError, v:
207 sys.stderr.write("%s error: %s\n" % (package, v[1]))
208 else:
209 if out:
210 sys.stdout.write("%s ok\n" % out)
211
212 sys.stdout.write("Indices written.\n")
213 sys.stdout.flush()
214 sys.stderr.flush()

eric ide

mercurial