#!/usr/bin/python
#
# Generate a HTML directory listing of a local directory.
# (c) 2009, Mason Larobina <mason.larobina@gmail.com>
#
# Usage:
# @on_event LOAD_ERROR spawn @scripts_dir/gendirlist.py %1
import sys
from os import path, listdir
from os.path import isdir, realpath, join
from urllib import quote
from base64 import b64encode as encode
import time
# Debugging.
import pprint
pprint.pprint(list(enumerate(sys.argv)))
# uri setting and HTML encoding function
def set_html(html):
return "set uri = data:text/html;base64,%s" % encode(html)
ESCAPES = {'<': '<', '>': '>'}
def escape(html):
for (old, new) in ESCAPES.items():
html = html.replace(old, new)
return html
fifo, uri = sys.argv[4], sys.argv[8]
if uri.startswith("file://"):
uri = uri[7:]
elif uri.startswith('http://') or uri.startswith('https://'):
sys.exit(0)
dir = realpath(uri)
if not isdir(dir):
sys.exit(0)
def send(cmd):
fh = open(fifo, 'w')
print "<--", cmd
fh.write('%s\n' % cmd)
fh.close()
links = []
link = links.append
ld = [f for f in listdir(dir) if not f.startswith('.')]
ld = sorted([(not isdir(join(dir, f)), f) for f in ['..']+ld])
LINK_FORMAT = '[%3s] <a href="javascript:void()" local="file://%s">%s</a>'
for (isfile, f) in ld:
fp = join(dir, f)
link(LINK_FORMAT % ('' if isfile else "DIR", quote(fp), escape(f)))
HTML_FORMAT = '''
<html><head>
<title>Directory listing for: %s</title>
</head><body><pre>
%s
</pre></body></html>'''
send(set_html(HTML_FORMAT % (escape(dir), '<br>'.join(links))))
time.sleep(0.1)
send("js %s" % ' '.join(filter(None, map(str.strip, '''
var last_links = 0;
var count = 0;
var run = Uzbl.run;
function set(k,v) { run('set '+k+' = '+v) };
function fix_links() {
var links = document.links;
for (var i = 0; i < links.length; i++) {
links[i].onclick = function () {
set('uri', this.getAttribute('local'));
};
};
if(!last_links || last_links != links.length) {
last_links = links.length;
count++;
setTimeout(fix_links, 500);
};
};
fix_links();
'''.split('\n')))))
send('event LOAD_PROGRESS 100')
Navigating to a location with a space in the uri fails.
Could use jazzing up (a stylesheet, show file mtimes next to link, …)