19 class IndexGenerator: |
19 class IndexGenerator: |
20 """ |
20 """ |
21 Class implementing the index generator for the builtin documentation |
21 Class implementing the index generator for the builtin documentation |
22 generator. |
22 generator. |
23 """ |
23 """ |
|
24 |
24 def __init__(self, outputDir): |
25 def __init__(self, outputDir): |
25 """ |
26 """ |
26 Constructor |
27 Constructor |
27 |
28 |
28 @param outputDir The output directory for the files |
29 @param outputDir The output directory for the files |
29 @type str |
30 @type str |
30 """ |
31 """ |
31 self.outputDir = outputDir |
32 self.outputDir = outputDir |
32 self.packages = { |
33 self.packages = { |
33 "00index": { |
34 "00index": {"description": "", "subpackages": {}, "modules": {}} |
34 "description": "", |
|
35 "subpackages": {}, |
|
36 "modules": {} |
|
37 } |
|
38 } |
35 } |
39 self.remembered = False |
36 self.remembered = False |
40 |
37 |
41 def remember(self, file, moduleDocument, basename=""): |
38 def remember(self, file, moduleDocument, basename=""): |
42 """ |
39 """ |
43 Public method to remember a documentation file. |
40 Public method to remember a documentation file. |
44 |
41 |
45 @param file The filename to be remembered. (string) |
42 @param file The filename to be remembered. (string) |
46 @param moduleDocument The ModuleDocument object containing the |
43 @param moduleDocument The ModuleDocument object containing the |
47 information for the file. |
44 information for the file. |
48 @param basename The basename of the file hierarchy to be documented. |
45 @param basename The basename of the file hierarchy to be documented. |
49 The basename is stripped off the filename if it starts with |
46 The basename is stripped off the filename if it starts with |
50 the basename. |
47 the basename. |
51 """ |
48 """ |
52 self.remembered = True |
49 self.remembered = True |
53 if basename: |
50 if basename: |
54 file = file.replace(basename, "") |
51 file = file.replace(basename, "") |
55 |
52 |
56 if "__init__" in file: |
53 if "__init__" in file: |
57 dirName = os.path.dirname(file) |
54 dirName = os.path.dirname(file) |
58 udir = os.path.dirname(dirName) |
55 udir = os.path.dirname(dirName) |
59 if udir: |
56 if udir: |
60 upackage = udir.replace(os.sep, ".") |
57 upackage = udir.replace(os.sep, ".") |
64 elt = self.packages["00index"] |
61 elt = self.packages["00index"] |
65 else: |
62 else: |
66 elt = self.packages["00index"] |
63 elt = self.packages["00index"] |
67 package = dirName.replace(os.sep, ".") |
64 package = dirName.replace(os.sep, ".") |
68 elt["subpackages"][package] = moduleDocument.shortDescription() |
65 elt["subpackages"][package] = moduleDocument.shortDescription() |
69 |
66 |
70 self.packages[package] = { |
67 self.packages[package] = { |
71 "description": moduleDocument.description(), |
68 "description": moduleDocument.description(), |
72 "subpackages": {}, |
69 "subpackages": {}, |
73 "modules": {} |
70 "modules": {}, |
74 } |
71 } |
75 |
72 |
76 if moduleDocument.isEmpty(): |
73 if moduleDocument.isEmpty(): |
77 return |
74 return |
78 |
75 |
79 package = os.path.dirname(file).replace(os.sep, ".") |
76 package = os.path.dirname(file).replace(os.sep, ".") |
80 try: |
77 try: |
81 elt = self.packages[package] |
78 elt = self.packages[package] |
82 except KeyError: |
79 except KeyError: |
83 elt = self.packages["00index"] |
80 elt = self.packages["00index"] |
84 elt["modules"][moduleDocument.name()] = ( |
81 elt["modules"][moduleDocument.name()] = moduleDocument.shortDescription() |
85 moduleDocument.shortDescription()) |
82 |
86 |
|
87 def __writeIndex(self, packagename, package, newline=None): |
83 def __writeIndex(self, packagename, package, newline=None): |
88 """ |
84 """ |
89 Private method to generate an index file for a package. |
85 Private method to generate an index file for a package. |
90 |
86 |
91 @param packagename The name of the package. (string) |
87 @param packagename The name of the package. (string) |
92 @param package A dictionary with information about the package. |
88 @param package A dictionary with information about the package. |
93 @param newline newline character to be used (string) |
89 @param newline newline character to be used (string) |
94 @return The name of the generated index file. |
90 @return The name of the generated index file. |
95 """ |
91 """ |
97 f = os.path.join(self.outputDir, "index") |
93 f = os.path.join(self.outputDir, "index") |
98 title = "Table of contents" |
94 title = "Table of contents" |
99 else: |
95 else: |
100 f = os.path.join(self.outputDir, "index-{0}".format(packagename)) |
96 f = os.path.join(self.outputDir, "index-{0}".format(packagename)) |
101 title = packagename |
97 title = packagename |
102 |
98 |
103 filename = joinext(f, ".html") |
99 filename = joinext(f, ".html") |
104 |
100 |
105 subpackages = "" |
101 subpackages = "" |
106 modules = "" |
102 modules = "" |
107 |
103 |
108 # 1) subpackages |
104 # 1) subpackages |
109 if package["subpackages"]: |
105 if package["subpackages"]: |
110 subpacks = package["subpackages"] |
106 subpacks = package["subpackages"] |
111 names = sorted(subpacks.keys()) |
107 names = sorted(subpacks.keys()) |
112 lst = [] |
108 lst = [] |
113 for name in names: |
109 for name in names: |
114 link = joinext("index-{0}".format(name), ".html") |
110 link = joinext("index-{0}".format(name), ".html") |
115 lst.append( |
111 lst.append( |
116 TemplatesListsStyleCSS.indexListEntryTemplate.format(**{ |
112 TemplatesListsStyleCSS.indexListEntryTemplate.format( |
117 "Description": subpacks[name], |
113 **{ |
118 "Name": name.split(".")[-1], |
114 "Description": subpacks[name], |
119 "Link": link, |
115 "Name": name.split(".")[-1], |
120 }) |
116 "Link": link, |
|
117 } |
|
118 ) |
121 ) |
119 ) |
122 subpackages = ( |
120 subpackages = TemplatesListsStyleCSS.indexListPackagesTemplate.format( |
123 TemplatesListsStyleCSS.indexListPackagesTemplate.format(**{ |
121 **{ |
124 "Entries": "".join(lst), |
122 "Entries": "".join(lst), |
125 }) |
123 } |
126 ) |
124 ) |
127 |
125 |
128 # 2) modules |
126 # 2) modules |
129 if package["modules"]: |
127 if package["modules"]: |
130 mods = package["modules"] |
128 mods = package["modules"] |
131 names = sorted(mods.keys()) |
129 names = sorted(mods.keys()) |
132 lst = [] |
130 lst = [] |
134 link = joinext(name, ".html") |
132 link = joinext(name, ".html") |
135 nam = name.split(".")[-1] |
133 nam = name.split(".")[-1] |
136 if nam == "__init__": |
134 if nam == "__init__": |
137 nam = name.split(".")[-2] |
135 nam = name.split(".")[-2] |
138 lst.append( |
136 lst.append( |
139 TemplatesListsStyleCSS.indexListEntryTemplate.format(**{ |
137 TemplatesListsStyleCSS.indexListEntryTemplate.format( |
140 "Description": mods[name], |
138 **{ |
141 "Name": nam, |
139 "Description": mods[name], |
142 "Link": link, |
140 "Name": nam, |
143 }) |
141 "Link": link, |
|
142 } |
|
143 ) |
144 ) |
144 ) |
145 modules = ( |
145 modules = TemplatesListsStyleCSS.indexListModulesTemplate.format( |
146 TemplatesListsStyleCSS.indexListModulesTemplate.format(**{ |
146 **{ |
147 "Entries": "".join(lst), |
147 "Entries": "".join(lst), |
148 }) |
148 } |
149 ) |
149 ) |
150 |
150 |
151 doc = ( |
151 doc = ( |
152 TemplatesListsStyleCSS.headerTemplate.format( |
152 TemplatesListsStyleCSS.headerTemplate.format(**{"Title": title}) |
153 **{"Title": title} |
153 + TemplatesListsStyleCSS.indexBodyTemplate.format( |
154 ) + TemplatesListsStyleCSS.indexBodyTemplate.format( |
154 **{ |
155 **{"Title": title, |
155 "Title": title, |
156 "Description": package["description"], |
156 "Description": package["description"], |
157 "Subpackages": subpackages, |
157 "Subpackages": subpackages, |
158 "Modules": modules} |
158 "Modules": modules, |
159 ) + TemplatesListsStyleCSS.footerTemplate |
159 } |
|
160 ) |
|
161 + TemplatesListsStyleCSS.footerTemplate |
160 ) |
162 ) |
161 |
163 |
162 with open(filename, "w", encoding="utf-8", newline=newline) as f: |
164 with open(filename, "w", encoding="utf-8", newline=newline) as f: |
163 f.write(doc) |
165 f.write(doc) |
164 |
166 |
165 return filename |
167 return filename |
166 |
168 |
167 def writeIndices(self, basename="", newline=None): |
169 def writeIndices(self, basename="", newline=None): |
168 """ |
170 """ |
169 Public method to generate all index files. |
171 Public method to generate all index files. |
170 |
172 |
171 @param basename The basename of the file hierarchy to be documented. |
173 @param basename The basename of the file hierarchy to be documented. |
172 The basename is stripped off the filename if it starts with |
174 The basename is stripped off the filename if it starts with |
173 the basename. |
175 the basename. |
174 @param newline newline character to be used (string) |
176 @param newline newline character to be used (string) |
175 """ |
177 """ |
176 if not self.remembered: |
178 if not self.remembered: |
177 sys.stderr.write("No index to generate.\n") |
179 sys.stderr.write("No index to generate.\n") |
178 return |
180 return |
179 |
181 |
180 if basename: |
182 if basename: |
181 basename = basename.replace(os.sep, ".") |
183 basename = basename.replace(os.sep, ".") |
182 if not basename.endswith("."): |
184 if not basename.endswith("."): |
183 basename = "{0}.".format(basename) |
185 basename = "{0}.".format(basename) |
184 for package, element in list(self.packages.items()): |
186 for package, element in list(self.packages.items()): |