# HG changeset patch # User paulo # Date 1370144580 25200 # Node ID 0482bffd7d7f0fefe85849481ca118cee9658679 # Parent f5c2934a1e3f0cda59dc0d1f963fb883e2de3414 update pics2/pics_app.py with browse page diff -r f5c2934a1e3f -r 0482bffd7d7f pics2/pics_app.py --- a/pics2/pics_app.py Tue May 14 23:36:18 2013 -0700 +++ b/pics2/pics_app.py Sat Jun 01 20:43:00 2013 -0700 @@ -5,51 +5,151 @@ import html +import logging +logging.basicConfig( + level=logging.DEBUG, + filename="_LOG", + format="%(asctime)s %(levelname)-8s %(message)s", +) -_APPROOTPATH = "/pics" -_GET_PICSDIR_RE = re.compile(r"^.*" + _APPROOTPATH) -def _get_pics_dir(environ): - path_info = environ.get("PATH_INFO", '') - return _GET_PICSDIR_RE.sub('.', path_info) - def _get_pics_url(environ, dirpath): script_name = environ.get("SCRIPT_NAME", '') return os.path.normpath(os.path.join(os.path.dirname(script_name), dirpath)) +def _get_app_url(environ, dirpath): + script_name = environ.get("SCRIPT_NAME", '') + return os.path.normpath(os.path.join(script_name, dirpath)) + + +def _parse_path_info(path_info): + ppi = path_info.split(os.sep) + if len(ppi) > 1 and ppi[-1] == '': + del ppi[-1] + + return ppi + + +def _get_standard_html_doc(title): + root = html.HTML("html") + + header = root.header + header.title(title) + + body = root.body + body.h1(title) + + return (root, header, body) + + +def _numeric_pad_basename(path, maxdigits=20): + return os.path.basename(path).zfill(maxdigits) + + +def _get_images(d): + thumb_fns = glob.glob(os.path.join(d, "thumbs", "*.jpg")) + thumb_fns = sorted(thumb_fns, key=_numeric_pad_basename) + logging.debug("thumb_fns = %s" % thumb_fns) + + browse_fns = [os.path.join(d, "browse", os.path.basename(i)) for i in thumb_fns] + logging.debug("browse_fns = %s" % browse_fns) + + return zip(thumb_fns, browse_fns) + + +def _go_thumbnail_links_to_browse_imgs_html_body(environ, body, t, b): + thumb_img_url = _get_pics_url(environ, t) + browse_url = _get_app_url(environ, b) + body.a(href=browse_url).img(src=thumb_img_url) + + def main(environ): - title = '(None)' - is_index = False + page_func = None - d = _get_pics_dir(environ) + logging.debug("environ['PATH_INFO'] = %s" % environ["PATH_INFO"]) + logging.debug("environ['SCRIPT_NAME'] = %s" % environ["SCRIPT_NAME"]) - if os.path.exists(os.path.join(d, "_picsroot")): - title = os.path.basename(d) - elif d == '/': - title = "pics index" - is_index = True - else: - raise IOError("_picsroot not found in directory: " + d) + pi = environ["PATH_INFO"] + ppi = _parse_path_info(pi) + logging.debug("ppi = %s" % ppi) + + if len(ppi) < 1 or ppi[0] != '': + raise AssertionError("Parsed path length must start empty: " + pi) + + if len(ppi) >= 2 and os.path.exists(os.path.join(ppi[1], "_picsroot")): + if len(ppi) == 2: + page_func = page_thumbs + elif len(ppi) >= 4 and ppi[2] == "browse" and os.path.exists(os.path.join(*ppi)): + page_func = page_browse + elif len(ppi) == 1: + page_func = page_index + + if page_func is None: + raise RuntimeError("Cannot find path: " + pi) - html_root = html.HTML("html") + return unicode(page_func(environ)).encode("utf-8") + - html_header = html_root.header - html_header.title(title) +def page_index(environ): + (html_root, html_header, html_body) = _get_standard_html_doc("pics index") - html_body = html_root.body - html_body.h1(title) + return html_root - if not is_index: - num_jpgs = len(glob.glob(os.path.join(d, "thumbs", "*.jpg"))) - for i in range(num_jpgs): - thumbnail_path = os.path.join(d, "thumbs", "%d.jpg" % i) - thumbnail_url = _get_pics_url(environ, thumbnail_path) - html_body.img(src=thumbnail_url) - return unicode(html_root).encode("utf-8") - +def page_thumbs(environ): + ppi = _parse_path_info(environ["PATH_INFO"]) + d = os.path.join(*ppi) + (html_root, html_header, html_body) = _get_standard_html_doc(d) + + html_p = html_body.p + for (t, b) in _get_images(d): + _go_thumbnail_links_to_browse_imgs_html_body(environ, html_p, t, b) + + return html_root + + +def page_browse(environ): + ppi = _parse_path_info(environ["PATH_INFO"]) + d = os.path.join(*ppi[:2]) + imgs = _get_images(d) + img = os.path.join(*ppi) + + # thumbnail preview ribbon + w = 7 # must be odd + v = w/2 + imgs_circ = [None] * w + x = None + n = len(imgs) + for (i, (t, b)) in enumerate(imgs): + if b == img: + x = i + 1 + imgs_circ[v] = (t, b) + for j in range(1, v + 1): + if (i + j) < n: imgs_circ[v + j] = imgs[i + j] + if (i - j) >= 0: imgs_circ[v - j] = imgs[i - j] + + break + + if x is None: + raise AssertionError + + (html_root, html_header, html_body) = _get_standard_html_doc(u"%s \u2014 %s of %s" % (d, x, len(imgs))) + + browse_img_url = _get_pics_url(environ, img) + html_body.p.img(src=browse_img_url) + + logging.debug("imgs_circ = %s" % imgs_circ) + + html_p_ribbon = html_body.p + for i in imgs_circ: + if i is not None: + (t, b) = i + _go_thumbnail_links_to_browse_imgs_html_body(environ, html_p_ribbon, t, b) + + return html_root + def app(environ, start_response): response_code = "500 Internal Server Error"