diff -r fad360dd01da -r 53e798708413 degal/templates.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/degal/templates.py Fri Jun 05 21:48:56 2009 +0300 @@ -0,0 +1,189 @@ +""" + Templates for HTML output +""" + +import html +from html import tags + +def link_from (from_page, to_page) : + """ + Returns a partial a tag linking from the given page to the given page + + XXX: URLEncode unicode -> str! + """ + + return tags.a(href=to_page.path_from(from_page)) + +def image_link (from_page, image) : + """ + Link to the given image + """ + + return link_from(from_page, imgae.html)( + tags.img(src=image.path_from(from_page)) + ) + +def image_page (image) : + """ + The per-image view + """ + + return [ + tags.div(id_='image')( + # title + tags.h1(image.title) if image.title else None, + + # image-links + tags.p( + # prev thumb + image_link(image.html, image.prev.thumb) if image.prev else None, + + # preview + image_link(image.html, image.preview), + + # next thumb + image_link(image.html, image.next.thumb) if image.next else None + ), + + # optional description + tags.p(image.description) if image.description else None, + ), + + # extended info, metadata + tags.div(id_='info')( + tags.p("%s: " % name, value) for name, value in image.metadata + ), + ] + +def folder_link (from_page, folder, page=0) : + """ + Returns a link to the given folder from the given page + """ + + return link_from(from_page, folder.html_file(page))(folder.title) + +def folder_page_link (folder, page) : + """ + Returns a partial a tag from the folder itself to the given page number + """ + + return link_from(folder, folder.html_file(page)) + +def folder_paginate (folder, cur_page) : + """ + Render the pagination view for a folder, if needed + """ + + if folder.page_count > 1 : + return tags.div(class_='paginate')( + tags.ul( + # prev link + tags.li(folder_page_link(folder, cur_page - 1)(html.raw("« Prev"))) + if cur_page > 0 else + tags.li(tags.span(html.raw("« Prev"))), + + (( + # page link + tags.li(folder_page_link(folder, page)(page + 1)) + if page != cur_page else + tags.li(tags.strong(page + 1)) + ) for page in xrange(folder.page_count)), + + # next link + tags.li(folder_page_link(folder, cur_page + 1)(html.raw("» Next"))) + if cur_page < folder.page_count - 1 else + tags.li(tags.span(html.raw("» Next"))), + ) + ) + +def folder_page (folder, cur_page) : + """ + Render the per-Folder view for the given page + """ + + # render the paginate-view once + paginate = folder_paginate(folder, cur_page) + + return [ + # title + tags.h1(folder.title) if folder.title else None, + + # subdirs + tags.div(id_='dirs')( + tags.ul( + tags.li( + folder_link(folder, subfolder) + ) for subfolder in folder.subfolders + ) if folder.subfolders else None + ), + + # upper paginate + paginate, + + # image thumbnails + (( + image_link(folder, image) + ) for image in folder.images), + + # lower paginate + paginate, + + # description + tags.p(id='description')(folder.description) if folder.description else None, + + # shorturl + ] + +def breadcrumb_trail (gallery, page) : + """ + Yield the breadcrumb elements + """ + + is_first = True + + for segment in gallery.path_to(page) : + # spacers + if is_first : + is_first = False + + else : + yield html.raw("»") + + # link from this page to sub-page + yield link_from(page, segment)(segment.title) + + +def breadcrumb (gallery, page) : + """ + Build a breadcrumb trail from the gallery root to the given object + """ + + return tags.div(id='breadcrumb')( + breadcrumb_trail(gallery, page) + ) + +def master (gallery, title, page, body) : + """ + Render the full-page HTML layout for the given page with title and body + """ + + return html.XHTMLDocument( + head=[ + tags.title(title), + + # stylesheet + tags.link(rel='Stylesheet', type='text/css', href=gallery.stylesheet.path_from(page)) + ], + + body=[ + # top-of-page breadcrumb nav + breadcrumb(gallery, page), + + # other content + body, + + # footer + tags.p(id='about')(tags.a(href='http://projects.qmsk.net/degal')('Degal'), gallery.version) + ], + ) +