From 2193d7f18ecb2e9ed325366f60d9dc4b35110df2 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 27 Feb 2011 16:06:01 +0100 Subject: Move data to share/, autocreate Data.pm during build process --- .gitignore | 1 + lib/App/Dthumb.pm | 25 +- lib/App/Dthumb/Data.pm | 608 ---------------------------------------------- lib/App/Dthumb/Data.pm.PL | 74 ++++++ share/close.gif | Bin 0 -> 109 bytes share/html_end | 3 + share/html_start | 51 ++++ share/lightbox.js | 437 +++++++++++++++++++++++++++++++++ share/loading.gif | Bin 0 -> 2364 bytes share/overlay.png | Bin 0 -> 279 bytes 10 files changed, 573 insertions(+), 626 deletions(-) delete mode 100644 lib/App/Dthumb/Data.pm create mode 100644 lib/App/Dthumb/Data.pm.PL create mode 100644 share/close.gif create mode 100644 share/html_end create mode 100644 share/html_start create mode 100644 share/lightbox.js create mode 100644 share/loading.gif create mode 100644 share/overlay.png diff --git a/.gitignore b/.gitignore index e6992f5..cb3cf66 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /build/ /_build/ /blib/ +/lib/App/Dthumb/Data.pm diff --git a/lib/App/Dthumb.pm b/lib/App/Dthumb.pm index d61fec5..5b493ee 100755 --- a/lib/App/Dthumb.pm +++ b/lib/App/Dthumb.pm @@ -30,7 +30,7 @@ sub new { $ref->{data} = App::Dthumb::Data->new(); $ref->{tar} = Archive::Tar->new(); - $ref->{html} = $ref->{data}->html_start(); + $ref->{html} = $ref->{data}->get('html_start'); $ref->{current_file_id} = 0; @@ -86,7 +86,6 @@ sub create_files { my ($self) = @_; my $thumbdir = $self->{config}->{dir_thumbs}; my $datadir = $self->{config}->{dir_data}; - my $fh; if (not -d $thumbdir) { mkdir($thumbdir); @@ -96,21 +95,11 @@ sub create_files { mkdir($datadir); } - open($fh, '>', "${datadir}/lightbox.js"); - print {$fh} $self->{data}->lightbox(); - close($fh); - - open($fh, '>', "${datadir}/overlay.png"); - print {$fh} $self->{data}->overlay_png(); - close($fh); - - open($fh, '>', "${datadir}/loading.gif"); - print {$fh} $self->{data}->loading_gif(); - close($fh); - - open($fh, '>', "${datadir}/close.gif"); - print {$fh} $self->{data}->close_gif(); - close($fh); + for my $file (qw(lightbox.js overlay.png loading.gif close.gif)) { + open(my $fh, '>', "${datadir}/${file}"); + print {$fh} $self->{data}->get($file); + close($fh); + } } sub delete_old_thumbnails { @@ -191,7 +180,7 @@ sub create_thumbnail_image { sub write_out_html { my ($self) = @_; - $self->{html} .= $self->{data}->html_end(); + $self->{html} .= $self->{data}->get('html_end'); open(my $fh, '>', $self->{config}->{file_index}); print {$fh} $self->{html}; diff --git a/lib/App/Dthumb/Data.pm b/lib/App/Dthumb/Data.pm deleted file mode 100644 index 9065e35..0000000 --- a/lib/App/Dthumb/Data.pm +++ /dev/null @@ -1,608 +0,0 @@ -package App::Dthumb::Data; - -use strict; -use warnings; -use base 'Exporter'; - -use Data::Section -setup; -use MIME::Base64 qw(decode_base64); - -our @EXPORT_OK = (); - -sub new { - my ($obj) = @_; - my $ref = {}; - return bless($ref, $obj); -} - -sub html_start { - my ($self) = @_; - return ${$self->section_data('html_and_css')}; -} - -sub html_end { - my ($self) = @_; - return ${$self->section_data('html_end')}; -} - -sub lightbox { - my ($self) = @_; - return ${$self->section_data('lightbox.js')}; -} - -sub overlay_png { - my ($self) = @_; - return decode_base64(${$self->section_data('overlay.png')}); -} - -sub loading_gif { - my ($self) = @_; - return decode_base64(${$self->section_data('loading.gif')}); -} - -sub close_gif { - my ($self) = @_; - return decode_base64(${$self->section_data('close.gif')}); -} - -1; - -__DATA__ - -______[ html_and_css ]______ - - - - - dthumb - - - - -
- -______[ html_end ]______ - -
- - - -______[ overlay.png ]______ - -iVBORw0KGgoAAAANSUhEUgAAAGUAAABlCAYAAABUfC3PAAAABGdBTUEAAK/INwWK6QAAABl0RVh0 -U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAACpSURBVHja7NEBDQAACMOwg39PWMMGCZ2E -tZJMdKq2AIqgQBEUKIICRVAEBYqgQBEUKIIiKFAEBYqgQBEUQYEiKFAEBYqgCAoUQYEiKFAERVCg -CAoUQYEiKIICRVCgCAoUQREUKIICRVCgCIqgQBEUKIICRVAEBYqgQBEUKIIiKFAEBYqgQBEUQYEi -KFAEBYqgQLEAiqBAERQoggJFUAQFiqBAEZTHrQADAOi7AYkbZwBkAAAAAElFTkSuQmCC - -______[ loading.gif ]______ - -R0lGODlhfgAWANUiAFJSUi4uLjAwMElJSVBQUE9PT0xMTEhISCwsLDU1NUFBQUtLSy8vL0VFRUZG -RlNTU2pqZy8vLDs7N1paWj09PVNTTkJCPjExMTIyMjY2Njg4ODQ0NDk5OW5ubjo6OkBAQC0tLTMz -M////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQF -AAAiACwAAAAAfgAWAAAG/8CQcEgsGo/IpHLJbDqfx450Sq1ar9isdsvter/Th7DzKZvP6LR6zW67 -3/C43Dz+gBB4kH7P7/v/gIGCg4SFhn94CCBkdQgUDQ0OB5MKegqTmAeVIBhGGHqdRZ+cnqClpKKm -qahEo6GtqrCsGBcXDAiMIWQIkJIDvwMBAcDEwQEbyMnIwsrKzM3Lx9Abz9DVzdfO0tbb2N0htBe4 -H42RBwML6QYCAgbu7+7sGfP08/L19Pf4Gfr4/fX/8gnYZ28gwYAFMyRYuAGcuFxkQPhaYKCAxVoW -M2aspaGjx44cP3oMKVIDSZEnP6YceaEkyJYuV770qLDhJ4h2JlEsQKAnBv8MPYMG/cmhqNGiRI8a -TaqUA1OlT49GXYqhKdKqVqdeNapBoZBF5HTlRMezJwAhANKqTSvEg9u3btvCfSt3roe6c/HC1Us3 -hN24fv/yBeyBa4KGYOuAOLegLNsQa9cOvhvY7uTLlfNm3ru571/Kn+UW1XA4RGKxi8maPQs58uPQ -nQkLjg16NuzbtnOPLp04AgQJqRsHZe36dW7LtDHjRr5c823DiH9HQK2z4lCgQq9bdYq1qVbu27+L -7w6VvFTzVLl6NY1TIuOKFy9o1CjTJMyS9fPfR7lfZX+WLtkXIEk1gXPaLuagow478MCDED8G7fPg -hBH6UyFAFwpEEIQbyrN0UGm0jFNOgsAIU0yJ3WgzDTUpJpONiy1Gs+KLMk5DI4vKOPRQWLs8Yg4l -lmQCJCtDuHLKK0XGkiSRQhi5CpJNKhklkwbOUsst7SVyyJZcdunll4jkgRMYZJZp5ploahHWA3O0 -6eabcMb5BhR01mnnnXhCEQQAIfkEBQAAIgAsBAAEABwADgAABnhAxuWCCRkxoqRymVQcnlDFsLip -bphY0WDL3RJDm4Q4k2UazugzNZHRuMvLgnwuN7I1nDxcSej7+2AJeHkee0kAiImIgYMehYaKioyE -j3uRiZOEhiKXiyF3eRybf39rbW+GdHRfYWObaWlTYFabXV1CX0ebTlBPCkEAIfkEBQAAIgAsDgAE -ABwADgAABmlATGhIxIiOyORRcWg6FZuoNKqsigbYLDbD7XKtSoN4LNaYz2ZwssBusznwOFyNJNjv -do9+r6cfAYCBgHx8fiKCgoR7hoiBin1+jYBycoZ4eGhohm5uXl6GZGRTU4ZaWkJEQ0Z+TE5NCkEA -IfkEBQAAIgAsGAAEABwADgAABmlATGhIxIiOyORRcWg6FZuoNKqsigbYLDbD7XKtSoN4LNaYz2Zw -ssBusznwOFyNJNjvdo9+r6cfAYCBgHx8fiKCgoR7hoiBin1+jYBycoZ4eGhohm5uXl6GZGRTU4Za -WkJEQ0Z+TE5NCkEAIfkEBQAAIgAsIgAEABwADgAABmlATGhIxIiOyORRcWg6FZuoNKqsigbYLDbD -7XKtSoN4LNaYz2ZwssBusznwOFyNJNjvdo9+r6cfAYCBgHx8fiKCgoR7hoiBin1+jYBycoZ4eGho -hm5uXl6GZGRTU4ZaWkJEQ0Z+TE5NCkEAIfkEBQAAIgAsLAAEABwADgAABmlATGhIxIiOyORRcWg6 -FZuoNKqsigbYLDbD7XKtSoN4LNaYz2ZwssBusznwOFyNJNjvdo9+r6cfAYCBgHx8fiKCgoR7hoiB -in1+jYBycoZ4eGhohm5uXl6GZGRTU4ZaWkJEQ0Z+TE5NCkEAIfkEBQAAIgAsNgAEABwADgAABmlA -TGhIxIiOyORRcWg6FZuoNKqsigbYLDbD7XKtSoN4LNaYz2ZwssBusznwOFyNJNjvdo9+r6cfAYCB -gHx8fiKCgoR7hoiBin1+jYBycoZ4eGhohm5uXl6GZGRTU4ZaWkJEQ0Z+TE5NCkEAIfkEBQAAIgAs -QAAEABwADgAABmlATGhIxIiOyORRcWg6FZuoNKqsigbYLDbD7XKtSoN4LNaYz2ZwssBusznwOFyN -JNjvdo9+r6cfAYCBgHx8fiKCgoR7hoiBin1+jYBycoZ4eGhohm5uXl6GZGRTU4ZaWkJEQ0Z+TE5N -CkEAIfkEBQAAIgAsSgAEABwADgAABmlATGhIxIiOyORRcWg6FZuoNKqsigbYLDbD7XKtSoN4LNaY -z2ZwssBusznwOFyNJNjvdo9+r6cfAYCBgHx8fiKCgoR7hoiBin1+jYBycoZ4eGhohm5uXl6GZGRT -U4ZaWkJEQ0Z+TE5NCkEAIfkEBQAAIgAsVAAEABwADgAABmlATGhIxIiOyORRcWg6FZuoNKqsigbY -LDbD7XKtSoN4LNaYz2ZwssBusznwOFyNJNjvdo9+r6cfAYCBgHx8fiKCgoR7hoiBin1+jYBycoZ4 -eGhohm5uXl6GZGRTU4ZaWkJEQ0Z+TE5NCkEAIfkEBQAAIgAsXgAEABwADgAABnxATGhIxIiOyORR -cWg6Gg3KZkqdKq+igXZweDYy4DAYqzQsztynZs1ek5OFuDnNqdvrbyRhXzA3PYCBgHlHAHsEBQtc -goKEIgCGiIoHjIGOkHyTlYOEkZJcd3eOh30LTW1tjnGlaWJijmZoXQ1VVY5baVBCRENGhExOUBRB -ACH5BAUAACIALAQABAB6AA4AAAavQEqj4TgYFaKkcslsOp/QqHRKFWFC2Cxm+jgMi4PwoEoum8/T -jXqtnk684IXcgK7b79GMfq93H+IGBYJ4hIV1GoiJiH5GC4EEkIaSk1IclpeWjAMLBZAEAJShokke -paalmpyQAKCjroanp6mdn62vt3axprOetri/ZbqoUhUWjY+RwMpVmJh+gIIFy9NSiop+RAebc9Td -Tnx82NliY97mSWxsfkLZR+fnV1lYW1JdQQA7 - -______[ close.gif ]______ - -R0lGODlhFAAUAJEDAJeXl0BAQO7u7vr69SH5BAEAAAMALAAAAAAUABQAAAI+nI+py+0PYxO02puu -trmCcAUA1VHBWZ2gUJqoWrUuHCMbXR+aiuZG+OqxbCkhrfUJjYa6zUbmJEGdiygHUQAAOw== - -______[ lightbox.js ]______ - -/* - Lightbox JS: Fullsize Image Overlays - by Lokesh Dhakar - http://www.huddletogether.com - - For more information on this script, visit: - http://huddletogether.com/projects/lightbox/ - - Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/ - (basically, do anything you want, just leave my name and link) - - Table of Contents - ----------------- - Configuration - - Functions - - getPageScroll() - - getPageSize() - - pause() - - getKey() - - listenKey() - - showLightbox() - - hideLightbox() - - initLightbox() - - addLoadEvent() - - Function Calls - - addLoadEvent(initLightbox) - -*/ - - - -// -// Configuration -// - -// If you would like to use a custom loading image or close button reference them in the next two lines. -var loadingImage = '.dthumb/loading.gif'; -var closeButton = '.dthumb/close.gif'; - - - - - -// -// getPageScroll() -// Returns array with x,y page scroll values. -// Core code from - quirksmode.org -// -function getPageScroll(){ - - var yScroll; - - if (self.pageYOffset) { - yScroll = self.pageYOffset; - } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict - yScroll = document.documentElement.scrollTop; - } else if (document.body) {// all other Explorers - yScroll = document.body.scrollTop; - } - - arrayPageScroll = new Array('',yScroll) - return arrayPageScroll; -} - - - -// -// getPageSize() -// Returns array with page width, height and window width, height -// Core code from - quirksmode.org -// Edit for Firefox by pHaez -// -function getPageSize(){ - - var xScroll, yScroll; - - if (window.innerHeight && window.scrollMaxY) { - xScroll = document.body.scrollWidth; - yScroll = window.innerHeight + window.scrollMaxY; - } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac - xScroll = document.body.scrollWidth; - yScroll = document.body.scrollHeight; - } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari - xScroll = document.body.offsetWidth; - yScroll = document.body.offsetHeight; - } - - var windowWidth, windowHeight; - if (self.innerHeight) { // all except Explorer - windowWidth = self.innerWidth; - windowHeight = self.innerHeight; - } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode - windowWidth = document.documentElement.clientWidth; - windowHeight = document.documentElement.clientHeight; - } else if (document.body) { // other Explorers - windowWidth = document.body.clientWidth; - windowHeight = document.body.clientHeight; - } - - // for small pages with total height less then height of the viewport - if(yScroll < windowHeight){ - pageHeight = windowHeight; - } else { - pageHeight = yScroll; - } - - // for small pages with total width less then width of the viewport - if(xScroll < windowWidth){ - pageWidth = windowWidth; - } else { - pageWidth = xScroll; - } - - - arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) - return arrayPageSize; -} - - -// -// pause(numberMillis) -// Pauses code execution for specified time. Uses busy code, not good. -// Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602 -// -function pause(numberMillis) { - var now = new Date(); - var exitTime = now.getTime() + numberMillis; - while (true) { - now = new Date(); - if (now.getTime() > exitTime) - return; - } -} - -// -// getKey(key) -// Gets keycode. If 'x' is pressed then it hides the lightbox. -// - -function getKey(e){ - if (e == null) { // ie - keycode = event.keyCode; - } else { // mozilla - keycode = e.which; - } - key = String.fromCharCode(keycode).toLowerCase(); - - if(key == 'x'){ hideLightbox(); } -} - - -// -// listenKey() -// -function listenKey () { document.onkeypress = getKey; } - - -// -// showLightbox() -// Preloads images. Pleaces new image in lightbox then centers and displays. -// -function showLightbox(objLink) -{ - // prep objects - var objOverlay = document.getElementById('overlay'); - var objLightbox = document.getElementById('lightbox'); - var objCaption = document.getElementById('lightboxCaption'); - var objImage = document.getElementById('lightboxImage'); - var objLoadingImage = document.getElementById('loadingImage'); - var objLightboxDetails = document.getElementById('lightboxDetails'); - - - var arrayPageSize = getPageSize(); - var arrayPageScroll = getPageScroll(); - - // center loadingImage if it exists - if (objLoadingImage) { - objLoadingImage.style.top = (arrayPageScroll[1] + ((arrayPageSize[3] - 35 - objLoadingImage.height) / 2) + 'px'); - objLoadingImage.style.left = (((arrayPageSize[0] - 20 - objLoadingImage.width) / 2) + 'px'); - objLoadingImage.style.display = 'block'; - } - - // set height of Overlay to take up whole page and show - objOverlay.style.height = (arrayPageSize[1] + 'px'); - objOverlay.style.display = 'block'; - - // preload image - imgPreload = new Image(); - - imgPreload.onload=function(){ - objImage.src = objLink.href; - - // center lightbox and make sure that the top and left values are not negative - // and the image placed outside the viewport - var lightboxTop = arrayPageScroll[1] + ((arrayPageSize[3] - 35 - imgPreload.height) / 2); - var lightboxLeft = ((arrayPageSize[0] - 20 - imgPreload.width) / 2); - - objLightbox.style.top = (lightboxTop < 0) ? "0px" : lightboxTop + "px"; - objLightbox.style.left = (lightboxLeft < 0) ? "0px" : lightboxLeft + "px"; - - - objLightboxDetails.style.width = imgPreload.width + 'px'; - - if(objLink.getAttribute('title')){ - objCaption.style.display = 'block'; - //objCaption.style.width = imgPreload.width + 'px'; - objCaption.innerHTML = objLink.getAttribute('title'); - } else { - objCaption.style.display = 'none'; - } - - // A small pause between the image loading and displaying is required with IE, - // this prevents the previous image displaying for a short burst causing flicker. - if (navigator.appVersion.indexOf("MSIE")!=-1){ - pause(250); - } - - if (objLoadingImage) { objLoadingImage.style.display = 'none'; } - - // Hide select boxes as they will 'peek' through the image in IE - selects = document.getElementsByTagName("select"); - for (i = 0; i != selects.length; i++) { - selects[i].style.visibility = "hidden"; - } - - - objLightbox.style.display = 'block'; - - // After image is loaded, update the overlay height as the new image might have - // increased the overall page height. - arrayPageSize = getPageSize(); - objOverlay.style.height = (arrayPageSize[1] + 'px'); - - // Check for 'x' keypress - listenKey(); - - return false; - } - - imgPreload.src = objLink.href; - -} - - - - - -// -// hideLightbox() -// -function hideLightbox() -{ - // get objects - objOverlay = document.getElementById('overlay'); - objLightbox = document.getElementById('lightbox'); - - // hide lightbox and overlay - objOverlay.style.display = 'none'; - objLightbox.style.display = 'none'; - - // make select boxes visible - selects = document.getElementsByTagName("select"); - for (i = 0; i != selects.length; i++) { - selects[i].style.visibility = "visible"; - } - - // disable keypress listener - document.onkeypress = ''; -} - - - - -// -// initLightbox() -// Function runs on window load, going through link tags looking for rel="lightbox". -// These links receive onclick events that enable the lightbox display for their targets. -// The function also inserts html markup at the top of the page which will be used as a -// container for the overlay pattern and the inline image. -// -function initLightbox() -{ - - if (!document.getElementsByTagName){ return; } - var anchors = document.getElementsByTagName("a"); - - // loop through all anchor tags - for (var i=0; i - // - // - // - - var objBody = document.getElementsByTagName("body").item(0); - - // create overlay div and hardcode some functional styles (aesthetic styles are in CSS file) - var objOverlay = document.createElement("div"); - objOverlay.setAttribute('id','overlay'); - objOverlay.onclick = function () {hideLightbox(); return false;} - objOverlay.style.display = 'none'; - objOverlay.style.position = 'absolute'; - objOverlay.style.top = '0'; - objOverlay.style.left = '0'; - objOverlay.style.zIndex = '90'; - objOverlay.style.width = '100%'; - objBody.insertBefore(objOverlay, objBody.firstChild); - - var arrayPageSize = getPageSize(); - var arrayPageScroll = getPageScroll(); - - // preload and create loader image - var imgPreloader = new Image(); - - // if loader image found, create link to hide lightbox and create loadingimage - imgPreloader.onload=function(){ - - var objLoadingImageLink = document.createElement("a"); - objLoadingImageLink.setAttribute('href','#'); - objLoadingImageLink.onclick = function () {hideLightbox(); return false;} - objOverlay.appendChild(objLoadingImageLink); - - var objLoadingImage = document.createElement("img"); - objLoadingImage.src = loadingImage; - objLoadingImage.setAttribute('id','loadingImage'); - objLoadingImage.style.position = 'absolute'; - objLoadingImage.style.zIndex = '150'; - objLoadingImageLink.appendChild(objLoadingImage); - - imgPreloader.onload=function(){}; // clear onLoad, as IE will flip out w/animated gifs - - return false; - } - - imgPreloader.src = loadingImage; - - // create lightbox div, same note about styles as above - var objLightbox = document.createElement("div"); - objLightbox.setAttribute('id','lightbox'); - objLightbox.style.display = 'none'; - objLightbox.style.position = 'absolute'; - objLightbox.style.zIndex = '100'; - objBody.insertBefore(objLightbox, objOverlay.nextSibling); - - // create link - var objLink = document.createElement("a"); - objLink.setAttribute('href','#'); - objLink.setAttribute('title','Click to close'); - objLink.onclick = function () {hideLightbox(); return false;} - objLightbox.appendChild(objLink); - - // preload and create close button image - var imgPreloadCloseButton = new Image(); - - // if close button image found, - imgPreloadCloseButton.onload=function(){ - - var objCloseButton = document.createElement("img"); - objCloseButton.src = closeButton; - objCloseButton.setAttribute('id','closeButton'); - objCloseButton.style.position = 'absolute'; - objCloseButton.style.zIndex = '200'; - objLink.appendChild(objCloseButton); - - return false; - } - - imgPreloadCloseButton.src = closeButton; - - // create image - var objImage = document.createElement("img"); - objImage.setAttribute('id','lightboxImage'); - objLink.appendChild(objImage); - - // create details div, a container for the caption and keyboard message - var objLightboxDetails = document.createElement("div"); - objLightboxDetails.setAttribute('id','lightboxDetails'); - objLightbox.appendChild(objLightboxDetails); - - // create caption - var objCaption = document.createElement("div"); - objCaption.setAttribute('id','lightboxCaption'); - objCaption.style.display = 'none'; - objLightboxDetails.appendChild(objCaption); - - // create keyboard message - var objKeyboardMsg = document.createElement("div"); - objKeyboardMsg.setAttribute('id','keyboardMsg'); - objKeyboardMsg.innerHTML = 'press x to close'; - objLightboxDetails.appendChild(objKeyboardMsg); - - -} - - - - -// -// addLoadEvent() -// Adds event to window.onload without overwriting currently assigned onload functions. -// Function found at Simon Willison's weblog - http://simon.incutio.com/ -// -function addLoadEvent(func) -{ - var oldonload = window.onload; - if (typeof window.onload != 'function'){ - window.onload = func; - } else { - window.onload = function(){ - oldonload(); - func(); - } - } - -} - - - -addLoadEvent(initLightbox); // run initLightbox onLoad diff --git a/lib/App/Dthumb/Data.pm.PL b/lib/App/Dthumb/Data.pm.PL new file mode 100644 index 0000000..1f04800 --- /dev/null +++ b/lib/App/Dthumb/Data.pm.PL @@ -0,0 +1,74 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use 5.010; +use autodie; +use MIME::Base64 qw(encode_base64); + +local $/ = undef; +my ($out_file) = @ARGV; + +open(my $out_fh, '>', $out_file); +opendir(my $share_dh, 'share'); + +print {$out_fh} ; + +for my $file (readdir($share_dh)) { + if (substr($file, 0, 1) eq '.') { + next; + } + + open(my $fh, '<', "share/${file}"); + my $content = <$fh>; + close($fh); + + if ($file =~ qr{ \. (png | gif) $ }ox) { + $content = encode_base64($content); + } + + printf {$out_fh} ( + "______[ %s ]______\n%s\n", + $file, + $content, + ); +} +closedir($share_dh); +close($out_fh); + + +__DATA__ +package App::Dthumb::Data; + +use strict; +use warnings; +use base 'Exporter'; + +use Data::Section -setup; +use MIME::Base64 qw(decode_base64); + +our @EXPORT_OK = (); + +sub new { + my ($obj) = @_; + my $ref = {}; + return bless($ref, $obj); +} + +sub get { + my ($self, $name) = @_; + my $data = $self->section_data($name); + + if (not $data) { + die("No such data: ${name}\n"); + } + + if ($name =~ qr{ \. (png | gif) $ }ox) { + return decode_base64(${$data}); + } + return ${$data}; +} + +1; + +__DATA__ + diff --git a/share/close.gif b/share/close.gif new file mode 100644 index 0000000..773013b Binary files /dev/null and b/share/close.gif differ diff --git a/share/html_end b/share/html_end new file mode 100644 index 0000000..9943ff0 --- /dev/null +++ b/share/html_end @@ -0,0 +1,3 @@ + + + diff --git a/share/html_start b/share/html_start new file mode 100644 index 0000000..a3539be --- /dev/null +++ b/share/html_start @@ -0,0 +1,51 @@ + + + + dthumb + + + + +
diff --git a/share/lightbox.js b/share/lightbox.js new file mode 100644 index 0000000..df9e8e4 --- /dev/null +++ b/share/lightbox.js @@ -0,0 +1,437 @@ +/* + Lightbox JS: Fullsize Image Overlays + by Lokesh Dhakar - http://www.huddletogether.com + + For more information on this script, visit: + http://huddletogether.com/projects/lightbox/ + + Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/ + (basically, do anything you want, just leave my name and link) + + Table of Contents + ----------------- + Configuration + + Functions + - getPageScroll() + - getPageSize() + - pause() + - getKey() + - listenKey() + - showLightbox() + - hideLightbox() + - initLightbox() + - addLoadEvent() + + Function Calls + - addLoadEvent(initLightbox) + +*/ + + + +// +// Configuration +// + +// If you would like to use a custom loading image or close button reference them in the next two lines. +var loadingImage = '.dthumb/loading.gif'; +var closeButton = '.dthumb/close.gif'; + + + + + +// +// getPageScroll() +// Returns array with x,y page scroll values. +// Core code from - quirksmode.org +// +function getPageScroll(){ + + var yScroll; + + if (self.pageYOffset) { + yScroll = self.pageYOffset; + } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict + yScroll = document.documentElement.scrollTop; + } else if (document.body) {// all other Explorers + yScroll = document.body.scrollTop; + } + + arrayPageScroll = new Array('',yScroll) + return arrayPageScroll; +} + + + +// +// getPageSize() +// Returns array with page width, height and window width, height +// Core code from - quirksmode.org +// Edit for Firefox by pHaez +// +function getPageSize(){ + + var xScroll, yScroll; + + if (window.innerHeight && window.scrollMaxY) { + xScroll = document.body.scrollWidth; + yScroll = window.innerHeight + window.scrollMaxY; + } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac + xScroll = document.body.scrollWidth; + yScroll = document.body.scrollHeight; + } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari + xScroll = document.body.offsetWidth; + yScroll = document.body.offsetHeight; + } + + var windowWidth, windowHeight; + if (self.innerHeight) { // all except Explorer + windowWidth = self.innerWidth; + windowHeight = self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode + windowWidth = document.documentElement.clientWidth; + windowHeight = document.documentElement.clientHeight; + } else if (document.body) { // other Explorers + windowWidth = document.body.clientWidth; + windowHeight = document.body.clientHeight; + } + + // for small pages with total height less then height of the viewport + if(yScroll < windowHeight){ + pageHeight = windowHeight; + } else { + pageHeight = yScroll; + } + + // for small pages with total width less then width of the viewport + if(xScroll < windowWidth){ + pageWidth = windowWidth; + } else { + pageWidth = xScroll; + } + + + arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) + return arrayPageSize; +} + + +// +// pause(numberMillis) +// Pauses code execution for specified time. Uses busy code, not good. +// Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602 +// +function pause(numberMillis) { + var now = new Date(); + var exitTime = now.getTime() + numberMillis; + while (true) { + now = new Date(); + if (now.getTime() > exitTime) + return; + } +} + +// +// getKey(key) +// Gets keycode. If 'x' is pressed then it hides the lightbox. +// + +function getKey(e){ + if (e == null) { // ie + keycode = event.keyCode; + } else { // mozilla + keycode = e.which; + } + key = String.fromCharCode(keycode).toLowerCase(); + + if(key == 'x'){ hideLightbox(); } +} + + +// +// listenKey() +// +function listenKey () { document.onkeypress = getKey; } + + +// +// showLightbox() +// Preloads images. Pleaces new image in lightbox then centers and displays. +// +function showLightbox(objLink) +{ + // prep objects + var objOverlay = document.getElementById('overlay'); + var objLightbox = document.getElementById('lightbox'); + var objCaption = document.getElementById('lightboxCaption'); + var objImage = document.getElementById('lightboxImage'); + var objLoadingImage = document.getElementById('loadingImage'); + var objLightboxDetails = document.getElementById('lightboxDetails'); + + + var arrayPageSize = getPageSize(); + var arrayPageScroll = getPageScroll(); + + // center loadingImage if it exists + if (objLoadingImage) { + objLoadingImage.style.top = (arrayPageScroll[1] + ((arrayPageSize[3] - 35 - objLoadingImage.height) / 2) + 'px'); + objLoadingImage.style.left = (((arrayPageSize[0] - 20 - objLoadingImage.width) / 2) + 'px'); + objLoadingImage.style.display = 'block'; + } + + // set height of Overlay to take up whole page and show + objOverlay.style.height = (arrayPageSize[1] + 'px'); + objOverlay.style.display = 'block'; + + // preload image + imgPreload = new Image(); + + imgPreload.onload=function(){ + objImage.src = objLink.href; + + // center lightbox and make sure that the top and left values are not negative + // and the image placed outside the viewport + var lightboxTop = arrayPageScroll[1] + ((arrayPageSize[3] - 35 - imgPreload.height) / 2); + var lightboxLeft = ((arrayPageSize[0] - 20 - imgPreload.width) / 2); + + objLightbox.style.top = (lightboxTop < 0) ? "0px" : lightboxTop + "px"; + objLightbox.style.left = (lightboxLeft < 0) ? "0px" : lightboxLeft + "px"; + + + objLightboxDetails.style.width = imgPreload.width + 'px'; + + if(objLink.getAttribute('title')){ + objCaption.style.display = 'block'; + //objCaption.style.width = imgPreload.width + 'px'; + objCaption.innerHTML = objLink.getAttribute('title'); + } else { + objCaption.style.display = 'none'; + } + + // A small pause between the image loading and displaying is required with IE, + // this prevents the previous image displaying for a short burst causing flicker. + if (navigator.appVersion.indexOf("MSIE")!=-1){ + pause(250); + } + + if (objLoadingImage) { objLoadingImage.style.display = 'none'; } + + // Hide select boxes as they will 'peek' through the image in IE + selects = document.getElementsByTagName("select"); + for (i = 0; i != selects.length; i++) { + selects[i].style.visibility = "hidden"; + } + + + objLightbox.style.display = 'block'; + + // After image is loaded, update the overlay height as the new image might have + // increased the overall page height. + arrayPageSize = getPageSize(); + objOverlay.style.height = (arrayPageSize[1] + 'px'); + + // Check for 'x' keypress + listenKey(); + + return false; + } + + imgPreload.src = objLink.href; + +} + + + + + +// +// hideLightbox() +// +function hideLightbox() +{ + // get objects + objOverlay = document.getElementById('overlay'); + objLightbox = document.getElementById('lightbox'); + + // hide lightbox and overlay + objOverlay.style.display = 'none'; + objLightbox.style.display = 'none'; + + // make select boxes visible + selects = document.getElementsByTagName("select"); + for (i = 0; i != selects.length; i++) { + selects[i].style.visibility = "visible"; + } + + // disable keypress listener + document.onkeypress = ''; +} + + + + +// +// initLightbox() +// Function runs on window load, going through link tags looking for rel="lightbox". +// These links receive onclick events that enable the lightbox display for their targets. +// The function also inserts html markup at the top of the page which will be used as a +// container for the overlay pattern and the inline image. +// +function initLightbox() +{ + + if (!document.getElementsByTagName){ return; } + var anchors = document.getElementsByTagName("a"); + + // loop through all anchor tags + for (var i=0; i + // + //
+ // + + var objBody = document.getElementsByTagName("body").item(0); + + // create overlay div and hardcode some functional styles (aesthetic styles are in CSS file) + var objOverlay = document.createElement("div"); + objOverlay.setAttribute('id','overlay'); + objOverlay.onclick = function () {hideLightbox(); return false;} + objOverlay.style.display = 'none'; + objOverlay.style.position = 'absolute'; + objOverlay.style.top = '0'; + objOverlay.style.left = '0'; + objOverlay.style.zIndex = '90'; + objOverlay.style.width = '100%'; + objBody.insertBefore(objOverlay, objBody.firstChild); + + var arrayPageSize = getPageSize(); + var arrayPageScroll = getPageScroll(); + + // preload and create loader image + var imgPreloader = new Image(); + + // if loader image found, create link to hide lightbox and create loadingimage + imgPreloader.onload=function(){ + + var objLoadingImageLink = document.createElement("a"); + objLoadingImageLink.setAttribute('href','#'); + objLoadingImageLink.onclick = function () {hideLightbox(); return false;} + objOverlay.appendChild(objLoadingImageLink); + + var objLoadingImage = document.createElement("img"); + objLoadingImage.src = loadingImage; + objLoadingImage.setAttribute('id','loadingImage'); + objLoadingImage.style.position = 'absolute'; + objLoadingImage.style.zIndex = '150'; + objLoadingImageLink.appendChild(objLoadingImage); + + imgPreloader.onload=function(){}; // clear onLoad, as IE will flip out w/animated gifs + + return false; + } + + imgPreloader.src = loadingImage; + + // create lightbox div, same note about styles as above + var objLightbox = document.createElement("div"); + objLightbox.setAttribute('id','lightbox'); + objLightbox.style.display = 'none'; + objLightbox.style.position = 'absolute'; + objLightbox.style.zIndex = '100'; + objBody.insertBefore(objLightbox, objOverlay.nextSibling); + + // create link + var objLink = document.createElement("a"); + objLink.setAttribute('href','#'); + objLink.setAttribute('title','Click to close'); + objLink.onclick = function () {hideLightbox(); return false;} + objLightbox.appendChild(objLink); + + // preload and create close button image + var imgPreloadCloseButton = new Image(); + + // if close button image found, + imgPreloadCloseButton.onload=function(){ + + var objCloseButton = document.createElement("img"); + objCloseButton.src = closeButton; + objCloseButton.setAttribute('id','closeButton'); + objCloseButton.style.position = 'absolute'; + objCloseButton.style.zIndex = '200'; + objLink.appendChild(objCloseButton); + + return false; + } + + imgPreloadCloseButton.src = closeButton; + + // create image + var objImage = document.createElement("img"); + objImage.setAttribute('id','lightboxImage'); + objLink.appendChild(objImage); + + // create details div, a container for the caption and keyboard message + var objLightboxDetails = document.createElement("div"); + objLightboxDetails.setAttribute('id','lightboxDetails'); + objLightbox.appendChild(objLightboxDetails); + + // create caption + var objCaption = document.createElement("div"); + objCaption.setAttribute('id','lightboxCaption'); + objCaption.style.display = 'none'; + objLightboxDetails.appendChild(objCaption); + + // create keyboard message + var objKeyboardMsg = document.createElement("div"); + objKeyboardMsg.setAttribute('id','keyboardMsg'); + objKeyboardMsg.innerHTML = 'press x to close'; + objLightboxDetails.appendChild(objKeyboardMsg); + + +} + + + + +// +// addLoadEvent() +// Adds event to window.onload without overwriting currently assigned onload functions. +// Function found at Simon Willison's weblog - http://simon.incutio.com/ +// +function addLoadEvent(func) +{ + var oldonload = window.onload; + if (typeof window.onload != 'function'){ + window.onload = func; + } else { + window.onload = function(){ + oldonload(); + func(); + } + } + +} + + + +addLoadEvent(initLightbox); // run initLightbox onLoad diff --git a/share/loading.gif b/share/loading.gif new file mode 100644 index 0000000..fbe57be Binary files /dev/null and b/share/loading.gif differ diff --git a/share/overlay.png b/share/overlay.png new file mode 100644 index 0000000..7cee298 Binary files /dev/null and b/share/overlay.png differ -- cgit v1.2.3