From 68c39fb44a748326e82293210c9cc48d85fe874b Mon Sep 17 00:00:00 2001 From: Jon Langseth Date: Tue, 14 Dec 2010 13:47:26 +0100 Subject: [PATCH] Four new features, two bugfixes. Version 0.2 code. DONE: filename.txt for file comments DONE: comment.txt for album comments DONE: Save reference to main-index thumbnail. DONE: Add command line option to disable EXIF block output BUGFIX: Now generates for all images, including the last in set. BUGFIX: Performs rotation according to EXIF --- README | 58 ++++++++++++++++++++++++++-- full.tpl | 7 ++++ index.php | 79 ++++++++++++++++++++++++++++++++++++++ index.tpl | 2 + indexstyle.css | 97 ++++++++++++++++++++++++++++++++++++++++++++++ plsgen | 62 ++++++++++++++++++++++++++---- plsgen.cfg | 11 +++++- rss.php | 102 +++++++++++++++++++++++++++++++++++++++++++++++++ style.css | 14 ++++++- 9 files changed, 418 insertions(+), 14 deletions(-) create mode 100644 index.php create mode 100644 indexstyle.css create mode 100644 rss.php diff --git a/README b/README index 5384598..2e6e6cd 100644 --- a/README +++ b/README @@ -23,6 +23,7 @@ a Web server. The generated result is static HTML, so no requirements at all exist in regard to type and functionality of HTTP daemon. + Installation ------------------------- @@ -45,6 +46,7 @@ allows you to override the default locations. The shipped config lists all configuration options, along with their default values (used if no config present). + Execution / Use ------------------------- @@ -63,6 +65,8 @@ Recognized commandline options are: --htmlonly Add this option to only generate HTML files No image operations will be performed with this option + --noexif + Forces EXIF data block not to be written to HTML output --config=/path/to/config Overrides default config file location. Default is to look for ./plsgen.cfg, then ../plsgen.cfg @@ -70,14 +74,62 @@ Recognized commandline options are: --help Displays a list of available commandline options + +File overrides: comments, title, index image. +------------------------------------------------------ +plsgen supports static gallery- and image comments. To get descriptive +text or author comments on a gallery, add a file with the name 'comment.txt' +to the directory before generating the album. The file is read, and injected +verbatim, into all index* files generated, pre- and post-padded with the +content of the comment-{pre,post} configuration variables. + +To add an image comment, create a text file named identically to the image +filename, plus the suffix .txt. So, if an image is named 'AnImage.JPG', the +corresponding comment file should be named 'AnImage.JPG.txt' + +If you wish to pre-seed the gallery title, you may do so by putting the +gallery title on a single line in a file named '.title'. The title is read +from this file if no title is given on the command line, and it is present. +Note that if a title is given on the command line, that title will be used, +and also will overwrite any content in the .title file. + +A reference to an "index image", simply the first image in the set, +is saved in the file '.indeximage', if this file does not previously exist. +To override the chosen index image, simply put the filename you would +rather have used in this file. The index image is used bu the included +example index.php and rss.php + + +Index front-end and RSS support +------------------------- +Included is a sample front-end index, and an accompanying RSS +generator written using PHP. To use these, take a look at the PHP +source, make personal adaptation (at least change references to my site +to your own), and place both php files, plus indexstyle.css in a +directory where you keep your albums as sub-directories. + +E.g.: + Web Root + |-- galleryset1 + | |-- image1.jpg + | |-- image1.jpg.txt + | |-- image2.jpg + | |-- comment.txt + | `- .title + |-- galleryset2 + . ... + |-- nav.js + |-- style.css + |-- index.php + |-- indexstyle.css + `- rss.php + + Todo-list ------------------------- -# TODO: filename.txt for file comments # TODO: Templating of EXIF # TODO: Priority/sorting of EXIF tags # TODO: Possibility for hide/show EXIF -# TODO: RSS support? Delegate that to frontend? -# TODO: Save reference to main-index thumbnail. # TODO: Clear old generated files and meta on regen # TODO: Use perlmagick et. al instead of convert/jhead.. diff --git a/full.tpl b/full.tpl index 9e2889a..2be36e9 100644 --- a/full.tpl +++ b/full.tpl @@ -26,12 +26,19 @@ +%{comment} +
%{exif}
+ diff --git a/index.php b/index.php new file mode 100644 index 0000000..4377154 --- /dev/null +++ b/index.php @@ -0,0 +1,79 @@ + +plsgen-generated photoalbum. + + + + + +
+ +
+ +" . $buf . ""; + } + + if (is_file($target . "/.indeximage")) { + $fd = fopen($target . "/.indeximage", "r"); + $buf = $file . "/thumb/"; + $buf .= fgets($fd, 4096); + chop ($buf); + fclose($fd); + $idximage[$file] = "Thumb"; + } + + } else { + + } + } + } +} +//closing the directory +closedir($dir_handle); + +krsort($album); + +foreach ( $album as $key => $value ) { + echo "
"; + echo ""; + echo ""; + echo "
$value
"; + echo "
"; +} +?> +
+
+
+Photo gallery index by Jon Langseth, generated using index.php +
+ + diff --git a/index.tpl b/index.tpl index a3be2bb..3bd8bdb 100644 --- a/index.tpl +++ b/index.tpl @@ -18,6 +18,8 @@ Page %{position} %{thumbnails} +%{comment} + Album generated %{gallery_timestamp} diff --git a/indexstyle.css b/indexstyle.css new file mode 100644 index 0000000..80a525c --- /dev/null +++ b/indexstyle.css @@ -0,0 +1,97 @@ +body { + font-family : Arial, Verdana, Geneva, Helvetica, sans-serif; + font-size: 12px; + background-color: black; + text-align: center +} +#wrapper { + margin-left: auto; + margin-right: auto; + width: 950px; +} +#head { + width: 925px; + background-color: #444; + border: 2px solid #2c2c29; + padding: 10px; + text-align: center; + color: wheat; +} +#head h1 { + font-size: 18px; + font-weight: bold; + margin: 0px; +} +#head-link { + font-size: 10px; + font-weight: italic; + margin-top: 10px; +} +a, a:visited { + color: white; +} + +#content { + margin-top: 10px; + width: 100%; + background-color: black; + color: white; + clear: both; + display: block; + text-align: center; +} +.title { + font-size: 11pt; + margin-top: 5px; + font-weight: bold; +} +.album { + width: 220px; + height: 225px; + margin: 5px; + padding: 0px; + display: -moz-inline-stack; + display: inline-block; + /* zoom: 1;*/ + *display: inline; + _height: 225px; + + vertical-align: top; + text-align: center; +} +.title {} +.idxthumb { + width: 170px; + height: 135px; + margin: 5px; + padding: 0px; + display: -moz-inline-stack; + display: inline-block; + /* zoom: 1;*/ + *display: inline; + _height: 135px; + + background-color: #2c2c29; + vertical-align: top; + text-align: center; + +} +.idxthumb img +{ + background-color: #2c2c29; + margin: 0px; + margin-top: 5px; + padding: 0px; +} +.idxthumb a img +{ + border:1px solid #2c2c29; +} +.idxthumb a:hover img +{ + border:1px solid #black; +} + + +.idxlink {} + diff --git a/plsgen b/plsgen index 0f04fb1..f5876d4 100755 --- a/plsgen +++ b/plsgen @@ -5,12 +5,10 @@ use AppConfig; use Getopt::Long; use strict; -# TODO: filename.txt for file comments # TODO: Templating of EXIF -# TODO: Priority/sorting of EXFI tags +# TODO: Priority/sorting of EXIF tags # TODO: Possibility for hide/show EXIF # TODO: RSS support? Delegate that to frontend? -# TODO: Save reference to main-index thumbnail. # TODO: Clear old generated files and meta on regen # TODO: Use perlmagick et. al instead of convert/jhead.. @@ -19,10 +17,13 @@ my $title = undef; my $htmlonly = 0; my $configfile = undef; my $halp = undef; +my $album_comment = undef; +my $doexif = 1; GetOptions ( "title=s" => \$title, "htmlonly!" => \$htmlonly, + "exif!" => \$doexif, "config=s" => \$configfile, "help" => \$halp ); @@ -36,6 +37,8 @@ if ( $halp ) print " --htmlonly\n"; print " Add this option to only generate HTML files\n"; print " No image operations will be performed with this option\n"; + print " --noexif\n"; + print " Forces EXIF data block not to be written to HTML output\n"; print " --config=/path/to/config\n"; print " Overrides default config file location.\n"; print " Default is to look for ./plsgen.cfg, then ../plsgen.cfg\n"; @@ -54,6 +57,8 @@ my $columns = $config->columns; my $rows = $config->rows; my $thumb_pre = $config->thumb_pre; my $thumb_post = $config->thumb_post; +my $comment_pre = $config->comment_pre; +my $comment_post = $config->comment_post; my $idx_prev_text = $config->idx_prev_text; my $idx_next_text = $config->idx_next_text; my $idx_ret_text = $config->idx_ret_text; @@ -74,13 +79,21 @@ elsif ( $title ) close TF; } +# Get the album comment, if available +if ( -f "comment.txt" ) +{ + open CF, ") { $album_comment .= $_; } + close CF; +} + mkdir "thumb"; mkdir "view"; # Glob file names to an array my @images = glob("*png *.jpg *.JPG *.gif *.GIF"); # Keep count of total number of images -my $imagecount = $#images; +my $imagecount = $#images+1; my ($current, $previous, $next); my $indexcount = 1; @@ -116,6 +129,19 @@ for ( my $i = 1; $i <= $imagecount; $i++) my $cur_index_text = "" . $idx_ret_text . ""; my $current_display = "view/" . $current; + # Check for, and load comment from FILENAME.txt here.. + my $comment = undef; + if ( -f $current . ".txt" ) + { + open CF, "<" . $current . ".txt"; + while () { $comment .= $_; } + close CF; + } + if ( $comment ) + { + $comment = $comment_pre . $comment . $comment_post; + } + printf ("Processing image %s: %s\n", $position, $current); # - - If rotated according to EXIF, do rotation @@ -124,13 +150,20 @@ for ( my $i = 1; $i <= $imagecount; $i++) { system("jhead -autorot " . $current . ">/dev/null") unless $htmlonly; } - my $exif_text = get_exifblock($exif); + my $exif_text = get_exifblock($exif) if $doexif; # - - Create thumbnail image (resize to new image) system("convert " . $current . " -geometry '160x120>' thumb/" . $current) unless $htmlonly; # - - Create normal display image (resize to new image) system("convert " . $current . " -geometry '800x600>' view/" . $current) unless $htmlonly; +# - - Save a reference to the "primary image" + if ( not -f ".indeximage" ) + { + open IM, ">.indeximage"; + print IM $current; + close IM; + } # - - Create full view HTML file my $cur_html; open TEMPLATE, "<" . $full_tpl_file or die "UNABLE TO LOAD TEMPLATE $full_tpl_file\n"; @@ -149,6 +182,7 @@ for ( my $i = 1; $i <= $imagecount; $i++) $_ =~ s/%\{position\}/$position/; $_ =~ s/%\{current\}/$current/; $_ =~ s/%\{current_display\}/$current_display/; + $_ =~ s/%\{comment\}/$comment/; $_ =~ s/%\{exif\}/$exif_text/; $_ =~ s/%\{gallery_timestamp\}/$gentime/; $_ =~ s/%\{navscript\}/$navscript/; @@ -166,7 +200,7 @@ for ( my $i = 1; $i <= $imagecount; $i++) { $thumbs .= ""; # - - On each Y, terminate index file/group: - make_index( $index_tpl_file, $indexcount, $indexes, $thumbs); + make_index( $index_tpl_file, $indexcount, $indexes, $thumbs, $album_comment ); $thumbs = "
"; $indexcount++; } @@ -177,7 +211,7 @@ for ( my $i = 1; $i <= $imagecount; $i++) } } $thumbs .= "
"; -make_index( $index_tpl_file, $indexcount, $indexes, $thumbs); +make_index( $index_tpl_file, $indexcount, $indexes, $thumbs, $album_comment ); # Done. @@ -188,6 +222,7 @@ sub make_index my $idxcount = shift; my $lastidx = shift; my $thumbs = shift; + my $comment = shift; my $gentime = localtime; my $html; @@ -216,6 +251,11 @@ sub make_index $next_text = "" . $idx_next_text . ""; } + if ( $comment ) + { + $comment = $comment_pre . $comment . $comment_post; + } + my $position = $indexcount . " of " . $lastidx; my $navscript = gen_navscript( $prev_file, $next_file ); @@ -225,6 +265,7 @@ sub make_index $_ =~ s/%\{previous\}/$prev_text/; $_ =~ s/%\{next\}/$next_text/; $_ =~ s/%\{title\}/$title/; + $_ =~ s/%\{comment\}/$comment/; $_ =~ s/%\{position\}/$position/; $_ =~ s/%\{main_meta\}/$main_meta/; $_ =~ s/%\{navigation_script\}/$navigation_header/; @@ -251,7 +292,7 @@ sub get_exifdata ($) my $info = $exifTool->ImageInfo($image); $exif->{'Make'} = $info->{'Make'}; $exif->{'Model'} = $info->{'Model'}; - #$exif->{'Orientation'} = $info->{'Orientation'}; + $exif->{'Orientation'} = $info->{'Orientation'}; $exif->{'ExposureTime'} = $info->{'ExposureTime'}; $exif->{'FNumber'} = $info->{'FNumber'}; $exif->{'ISO'} = $info->{'ISO'}; @@ -277,6 +318,7 @@ sub get_exifblock my $flipflop = 0; foreach my $tag ( keys %$exif ) { + next if $tag =~ m/Orientation/; my $val = $exif->{$tag}; next unless $val; $block .= "" if $flipflop; @@ -354,6 +396,10 @@ sub get_config $cfg->thumb_pre("
"); $cfg->define('thumb_post'); $cfg->thumb_post("
"); + $cfg->define('comment_pre'); + $cfg->comment_pre("
"); + $cfg->define('comment_post'); + $cfg->thumb_post("
"); $cfg->define('idx_prev_text'); $cfg->idx_prev_text("← Back"); $cfg->define('idx_next_text'); diff --git a/plsgen.cfg b/plsgen.cfg index 84a3b7a..0ba6f78 100644 --- a/plsgen.cfg +++ b/plsgen.cfg @@ -14,8 +14,8 @@ navigation_script = ../nav.js # The layout of the thumbnails in the index. Each row will be wrapped # in a
-rows = 3 -columns = 4 +rows = 4 +columns = 5 # HTML code to wrap each thumbnail with. The default allows simple # styling. If you wish to span this over multiple lines, use the @@ -23,6 +23,13 @@ columns = 4 thumb_pre =
thumb_post =
+# HTML code to wrap comments with, for both index and image +# display. The default allows simple styling. If you wish to span +# this over multiple lines, use the end-of-line continuation mark \ +comment_pre =
+comment_post =
+ + # Text-strings that can easily be replaced with more complex HTML. idx_prev_text = ← Back idx_next_text = Next → diff --git a/rss.php b/rss.php new file mode 100644 index 0000000..21cfa0c --- /dev/null +++ b/rss.php @@ -0,0 +1,102 @@ +\n"); +print ("\n"); +print (" \n"); +print (" " . $stream_title . "\n"); +print (" " . $site_url . "\n"); +print (" " . $stream_description . "\n"); +print (" http://blogs.law.harvard.edu/tech/rss\n"); +print (" " . $contact_address . "\n"); +print (" " . $contact_address . "\n"); + +/* // disse mÃ¥ fixxes + + */ + +foreach ( $album as $key => $value ) { + print ("\n"); + print (""); + $i_title = html_entity_decode($title[$key]); + $url = $site_url . "/" . $value; + print ($i_title); + print ("\n"); + print (" " . date("D, j M Y H:i:s +0100", $ctimes[$key]) . "\n"); + print (" " . $url . "\n"); + print (" $key$value\n"); + print (" \n"); + printf ("The photo gallery '%s' at %s was updated/published at %s", $i_title,$url,$url,date("D, j M Y H:i:s +0100", $ctimes[$key])); + print (" \n"); + print ("", $url, $idximage[$key]); + printf ("The photo gallery '%s' at %s was updated/published at %s", $i_title,$url,$url,date("D, j M Y H:i:s +0100", $ctimes[$key])); + print (" ]]>"); + print ("\n"); + + $maxcount--; + if ($maxcount < 1) break; +} +print (" \n"); +print (""); +?> + + diff --git a/style.css b/style.css index 9149f23..a742622 100644 --- a/style.css +++ b/style.css @@ -87,9 +87,21 @@ margin: 0px; padding: 2px 0 2px 10px; } +#timestamp { + margin-top: 15px; + font-size: 10pt; + font-family: sans; +} + +#copyright { + margin-top: 5px; + font-size: 10pt; + font-family: sans; +} + #footer { font-family: serif; font-size: 7pt; color: #444; - margin-top: 20px; + margin-top: 10px; } -- 2.39.2