From e68c5c22d14964114cf3374a9f8096e3654c2c1f Mon Sep 17 00:00:00 2001 From: Eugene Crosser Date: Wed, 1 Mar 2006 22:08:46 +0000 Subject: [PATCH] make info pages --- mkgallery.pl | 362 +++++---------------------------------------------- 1 file changed, 36 insertions(+), 326 deletions(-) diff --git a/mkgallery.pl b/mkgallery.pl index 97f1fbc..2f6bc6e 100755 --- a/mkgallery.pl +++ b/mkgallery.pl @@ -376,6 +376,24 @@ sub makeaux { end_html,"\n"; close($F); } + my $fn = sprintf("%s/.html/%s-info.html",$dn,$name); + my $F; + unless (open($F,'>'.$fn)) { + warn "cannot open \"$fn\": $!"; + return; + } + + # info html + my $imgsrc = sprintf("../.%s/%s",$sizes[0],$name); + print $F start_html(-title=>$title,-bgcolor=>"#ffff80", + -style=>{-src=>$inc."gallery.css"},),"\n", + start_center,"\n", + h1($title),"\n", + table(Tr(td(img({-src=>$imgsrc})),td($self->infotable))), + end_table, + end_center,"\n", + end_html,"\n"; + close($F); } sub startindex { @@ -442,8 +460,8 @@ sub startimglist { my $first = $self->{-firstimg}->{-base}; my $slideref = sprintf(".html/%s-slide.html",$first); - print $IND h2("Images"), - a({-href=>$slideref},'Slideshow'); + print $IND h2("Images"),"\n", + a({-href=>$slideref},'Slideshow'), "\n"; } @@ -458,7 +476,15 @@ sub img_entry { my $info = $self->{-info}; my ($w, $h) = dim($info); - #print &infobox($info,$base,$fn),"\n"; + print $IND start_div({-class=>'ibox',-id=>$name, + -OnClick=>"HideIbox('$name');"}), + span({-style=>'float: left;'},b("Info for $name")), + span({-style=>'float: right;'}, + a({-href=>"#",-OnClick=>"HideIbox('$name');"},"Close")), + br({-clear=>'all'}), + $self->infotable, + end_div,"\n"; + print $IND table({-class=>'slide'},Tr(td( a({-href=>".html/$name-info.html", -onClick=>"return showIbox('$name');"},$title), @@ -477,224 +503,10 @@ sub endimglist { print $IND br({-clear=>'all'}),hr,"\n\n"; } -###################################################################### -=cut -###################################################################### - -&processdir(getcwd); - -sub processdir { - my ($start,$dir)=@_; - my $dn=$start; - $dn .= "/".$dir if ($dir); - unless ( -d $dn ) { - warn "not a directory: $dn"; - return; - } - my $D; - unless (opendir($D,$dn)) { - warn "cannot opendir $dn: $!"; - return; - } - -# recurse into subdirectories BEFORE opening index file - - &iteratedir($D,$start,$dir,sub { - my ($start,$dir,$base)=@_; - my $ndir = $dir; - $ndir .= "/" if ($ndir); - $ndir .= $base; - return unless ( -d $start."/".$ndir ); - &processdir($start,$ndir); - }); - -# fill in title - - my $title=&gettitle($dn,$dir); - -# get include prefix - - my $inc=&getinclude($dn); - -# generate directory index unless suppressed - - if ( -e $dn."/.noindex" ) { - open(STDOUT,">/dev/null"); - } else { - open(STDOUT,">".$dn."/index.html"); - } - -# write HTML header - - -style=>{-src=>[$inc."gallery.css", - $inc."lightbox.css"]}, - -script=>[{-code=>"var incPrefix='$inc';"}, - {-src=>$inc."gallery.js"}, - {-src=>$inc."lightbox.js"}]),"\n"; - print a({-href=>"../index.html"},"UP"); - print start_center,"\n"; - print h1($title),"\n"; - -# create list of sub-albums - - my $hassubdirs=0; - &iteratedir($D,$start,$dir,sub { - my ($start,$dir,$base)=@_; - my $en=sprintf("%s/%s/%s",$start,$dir,$base); - return unless ( -d $en ); - unless ($hassubdirs) { - print hr,h2("Albums"),start_table,"\n"; - $hassubdirs=1; - } - &subalbum($base,&gettitle($en,$dir."/".$base)); - }); - print end_table,hr,"\n" if ($hassubdirs); - -# create picture gallery - - my @piclist=(); - my @infolist=(); - - my $haspics=0; - &iteratedir($D,$start,$dir,sub { - my ($start,$dir,$base)=@_; - my $en=sprintf("%s/%s/%s",$start,$dir,$base); - return unless ( -f $en ); - my $info = image_info($en); - if (my $error = $info->{error}) { - if (($error !~ "Unrecognized file format") && - ($error !~ "Can't read head")) { - print STDERR "File \"$en\": $error\n"; - } - return; - } - if (&processfile($start,$dir,$base,$en,$info)) { - $haspics=1; - push(@piclist,$base); - push(@infolist,$info); - } - }); - -# write HTML footer - - print br({-clear=>"all"}),"\n"; - print a({-href=>".html/".$piclist[0]."-slide.html"},"Slideshow"); - print hr,"\n" if ($haspics); - print end_center,"\n"; - print end_html,"\n"; - - close(STDOUT); - closedir($D); - -# generate html files for slideshow from @piclist - - for (my $i=0;$i<=$#piclist;$i++) { - my $base=$piclist[$i]; - my $pbase; - my $nbase; - $pbase=$piclist[$i-1] if ($i>0); - $nbase=$piclist[$i+1] if ($i<$#piclist); - for my $refresh('static','slide') { - &mkauxfile($start,$dir,$pbase,$base,$nbase, - $refresh,$infolist[$i]); - } - } - -} - -############################################################# -# helper functions -############################################################# - -sub iteratedir { - my ($D,$start,$dir,$prog)=@_; - my @list=(); - while (my $de=readdir($D)) { - next if ($de =~ /^\./); - push(@list,$de); - } - foreach my $de(sort @list) { - &$prog($start,$dir,$de); - } - rewinddir($D); -} - -sub getinclude { - my ($dn)=@_; - - my $depth=20; - my $str=""; - #print STDERR "start include ",$dn."/".$str.".include","\n"; - while ( ! -d $dn."/".$str.".include" ) { - #print STDERR "not include ",$dn."/".$str.".include","\n"; - $str.="../"; - last unless ($depth--); - } - #print STDERR "end include ",$dn."/".$str.".include","\n"; - if ( -d $dn."/".$str.".include" ) { - #print STDERR "return include ".$str.".include/".$fn,"\n"; - return $str.".include/"; - } else { - return ""; # won't work anyway but return something - } -} - -sub gettitle { - my ($dir,$dflt)=@_; - - my $F; - my $str; - if (open($F,"<".$dir."/.title")) { - $str=<$F>; - chop $str; - close($F); - } else { - print STDERR "enter title for $dir\n"; - $str=<>; - if ($str =~ /^\s*$/) { - $str=$dflt; - } - if (open($F,">".$dir."/.title")) { - print $F $str,"\n"; - close($F); - } else { - print STDERR "cant open .title in $dir for writing: $!"; - } - } - return $str; -} - -sub subalbum { - my ($base,$title)=@_; - - print Tr({-bgcolor=>"#c0c0c0"}, - td(a({-href=>$base."/index.html"},$base)), - td(a({-href=>$base."/index.html"},$title))),"\n"; -} - -sub processfile { - my ($start,$dir,$base,$fn,$info)=@_; - - my ($w,$h) = dim($info); - my $title=$info->{'Comment'}; - $title=$base unless ($title); - my $thumb=&scale($start,$dir,$base,$fn,160,$info); - my $medium=&scale($start,$dir,$base,$fn,640,$info); - print &infobox($info,$base,$fn),"\n"; - print table({-class=>'slide'},Tr(td( - a({-href=>".html/$base-info.html", - -onClick=>"return showIbox('$base');"},$title), - br, - a({-href=>$medium,-rel=>"lightbox",-title=>$title}, - img({-src=>$thumb})), - br, - a({-href=>$base},"($w x $h)"), - br))),"\n"; - return 1; -} - -sub infobox { - my ($info,$base,$fn)=@_; +sub infotable { + my $self = shift; + my $info = $self->{-info}; + my $msg=''; my @infokeys=( 'DateTime', @@ -710,112 +522,10 @@ sub infobox { 'Model', 'Software', ); - - my $msg=start_div({-class=>'ibox',-id=>$base,-OnClick=>"HideIbox('$base');"}); - $msg.=span({-style=>'float: left;'},"Info for $base"). - span({-style=>'float: right;'}, - a({-href=>"#",-OnClick=>"HideIbox('$base');"},"Close")); - $msg.=br({-clear=>'all'}); - $msg.=start_table; + $msg.=start_table."\n"; foreach my $k(@infokeys) { - $msg.=Tr(td($k.":"),td($info->{$k})); + $msg.=Tr(td($k.":"),td($info->{$k}))."\n" if ($info->{$k}); } - $msg.=end_table; - $msg.=end_div; - return $msg; + $msg.=end_table."\n"; } -sub mkauxfile { - my ($start,$dir,$pbase,$base,$nbase,$refresh,$info) =@_; - my $en=sprintf("%s/%s/.html/%s-%s.html",$start,$dir,$base,$refresh); - my $pref; - my $nref; - if ($pbase) { - $pref=sprintf("%s-%s.html",$pbase,$refresh); - } else { - $pref="../index.html"; - } - if ($nbase) { - $nref=sprintf("%s-%s.html",$nbase,$refresh); - } else { - $nref="../index.html"; - } - my $toggle; - my $toggleref; - if ($refresh eq 'slide') { - $toggle='Stop!'; - $toggleref=sprintf("%s-static.html",$base); - } else { - $toggle='Play->'; - $toggleref=sprintf("%s-slide.html",$base); - } - - my $tdir=sprintf "%s/%s/.html",$start,$dir; - mkdir($tdir,0755) unless ( -d $tdir ); - - unless (open(STDOUT,">".$en)) { - warn "cannot open $en: $!"; - return; - } - my $title=$info->{'Comment'}; - $title=$base unless ($title); - if ($refresh eq 'slide') { - print start_html(-title=>$title, - -bgcolor=>"#808080", - -head=>meta({-http_equiv=>'Refresh', - -content=>"3; url=$nref"})),"\n"; - } else { - print start_html(-title=>$title, - -bgcolor=>"#808080"),"\n"; - } - print start_center,"\n"; - print h1($title); - print a({-href=>"../index.html"},"Index")," | "; - print a({-href=>$pref},"<<Prev")," | "; - print a({-href=>$toggleref},$toggle)," | "; - print a({-href=>$nref},"Next>>"); - print p; - print img({-src=>"../.640/".$base}),"\n"; - print end_center,"\n"; - print end_html,"\n"; - close(STDOUT); -} - -sub scale { - my ($start,$dir,$base,$fn,$tsize,$info)=@_; - my ($w,$h) = dim($info); - my $max=($w>$h)?$w:$h; - my $factor=$tsize/$max; - - return $base if ($factor >= 1); - - my $tdir=sprintf "%s/%s/.%s",$start,$dir,$tsize; - mkdir($tdir,0755) unless ( -d $tdir ); - my $tbase=sprintf ".%s/%s",$tsize,$base; - my $tfn=sprintf "%s/%s",$tdir,$base; - my @sstat=stat($fn); - my @tstat=stat($tfn); - return $tbase if (@tstat && ($sstat[9] < $tstat[9])); # [9] -> mtime - - print STDERR "scale by $factor from $fn to $tfn\n"; - &doscaling($fn,$tfn,$factor,$w,$h); - return $tbase; -} - -sub doscaling { - my ($src,$dest,$factor,$w,$h)=@_; - - my $im=new Image::Magick; - my $err; - #print STDERR "doscale $src -> $dest by $factor\n"; - $err=$im->Read($src); - unless ($err) { - $im->Scale(width=>$w*$factor,height=>$h*$factor); - $err=$im->Write($dest); - warn "ImageMagic: write \"$dest\": $err" if ($err); - } else { - warn "ImageMagic: read \"$src\": $err"; - system("djpeg \"$src\" | pnmscale \"$factor\" | cjpeg >\"$dest\""); - } - undef $im; -} -- 2.39.2