misc. fixes
"""
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)
],
)