--- a/degal/template.py Fri Jun 05 21:47:45 2009 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-from mako import exceptions
-from mako.lookup import TemplateLookup
-
-import settings, resources, helpers
-
-import log
-
-"""
- Locating and rendering templates
-"""
-
-_lookup = TemplateLookup(
- directories=[resources.TEMPLATE_DIR],
-# module_directory='%s/cache' % settings.TEMPLATE_DIR,
- output_encoding='utf-8',
- filesystem_checks=False, # this may need to be changed if used in a long-term process
-)
-
-TEMPLATE_GLOBALS = dict(
- h = helpers,
- version = settings.VERSION,
-)
-
-class Template (object) :
- def __init__ (self, name) :
- self.name = name
- self.tpl = _lookup.get_template("%s.%s" % (name, settings.TEMPLATE_EXT))
-
- def render (self, **data) :
- data.update(TEMPLATE_GLOBALS)
-
- try :
- log.debug("render %s with %s", self.name, data)
- return self.tpl.render(**data)
- except :
- data = exceptions.text_error_template().render()
- log.error(data)
-
- raise
-
- def render_to (self, file, **data) :
- fh = open(file, "w")
- fh.write(self.render(**data))
- fh.close()
-
-# templates
-gallery = Template("gallery")
-image = Template("image")
-
--- /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)
+ ],
+ )
+
--- a/degal/templates/gallery.html Fri Jun 05 21:47:45 2009 +0300
+++ b/degal/templates/gallery.html Fri Jun 05 21:48:56 2009 +0300
@@ -1,10 +1,8 @@
-<%! use_javascript = False %>
-<%inherit file="master.html" /> <!-- %> -->
+<%inherit file="master.html" />
-<%def name="pagination(num_pages, cur_page)"> <!-- %> -->
+<%def name="pagination(num_pages, cur_page)">
% if num_pages > 1 :
<ul>
-
% if cur_page > 0 :
<li><a href="${h.url_for_page(cur_page - 1)}">« Prev</a></li>
% else :
@@ -26,7 +24,7 @@
% endif
</ul>
% endif
-</%def> <!-- %> -->
+</%def>
<h1>${title}</h1>
<div id="dirs">
--- a/degal/templates/image.html Fri Jun 05 21:47:45 2009 +0300
+++ b/degal/templates/image.html Fri Jun 05 21:48:56 2009 +0300
@@ -1,5 +1,4 @@
-<%! use_javascript = False %>
-<%inherit file="master.html" /> <!-- %> -->
+<%inherit file="master.html" />
<div id="image">
<h1>${title}</h1>
@@ -24,11 +23,11 @@
<p>Dimensions: ${h.format_imgsize(img_size)}</p>
<p>File size: ${h.format_filesize(file_size)}</p>
<p>Last modified: ${h.format_timestamp(timestamp)}</p>
-% for key, value in exif_data :
+% for key, value in exif_data :
<p>${key}: ${value}</p>
-% endfor
+% endfor
+% endif
-% endif
<p>ShortURL: <a href="${shorturl}" rel="nofollow">${shorturl_code}</a></p>
% if series_url :
<p><a href="${series_url}" rel="nofollow">${series_verb}</a> series</p>
--- a/degal/templates/master.html Fri Jun 05 21:47:45 2009 +0300
+++ b/degal/templates/master.html Fri Jun 05 21:48:56 2009 +0300
@@ -6,11 +6,6 @@
<head>
<title>${title}</title>
<link rel="Stylesheet" type="text/css" href="${stylesheet_url}" />
-% if self.module.use_javascript :
- <script type="text/javascript" src="../javascript/prototype.js" />
- <script type="text/javascript" src="../javascript/scriptaculous.js" />
- <script type="text/javascript" src="../javascript/taggr.js" />
-% endif
</head>
<body>
<div id="breadcrumb">
@@ -22,6 +17,6 @@
% endfor
</div>
${next.body()}
- <p id="about"><a href="http://marttila.de/~terom/degal/">DeGAL</a> ${version}</p>
+ <p id="about"><a href="http://projects.qmsk.net/degal">DeGAL</a> ${version}</p>
</body>
</html>