#!/usr/bin/env python # coding=utf-8 ''' A script that creates an index for a folder. ''' import os,sys,time import urllib VERSION = "20181206" IMAGE_EXTENSIONS = ['png', 'gif', 'jpg', 'jpeg', 'tif', 'tiff'] def setup(): ''' Setup the command line options ''' from argparse import ArgumentParser parser = ArgumentParser( epilog = "Recursively generate indexes: \n# find . -type d -not -path '*/.*' -exec SimpleWebPage -f \{\} \;" ) parser.add_argument("-f",action="store_true",dest="overwrite",default=False, help="Overwrite existing index file.") parser.add_argument("-H",action="store_true",dest="hidden",default=False, help="Show hidden files") parser.add_argument("-t",type=str,dest="title",default=None, help="Name for the title (Default: Folder name)") parser.add_argument("-o",type=str,dest="filename",default="index.html", help="Output filename (Default: index.html)") parser.add_argument("-p",action="store_false",dest="parent",default=True, help="Do no print .. link for parent folder.") parser.add_argument("--images",action="store_true",dest="images",default=False, help="Show images with tags") parser.add_argument("--version",action='version', version=VERSION) parser.add_argument("path",type=str,action="store",default=os.path.abspath('.'),nargs='?', help="Root path of the index") options = parser.parse_args() options.path = os.path.abspath(options.path) if options.title == None: options.title = os.path.basename(options.path) return options def setup2HTML(opts): return ''%";".join([ 'hidden=%s'%opts.hidden, 'parent=%s'%opts.parent, 'title=%s'%urllib.quote(opts.title), 'images=%s'%opts.images ]) def HTML2setup(opts): f = open(os.path.join(opts.path,opts.filename), 'rt') try: for l in f.readlines(): if l.find('name="SimpleWebPageSetup"') > -1: content = l[l.find('name="SimpleWebPageSetup"'):] for s in content.split('"')[3].split(";"): (k,v) = s.split('=',1) if k == 'hidden': opts.hidden = v == "True" if k == 'parent': opts.parent = v == "True" if k == 'title': opts.title = urllib.unquote(v) if k == 'images': opts.images = v == "True" print("Reading options from existing " + opts.filename) break except: pass return opts def generate_index(opts): for path,dirs,files in os.walk(opts.path): if opts.filename in files: if not opts.overwrite: print(opts.filename+" exists") sys.exit(1) opts = HTML2setup(opts) files = [ f for f in files if f != opts.filename] if not opts.hidden: files = [ f for f in files if not f.startswith(".")] dirs = [ d for d in dirs if not d.startswith(".")] f = open(os.path.join(path,opts.filename),'wt') dirs.sort() files.sort() f.write(get_header(opts)) if opts.parent: f.write(get_pathlink(path, '..')) for di in dirs: f.write(get_pathlink(path, di)) for fi in files: f.write(get_filelink(path, fi, opts.images)) f.write(get_footer()) f.close() return def get_filelink(path,fname,images=False): if os.path.islink(os.path.join(path, fname)) and not os.path.exists(os.path.join(path, fname)): (fsize, fsstr, fsstrb, fdstr)=(0, "NA", "NA", "NA") else: fsize = os.path.getsize(os.path.join(path, fname)) fsstr = sizeof(fsize) fsstrb = str(fsize) fdate = time.localtime(os.path.getmtime(os.path.join(path, fname))) fdstr = time.strftime("%Y/%m/%d %H:%M:%S", fdate) if images and is_imagefile(fname): fname_str = get_imagestr(fname) else: fname_str = fname return '%s%s%s%s\n'%( urllib.quote(fname), fname_str, fsstr, fsstrb, fdstr ) def get_imagestr(fname): return ''%( urllib.quote(fname), fname ) def get_pathlink(path,dname): fdate = time.localtime(os.path.getmtime(os.path.join(path, dname))) fdstr = time.strftime("%Y/%m/%d %H:%M:%S", fdate) return '↳ %s/[DIR]0%s\n'%( urllib.quote(dname), dname, fdstr ) def get_header(opts): header=''' ''' + setup2HTML(opts) + ''' ''' + opts.title + '''

''' + opts.title + '''

''' return header def get_footer(): return '''
NameSizeSize BModified
''' def is_imagefile(fname): for ext in IMAGE_EXTENSIONS: if fname.lower().endswith(ext): return True return False def sizeof(num): for x in [' B','KB','MB','GB','TB']: if num < 1024.0: if x==' B': return "%d %s" % (num, x) return "%3.1f %s" % (num, x) num /= 1024.0 if __name__ == "__main__": opts = setup() generate_index(opts)