--- /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)
+ ],
+ )
+