write new templates using html, replacing old mako stuff
authorTero Marttila <terom@fixme.fi>
Fri, 05 Jun 2009 21:48:56 +0300
changeset 62 53e798708413
parent 61 fad360dd01da
child 63 0db16d6b3617
write new templates using html, replacing old mako stuff
degal/template.py
degal/templates.py
degal/templates/gallery.html
degal/templates/image.html
degal/templates/master.html
--- 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("&laquo; Prev")))
+                    if cur_page > 0 else
+                tags.li(tags.span(html.raw("&laquo; 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("&raquo; Next")))
+                    if cur_page < folder.page_count - 1 else
+                tags.li(tags.span(html.raw("&raquo; 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("&raquo;")
+
+        # 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)}">&laquo; 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>