terom@76: from degal.command import command terom@117: from degal.concurrent import task terom@66: from degal import templates terom@48: terom@94: def render_image_html (ctx, image) : terom@66: """ terom@66: Render the thumbnails and .html for one image terom@66: """ terom@87: terom@101: ctx.log_debug("%s", image.html) terom@101: terom@66: # render output terom@119: tpl = templates.master(ctx.gallery, image, terom@66: templates.image_page(image) terom@66: ) terom@66: terom@66: # write output terom@66: tpl.render_file(image.html) terom@66: terom@117: def update_image_thumbs (image) : terom@94: """ terom@117: Render the thubmnails for the given image, returning the image. terom@117: terom@117: This /should/ be threadsafe. terom@94: """ terom@117: terom@117: # this will unconditionally update the image terom@117: image.update() terom@94: terom@117: return image terom@94: terom@101: def render_folder_images (ctx, images, for_update=True) : terom@94: """ terom@94: Render the given series of images terom@94: """ terom@118: terom@118: # XXX: handle this thumb-update/html-update stuff better terom@123: terom@123: # render all HTML terom@123: for image in images : terom@123: render_image_html(ctx, image) terom@123: terom@94: terom@117: # render the thumbnails concurrently terom@117: for image in ctx.concurrent.execute( terom@117: task(update_image_thumbs, image) terom@117: terom@117: for image in images terom@117: terom@117: # only test if not already filtered for update terom@117: # XXX: externalize logic terom@117: if for_update or ctx.config.force_thumb or image.stale() terom@117: ) : terom@94: # log image path terom@94: ctx.log_info("%s", image) terom@94: terom@101: # release large objects that are not needed anymore terom@123: image.cleanup() terom@101: terom@117: def render_folder_html (ctx, folder) : terom@48: """ terom@87: Render the .html output for one folder terom@48: """ terom@48: terom@87: # render each page separately terom@66: for page in xrange(folder.page_count) : terom@66: # output .html page terom@119: html = folder.html_page(page) terom@101: terom@119: ctx.log_debug("%s", html) terom@66: terom@66: # render template terom@119: tpl = templates.master(ctx.gallery, folder, terom@66: templates.folder_page(folder, page) terom@66: ) terom@66: terom@66: # write output terom@119: tpl.render_file(html) terom@66: terom@87: def render_folder (ctx, folder) : terom@94: """ terom@94: Render the HTML/images for this folder if needed, and recrurse into subfolders. terom@131: terom@131: Returns True if any sub-images were found, False if this folder and all subfolders were completely empty and no terom@131: HTML was generated. terom@131: terom@131: XXX: this logic is too complicated for one function. For one module? terom@94: """ terom@131: terom@131: # flag to track if we've rendered any contents. terom@131: empty = True terom@101: terom@101: if ctx.config.force_html or ctx.config.force_thumb : terom@101: # index all terom@101: for_update = False terom@94: terom@101: else : terom@101: # only new images terom@101: for_update = True terom@101: terom@101: # full count of images terom@87: image_count = len(folder.images) terom@101: terom@101: # index selected images terom@101: new_images = list(folder.index_images(for_update=for_update)) terom@101: terom@131: # index subfolders terom@131: for subfolder in folder.subfolders : terom@131: if render_folder(ctx, subfolder) : terom@131: # positive assertion terom@131: empty = False terom@131: terom@131: if folder.images : terom@131: empty = False terom@131: terom@131: # only render HTML if needed terom@131: if not empty : terom@87: # update folder index terom@117: render_folder_html(ctx, folder) terom@131: terom@131: # only render new images if needed terom@131: if new_images or ctx.config.force_html : terom@87: ctx.log_info("%s - render %d/%d images", folder, len(new_images), image_count) terom@87: terom@87: # update images terom@101: render_folder_images(ctx, new_images, for_update) terom@131: terom@87: else : terom@87: ctx.log_info("%s - up to date", folder) terom@131: terom@131: # return flag terom@131: return empty terom@66: terom@66: @command terom@66: def main (ctx) : terom@66: """ terom@66: Scan the gallery for new folders/images, and render updated ones terom@66: """ terom@66: terom@66: # render the gallery terom@66: render_folder(ctx, ctx.gallery) terom@48: