1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
|
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
from __future__ import print_function
from zzipdoc.match import Match
from zzipdoc.htm2dbk import *
class FunctionListReference:
""" Creating a docbook-style <reference> list of <refentry> parts
that will each be translated into a unix manual page in a second step """
def __init__(self, o = None):
self.o = o
self.pages = []
self.entry = None
def cut(self):
if not self.entry: return
self.pages += [ self.entry ]
self.entry = None
def add(self, entry):
name = entry.get_name()
description = entry.body_xml_text(name)
funcsynopsis = entry.head_xml_text()
if not funcsynopsis:
print("no funcsynopsis for " + name)
return
if self.entry is None:
self.entry = FunctionListRefEntry(entry, self.o)
self.entry.funcsynopsisinfo = entry.get_mainheader()
self.entry.refpurpose = entry.get_title()
self.entry.refentrytitle = entry.get_name()
# self.entry.refname = entry.get_name()
self.entry.funcsynopsis_list += [ funcsynopsis ]
self.entry.description_list += [ description ]
self.entry.refname_list += [ name ]
if entry.list_seealso():
for item in entry.list_seealso():
if item not in self.entry.seealso_list:
self.entry.seealso_list += [ item ]
def get_title(self):
return self.o.package+" Function List"
def xml_text(self):
T = "<reference><title>"+self.get_title()+"</title>\n"
for item in self.pages:
text = item.refentry_text()
if not text: "OOPS, no text for", item.name ; continue
T += self.sane(text)
T += "</reference>\n"
return T
def sane(self, text):
return (html2docbook(text)
.replace("<link>","<function>")
.replace("</link>","</function>")
.replace("<fu:protospec>","<funcprototype>")
.replace("</fu:protospec>","</funcprototype>")
.replace("<fu:prespec>","<funcdef>")
.replace("</fu:prespec>","")
.replace("<fu:namespec>","")
.replace("</fu:namespec>","</funcdef>")
.replace("</fu:callspec>","</paramdef>")
.replace("<fu:callspec>","<paramdef>"))
class FunctionListRefEntry:
def __init__(self, func, o):
""" initialize the fields needed for a man page entry - the fields are
named after the docbook-markup that encloses (!!) the text we store
the entries like X.refhint = "hello" will be printed therefore as
<refhint>hello</refhint>. Names with underscores are only used as
temporaries but they are memorized, perhaps for later usage. """
self.name = func.get_name()
self.refhint = "\n<!--========= "+self.name+" (3) ============-->\n"
self.refentry = None
self.refentry_date = o.version.strip() #! //refentryinfo/date
self.refentry_productname = o.package.strip() #! //refentryinfo/prod*
self.refentry_title = None #! //refentryinfo/title
self.refentryinfo = None #! override
self.manvolnum = "3" # //refmeta/manvolnum
self.refentrytitle = None # //refmeta/refentrytitle
self.refmeta = None # override
self.refpurpose = None # //refnamediv/refpurpose
self.refname = None # //refnamediv/refname
self.refname_list = []
self.refnamediv = None # override
self.mainheader = func.get_mainheader()
self.includes = func.get_includes()
self.funcsynopsisinfo = "" # //funcsynopsisdiv/funcsynopsisinfo
self.funcsynopsis = None # //funcsynopsisdiv/funcsynopsis
self.funcsynopsis_list = []
self.description = None
self.description_list = []
# optional sections
self.authors_list = [] # //sect1[authors]/listitem
self.authors = None # override
self.copyright = None
self.copyright_list = []
self.seealso = None
self.seealso_list = []
if func.list_seealso():
for item in func.list_seealso():
self.seealso_list += [ item ]
self.file_authors = None
if func.get_authors():
self.file_authors = func.get_authors()
self.authors_list += [ self.file_authors ]
self.file_copyright = None
if func.get_copyright():
self.file_copyright = func.get_copyright()
self.copyright_list += [ self.file_copyright ]
#fu
def refentryinfo_text(self):
""" the manvol formatter wants to render a footer line and header line
on each manpage and such info is set in <refentryinfo> """
if self.refentryinfo:
return self.refentryinfo
if self.refentry_date and \
self.refentry_productname and \
self.refentry_title: return (
"\n <date>"+self.refentry_date+"</date>"+
"\n <productname>"+self.refentry_productname+"</productname>"+
"\n <title>"+self.refentry_title+"</title>")
if self.refentry_date and \
self.refentry_productname: return (
"\n <date>"+self.refentry_date+"</date>"+
"\n <productname>"+self.refentry_productname+"</productname>")
return ""
def refmeta_text(self):
""" the manvol formatter needs to know the filename of the manpage to
be made up and these parts are set in <refmeta> actually """
if self.refmeta:
return self.refmeta
if self.manvolnum and self.refentrytitle:
return (
"\n <refentrytitle>"+self.refentrytitle+"</refentrytitle>"+
"\n <manvolnum>"+self.manvolnum+"</manvolnum>")
if self.manvolnum and self.name:
return (
"\n <refentrytitle>"+self.name+"</refentrytitle>"+
"\n <manvolnum>"+self.manvolnum+"</manvolnum>")
return ""
def refnamediv_text(self):
""" the manvol formatter prints a header line with a <refpurpose> line
and <refname>'d functions that are described later. For each of
the <refname>s listed here, a mangpage is generated, and for each
of the <refname>!=<refentrytitle> then a symlink is created """
if self.refnamediv:
return self.refnamediv
if self.refpurpose and self.refname:
return ("\n <refname>"+self.refname+'</refname>'+
"\n <refpurpose>"+self.refpurpose+" </refpurpose>")
if self.refpurpose and self.refname_list:
T = ""
for refname in self.refname_list:
T += "\n <refname>"+refname+'</refname>'
T += "\n <refpurpose>"+self.refpurpose+" </refpurpose>"
return T
return ""
def funcsynopsisdiv_text(self):
""" refsynopsisdiv shall be between the manvol mangemaent information
and the reference page description blocks """
T=""
if self.funcsynopsis:
T += "\n<funcsynopsis>"
if self.funcsynopsisinfo:
T += "\n<funcsynopsisinfo>"+ self.funcsynopsisinfo + \
"\n</funcsynopsisinfo>\n"
T += self.funcsynopsis + \
"\n</funcsynopsis>\n"
if self.funcsynopsis_list:
T += "\n<funcsynopsis>"
if self.funcsynopsisinfo:
T += "\n<funcsynopsisinfo>"+ self.funcsynopsisinfo + \
"\n</funcsynopsisinfo>\n"
for funcsynopsis in self.funcsynopsis_list:
T += funcsynopsis
T += "\n</funcsynopsis>\n"
#fi
return T
def description_text(self):
""" the description section on a manpage is the main part. Here
it is generated from the per-function comment area. """
if self.description:
return self.description
if self.description_list:
T = ""
for description in self.description_list:
if not description: continue
T += description
if T.strip() != "": return T
return "<para>(missing description)</para>"
def authors_text(self):
""" part of the footer sections on a manpage and a description of
original authors. We prever an itimizedlist to let the manvol
show a nice vertical aligment of authors of this ref item """
if self.authors:
return self.authors
if self.authors_list:
T = "<itemizedlist>"
previous=""
for authors in self.authors_list:
if not authors: continue
if previous == authors: continue
T += "\n <listitem><para>"+authors+"</para></listitem>"
previous = authors
T += "</itemizedlist>"
return T
if self.authors:
return self.authors
return ""
def copyright_text(self):
""" the copyright section is almost last on a manpage and purely
optional. We list the part of the per-file copyright info """
if self.copyright:
return self.copyright
""" we only return the first valid instead of merging them """
if self.copyright_list:
T = ""
for copyright in self.copyright_list:
if not copyright: continue
return copyright # !!!
return ""
def seealso_text(self):
""" the last section on a manpage is called 'SEE ALSO' usually and
contains a comma-separated list of references. Some manpage
viewers can parse these and convert them into hyperlinks """
if self.seealso:
return self.seealso
if self.seealso_list:
T = ""
for seealso in self.seealso_list:
if not seealso: continue
if T: T += ", "
T += seealso
if T: return T
return ""
def refentry_text(self, id=None):
""" combine fields into a proper docbook refentry """
if id is None:
id = self.refentry
if id:
T = '<refentry id="'+id+'">'
else:
T = '<refentry>' # this is an error
if self.refentryinfo_text():
T += "\n<refentryinfo>"+ self.refentryinfo_text()+ \
"\n</refentryinfo>\n"
if self.refmeta_text():
T += "\n<refmeta>"+ self.refmeta_text() + \
"\n</refmeta>\n"
if self.refnamediv_text():
T += "\n<refnamediv>"+ self.refnamediv_text() + \
"\n</refnamediv>\n"
if self.funcsynopsisdiv_text():
T += "\n<refsynopsisdiv>\n"+ self.funcsynopsisdiv_text()+ \
"\n</refsynopsisdiv>\n"
if self.description_text():
T += "\n<refsect1><title>Description</title> " + \
self.description_text() + "\n</refsect1>"
if self.authors_text():
T += "\n<refsect1><title>Author</title> " + \
self.authors_text() + "\n</refsect1>"
if self.copyright_text():
T += "\n<refsect1><title>Copyright</title> " + \
self.copyright_text() + "\n</refsect1>\n"
if self.seealso_text():
T += "\n<refsect1><title>See Also</title><para> " + \
self.seealso_text() + "\n</para></refsect1>\n"
T += "\n</refentry>\n"
return T
#fu
#end
|