#!/usr/bin/env python # coding=utf-8 ''' A script that creates an index for a folder. ''' import os,sys,time import urllib from glob import fnmatch 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, even if it's not generated with SimpleWebPage. By default, if file is generated with SimpleWebPage it will be overwritten!") 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("--include","-i", action="store", dest="includes", default=['*'], help="Glob match for files to be included in the table. ex. *.jpg. You can pass several includes.", nargs = '*' ) 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): """ returns new opts and was it able to read HTML """ try: read_config = False with open(os.path.join(opts.path,opts.filename), 'rt') as f: for l in f.readlines(): if l.find(' -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" read_config = True print("Reading options from existing " + opts.filename) break return (opts, read_config) except: return (opts, False) def generate_index(opts): for path,dirs, files in os.walk(opts.path): existing_config = False if opts.filename in files: opts, existing_config = HTML2setup(opts) if not existing_config and not opts.overwrite: print(opts.filename + " exists, and not generated with SimpleWebPage. Exiting.") sys.exit(1) files = [ f for f in files if f != opts.filename] files = match_files(files, opts.includes) if not opts.hidden: files = [ f for f in files if not f.startswith(".")] dirs = [ d for d in dirs if not d.startswith(".")] dirs.sort() files.sort() with open(os.path.join(path,opts.filename), 'wt') as f: 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 match_files(files, glob_list): matched = [] for f in files: for g in glob_list: if fnmatch.fnmatch(f,g): matched.append(f) break return matched 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)