#! /usr/bin/env python

#
# We generate some html pages to show images
#
# The images and generated thumbnails are copied to dest rep, but the
# generated html files are produced in the source tree, for you to
# include in your statc site before publication.
#

import os, sys, shutil, string, Image
from mkcommons import *

INDEX = "index.html"
LIST  = "list"
MENU  = "menu"
TN_PREFIX = "tn_"
TNX = 120
TNY = 90
COLS = 4

def mkImgPage(src, image, prev, next):
    """ generate the html page for one image """
    name = image[:-4]
    html = name + ".html"

    # Don't generate the html file if up to date
    if is_newer(os.path.join(src, html), os.path.join(src, image)):
        return html
    
    index = open(os.path.join(src, html), "w")
    index.write('<div id="Content">\n')
    index.write('<table border="0" cellpadding="5">\n')

    # Present the image
    index.write('<tr>\n  ')
    index.write('<td colspan="3" align="center">' +
                '<img src="%s" alt="%s" title="%s"></td>\n' \
                % (image, name, name))
    index.write('</tr>\n')

    # Then the image title, and the prev and next ones
    index.write('<tr>\n')
    index.write('  <td align="left">\n' +
                '    <a href="%s"><img src="%s" alt="%s" title="%s"></a>\n' \
                % (prev[:-4] + ".html", TN_PREFIX+prev, prev[:-4], prev[:-4]) +
                '  </td>\n')
    index.write('  <td align="center"><h2>%s</h2></td>\n' \
                % name.replace('_', ' '))
    index.write('  <td align="right">\n' +
                '    <a href="%s"><img src="%s" alt="%s" title="%s"></a>\n'\
                % (next[:-4] + ".html", TN_PREFIX+next, next[:-4], next[:-4]) +
                '  </td>\n')
    index.write('</tr>\n')
    
    index.write('</table>\n')
    index.write('</div>\n')
    index.close()

    return html

def mkIndex(src, imgs):
    """ generate the html index page """
    nbi = len(imgs)
    if nbi == 0:
        return

    name = os.path.join(src, INDEX)

    # Create the INDEX file only if one of the images is newer than
    # the existing INDEX file
    mkindex = False
    for i in imgs:
        mkindex = mkindex or is_newer(os.path.join(src, i), name)

    if not mkindex:
        return

    print name
    index = open(name, "w")
    index.write('<div id="Content">\n')
    index.write('<h1>%s</h1>' % src)
    index.write('<table border="0" cellpadding="5">\n')
    index.write('<tr>\n')

    i = 0
    for img in imgs:
        i+=1
        tn_img = TN_PREFIX + img
        link = img[:-4] + ".html"
        index.write('  <td align="center" valign="top">\n    ' +
                    '<a href="%s"><img src="%s" alt="%s" title="%s"></a>\n' \
                    % (link, tn_img, img, img) +
                    '</td>\n')

        if i > 0 and i % COLS == 0:
            index.write('</tr>\n')
            if i < nbi:
                index.write('<tr>\n')
    
    index.write('</table>\n')
    index.write('</div>\n')
    index.close()

    return 

def mkclean(src, dest, images):
    """ clean out the dest rep """
    # Clean the source dir
    for f in os.listdir(src):
        # Ckeck only image.html files to be deleted
        if f != INDEX and f[-4:] == "html":
            name    = os.path.join(src, f)
            image   = f[:-4] + "jpg"
            imgfile = os.path.join(src, image)
            if not os.path.isfile(imgfile):
                print "Deleting", name
                os.remove(name)

    # Make list of files to be found on dest
    files = [INDEX]
    for i in images:
        files.append(i)
        files.append(TN_PREFIX + i)
        files.append("%s.html" % i[:-4])

    for f in os.listdir(dest):
        name = os.path.join(dest, f)
        if os.path.isfile(name) and f not in files:
            print "Deleting", name
            os.remove(name)

def mkgal(src, dest, images):
    """ make the gallery """
    pages = []
    pos = 0
    nbi = len(images)
    while pos < nbi:
        # First copy the image on dest
        image    = images[pos]
        img_src  = os.path.join(src, image)
        img_dest = os.path.join(dest, image)

        if not os.path.isfile(img_dest):
            shutil.copyfile(img_src, img_dest)
        
        # Then make the thumbnail
        tn = os.path.join(dest, TN_PREFIX + image)
        if not os.path.isfile(tn):
            print "Creating", tn
            img = Image.open(img_src)
            img.thumbnail((TNX, TNY), Image.ANTIALIAS)
            img.save(tn, img.format)

        # Make an image.html page with prev and next image
        if pos == 0:
            prev = images[nbi-1]
        else:
            prev = images[pos-1]

        if pos < nbi-1:
            next = images[pos+1]
        else:
            next = images[0]
            
        pages.append( mkImgPage(src, image, prev, next) )
        
        pos += 1

    # Make the index.html page for current rep
    if nbi > 0:
        mkIndex(src, images)

    # Create a list file containing the generated pages
    mklist(src, pages)

    # Clean the src dir
    for f in os.listdir(src):
        biglist = images + pages + [INDEX, LIST, MENU]
        if os.path.isfile(f) and f not in biglist:
            print "Deleting", f
            os.remove(f)

    # Clean out the dest dir
    mkclean(src, dest, images)

    return
        
def main(src, dest):
    """ Make all the html file """
    for root, dirs, files in os.walk(src):
        # Build the dest dir
        rlist = root.split('/')
        if len(rlist) > 1:
            dest_dir = os.path.join(dest, string.join(rlist[1:], '/'))
        else:
            dest_dir = dest

        # We build the tree on the dest side
        if not os.path.isdir(dest_dir):
            print "mkdir", dest_dir
            os.mkdir(dest_dir)

        images = []
        for f in files:
            # Consider .jpg files only
            if f[-4:].lower() in ['.jpg']:
                images.append(f)

        mkgal(root, dest_dir, images)

if __name__ == "__main__":
    if len(sys.argv) == 3:
        main(sys.argv[1], sys.argv[2])
    else:
        prog = sys.argv[0]
        print "usage: %s <source dir> <target dir>"
    
