src/eric7/DocumentationTools/IndexGenerator.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9413
80c06d472826
equal deleted inserted replaced
9220:e9e7eca7efee 9221:bf71ee032bb4
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()):
189 except OSError as v: 191 except OSError as v:
190 sys.stderr.write("{0} error: {1}\n".format(package, v[1])) 192 sys.stderr.write("{0} error: {1}\n".format(package, v[1]))
191 else: 193 else:
192 if out: 194 if out:
193 sys.stdout.write("{0} ok\n".format(out)) 195 sys.stdout.write("{0} ok\n".format(out))
194 196
195 sys.stdout.write("Indices written.\n") 197 sys.stdout.write("Indices written.\n")
196 sys.stdout.flush() 198 sys.stdout.flush()
197 sys.stderr.flush() 199 sys.stderr.flush()

eric ide

mercurial