2 # Creating a Gallery of bunch of images.
3 # Arpit Jain arpitjain11@ozoneball.com
4 package IkiWiki::Plugin::gallery;
11 hook(type => "preprocess", id => "gallery", call => \&preprocess);
12 hook(type => "pagetemplate", id => "gallery", call => \&pagetemplate);
15 sub pagetemplate(@){ #{{{
17 my $template = $params{template};
18 my $page = $params{page};
21 if($template->query(name => "gallery")){
22 my $pagetmpl=template("gallery.tmpl", blind_cache => 1);
23 $pagetmpl->param(prototype1 => "prototype.js");
24 $pagetmpl->param(scriptaculous => "scriptaculous.js?load=effects");
25 $pagetmpl->param(lightbox => "lightbox.js");
26 $pagetmpl->param(lightboxcss => "css/lightbox.css");
27 $pagetmpl->param(baseurl => "$config{url}/");
28 $scripts=$pagetmpl->output ;
30 $template->param(gallery => $scripts);
33 sub preprocess (@) { #{{{
36 my $alt = $params{alt} || '';
37 my $title = $params{title} || '';
38 my $imagedir = $params{imagedir} || '';
39 my $thumbnailsize= $params{thumbnailsize} || '200x200';
40 my $cols= $params{cols} || '3';
41 my $name = $params{name} || '1';
43 my $dir = bestdir($params{page}, $imagedir) || return "[[gallery ".sprintf(gettext("Directory %s not found"), $imagedir)."]]";
45 my ($w, $h) = ($thumbnailsize =~ /^(\d+)x(\d+)$/);
46 return "[[gallery ".sprintf(gettext('bad thumbnail size "%s"'), $thumbnailsize)."]]" unless (defined $w && defined $h);
48 opendir PICSDIR, srcfile($dir);
49 my @image_files = grep /\.(jpg|png|gif)$/, readdir PICSDIR;
52 eval q{use Image::Magick};
55 my $numfiles = scalar(@image_files);
58 my $tosend='<table align="center">';
60 $tosend.="<tr><td align=\"center\" colspan=\"$cols\"><h2>$title</h2></td></tr>";
63 my ($imagefile,$im,$r);
65 foreach $imagefile (@image_files){
66 $im = Image::Magick->new;
67 my $imagelink = "$dir/$imagefile"; #Source Image File
68 my $thumblink = "$dir/${w}x${h}-$imagefile"; #Destination Thumbnail File
69 my $thumboutlink= "$config{destdir}/$thumblink" ; #Destination Image File
71 will_render($params{page}, $thumblink);
73 if (-e $thumboutlink && (-M srcfile($imagelink) >= -M $thumboutlink)) {##Do Not Create Thumbnail if already exists.
74 $r = $im->Read($thumboutlink);
75 return "[[gallery ".sprintf(gettext("failed to read %s: %s"), $thumboutlink, $r)."]]" if $r;
77 $r = $im->Read(srcfile($imagelink)); #Read Image File.
78 return "[[gallery".sprintf(gettext("Failed to read %s: %s"), $imagelink, $r)."]]" if $r;
80 $r = $im->Resize(geometry => "${w}x${h}"); #Create Thumbnail
81 return "[[gallery ".sprintf(gettext("Failed to resize: %s"), $r)."]]" if $r;
83 # Don't actually write file in preview mode
84 if (! $params{preview}) {
85 my @blob = $im->ImageToBlob();
86 $thumblink=Ikiwiki::possibly_foolish_untaint($thumblink);
87 writefile($thumblink, $config{destdir}, $blob[0], 1);
89 $thumblink = $imagelink;
93 add_depends($params{page},$thumblink);
94 add_depends($params{page},$imagelink);
96 my ($imageurl, $thumburl);
97 if (! $params{preview}) {
98 $imageurl=urlto($imagelink, $params{destpage});
99 $thumburl=urlto($thumblink, $params{destpage});
101 $imageurl="$config{url}/$imagelink";
102 $thumburl="$config{url}/$thumblink";
109 $tosend.="<td align=\"center\" class=\"images\"><table><tr>";
111 $tosend.= "<td align=\"center\" class=\"images\"><a href=\"$imageurl\" title=\"$imagefile\" rel=\"lightbox[mypics]\"><img src=\"" .$thumburl."\"/></a></td>";
113 $tosend.="</tr><tr><td align=\"center\">$imagefile</td></tr></table></td>";
116 if($numcols==$cols) {
126 sub bestdir ($$) { #{{{
131 if ($link=~s/^\/+//) {
137 $l.="/" if length $l;
139 if (-d "$config{srcdir}/$l") {
142 } while $cwd=~s!/?[^/]+$!!;
144 if (length $config{userdir}) {
145 my $l = "$config{userdir}/".lc($link);