-
Notifications
You must be signed in to change notification settings - Fork 73
/
dump_sphinx_objects_inventory.py
executable file
·163 lines (133 loc) · 4.48 KB
/
dump_sphinx_objects_inventory.py
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
#!/usr/bin/env python
"""
Process URL for intersphinx targets and emit html or text
originally retrieved from:
https://gist.github.com/gmr/11359058
fixed for python3 and pep8 compliance by jantman
"""
from sphinx.ext.intersphinx import read_inventory_v2
from posixpath import join
import pprint
import argparse
import locale
import os
import sys
import tempfile
import urllib2
def validuri(string):
return string
parser = argparse.ArgumentParser(description='Process intersphinx link library')
parser.add_argument('--url', type=validuri,
help="URL to retrieve objects.inv from")
parser.add_argument('--file', help="objects.inv format file")
group = parser.add_mutually_exclusive_group(required=False)
group.add_argument('--html', action='store_true', help="Output HTML")
group.add_argument('--terse', action='store_true',
help="Output terse text list")
group.add_argument('--rst', action='store_true',
help="Output ReStructuredText")
group.add_argument('--rewrite', action='store_true',
help="Output short form and correct form of each link.")
args = parser.parse_args()
def start_role(role):
if args.terse:
return
elif args.rewrite:
return
elif args.rst:
print(role)
else:
print("<dt>Role: {}</dt>\n<dd>\n<dl>\n".format(role))
def start_item(role, item):
if args.terse:
return
elif args.rewrite:
return
elif args.rst:
print("\t:{}:{}:".format(role, item))
elif args.html:
print("<dt>{}:{}</dt>\n".format(role, item))
print("<dd>")
print("<table>\n<tbody>")
def end_item(role, item):
if args.html:
print("</tbody></table>")
print("</dd>\n")
def print_link(role, item, domain, title):
"""Return the correct link form, if no title then extended form."""
domain = domain.lower()
if title == '' or title == '-':
linkStr = ":{}:`{} <{}:{}>`".format(role, item, domain, item)
else:
linkStr = ":{}:`{}:{}`".format(role, domain, item)
if args.terse:
print(linkStr)
if args.rewrite:
print(":{}:`{}:{}`".format(role, domain, item), "\t{}".format(linkStr))
elif args.rst:
print("\t\t:Link:\t{}".format(linkStr))
elif args.html:
print("<tr><th>Link:</th><td>{}</td></tr>".format(linkStr))
def end_role():
if args.html:
print("</dl>\n")
print("</dd>\n")
def print_meta(role, item, domain, version, url, title):
if args.terse:
return
elif args.rewrite:
return
elif args.rst:
print("\t\t:Domain:\t{}".format(domain))
print("\t\t:Version:\t{}".format(version))
print("\t\t:URL:\t{}".format(url))
print("\t\t:Title:\t{}".format(title))
elif args.html:
print("<tr><th>Domain:</th><td>{}</td></tr>".format(domain))
print("<tr><th>Version:</th><td>{}</td></tr>".format(version))
print("<tr><th>URL:</th><td>{}</td></tr>".format(url))
print("<tr><th>Title:</th><td>{}</td></tr>".format(title))
return
def fetch_data(url, inv):
f = open(inv, 'rb')
line = f.readline() # burn a line
invdata = read_inventory_v2(f, url or '', join)
if args.html:
print("<dl>")
for role in invdata:
start_role(role)
for item in invdata[role]:
(domain, version, url, title) = invdata[role][item]
start_item(role, item)
print_link(role, item, domain, title)
print_meta(role, item, domain, version, url, title)
end_item(role, item)
if args.html:
print("</dl>\n")
if __name__ == "__main__":
if args.file:
inv = args.file
else:
inv = False
if args.url:
url = args.url
else:
url = False
if inv is False and url is False:
raise Exception("need to specify a file or URL")
if inv and url != '':
fetch_data(url, inv)
elif url:
# fetch URL into inv
if url.rfind('objects.inv') > 5:
invdata = urllib2.urlopen(url)
else:
invdata = urllib2.urlopen(url + '/objects.inv')
sys.stderr.write('URL resolved to: {}\n '.format(invdata.geturl()))
f = tempfile.NamedTemporaryFile()
f.write(invdata.read())
sys.stderr.write("objects.inv written to: {}\n".format(f.name))
sys.stderr.write("Using: {} as base HREF\n".format(url))
fetch_data(url, f.name)
else:
raise Exception("You need to specify a --URL")