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