* <[EMAIL PROTECTED]> [2005-05-09 22:13]: > > occurance of a date string is mentioned there so I'll later try to add > > that to my patch. > Looking at that now.
OK, here is a complete patch. It introduces a new variable "dateString" which allows you to specify the date string to be used (following date(1)). It then converts the %fields and %intlSubs into functions - this is needed to gain access to $configHash and therefore to the value of "dateString". $configHash has to be passed to these functions now, so a number of functions had to be modified in order to do that. Nothing major, though. This new "dateString" is used in two places: 1. GENERATED_DATE will use it and a new DATE (without the leading "on") has been introduced. 2. the "Transform" function for the EXIF date will now also follow dateString by default; this introduced a dependency on str2time from Date::Parse (packaged as libtimedate-perl in Debian) to parse the string from EXIF, but if that's a problem I can probably get rid of this dependency (but it would make the code uglier). I also rewrote most of the "Transform" functionality. This is now cleaner and allows more than just reg ex substitution. It also warns the user if the eval fails. Comments? diff -urN bins-1.1.27~/bins bins-1.1.27/bins --- bins-1.1.27~/bins 2005-05-09 22:05:59.370115208 +0100 +++ bins-1.1.27/bins 2005-05-10 00:15:19.951327536 +0100 @@ -69,6 +69,9 @@ use XML::Handler::YAWriter; use Text::Iconv; +# Date parsing +use Date::Parse; + #use XML::Handler::XMLWriter; #use XML::Grove::AsString; #use XML::Handler::Composer; @@ -130,6 +133,9 @@ # static-files directory. # The name should be unique for the entire album. + dateString => "%c", # Specify the format of date strings; this + # accepts all formats supported by date(1). + excludeBackgroundImage => 1, # If set to 1, the image with the name given # in backgroundImage will be excluded from # the current directory. @@ -404,12 +410,12 @@ $defaultConfig{fileActiveSizeNames} = [EMAIL PROTECTED]; # Fields to display (in the list order) under the picture. These -# fields are defined in the %fields hash below. +# fields are defined in the getFields function below. my @mainFields = ("description", "people", "location", "date", "event"); -# Fields to display (in the list order) in the details page. These -# fields are defined in the %fields hash below. +# Fields to display (in the list order) in the details page. These +# fields are in the getFields function below. my @secondaryFields = ( # DigiCam _("BINS-SECTION DigiCam Info"), @@ -472,7 +478,7 @@ "BINS-SECTION end", # close the last section ); -my %fields = +sub getFields { # The key is the string used as the name in the picture # description file. # Name corresponds to the string displayed under the picture. @@ -481,7 +487,9 @@ # The value of the EXIF structure is only used if no value # is present in the picture description file. # Transform is a Perl operator used to convert an exif value - # to the desired format to display. + # to the desired format to display. It is evaluated as + # normal Perl code and the result has to be in $_. + my %fields = ( "title" => { Name => _("Title"), @@ -498,12 +506,13 @@ "date" => { Name => _("Date"), EXIF => "DateTimeOriginal", - Transform => 's%^(\d+):(\d+):(\d+) (.*)$%$3/$2/$1 $4%', # french date - }, + Transform => '$_ = strftime $configHash->{dateString}, gmtime str2time "$_"', + # Alternatively, you could use regex substitution: # English version is yyyy:mm:dd hh:mm:ss to yyyy/mm/dd hh:mm:ss : - # "s%^(\\d+):(\\d+):(\\d+) (.*)$%\$1/\$2/\$3 \$4%", + # Transform => 's%^(\\d+):(\\d+):(\\d+) (.*)$%\$1/\$2/\$3 \$4%', # French version is yyyy:mm:dd hh:mm:ss to dd/mm/yyyy hh:mm:ss : - # 's%^(\d+):(\d+):(\d+) (.*)$%$3/$2/$1 $4%', + # Transform => 's%^(\d+):(\d+):(\d+) (.*)$%$3/$2/$1 $4%', + }, "event" => { Name => _("Event"), @@ -777,7 +786,9 @@ EXIF => "", #Tip => _(""), }, -); + ); + return \%fields; +} my @priorityExifTags = (); # the field in this list are taken from # the desc file, even if they are present @@ -801,8 +812,10 @@ }); $defaultConfig{colorsSubs} = \%colorsSubs; -# Strings to translate in the HTML template pages (if I18N is used) -my %intlSubs = ( STRING_THUMBNAILS => _("thumbnails"), +sub getIntlSubs{ + my $configHash = shift; + # Strings to translate in the HTML template pages (if I18N is used) + my %intlSubs = ( STRING_THUMBNAILS => _("thumbnails"), STRING_IMAGELIST => _("Image List"), STRING_HOME => _("Home"), STRING_UP => _("Up one album"), @@ -822,10 +835,13 @@ BINS_VERSION => "1.1.27", ENCODING => $defaultConfig{htmlEncoding}, GENERATED_DATE => _("on "). - local2html(strftime("%c", localtime)), + local2html(strftime($configHash->{dateString}, + localtime)), BINS_ID => '<!--$Id: bins,v 1.162 2004/10/24 18:04:07 jerome Exp $-->', ); + return \%intlSubs; +} # @knownImageExtentions defines file extensions that BINS can handle as # input image. BINS _should_ handle all input format of ImageMagick @@ -880,6 +896,8 @@ sub trimWhiteSpace; sub stringToBool; sub ignoreSet; +sub getFields; +sub getIntlSubs; sub generateThumbnailPages; sub generateThumbEntry; @@ -1314,6 +1332,7 @@ $subsHash{HOME_LINK} = $configHash->{homeURL}; $subsHash{ALBUM_THUMB} = $configHash->{treePreview}; $subsHash{PATH_SHOW_ICON} = $configHash->{pathShowIcon}; + $subsHash{DATE} = strftime($configHash->{dateString}, localtime); renderTemplate("tree", $albumdir."tree.html", \%subsHash, $configHash); @@ -2026,7 +2045,7 @@ my $atLeastOneField = 0; my $tagValue; - $tablesubs{DESC_TABLE} = getDescTable(%imageInfo); + $tablesubs{DESC_TABLE} = getDescTable(\%imageInfo, $configHash); if ($configHash->{defaultSize} >= 0){ $tablesubs{THUMB_DEFAULT_SIZE} = @@ -2059,6 +2078,7 @@ $finalsubs{HOME_LINK} = $configHash->{homeURL}; $finalsubs{FEEDBACK_LINK} = $configHash->{feedbackMail}; $finalsubs{PATH_SHOW_ICON} = $configHash->{pathShowIcon}; + $finalsubs{DATE} = strftime($configHash->{dateString}, localtime); renderTemplate("imagelist", $albumdir.$album."imagelist.html", \%finalsubs, $configHash); @@ -2263,6 +2283,7 @@ $templateParameters{HOME_LINK} = $configHash->{homeURL}; $templateParameters{FEEDBACK_LINK} = $configHash->{feedbackMail}; $templateParameters{PATH_SHOW_ICON} = $configHash->{pathShowIcon}; + $templateParameters{DATE} = strftime($configHash->{dateString}, localtime); renderTemplate("subalbum", $albumdir.$album."index.html", \%templateParameters, $configHash); @@ -2563,6 +2584,7 @@ $subsHash{HOME_LINK} = $configHash->{homeURL}; $subsHash{FEEDBACK_LINK} = $configHash->{feedbackMail}; $subsHash{PATH_SHOW_ICON} = $configHash->{pathShowIcon}; + $subsHash{DATE} = strftime($configHash->{dateString}, localtime); if ($albumHashRef->{numSubAlbums} == 0){ $subsHash{FIRST_PAGE} = "index.html"; }else{ @@ -2658,7 +2680,7 @@ $sectionTitle = $tagName; $sectionTitle =~ s/^BINS-SECTION //; }else{ - $tagValue = $fields{$tagName}; + $tagValue = getFields($configHash)->{$tagName}; if ($imageInfo->{$tagName}) { my %row = (FIELD_NAME => $tagValue->{'Name'}, FIELD_VALUE => local2html($imageInfo->{$tagName}) @@ -2701,10 +2723,11 @@ $subs_hash{HOME_LINK} = $configHash->{homeURL}; $subs_hash{FEEDBACK_LINK} = $configHash->{feedbackMail}; $subs_hash{PATH_SHOW_ICON} = $configHash->{pathShowIcon}; + $subs_hash{DATE} = strftime($configHash->{dateString}, localtime); $subs_hash{CUSTOM_CSS} = $configHash->{customStyleSheet}; my @array; - push @array, {NAV_NAME => $intlSubs{STRING_BACKTOTHEIMAGE}, + push @array, {NAV_NAME => getIntlSubs($configHash)->{STRING_BACKTOTHEIMAGE}, NAV_LINK => "javascript:history.back();", NAV_ICON => "back.png", NAV_ID => "back"}; @@ -3281,7 +3304,7 @@ $subs_hash{ALBUM_PATH_LINKS} = pathLinks($album, $title, @{$albumHashRef->{parentDirNames}}); $subs_hash{TITLE} = $title; - $subs_hash{DESC_TABLE} = getDescTable(%{$imageHashRef}); + $subs_hash{DESC_TABLE} = getDescTable(\%{$imageHashRef}, $configHash); $subs_hash{DETAILS_LINK} = $imageHashRef->{detailsLink}; $subs_hash{STRING_DETAILS} = _("Additional information on the picture"); @@ -3295,6 +3318,7 @@ getRootDir($album)."static.".$configHash->{templateStyle}; $subs_hash{HOME_LINK} = $configHash->{homeURL}; $subs_hash{FEEDBACK_LINK} = $configHash->{feedbackMail}; + $subs_hash{DATE} = strftime($configHash->{dateString}, localtime); if ($configHash->{backgroundImage}) { # Do not set this if not configured, so that template # can check for whether defined. @@ -3336,14 +3360,14 @@ } sub getDescTable{ - my (%hash) = @_; + my ($hashref, $configHash) = @_; my @descTable; foreach my $tagName (@mainFields) { - if ($hash{$tagName}) { - my $value=$hash{$tagName}; + if (${%$hashref}{$tagName}) { + my $value=${%$hashref}{$tagName}; $value =~ s/'/'/g ; # in case it's used in javascript code - push @descTable, {DESC_FIELD_NAME => $fields{$tagName}->{'Name'}, + push @descTable, {DESC_FIELD_NAME => getFields($configHash)->{$tagName}->{'Name'}, DESC_FIELD_VALUE => $value, }; } @@ -3474,7 +3498,7 @@ %{$templateParameters} = (%{$templateParameters}, %{$configHash->{colorsSubs}{$configHash->{colorStyle}}}, - %intlSubs, + %{getIntlSubs($configHash)}, ); # open the html template @@ -3581,7 +3605,7 @@ if (-e $descFile) { beVerboseN(" Reading desc file $descFile.", 3); $document = getXMLAsGrove($descFile); - %descHash = getDescXML($document); + %descHash = getDescXML($document, $configHash); #$descHash{descFileName} = uri_escape($descFile, '^-A-Za-z0-9/_\.'); $configHash = getConfigXML($document, '/image/bins', $configHash); %exifHash = getExifXML($document, [EMAIL PROTECTED]); @@ -3606,7 +3630,7 @@ # Given an XML doc as a Grove, returns # fields from that images description file. sub getDescXML{ - my $document = shift(@_); + my ($document, $configHash) = @_; my $fieldName; my $fieldValue; my %descHash; @@ -3619,7 +3643,7 @@ && $element->{Name} eq "field") { $fieldName = $element->{Attributes}{'name'}; $fieldValue = ""; - if (grep (/^$fieldName$/, keys(%fields))) { + if (grep (/^$fieldName$/, keys(%{getFields($configHash)}))) { beVerbose(" Reading field '$fieldName':", 3); foreach my $characters (@{$element->{Contents}}) { #if (UNIVERSAL::isa($characters, 'XML::Grove::Characters')) { @@ -4045,19 +4069,26 @@ } # add value to desc Hash if field is void - foreach my $field (keys(%fields)) { - my $fieldExif = $fields{$field}->{'EXIF'}; + foreach my $field (keys(%{getFields($configHash)})) { + my $fieldExif = getFields($configHash)->{$field}->{'EXIF'}; if ((! $descHash->{$field}) && $fieldExif && $exifHash->{$fieldExif}) { beVerboseN(" Using '$field' from EXIF data: ". $exifHash->{$fieldExif}, 3); - $descHash->{$field} = $exifHash->{$fieldExif}; - if ($fields{$field}->{'Transform'}) { - beVerbose(" Evaluating ". - "$descHash->{$field} =~ ".$fields{$field}->{'Transform'}. - " to ", 4); - eval '$descHash->{$field} =~ '.$fields{$field}->{'Transform'}; - beVerboseN("'$descHash->{$field}'.", 4); + my $func = getFields($configHash)->{$field}->{'Transform'}; + if ($func) { + $_ = $exifHash->{$fieldExif}; + beVerbose(" Evaluating '$func' from '$_'", 4); + eval $func; + if ($@) { + beVerboseN("", 4); + print("Error: evaluation of transformation for $field failed.\n"); + exit 2; + } + $descHash->{$field} = $_; + beVerboseN(" to '$descHash->{$field}'.", 4); + } else { + $descHash->{$field} = $exifHash->{$fieldExif}; } } } diff -urN bins-1.1.27~/doc/bins.sgml bins-1.1.27/doc/bins.sgml --- bins-1.1.27~/doc/bins.sgml 2005-05-09 22:05:59.374114600 +0100 +++ bins-1.1.27/doc/bins.sgml 2005-05-09 23:54:20.467798136 +0100 @@ -430,6 +430,15 @@ </varlistentry> <varlistentry> + <term>dateString</term> + <listitem> + <para>Specify the format of date strings. This variable + accepts all formats supported by <command>date(1)</command>. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term>defaultSize</term> <listitem> <para>Size to use when user clicks directly on the -- Martin Michlmayr http://www.cyrius.com/ -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]