#!/usr/bin/perl
# #############################################################################
# Author: Vulcho Nedelchev <kumcho@vulcho.com>
# Version: 1.1
# Get latest: http://www.vulcho.com/perl/
# #############################################################################
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use strict;
use DirHandle;
my $q = new CGI;
my $PAGE = $q->param('page') || 1;
my $HEADER = my_header();
my $FOOTER = my_footer();
my @IMAGES = images();
my $TOTAL_IMAGES = scalar(@IMAGES);
my $PAGES = pages(scalar(@IMAGES));
my $MENU = navigation();
my $BODY = body();
my $COPYRIGHT = copyright();
$PAGE = $PAGE !~ /^\d+$/ ? 1 : $PAGE;
sub copyright {
return "<p><font size=1><b>Vulcho's Gallery, v1.1, coded in Perl</b></font></p>\n";
}
sub main {
print $q->header;
print $HEADER;
print "<b>You are now watching page# $PAGE;</b><br>\n";
print "<b>Images are $TOTAL_IMAGES placed in $PAGES pages;</b><br><br>\n";
print $BODY;
print "<HR size=\"1px\" style=\"color:#35332C\">\n";
print "<center>$MENU $COPYRIGHT</center>\n";
print $FOOTER;
}
sub body {
my @page_images = splice(@IMAGES, ($PAGE-1)*20, 20);
my $i = 0;
my $body;
$body="<table cellspacing=5 cellpadding=5 border=0>";
for (0..4) {
my @arr = splice @page_images, $_, 4;
my $size = size();
map { $_ = $q->a({-href=>"$_", -title=>$_, -target=>'_blank'}, $q->img({src=>"thumb_$_", border=>0}).'<br>'.size($_).' bytes' ) } @arr;
$body.=$q->Tr( $q->td({-valign=>'top'}, \@arr) );
}
$body.="<table>\n";
return $body;
}
sub navigation {
my $menu;
my $script = $ENV{SCRIPT_NAME};
for (1..$PAGES) {
if ($PAGE == $_) {
$menu .= " [$_] ";
}else{
$menu .= " " . $q->a({-href=>"$script?page=$_"}, $_) . " ";
}
}
$menu.="<br>\n";
if ($PAGE>1) {
$menu.=$q->a({-href=>"$script?page=".($PAGE-1)}, '<<BACKWARD')." ";
}else{
$menu.=' <<BACKWARD ';
}
$menu.=' ' . $q->a({-href=>"$script?page=1"}, 'START') . ' ';
if ($PAGE < $PAGES) {
$menu.=" ".$q->a({-href=>"$script?page=".($PAGE+1)}, 'FORWARD>>');
}else{
$menu.=' FORWARD>> ';
}
return $menu;
}
sub pages {
my $files = shift;
return(($files%20)?(int($files/20)+1):($files/20));
}
sub my_footer {
return file('footer.tmpl');
}
sub my_header {
return file('header.tmpl');
}
sub file {
open FF, $_[0] or die "Cannot read file $_[0]";
my @data = <FF>;
close FF;
return join '', @data;
}
sub images {
my $d = new DirHandle ".";
my @files;
if (defined $d) {
while (defined($_ = $d->read)) {
next unless m/\.png|\.gif|\.jpg|\.jpeg/i;
next if m/^thumb_/i;
next if banned($_);
thumb($_);
push @files, $_;
}
undef $d;
}
#sort @files;
return(sort(@files));
}
sub thumb {
my $image = shift;
make_thumb($image) unless (-f "thumb_$image");
}
sub make_thumb {
eval{system("/usr/bin/convert", "-resize", '100x100', $_[0], "thumb_$_[0]") };
die "$@ kurec" if $@;
}
sub banned {
my %banned=(
'blank.gif' => 1,
'spacer.gif' => 1,
);
return exists $banned{$_[0]} ? 1 : undef;
}
sub size {
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat($_[0]);
return $size;
}
main();
exit;