degal/templates.py
changeset 62 53e798708413
child 77 2a53c5ade434
--- /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("&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)
+        ],
+    )
+