2 from zzipdoc.match import *
3 from zzipdoc.options import *
4 from zzipdoc.textfile import *
5 from zzipdoc.textfileheader import *
6 from zzipdoc.functionheader import *
7 from zzipdoc.functionprototype import *
8 from zzipdoc.commentmarkup import *
9 from zzipdoc.functionlisthtmlpage import *
10 from zzipdoc.functionlistreference import *
11 from zzipdoc.dbk2htm import *
13 def _src_to_xml(text):
14 return text.replace("&", "&").replace("<", "<").replace(">", ">")
17 def __init__(self, header, comment):
18 self.textfileheader = header
19 self.filecomment = comment
22 self.textfileheaders = []
23 self.filecomments = []
25 def add(self, textfileheader, filecomment):
26 self.textfileheaders += [ textfileheader ]
27 self.filecomments += [ filecomment ]
28 self.entries += [ PerFileEntry(textfileheader, filecomment) ]
29 def where_filename(self, filename):
30 for entry in self.entries:
31 if entry.textfileheader.get_filename() == filename:
34 def print_list_mainheader(self):
35 for t_fileheader in self.headers:
36 print t_fileheader.get_filename(), t_fileheader.src_mainheader()
38 class PerFunctionEntry:
39 def __init__(self, header, comment, prototype):
41 self.comment = comment
42 self.prototype = prototype
44 return self.prototype.get_name()
45 def get_titleline(self):
46 return self.header.get_titleline()
57 def add(self, functionheader, functioncomment, functionprototype):
58 self.headers += [ functionheader ]
59 self.comments += [ functionprototype ]
60 self.prototypes += [ functionprototype ]
61 self.entries += [ PerFunctionEntry(functionheader, functioncomment,
63 def print_list_titleline(self):
64 for funcheader in self.headers:
65 print funcheader.get_filename(), "[=>]", funcheader.get_titleline()
66 def print_list_name(self):
67 for funcheader in self.prototypes:
68 print funcheader.get_filename(), "[>>]", funcheader.get_name()
70 class PerFunctionFamilyEntry:
71 def __init__(self, leader):
74 def contains(self, func):
75 for item in self.functions:
76 if item == func: return True
79 if not self.contains(func):
80 self.functions += [ func ]
82 if self.leader is None: return None
83 return self.leader.get_name()
84 class PerFunctionFamily:
90 def add_PerFunction(self, per_list):
91 for item in per_list.entries:
92 add_PerFunctionEntry(item)
93 def add_PerFunctionEntry(self, item):
94 self.functions += [ item ]
95 def get_function(self, name):
96 for item in self.functions:
97 if item.get_name() == name:
100 def get_entry(self, name):
101 for item in self.entries:
102 if item.get_name() == name:
105 def fill_families(self):
107 for func in self.functions:
108 name = func.get_name()
109 name_list[name] = func
110 for func in self.functions:
111 name = func.get_name()
112 line = func.get_titleline()
113 is_retarget = Match("=>\s*(\w+)")
114 if line & is_retarget:
115 into = is_retarget[1]
116 self.retarget[name] = is_retarget[1]
118 for name in self.retarget:
119 into = self.retarget[name]
120 if into not in name_list:
121 print ("function '"+name+"' retarget into '"+into+
122 "' does not exist - keep alone")
123 if into in self.retarget:
124 other = self.retarget[into]
125 print ("function '"+name+"' retarget into '"+into+
126 "' which is itself a retarget into '"+other+"'")
127 if into not in lead_list:
128 lead_list += [ into ]
129 for func in self.functions:
130 name = func.get_name()
131 if name not in lead_list and name not in self.retarget:
132 lead_list += [ name ]
133 for name in lead_list:
134 func = self.get_function(name)
136 entry = PerFunctionFamilyEntry(func)
137 entry.add(func) # the first
138 self.entries += [ entry ]
140 print "head function '"+name+" has no entry"
141 for func in self.functions:
142 name = func.get_name()
143 if name in self.retarget:
144 into = self.retarget[name]
145 entry = self.get_entry(into)
146 if entry is not None:
147 entry.add(func) # will not add duplicates
149 print "into function '"+name+" has no entry"
150 def print_list_name(self):
151 for family in self.entries:
152 name = family.get_name()
154 for item in family.functions:
155 print item.get_name(), ",",
157 class HtmlManualPageAdapter:
158 def __init__(self, entry):
159 """ usually takes a PerFunctionEntry """
162 return self.entry.get_name()
164 return self.entry.get_head()
166 return self.entry.get_body()
167 def head_xml_text(self):
168 return self._head().xml_text()
169 def body_xml_text(self, name):
170 return self._body().xml_text(name)
171 def head_get_prespec(self):
172 return self._head().get_prespec()
173 def head_get_namespec(self):
174 return self._head().get_namespec()
175 def head_get_callspec(self):
176 return self._head().get_callspec()
178 return self._body().header.get_title()
179 def get_filename(self):
180 return self._body().header.get_filename()
181 def src_mainheader(self):
182 return self._body().header.parent.textfile.src_mainheader()
183 def get_mainheader(self):
184 return _src_to_xml(self.src_mainheader())
185 class RefEntryManualPageAdapter:
186 def __init__(self, entry, per_file = None):
187 """ usually takes a PerFunctionEntry """
189 self.per_file = per_file
191 return self.entry.get_name()
193 return self.entry.get_head()
195 return self.entry.get_body()
197 return self._body().header.parent.textfile
198 def head_xml_text(self):
199 return self._head().xml_text()
200 def body_xml_text(self, name):
201 return self._body().xml_text(name)
203 return self._body().header.get_title()
204 def get_filename(self):
205 return self._body().header.get_filename()
206 def src_mainheader(self):
207 return self._textfile().src_mainheader()
208 def get_mainheader(self):
209 return _src_to_xml(self.src_mainheader())
210 def get_includes(self):
212 def list_seealso(self):
213 return self._body().header.get_alsolist()
214 def get_authors(self):
217 entry = self.per_file.where_filename(self.get_filename())
219 comment = entry.filecomment.xml_text()
221 check = Match(r"(?s)<para>\s*[Aa]uthors*\b:*((?:.(?!</para>))*.)</para>")
222 if comment & check: return _src_to_xml(check[1])
224 def get_copyright(self):
227 entry = self.per_file.where_filename(self.get_filename())
229 comment = entry.filecomment.xml_text()
231 check = Match(r"(?s)<para>\s*[Cc]opyright\b((?:.(?!</para>))*.)</para>")
232 if comment & check: return check[0]
235 def makedocs(filenames, o):
237 for filename in filenames:
238 textfile = TextFile(filename)
240 textfiles += [ textfile ]
242 for textfile in textfiles:
243 textfileheader = TextFileHeader(textfile)
244 textfileheader.parse()
245 filecomment = CommentMarkup(textfileheader)
247 per_file.add(textfileheader, filecomment)
249 for textfile in per_file.textfileheaders:
250 funcheader = FunctionHeaderList(textfile)
252 funcheaders += [ funcheader ]
253 per_function = PerFunction()
254 for funcheader in funcheaders:
255 for child in funcheader.get_children():
256 funcprototype = FunctionPrototype(child)
257 funcprototype.parse()
258 funccomment = CommentMarkup(child)
260 per_function.add(child, funccomment, funcprototype)
261 per_family = PerFunctionFamily()
262 for item in per_function.entries:
263 per_family.add_PerFunctionEntry(item)
264 per_family.fill_families()
266 # per_file.print_list_mainheader()
267 # per_function.print_list_titleline()
268 # per_function.print_list_name()
269 per_family.print_list_name()
270 html = FunctionListHtmlPage(o)
271 for item in per_family.entries:
272 for func in item.functions:
273 func_adapter = HtmlManualPageAdapter(func)
274 if o.onlymainheader and not (Match("<"+o.onlymainheader+">")
275 & func_adapter.src_mainheader()):
277 html.add(func_adapter)
280 html_filename = "zziplib"+o.suffix+".html"
282 print "writing "+html_filename
283 fd = open(html_filename, "w")
284 print >>fd, section2html(paramdef2html(html.xml_text()))
287 print "could not open '"+html_filename+"'file", e
288 man3 = FunctionListReference(o)
289 for item in per_family.entries:
290 for func in item.functions:
291 func_adapter = RefEntryManualPageAdapter(func, per_file)
292 if o.onlymainheader and not (Match("<"+o.onlymainheader+">")
293 & func_adapter.src_mainheader()):
295 man3.add(func_adapter)
298 man3_filename = "zziplib"+o.suffix+".docbook"
300 print "writing "+man3_filename
301 fd = open(man3_filename, "w")
302 print >>fd, man3.xml_text()
305 print "could not open '"+man3_filename+"'file", e
308 if __name__ == "__main__":
311 o.package = "ZZipLib"
312 o.program = sys.argv[0]
313 for item in sys.argv[1:]:
314 if o.scan(item): continue
315 filenames += [ item ]
316 makedocs(filenames, o)