# HG changeset patch # User Tero Marttila # Date 1244664914 -10800 # Node ID f4b637ae775cd87cb96e194b935084e476f2476f # Parent e5400304a3d39928f53c359e68f217ccf4be470e fix html to have a separate Container type, but also special-case tuples, lists and genexps diff -r e5400304a3d3 -r f4b637ae775c degal/html.py --- a/degal/html.py Wed Jun 10 23:14:37 2009 +0300 +++ b/degal/html.py Wed Jun 10 23:15:14 2009 +0300 @@ -5,7 +5,7 @@ """ from cgi import escape -import itertools as _itertools +import itertools as _itertools, types as _types class IRenderable (object) : """ @@ -90,6 +90,8 @@ Items that are None will be omitted from the return value. + Certain core sequence types will be recognized and flattened for output: tuples, lists, and generators. + >>> list(Container.process_contents([])) [] >>> list(Container.process_contents([None])) @@ -101,9 +103,14 @@ for content in contents : if content is None : continue - + + # Hardcoded list of special-case nested contents + elif isinstance(content, (_types.TupleType, _types.ListType, _types.GeneratorType)) : + for subcontent in cls.process_contents(content) : + yield subcontent + else : - # normal, handle as unicode data + # normal, handle as IRenderable/unicode data yield content def __init__ (self, *contents) : diff -r e5400304a3d3 -r f4b637ae775c degal/templates.py --- a/degal/templates.py Wed Jun 10 23:14:37 2009 +0300 +++ b/degal/templates.py Wed Jun 10 23:15:14 2009 +0300 @@ -28,7 +28,7 @@ The per-image view """ - return html.container( + return [ tags.div(id_='image')( # title tags.h1(image.title) if image.title else None, @@ -53,7 +53,7 @@ tags.div(id_='info')(*( tags.p(("%s: " % name), value) for name, value in image.metadata.iteritems() )), - ) + ] def folder_link (from_page, folder, page=0) : """ @@ -82,7 +82,7 @@ if cur_page > 0 else tags.li(tags.span(html.raw("« Prev"))), - html.container(( + (( # page link tags.li(folder_page_link(folder, page)(page + 1)) if page != cur_page else @@ -104,7 +104,7 @@ # render the paginate-view once paginate = folder_paginate(folder, cur_page) - return html.container( + return [ # title tags.h1(folder.title) if folder.title else None, @@ -121,9 +121,9 @@ paginate, # image thumbnails - html.container(*(( + (( image_link(folder, image, image.html) - ) for image in folder.images)), + ) for image in folder.images), # lower paginate paginate, @@ -132,7 +132,7 @@ tags.p(id='description')(folder.description) if folder.description else None, # shorturl - ) + ] def breadcrumb_trail (gallery, page) : """ @@ -160,7 +160,7 @@ """ return tags.div(id='breadcrumb')( - *breadcrumb_trail(gallery, page) + breadcrumb_trail(gallery, page) ) def master (gallery, title, page, body) : @@ -169,14 +169,14 @@ """ return html.XHTMLDocument( - head=html.container( + head=[ tags.title(title), # stylesheet tags.link(rel='Stylesheet', type='text/css', href=gallery.stylesheet.path_from(page)) - ), + ], - body=html.container( + body=[ # top-of-page breadcrumb nav breadcrumb(gallery, page), @@ -185,6 +185,6 @@ # footer tags.p(id='about')(tags.a(href='http://projects.qmsk.net/degal')('Degal'), gallery.version) - ), + ], )