-
-
Save epc/4118456 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
""" Process URL for intersphinx targets and emit html or text """ | |
def validuri(string): | |
return string | |
from sphinx.ext.intersphinx import read_inventory_v2 | |
from posixpath import join | |
import pprint | |
import argparse | |
import locale | |
import os,sys,tempfile | |
import urllib2 | |
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 == '')|(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] | |
#sys.stderr.write("{}:{} :: {}\n".format(role,item,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 | |
# if os.path.exists(inv) == False: | |
# raise Exception('File "{}" does not exist'.format(inv)) | |
else: | |
inv = False | |
if (args.url): | |
url = args.url | |
else: | |
url = False | |
# sys.stderr.write('URL({}) FN({})\n'.format(url,fn)) | |
if (inv == False) & (url == False): | |
raise Exception("need to specify a file or URL") | |
if (inv != False ) & (url != ''): | |
#sys.stderr.write("Reading from: {}\n".format(inv)) | |
#sys.stderr.write("Using: {} as base HREF\n".format(url)) | |
fetch_data(url,inv) | |
elif (url != False): | |
# fetch URL into inv | |
#sys.stderr.write("Retrieving objects.inv from {}\n".format(url)) | |
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())) | |
#print invdata.read() | |
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") |
Also on Windows it fails, you should change from posixos import join
to from os.path import join
You can now call sphinx.ext.intersphinx directly to output cleartext from objects.inv
[Your_Sphinx_venv]/bin/python -m sphinx.ext.intersphinx.py [path or URL] > output.txt
The output uses justified text instead of tabs for better display in a terminal. To output fully tabbed csv you can tweak the print output of the inventory_main function at the end.
here is the link to my gist with the pure tab-delimited output https://gist.github.com/acsr/fb7b5cf97627f70876ceeae031cd37f1#file-sphinx-ext-intersphinx-py
In case anyone is 1) still using this and 2) has comments, please send them to me or call attention to me, for whatever reason I never get notifications on this gist. I'm @epc on Twitter and epc at epcostello dot com via email.
Slowest delayed reply ever: apologies for not seeing these comments last year, I didn't receive any notifications.