1 from match import Match
5 return text & Match("[^\w]+") >> "_"
7 class FunctionListReference:
8 """ Creating a docbook-style <reference> list of <refentry> parts
9 that will each be translated into a unix manual page in a second step """
11 '<!DOCTYPE reference PUBLIC "-//OASIS//DTD'+
12 ' DocBook XML V4.1.2//EN"'+"\n"+
13 ' "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">'+
15 def __init__(self, o = None):
21 if not self.entry: return
22 self.pages += [ self.entry ]
25 if self.entry is None:
26 self.entry = FunctionListRefEntry(entry, self.o)
27 self.entry.funcsynopsisinfo = entry.get_mainheader()
28 self.entry.refpurpose = entry.get_title()
29 self.entry.refentrytitle = entry.get_name()
30 # self.entry.refname = entry.get_name()
31 name = entry.get_name()
32 description = entry.body_xml_text(name)
33 funcsynopsis = entry.head_xml_text()
34 self.entry.funcsynopsis_list += [ funcsynopsis ]
35 self.entry.description_list += [ description ]
36 self.entry.refname_list += [ name ]
37 if entry.list_seealso():
38 for item in entry.list_seealso():
39 if item not in self.entry.seealso_list:
40 self.entry.seealso_list += [ item ]
41 def add_overview(self, entry):
42 if self.overview is None:
43 title = entry.get_mainheader() & Match(".*<(.*)>.*") >> "\\1"
44 self.overview = FunctionListRefEntry(entry, self.o)
45 self.overview.funcsynopsisinfo = entry.get_mainheader()
46 self.overview.refpurpose = self.o.package.strip()
47 self.overview.refentrytitle = title
48 self.overview.refname = _to_word(title)
49 description = entry.get_title().strip() & Match("^[.]+") >> ""
50 funcsynopsis = entry.head_xml_text()
51 self.overview.funcsynopsis_list += [ funcsynopsis ]
53 self.overview.description_list += [
54 "<para> - "+ description +"</para>" ]
57 T += "<reference><title>"+self.o.package+" Function List</title>\n"
58 for item in self.pages:
59 T += self.sane(item.refentry_text())
60 T += self.sane(self.overview.refentry_text())
64 return (html2docbook(text).replace("->","->")
65 .replace("<link>","<function>")
66 .replace("</link>","</function>")
67 .replace("<fu:protospec>","<funcprototype>")
68 .replace("</fu:protospec>","</funcprototype>")
69 .replace("<fu:prespec>","<funcdef>")
70 .replace("</fu:prespec>","")
71 .replace("<fu:namespec>","")
72 .replace("</fu:namespec>","</funcdef>")
73 .replace("</fu:callspec>","</paramdef>")
74 .replace("<fu:callspec>","<paramdef>")) & (
75 Match("<listitem>((?:.(?!(<para|</listitem)))*).</listitem>")
76 >> "<listitem><para>\\1</para></listitem>")
79 class FunctionListRefEntry:
80 def __init__(self, func, o):
81 """ initialize the fields needed for a man page entry - the fields are
82 named after the docbook-markup that encloses (!!) the text we store
83 the entries like X.refhint = "hello" will be printed therefore as
84 <refhint>hello</refhint>. Names with underscores are only used as
85 temporaries but they are memorized, perhaps for later usage. """
86 self.name = func.get_name()
87 self.refhint = "\n<!--========= "+self.name+" (3) ============-->\n"
89 self.refentry_date = o.version.strip() # //refentryinfo/date
90 self.refentry_productname = o.package.strip() # //refentryinfo/prod*
91 self.refentry_title = None # //refentryinfo/title
92 self.refentryinfo = None # override
93 self.manvolnum = "3" # //refmeta/manvolnum
94 self.refentrytitle = None # //refmeta/refentrytitle
95 self.refmeta = None # override
96 self.refpurpose = None # //refnamediv/refpurpose
97 self.refname = None # //refnamediv/refname
98 self.refname_list = []
99 self.refnamediv = None # override
100 self.mainheader = func.get_mainheader()
101 self.includes = func.get_includes()
102 self.funcsynopsisinfo = "" # //funcsynopsisdiv/funcsynopsisinfo
103 self.funcsynopsis = None # //funcsynopsisdiv/funcsynopsis
104 self.funcsynopsis_list = []
105 self.description = None
106 self.description_list = []
108 self.authors_list = [] # //sect1[authors]/listitem
109 self.authors = None # override
110 self.copyright = None
111 self.copyright_list = []
113 self.seealso_list = []
114 if func.list_seealso():
115 for item in func.list_seealso():
116 self.seealso_list += [ item ]
117 self.file_authors = None
118 if func.get_authors():
119 self.file_authors = func.get_authors()
120 self.authors_list += [ self.file_authors ]
121 self.file_copyright = None
122 if func.get_copyright():
123 self.file_copyright = func.get_copyright()
124 self.copyright_list += [ self.file_copyright ]
126 def refentryinfo_text(self):
127 """ the manvol formatter wants to render a footer line and header line
128 on each manpage and such info is set in <refentryinfo> """
129 if self.refentryinfo:
130 return self.refentryinfo
131 if self.refentry_date and \
132 self.refentry_productname and \
133 self.refentry_title: return (
134 "\n <date>"+self.refentry_date+"</date>"+
135 "\n <productname>"+self.refentry_productname+"</productname>"+
136 "\n <title>"+self.refentry_title+"</title>")
137 if self.refentry_date and \
138 self.refentry_productname: return (
139 "\n <date>"+self.refentry_date+"</date>"+
140 "\n <productname>"+self.refentry_productname+"</productname>")
142 def refmeta_text(self):
143 """ the manvol formatter needs to know the filename of the manpage to
144 be made up and these parts are set in <refmeta> actually """
147 if self.manvolnum and self.refentrytitle:
149 "\n <refentrytitle>"+self.refentrytitle+"</refentrytitle>"+
150 "\n <manvolnum>"+self.manvolnum+"</manvolnum>")
151 if self.manvolnum and self.name:
153 "\n <refentrytitle>"+self.name+"</refentrytitle>"+
154 "\n <manvolnum>"+self.manvolnum+"</manvolnum>")
156 def refnamediv_text(self):
157 """ the manvol formatter prints a header line with a <refpurpose> line
158 and <refname>'d functions that are described later. For each of
159 the <refname>s listed here, a mangpage is generated, and for each
160 of the <refname>!=<refentrytitle> then a symlink is created """
162 return self.refnamediv
163 if self.refpurpose and self.refname:
164 return ("\n <refname>"+self.refname+'</refname>'+
165 "\n <refpurpose>"+self.refpurpose+" </refpurpose>")
166 if self.refpurpose and self.refname_list:
168 for refname in self.refname_list:
169 T += "\n <refname>"+refname+'</refname>'
170 T += "\n <refpurpose>"+self.refpurpose+" </refpurpose>"
173 def funcsynopsisdiv_text(self):
174 """ refsynopsisdiv shall be between the manvol mangemaent information
175 and the reference page description blocks """
177 if self.funcsynopsis:
178 T += "\n<funcsynopsis>"
179 if self.funcsynopsisinfo:
180 T += "\n<funcsynopsisinfo>"+ self.funcsynopsisinfo + \
181 "\n</funcsynopsisinfo>\n"
182 T += self.funcsynopsis + \
183 "\n</funcsynopsis>\n"
184 if self.funcsynopsis_list:
185 T += "\n<funcsynopsis>"
186 if self.funcsynopsisinfo:
187 T += "\n<funcsynopsisinfo>"+ self.funcsynopsisinfo + \
188 "\n</funcsynopsisinfo>\n"
189 for funcsynopsis in self.funcsynopsis_list:
191 T += "\n</funcsynopsis>\n"
194 def description_text(self):
195 """ the description section on a manpage is the main part. Here
196 it is generated from the per-function comment area. """
198 return self.description
199 if self.description_list:
201 for description in self.description_list:
202 if not description: continue
204 if T.strip() != "": return T
205 return "<para>(missing description)</para>"
206 def authors_text(self):
207 """ part of the footer sections on a manpage and a description of
208 original authors. We prever an itimizedlist to let the manvol
209 show a nice vertical aligment of authors of this ref item """
212 if self.authors_list:
215 for authors in self.authors_list:
216 if not authors: continue
217 if previous == authors: continue
218 T += "\n <listitem><para>"+authors+"</para></listitem>"
220 T += "</itemizedlist>"
225 def copyright_text(self):
226 """ the copyright section is almost last on a manpage and purely
227 optional. We list the part of the per-file copyright info """
229 return self.copyright
230 """ we only return the first valid instead of merging them """
231 if self.copyright_list:
233 for copyright in self.copyright_list:
234 if not copyright: continue
235 return copyright # !!!
237 def seealso_text(self):
238 """ the last section on a manpage is called 'SEE ALSO' usally and
239 contains a comma-separated list of references. Some manpage
240 viewers can parse these and convert them into hyperlinks """
243 if self.seealso_list:
245 for seealso in self.seealso_list:
246 if not seealso: continue
251 def refentry_text(self, id=None):
252 """ combine fields into a proper docbook refentry """
256 T = '<refentry id="'+id+'">'
258 T = '<refentry>' # this is an error
260 if self.refentryinfo_text():
261 T += "\n<refentryinfo>"+ self.refentryinfo_text()+ \
262 "\n</refentryinfo>\n"
263 if self.refmeta_text():
264 T += "\n<refmeta>"+ self.refmeta_text() + \
266 if self.refnamediv_text():
267 T += "\n<refnamediv>"+ self.refnamediv_text() + \
269 if self.funcsynopsisdiv_text():
270 T += "\n<refsynopsisdiv>\n"+ self.funcsynopsisdiv_text()+ \
271 "\n</refsynopsisdiv>\n"
272 if self.description_text():
273 T += "\n<refsect1><title>Description</title> " + \
274 self.description_text() + "\n</refsect1>"
275 if self.authors_text():
276 T += "\n<refsect1><title>Author</title> " + \
277 self.authors_text() + "\n</refsect1>"
278 if self.copyright_text():
279 T += "\n<refsect1><title>Copyright</title> " + \
280 self.copyright_text() + "\n</refsect1>\n"
281 if self.seealso_text():
282 T += "\n<refsect1><title>See Also</title><para> " + \
283 self.seealso_text() + "\n</para></refsect1>\n"
285 T += "\n</refentry>\n"