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
|
#! /usr/bin/python3
""" Searches through a directory and creates an index page for it
"""
__author__ = "Guido U. Draheim"
import logging
import os.path
import re
import xml.etree.ElementTree as ET
logg = logging.getLogger("dir2index")
def esc(text):
text = text.replace(".", "\\&.")
text = text.replace("-", "\\-")
return text
def unescape(text):
text = text.replace('<', '<')
text = text.replace('>', '>')
text = text.replace('"', '"')
text = text.replace('&', '&')
return text
def htm(text):
text = text.replace('&', '&')
text = text.replace('<', '<')
text = text.replace('>', '>')
text = text.replace('"', '"')
return text
def splitname(filename):
base = os.path.basename(filename)
name, ext = os.path.splitext(base)
if name.endswith(".3"): name = name[:-2]
return name
def parse_html(filename):
tree = ET.parse(filename)
return tree.getroot()
def zzip_sorted(filenames):
for name in filenames:
if "zziplib" in name:
yield name
for name in filenames:
if "zziplib" not in name:
yield name
def dir2(man, dirs, into):
text = "<html><body>" + "\n"
file2name = {}
file2text = {}
for dirname in dirs:
for filename in os.listdir(dirname):
filepath = os.path.join(dirname, filename)
file2name[filename] = splitname(filename)
file2text[filename] = open(filepath).read()
# find the overview filenames and generate the pages order
overviews = []
for filename in file2text:
if " overview</title>" in file2text[filename]:
overviews.append(filename)
logg.warning("overviews = %s", overviews)
logg.warning("overviews = %s", [file2name[f] for f in overviews])
file2item = {}
pages = []
for overview in zzip_sorted(overviews):
if overview not in pages:
pages.append(overview)
for line in file2text[overview].split("\n"):
m = re.match('<li><a href="([^"]*)".*</li>', line)
if m:
filename = m.group(1)
if filename not in file2item:
file2item[filename] = line
if filename not in pages:
pages.append(filename)
for filename in sorted(file2name):
if filename not in pages:
pages.append(filename)
text += "<ul>"
for page in pages:
if page in file2item:
text += file2item[page]
elif page in overviews:
name = file2name[page]
logg.warning("page %s = %s", page, name)
text += '<li><a href="%s"><h4>%s</h4></a></li>' % (page, name)
else:
name = file2name[page]
text += '<li><a href="%s">%s</a></li>' % (page, name)
text += "\n"
text += "</ul>"
text += "</body></html>" + "\n"
writefile("%s/index.html" % into, text)
def writefile(filename, manpagetext):
dirname = os.path.dirname(filename)
if not os.path.isdir(dirname):
logg.debug("mkdir %s", dirname)
os.makedirs(dirname)
with open(filename, "w") as f:
f.write(manpagetext)
logg.debug("written %s [%s]", filename, manpagetext.split("\n", 1)[0])
if __name__ == "__main__":
from optparse import OptionParser
_o = OptionParser("%prog [options] directories...")
_o.add_option("-o","--into", metavar="DIR", default=".",
help="specify base directory for output [%default]")
_o.add_option("-t","--make", metavar="DIR", default="man",
help="make 'man'/'html' output pages [%default]")
_o.add_option("-v","--verbose", action="count", default=0,
help="increase logging level [%default]")
opt, args = _o.parse_args()
logging.basicConfig(level = max(0, logging.WARNING - 10 * opt.verbose))
# ensure commandline is compatible with "xmlto -o DIR TYPE INPUTFILE"
make = opt.make
dir2(make == 'man', args, opt.into)
|