view release on metacpan or search on metacpan
- Silence many warnings and info from mplayer.
- Output HTML entities for non-ascii characters. Use Latin-9 instead
of Latin-1.
Version 1.02, Unreleased
Version 1.01, Sun Nov 21 11:29:10 CET 2004
* Album now uses style sheets (CSS) for most formatting, making
it easy to customize the appearance of the pages.
Version 1.00, Sun Oct 3 16:40:34 CET 2004
* First official release after a long period of beta tests.
Details
=======
A photo album consists of a number of (large) pictures, small thumbnail
images, and index pages. Optionally, medium sized images can be
generated as well. The album will be organised as follows:
index.html first or only index page
indexN.html subsequent index pages (N = 1, 2, ...)
css/ direcotry with style sheets
icons/ directory with navigation icons
large/ original (large) images, with HTML pages
medium/ optional medium sized images, with HTML pages
thumbnail/ thumbnail images
Each image can be labeled with a description, a tag (applies to a
group of images, e.g. a date), the image name, and some
characteristics (size and dimensions).
Images can be handled 'in situ', or imported from e.g. a CD-ROM or
lib/Album.pm view on Meta::CPAN
A photo album consists of a number of (large) pictures, small thumbnail
images, and index pages. Optionally, medium sized images can be
generated as well. Also, it is possible to embed other albums.
The album will be organised as follows:
index.html first or only index page
indexN.html subsequent index pages (N = 1, 2, ...)
icons/ directory with navigation icons
css/ directory with stylesheets
large/ original (large) images, with HTML pages
medium/ optional medium sized images, with HTML pages
thumbnail/ thumbnail images
Each image can be labeled with a description, a tag (applies to a
group of images, e.g. a date), the image name, and some
characteristics (size and dimensions).
Images can be handled 'in situ', or imported from e.g. a CD-ROM or
digital camera. Optionally, EXIF information from digital camera files
lib/Album/Tutorial.pm view on Meta::CPAN
it as follows:
$ album -v
No info.dat, adding images from large
info.dat: Cannot update (does not exist)
Number of entries = 7 (7 added)
mkdir thumbnails
mkdir icons
mkdir css
Creating icons: first-gr.png first.png ... sound.png movie.jpg
Creating style sheets: common.css index.css ... journal.css
im023.jpg: thumbnail OK
im024.jpg: thumbnail OK
im025.jpg: thumbnail OK
im026.jpg: thumbnail OK
im027.jpg: thumbnail OK
im028.jpg: thumbnail OK
im029.jpg: thumbnail OK
Creating pages for 7 images
(Needed to write 7 image pages)
Creating pages for 1 index
lib/Album/Tutorial.pm view on Meta::CPAN
any images in the 'large' directory (which is considered 'original work');
=item *
any images in the 'medium' and 'thumbnails' directories (but see
B<--clobber> below);
=item *
any icons or stylesheets, so it is save to customize these;
=back
=head2 Adding medium sized images
The purpose of medium sized images is easy browsing by having a
consistent and convenient size. The default size shows normal 4:3
images completely on an 1024x768 screen in the browser's full screen
mode.
script/album view on Meta::CPAN
# Clean up and create directories.
if ( $clobber ) {
rmtree([d_thumbnails(), d_medium()], $verbose > 1);
}
mkpath([d_large(), d_thumbnails(), d_icons(), d_css()], $verbose > 1);
mkpath([d_medium()], $verbose > 1) if $medium;
# Copy the button images over to the target directory.
add_button_images();
# Create the default style sheets, if necessary.
add_stylesheets();
# Copy images in place, rotate if necessary, and create the thumbnails.
prepare_images();
# Update cache.
update_cache();
my $cache_update = 0;
my $entries_per_page = $index_columns*$index_rows;
my $num_indexes = int(($num_entries - 1) / $entries_per_page) + 1;
script/album view on Meta::CPAN
# $rtop
# $vbuttons / $hbuttons
# $jscript
# $contents
$fmt_index_page = $load->("index.fmt", heredoc(<<' EOD', 4));
<?xml version="1.0" encoding="iso-8859-15"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="${lib_common}css/index.css">
<title>$title</title>
$jscript
</head>
<body>
<table>
<tr>
<td></td>
<td align='left'>
<p class='hdl'>
$ltop
script/album view on Meta::CPAN
# $image
# $lbot
# $rbot
$fmt_image_page = $load->("image.fmt", heredoc(<<' EOD', 4));
<?xml version="1.0" encoding="iso-8859-15"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>$title</title>
<link rel="stylesheet" href="../${lib_common}css/$dir.css">
$jscript
</head>
<body>
<table>
<tr>
<td></td>
<td align='left' valign='top'>
<p class='hdl'>
$ltop
</p>
script/album view on Meta::CPAN
# $tag
# $vbuttons / $hbuttons
# $journal
# $jscript
$fmt_journal_page = $load->("journal.fmt", heredoc(<<' EOD', 4));
<?xml version="1.0" encoding="iso-8859-15"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel='stylesheet' href='../${lib_common}css/journal.css'>
<title>$title</title>
$jscript
</head>
<body>
<table class='outer'>
<tr class='grey'>
<td>
<p class='hd'>
$tag
</p>
script/album view on Meta::CPAN
for ( $med ? $el->medium_size : $el->file_size ) {
next unless $_;
$ret .= "," if $ret;
$ret .= bytes($_);
}
$ret;
}
#### EXIF helpers.
sub restyle_exif($) {
my ($el) = @_;
my $ret = "";
my $v;
my $app = sub {
$ret .= "<tr><td>".htmln($_[0])."</td>".
"<td>".htmln($_[1])."</td></tr>\n";
};
$app->("Date", $v) if $v = $el->DateTime;
script/album view on Meta::CPAN
}
#### Caption helpers.
sub f_caption($) {
my ($el) = @_;
my $s = htmln($el->dest_name);
if ( $el->Make ) {
$s = " $s<a href='#' class='info'> <span>".
"<table border='1' width='100%'>\n".
restyle_exif($el) . "</table>\n".
"</span></a>";
}
$s;
}
sub s_caption($) {
my ($el) = @_;
size_info($el, $medium);
}
script/album view on Meta::CPAN
my $s = size_info($el);
$auxright .= " ($s)" if $s;
$auxright .= " $creator" if $creator;
my $auxleft = htmln($el->tag || "");
my $it2 = $it;
if ( $el->Make ) { # EXIF info
$it2 = "<a href='#' class='info'>" . $it .
"<span>" .
"<table border='1' width='100%'>\n" .
restyle_exif($el) . "</table>\n" .
"</span></a>";
}
my $tt2 = $tt;
if ( $dir eq "medium" && $el->annotation ) {
my @a = UNIVERSAL::isa($el->annotation, "ARRAY")
? @{$el->annotation} : ($el->annotation);
my $t = "";
foreach ( reverse(@{$el->annotation}) ) {
next unless $_;
script/album view on Meta::CPAN
}
print STDERR ("\n") if $verbose > 1;
if ( $doing ) {
die("Error in DATA: still processing $name\n");
unlink($name);
}
}
################ Style Sheets ################
my $add_stylesheet_msg;
sub add_stylesheets {
my $css_fontfam = "font-family: Verdana, Arial, Helvetica";
my $WHITE = "#FFFFFF";
my $BLACK = "#000000";
my $RED = "#FF0000";
my $LGREY = "#E0E0E0";
my $MGREY = "#D0D0D0";
my $DGREY = "#C0C0C0";
$add_stylesheet_msg = 0;
add_stylesheet("common", heredoc(<<" EOD", 4));
body {
font-size: 80%; $css_fontfam;
text: $BLACK;
background: $DGREY;
}
td {
font-size: 80%; $css_fontfam;
}
p.hdl, p.hdr {
font-size: 140%; font-weight: bold;
script/album view on Meta::CPAN
color: $BLACK; text-decoration: none;
}
a:visited {
color: $BLACK; text-decoration: none;
}
a:active {
color: $RED; text-decoration: none;
}
EOD
add_stylesheet("index", heredoc(<<" EOD", 4));
\@import "common.css";
a.info {
position: relative; z-index: 24; background-color: $LGREY;
color: $BLACK; text-decoration:none;
}
a.info:hover {
z-index: 25; background-color: $LGREY;
}
a.info span {
display: none;
script/album view on Meta::CPAN
a.info:hover span {
display: block;
position: absolute; top: 2em; left: 2em; width: 25em;
border: 0px; background-color: $MGREY; color: $BLACK;
text-align: center;
}
table.outer {
background: #d0d0d0;
border-collapse: separate;
border-width: 2px; /* border=2 */
border-style: solid;
border-color: #e8e8e8 #727272 #727272 #e8e8e8;
border-spacing: 3px; /* cellspacing = 3 */
}
table.outer tr {
background: #e0e0e0;
}
table.outer td {
border-width: 1px;
border-style: solid;
border-color: #7c7c7c #f5f5f5 #f5f5f5 #7c7c7c;
}
table.inner {
border: outset 0px;
}
table.inner td {
border: inset 0px;
}
p.hdr {
font-size: 140%; font-weight: bold;
script/album view on Meta::CPAN
color: #000000; text-decoration: underline;
}
p.hdr a:visited {
color: #000000; text-decoration: underline;
}
p.hdr a:hover {
color: #FF0000; text-decoration: underline;
}
EOD
add_stylesheet("large", heredoc(<<" EOD", 4));
\@import "common.css";
a.info {
position: relative; z-index: 24; background-color: $DGREY;
color: $BLACK; text-decoration: none;
}
a.info:hover {
z-index: 25; background-color: $DGREY;
}
a.info span {
display: none;
}
a.info:hover span {
display: block;
position: absolute; top: 2em; left: 2em; width: 15em;
border: 0px; background-color: $MGREY; color :$BLACK;
text-align: center;
}
EOD
add_stylesheet("medium", heredoc(<<" EOD", 4));
\@import "common.css";
a.info {
position: relative; z-index: 24; background-color: $DGREY;
color:$BLACK; text-decoration:none;
}
a.info:hover {
z-index: 25; background-color: $DGREY;
}
a.info span {
display: none;
}
a.info:hover span {
display: block;
position: absolute; top:2em; left: 2em; width: 15em;
border: 0px; background-color: $MGREY; color: $BLACK;
text-align: center;
}
EOD
add_stylesheet("journal", heredoc(<<" EOD", 4));
body {
font-size: 100%; $css_fontfam;
text: $BLACK;
background: $WHITE;
}
p.hd {
font-size: 140%; font-weight: bold;
margin-left: 0.1in; margin-top: 0.1in; margin-bottom: 0.1in;
}
table.outer {
width: 500px;
border-spacing: 10px;
}
tr.grey {
background: $DGREY;
}
table.outer td {
}
EOD
print STDERR ("\n") if $add_stylesheet_msg;
}
sub add_stylesheet {
my ($css, $data) = @_;
return if -e d_css("$css.css");
print STDERR ("Creating style sheets: ")
unless $verbose <= 1 || $add_stylesheet_msg++;
print STDERR ("$css.css ");
$css = d_css("$css.css");
open(my $out, ">".$css) or die("$css: $!\n");
binmode($out);
print {$out} ($data);
close($out) or die("$css: $!\n");
}
################ End Style Sheets ################