From: Gavin Carr Date: Tue, 18 Sep 2007 12:26:04 +0000 (+0000) Subject: Rename entriescache to entries_cache, since it's ambivalent about its name. X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fblosxom-plugins.git;a=commitdiff_plain;h=6aa36d38cdb908ca471aba5b0759edadfd03206d Rename entriescache to entries_cache, since it's ambivalent about its name. --- diff --git a/general/entries_cache b/general/entries_cache new file mode 100644 index 0000000..7c7160e --- /dev/null +++ b/general/entries_cache @@ -0,0 +1,520 @@ +# Blosxom Plugin: entries_cache -*- perl -*- +# Author(s): Fletcher T. Penney +# Modified by Steve Schwarz +# Version: 0.92 +# Based on entries_index by Rael Dornfest +# Documentation help contributed by Iain Cheyne + +package entries_cache; + +# --- Configurable variables ----- + +$delay = 0; # How many minutes delay before entries are re-indexed? + # Set to 0 to force reindexing everytime - this + # will provide the same behavior as Rael's + # entries_index. Though, I am not sure why one + # would do this. At least use a small cache time to + # improve performance.... + # SAS - I set this to zero so comments and new files + # are immediately visible. +$indexname = "$blosxom::plugin_state_dir/.entries_cache.index"; +$others_indexname = "$blosxom::plugin_state_dir/.entries_cache.others"; + + +$use_date_tags = 1; # Set to 1 to enable parsing meta- keywords + # for date tags + +$use_UK_dates = 0; # Default is mm/dd/yy (US) + # Set to 1 to use dd/mm/yy (UK) + +$update_meta_date = 0; # Add a meta_date tag if it doesn't exist + # This will require that perl has write access to your story files + # and that you are using the meta plugin. + + # NOTE: As of version 0.91, you do not NEED the meta plugin... + + # Be sure to save your text files with UNIX line endings + # (any decent text editor should be able to do this) or use the blok + # plugin (http://www.enilnomi.net/download.html#blok). + # There is some logic in entries_cache to fix this, but do not rely + # on it. + + # Lastly, make sure there is at least one blank line between the + # entry title and the body. Again, there is some logic in + # entries_cache to fix this, but do not rely on it. + + # The default meta-keywords are compatible with Eric Sherman's + # entries_index_tagged defaults: + + # http://primitiveworker.org/blo.g/development/blosxom/entries_index_tagged/ + +$meta_timestamp = "meta-creation_timestamp:" unless defined $meta_timestamp; + # timestamp_tag is the non-human readable date stamp format + # used by entries_index, entries_cache, entries_index_tagged, + # and blosxom + +$meta_date = "meta-creation_date:" unless defined $meta_date; + # date_tag is a human readable version + +$strip_meta_dates = 1; # Strip meta-tags from story so that + # they are not displayed. Unnecessary if you are running the + # meta plugin. + +$debug = 0; # Debugging flag + +# -------------------------------- + +use File::stat; +use File::Find; +use CGI qw/:standard/; +use Time::Local; + +my $time = time(); +my $reindex = 0; + +sub start { + # Force a reindex + $reindex = 1 if (CGI::param('reindex')); + return 1; +} + + +sub entries { + + return sub { + my(%files, %indexes, %others); + + # Read cached index + if ( open CACHE, $indexname) { + while ($line = ) { + # Improved backwards compatibility with entries_index + if ($line =~ /\s*'?(.*?)'?\s*=>\s*(\d*),?/) { + $files{$1} = $2; + } + } + close CACHE; + # See if it's time to reindex + $reindex = 1 if ( stat($indexname)->mtime lt ($time - $delay*60) ); + } else { + # No index found, so we need to index + $reindex = 1; + } + + # Read cached others index + if ( open CACHE, $others_indexname) { + while ($line = ) { + # Improved backwards compatibility with entries_index + if ($line =~ /\s*'?(.*)'?\s*=>\s*(.*),?/) { + $others{$1} = $2; + } + } + close CACHE; + # See if it's time to reindex + $reindex = 1 if ( stat($others_indexname)->mtime lt ($time - $delay*60) ); + } else { + # No index found, so we need to index + $reindex = 1; + } + + + # Perform reindexing if necessary + # This code was originally copied from entries_index by Rael Dornfest + # Check to see if previously indexed files exist, and then rescan + # the datadir for any new files, while preserving the old times + + # Static mode requires some of the code in this section, and the + # speed hit is unimportant for static blogs + + if ($blosxom::static_or_dynamic eq "static") { + $reindex = 1; + } + + + if ($reindex eq 1) { + + # If any files not available, err on side of caution and reindex + for my $file (keys %files) { -f $file or do { $reindex++; delete $files{$file} }; } + for my $other (keys %others) { -f $other or do { $reindex++; delete $others{$other} }; } + + + find( + sub { + my $d; + my $curr_depth = $File::Find::dir =~ tr[/][]; + + # if ( $blosxom::depth and $curr_depth > $blosxom::depth ) { + # # We are beyond depth, so remove files + # $files{$File::Find::name} and delete $files{$File::Find::name}; + # $others{$File::Find::name} and delete $others{$File::Find::name}; + # return; + #} + + # Adding support for %others + if ( + $File::Find::name =~ + m!^$blosxom::datadir/(?:(.*)/)?(.+)\.$blosxom::file_extension$! + and $2 ne 'index' and $2 !~ /^\./ and (-r $File::Find::name) + ) { + # SAS modified so if meta-creation_date or file timestamp are in the future + # and we don't want future entries the file won't be included in the file list + # the index list + if (!$blosxom::show_future_entries and + ((extract_date($File::Find::name, $files{$File::Find::name}) > time) or + (stat($File::Find::name)->mtime > time))) { + $files{$File::Find::name} and delete $files{$File::Find::name}; + $others{$File::Find::name} and delete $others{$File::Find::name}; + } else { + ( $files{$File::Find::name} || ++$reindex ) + and ( $files{$File::Find::name} = + extract_date($File::Find::name,$files{$File::Find::name}) || + $files{$File::Find::name} || + stat($File::Find::name)->mtime ) + + # Static + and ( + param('-all') + or !-f "$blosxom::static_dir/$1/index." . $blosxom::static_flavours[0] +# or stat("$blosxom::static_dir/$1/index." . $blosxom::static_flavours[0])->mtime < stat($File::Find::name)->mtime +# Trying to fix for static mode +# Barijaona's note : you may uncomment the above instruction if you want to be able to fix typos in static rendering + or stat("$blosxom::static_dir/$1/index." . $blosxom::static_flavours[0])->mtime < $files{$File::Find::name} + ) + and $indexes{$1} = 1 + and $d = join('/', (blosxom::nice_date($files{$File::Find::name}))[5,2,3]) + and $indexes{$d} = $d + and $blosxom::static_entries and $indexes{ ($1 ? "$1/" : '') . "$2.$blosxom::file_extension" } = 1; + } + } else { + !-d $File::Find::name and -r $File::Find::name and $others{$File::Find::name} = stat($File::Find::name)->mtime + } + }, $blosxom::datadir + ); + + + if ( $reindex ) { + # The index was recreated, so we should record the new version + if ( open ENTRIES, "> $indexname" ) { + foreach (sort keys %files) { + print ENTRIES "$_=>$files{$_}\n"; + } + close ENTRIES; + } else { + warn "couldn't > $indexname: $!\n"; + } + + if ( open ENTRIES, "> $others_indexname" ) { + foreach (sort keys %others) { + print ENTRIES "$_=>$others{$_}\n"; + } + close ENTRIES; + } else { + warn "couldn't > $others_indexname: $!\n"; + } + } + } + return (\%files, \%indexes, \%others); + } +} + + +sub extract_date { + my ($file, $indexed_date) = @_; + my $new_story = ""; + my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); + + warn "Entries_Cache: Checking $file for meta-tag\n\tComparing to $indexed_date\n" if ($debug == 1); + + # This is an attempt for compatibility with Eric Sherman's entries_index_tagged + # But it does not handle as many date formats, as there are too many additional + # necessary modules that I am not willing to require + + if ( $use_date_tags != 0) { + + open (FILE, $file); + $line = ; # Read first line ( ie the title) + $new_story .= $line; + + # now, parse the story, and try to correct misformatted stories + while ($line = ) { + if ($line =~ /^$meta_timestamp\s*(\d+)/) { + # If present, this format is used + close File; + $result = $1; + warn "Entries_Cache: Found meta_timestamp $result for $file\n" if ($debug == 1); + return $result; + } + + if ($line =~ /^$meta_date\s*(.*)/) { + close File; + $result = $1; + warn "Entries_Cache: Found meta-date $result for $file\n" if ($debug == 1); + return parsedate($result); + } + + if ( $line !~ /^meta.*?:/i) { + # line doesn't start with meta... (ie story was not formatted + # for meta-tags), or the meta-tags are finished + + if ($update_meta_date eq 1) { + # Don't mess with stories unless using UNIX line endings. + + if (($line =~ /\r/) || ($new_story =~ /\r/)) { + warn "Entries_Cache: File $file has non-UNIX line endings; cannot update metatags...\n"; + close FILE; + return 0; + } + + warn "Entries_Cache: Updating meta-tag for $file\n" if ($debug == 1); + if ($indexed_date eq 0 || $indexed_date == "") { + $indexed_date = stat($file)->mtime; + warn "Entries_Cache: No date for $file, using $indexed_date\n" if ($debug == 1); + } + + ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($indexed_date); + $year += 1900; + $mon += 1; + $hour = sprintf("%02d",$hour); + $min = sprintf("%02d",$min); + $sec = sprintf("%02d",$sec); + + warn "Entries_Cache: Adding meta-tag to $file, using $meta_date $mday/$mon/$year $hour:$min:$sec\n" if ($debug == 1); + + if ($use_UK_dates eq 1) { + $new_story .= "$meta_date $mday/$mon/$year $hour:$min:$sec\n\n"; + } else { + $new_story .= "$meta_date $mon/$mday/$year $hour:$min:$sec\n\n"; + } + + if ( $line !~ /^\s*$/) { + # If this line wasn't empty, then add it to story + $new_story .= $line; + } + + while ($line = ) { + # read remainder of story + $new_story .= $line; + } + + close FILE; + open (FILE, "> $file") or warn "Unable to update date meta-tag on $file\n"; + print FILE $new_story; + close FILE; + return 0; + } else { + close FILE; + return 0; + } + } + + $new_story .= $line; + } + } + return 0; +} + +sub parsedate { + my ($datestring) = @_; + #warn "Parsing $datestring\n"; + + # Possible formatting + # Month can be 3 letter abbreviation or full name (in English) + # Time must be hh:mm or hh:mm:ss in 24 hour format + # Year must be yyyy + # The remaining 1 or 2 digits are treated as date + # ie: May 25 2003 18:40 + # order is not important as long as pieces are there + + # Convert the datestring to a time() format + + # Find "Shorthand" Date + if ( $datestring =~ /\d\d?\/\d\d?\/\d\d\d?\d?/) { + if ( $use_UK_dates eq 0) { + # Use US Formatting + $datestring =~ s/(\d\d?)\/(\d\d?)\/(\d\d\d?\d?)//; + $mon = $1 - 1; + $day = $2; + $year = $3; + } else { + # Use UK Formatting + $datestring =~ s/(\d\d?)\/(\d\d?)\/(\d\d\d?\d?)//; + $mon = $2 - 1; + $day = $1; + $year = $3; + } + + # Now, clean up year if 2 digit + # You may change the 70 to whatever cutoff you like + $year += 2000 if ($year < 70 ); + $year += 1900 if ($year < 100); + } + + # Find Month + $mon = 0 if ($datestring =~ s/(Jan|January)//i); + $mon = 1 if ($datestring =~ s/(Feb|February)//i); + $mon = 2 if ($datestring =~ s/(Mar|March)//i); + $mon = 3 if ($datestring =~ s/(Apr|April)//i); + $mon = 4 if ($datestring =~ s/(May)//i); + $mon = 5 if ($datestring =~ s/(Jun|June)//i); + $mon = 6 if ($datestring =~ s/(Jul|July)//i); + $mon = 7 if ($datestring =~ s/(Aug|August)//i); + $mon = 8 if ($datestring =~ s/(Sep|September)//i); + $mon = 9 if ($datestring =~ s/(Oct|October)//i); + $mon = 10 if ($datestring =~ s/(Nov|November)//i); + $mon = 11 if ($datestring =~ s/(Dec|December)//i); + + # Find Time + if ($datestring =~ s/(\d\d?):(\d\d)(:\d\d)?//) { + $hour = $1; + $min = $2; + $sec = $3; + } + + if ($datestring =~ s/(\d\d\d\d)//) { + $year = $1; + } + + if ($datestring =~ s/(\d\d?)//) { + $day = $1; + } + + return timelocal($sec,$min,$hour,$day,$mon,$year); + +} + +sub story { + return 1 if (! $strip_meta_dates); + # This code based on Rael's meta plugin + my($pkg, $path, $filename, $story_ref, $title_ref, $body_ref) = @_; + + # Strip date-based meta tags from body + $$body_ref =~ s/^$meta_timestamp.*//g; + $$body_ref =~ s/^$meta_date.*//g; + + + return 1; +} + +1; + +__END__ + +=head1 NAME + +Blosxom Plug-in: entries_cache + +=head1 SYNOPSIS + +Purpose: This plugin reserves original creation timestamp on weblog +entries, allowing for editing of entries without altering the original +creation time. It maintains an index ($blosxom::plugin_state_dir/ +.entries_cache.index) of filenames and their creation times. It also adds +new entries to the index the first time Blosxom come across them. In +addition, it is possible to rely on entries_cache inserting date-based meta +tags automatically into entries - this is enabled by the $use_date_tags +setting. This makes the entries more portable. Note that if this approach +is used, the meta plugin is required: http://www.blosxom.com/downloads/ +plugins/meta. (NOTE: As of version 0.91 you can use this without the meta +plugin.) + +Replaces the default $blosxom::entries subroutine + +The entries_cache plugin is a "souped-up" version of the entries_index +plugin. It maintains file modification times in the same manner as the +original plugin, but goes one-step further. It uses the modification time +of the index file to determine whether to rescan the datadir. If $delay +minutes have not passed, it relies on the cached information. + +You can force a manual scan by appending ?reindex=y to the end of your base +url. + +The reason for this change is that the original blosxom and the +entries_index plugin rescan the datadir each time a page is viewed. This +plugin allows you to cache the information to speed up processing times on +most page views. According to several posts on the blosxom mailing list, +this is one of the big processor hogs. With a $delay setting of 60 minutes, +there will only be one page view each hour that has to wait for the full +directory scan. To be honest, I have not noticed much of a speed boost +during my testing yet, but I imagine it would only appear for sites with a +large number of files to be indexed. + + +=head1 VERSION + +0.92 + +=head1 VERSION HISTORY +0.92 Checks if meta-creation_date is in the future and only displays + entry if $show_future_entries is set. Otherwise future articles + (by meta-creation_date or file modified time) are not displayed. + Don't think this breaks static rendering... haven't tested it. + +0.91 Improved documentation courtesy of Iain Cheyne - THANKS!!! + Now, if you are not running the meta plugin, you will not see any meta tags in your stories + +0.9 Added parser that detects stories that are not properly formatted for meta-tags and reformats them so that they are. + Additionally, it will not update files that have improper line endings ( ie non-UNIX endings). + +0.8 Fixed typo that caused index to be rebuilt every time... :) + +0.7 Major revisions - fixed the "Year 1900" bug and an issue with statically generated blogs misbehaving + +0.61 Fixed bug reading old styled cache files + +0.6 Added feature to automatically create meta-tags from indexed + time/date + +0.52 Fixed a bug where a new index might not be written + +0.51 Added dd/mm/yy(yy) and mm/dd/yy(yy) date formatting + +0.5 Complete rewrite - add support for %others, meta- tags, added backwards compatibility to using the .entries_index.index file from rael's plugin + +0.2 Removed reliance on Data::Dumper, making it suitable for use on Earthlink + +=head1 AUTHOR + +Fletcher T. Penney +Modified by Steve Schwarz +based on original code by: +Rael Dornfest , http://www.raelity.org/ + +This plugin is now maintained by the Blosxom Sourceforge Team, +. + +=head1 SEE ALSO + +Blosxom Home/Docs/Licensing: http://blosxom.sourceforge.net/ + +Blosxom Plugin Docs: http://blosxom.sourceforge.net/documentation/users/plugins.html + +=head1 BUGS + +None known; please send bug reports and feedback to the Blosxom +development mailing list . + +=head1 LICENSE + +entries_cache plugin +Copyright 2003, Fletcher Penney +except for portions copied from entries_index and entries_index_tagged + +Blosxom and original entries_index plugin +Copyright 2003, Rael Dornfest + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/general/entriescache b/general/entriescache deleted file mode 100644 index 3156c57..0000000 --- a/general/entriescache +++ /dev/null @@ -1,520 +0,0 @@ -# Blosxom Plugin: entries_cache -*- perl -*- -# Author(s): Fletcher T. Penney -# Modified by Steve Schwarz -# Version: 0.92 -# Based on entries_index by Rael Dornfest -# Documentation help contributed by Iain Cheyne - -package entriescache; - -# --- Configurable variables ----- - -$delay = 0; # How many minutes delay before entries are re-indexed? - # Set to 0 to force reindexing everytime - this - # will provide the same behavior as Rael's - # entries_index. Though, I am not sure why one - # would do this. At least use a small cache time to - # improve performance.... - # SAS - I set this to zero so comments and new files - # are immediately visible. -$indexname = "$blosxom::plugin_state_dir/.entries_cache.index"; -$others_indexname = "$blosxom::plugin_state_dir/.entries_cache.others"; - - -$use_date_tags = 1; # Set to 1 to enable parsing meta- keywords - # for date tags - -$use_UK_dates = 0; # Default is mm/dd/yy (US) - # Set to 1 to use dd/mm/yy (UK) - -$update_meta_date = 0; # Add a meta_date tag if it doesn't exist - # This will require that perl has write access to your story files - # and that you are using the meta plugin. - - # NOTE: As of version 0.91, you do not NEED the meta plugin... - - # Be sure to save your text files with UNIX line endings - # (any decent text editor should be able to do this) or use the blok - # plugin (http://www.enilnomi.net/download.html#blok). - # There is some logic in entries_cache to fix this, but do not rely - # on it. - - # Lastly, make sure there is at least one blank line between the - # entry title and the body. Again, there is some logic in - # entries_cache to fix this, but do not rely on it. - - # The default meta-keywords are compatible with Eric Sherman's - # entries_index_tagged defaults: - - # http://primitiveworker.org/blo.g/development/blosxom/entries_index_tagged/ - -$meta_timestamp = "meta-creation_timestamp:" unless defined $meta_timestamp; - # timestamp_tag is the non-human readable date stamp format - # used by entries_index, entries_cache, entries_index_tagged, - # and blosxom - -$meta_date = "meta-creation_date:" unless defined $meta_date; - # date_tag is a human readable version - -$strip_meta_dates = 1; # Strip meta-tags from story so that - # they are not displayed. Unnecessary if you are running the - # meta plugin. - -$debug = 0; # Debugging flag - -# -------------------------------- - -use File::stat; -use File::Find; -use CGI qw/:standard/; -use Time::Local; - -my $time = time(); -my $reindex = 0; - -sub start { - # Force a reindex - $reindex = 1 if (CGI::param('reindex')); - return 1; -} - - -sub entries { - - return sub { - my(%files, %indexes, %others); - - # Read cached index - if ( open CACHE, $indexname) { - while ($line = ) { - # Improved backwards compatibility with entries_index - if ($line =~ /\s*'?(.*?)'?\s*=>\s*(\d*),?/) { - $files{$1} = $2; - } - } - close CACHE; - # See if it's time to reindex - $reindex = 1 if ( stat($indexname)->mtime lt ($time - $delay*60) ); - } else { - # No index found, so we need to index - $reindex = 1; - } - - # Read cached others index - if ( open CACHE, $others_indexname) { - while ($line = ) { - # Improved backwards compatibility with entries_index - if ($line =~ /\s*'?(.*)'?\s*=>\s*(.*),?/) { - $others{$1} = $2; - } - } - close CACHE; - # See if it's time to reindex - $reindex = 1 if ( stat($others_indexname)->mtime lt ($time - $delay*60) ); - } else { - # No index found, so we need to index - $reindex = 1; - } - - - # Perform reindexing if necessary - # This code was originally copied from entries_index by Rael Dornfest - # Check to see if previously indexed files exist, and then rescan - # the datadir for any new files, while preserving the old times - - # Static mode requires some of the code in this section, and the - # speed hit is unimportant for static blogs - - if ($blosxom::static_or_dynamic eq "static") { - $reindex = 1; - } - - - if ($reindex eq 1) { - - # If any files not available, err on side of caution and reindex - for my $file (keys %files) { -f $file or do { $reindex++; delete $files{$file} }; } - for my $other (keys %others) { -f $other or do { $reindex++; delete $others{$other} }; } - - - find( - sub { - my $d; - my $curr_depth = $File::Find::dir =~ tr[/][]; - - # if ( $blosxom::depth and $curr_depth > $blosxom::depth ) { - # # We are beyond depth, so remove files - # $files{$File::Find::name} and delete $files{$File::Find::name}; - # $others{$File::Find::name} and delete $others{$File::Find::name}; - # return; - #} - - # Adding support for %others - if ( - $File::Find::name =~ - m!^$blosxom::datadir/(?:(.*)/)?(.+)\.$blosxom::file_extension$! - and $2 ne 'index' and $2 !~ /^\./ and (-r $File::Find::name) - ) { - # SAS modified so if meta-creation_date or file timestamp are in the future - # and we don't want future entries the file won't be included in the file list - # the index list - if (!$blosxom::show_future_entries and - ((extract_date($File::Find::name, $files{$File::Find::name}) > time) or - (stat($File::Find::name)->mtime > time))) { - $files{$File::Find::name} and delete $files{$File::Find::name}; - $others{$File::Find::name} and delete $others{$File::Find::name}; - } else { - ( $files{$File::Find::name} || ++$reindex ) - and ( $files{$File::Find::name} = - extract_date($File::Find::name,$files{$File::Find::name}) || - $files{$File::Find::name} || - stat($File::Find::name)->mtime ) - - # Static - and ( - param('-all') - or !-f "$blosxom::static_dir/$1/index." . $blosxom::static_flavours[0] -# or stat("$blosxom::static_dir/$1/index." . $blosxom::static_flavours[0])->mtime < stat($File::Find::name)->mtime -# Trying to fix for static mode -# Barijaona's note : you may uncomment the above instruction if you want to be able to fix typos in static rendering - or stat("$blosxom::static_dir/$1/index." . $blosxom::static_flavours[0])->mtime < $files{$File::Find::name} - ) - and $indexes{$1} = 1 - and $d = join('/', (blosxom::nice_date($files{$File::Find::name}))[5,2,3]) - and $indexes{$d} = $d - and $blosxom::static_entries and $indexes{ ($1 ? "$1/" : '') . "$2.$blosxom::file_extension" } = 1; - } - } else { - !-d $File::Find::name and -r $File::Find::name and $others{$File::Find::name} = stat($File::Find::name)->mtime - } - }, $blosxom::datadir - ); - - - if ( $reindex ) { - # The index was recreated, so we should record the new version - if ( open ENTRIES, "> $indexname" ) { - foreach (sort keys %files) { - print ENTRIES "$_=>$files{$_}\n"; - } - close ENTRIES; - } else { - warn "couldn't > $indexname: $!\n"; - } - - if ( open ENTRIES, "> $others_indexname" ) { - foreach (sort keys %others) { - print ENTRIES "$_=>$others{$_}\n"; - } - close ENTRIES; - } else { - warn "couldn't > $others_indexname: $!\n"; - } - } - } - return (\%files, \%indexes, \%others); - } -} - - -sub extract_date { - my ($file, $indexed_date) = @_; - my $new_story = ""; - my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); - - warn "Entries_Cache: Checking $file for meta-tag\n\tComparing to $indexed_date\n" if ($debug == 1); - - # This is an attempt for compatibility with Eric Sherman's entries_index_tagged - # But it does not handle as many date formats, as there are too many additional - # necessary modules that I am not willing to require - - if ( $use_date_tags != 0) { - - open (FILE, $file); - $line = ; # Read first line ( ie the title) - $new_story .= $line; - - # now, parse the story, and try to correct misformatted stories - while ($line = ) { - if ($line =~ /^$meta_timestamp\s*(\d+)/) { - # If present, this format is used - close File; - $result = $1; - warn "Entries_Cache: Found meta_timestamp $result for $file\n" if ($debug == 1); - return $result; - } - - if ($line =~ /^$meta_date\s*(.*)/) { - close File; - $result = $1; - warn "Entries_Cache: Found meta-date $result for $file\n" if ($debug == 1); - return parsedate($result); - } - - if ( $line !~ /^meta.*?:/i) { - # line doesn't start with meta... (ie story was not formatted - # for meta-tags), or the meta-tags are finished - - if ($update_meta_date eq 1) { - # Don't mess with stories unless using UNIX line endings. - - if (($line =~ /\r/) || ($new_story =~ /\r/)) { - warn "Entries_Cache: File $file has non-UNIX line endings; cannot update metatags...\n"; - close FILE; - return 0; - } - - warn "Entries_Cache: Updating meta-tag for $file\n" if ($debug == 1); - if ($indexed_date eq 0 || $indexed_date == "") { - $indexed_date = stat($file)->mtime; - warn "Entries_Cache: No date for $file, using $indexed_date\n" if ($debug == 1); - } - - ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($indexed_date); - $year += 1900; - $mon += 1; - $hour = sprintf("%02d",$hour); - $min = sprintf("%02d",$min); - $sec = sprintf("%02d",$sec); - - warn "Entries_Cache: Adding meta-tag to $file, using $meta_date $mday/$mon/$year $hour:$min:$sec\n" if ($debug == 1); - - if ($use_UK_dates eq 1) { - $new_story .= "$meta_date $mday/$mon/$year $hour:$min:$sec\n\n"; - } else { - $new_story .= "$meta_date $mon/$mday/$year $hour:$min:$sec\n\n"; - } - - if ( $line !~ /^\s*$/) { - # If this line wasn't empty, then add it to story - $new_story .= $line; - } - - while ($line = ) { - # read remainder of story - $new_story .= $line; - } - - close FILE; - open (FILE, "> $file") or warn "Unable to update date meta-tag on $file\n"; - print FILE $new_story; - close FILE; - return 0; - } else { - close FILE; - return 0; - } - } - - $new_story .= $line; - } - } - return 0; -} - -sub parsedate { - my ($datestring) = @_; - #warn "Parsing $datestring\n"; - - # Possible formatting - # Month can be 3 letter abbreviation or full name (in English) - # Time must be hh:mm or hh:mm:ss in 24 hour format - # Year must be yyyy - # The remaining 1 or 2 digits are treated as date - # ie: May 25 2003 18:40 - # order is not important as long as pieces are there - - # Convert the datestring to a time() format - - # Find "Shorthand" Date - if ( $datestring =~ /\d\d?\/\d\d?\/\d\d\d?\d?/) { - if ( $use_UK_dates eq 0) { - # Use US Formatting - $datestring =~ s/(\d\d?)\/(\d\d?)\/(\d\d\d?\d?)//; - $mon = $1 - 1; - $day = $2; - $year = $3; - } else { - # Use UK Formatting - $datestring =~ s/(\d\d?)\/(\d\d?)\/(\d\d\d?\d?)//; - $mon = $2 - 1; - $day = $1; - $year = $3; - } - - # Now, clean up year if 2 digit - # You may change the 70 to whatever cutoff you like - $year += 2000 if ($year < 70 ); - $year += 1900 if ($year < 100); - } - - # Find Month - $mon = 0 if ($datestring =~ s/(Jan|January)//i); - $mon = 1 if ($datestring =~ s/(Feb|February)//i); - $mon = 2 if ($datestring =~ s/(Mar|March)//i); - $mon = 3 if ($datestring =~ s/(Apr|April)//i); - $mon = 4 if ($datestring =~ s/(May)//i); - $mon = 5 if ($datestring =~ s/(Jun|June)//i); - $mon = 6 if ($datestring =~ s/(Jul|July)//i); - $mon = 7 if ($datestring =~ s/(Aug|August)//i); - $mon = 8 if ($datestring =~ s/(Sep|September)//i); - $mon = 9 if ($datestring =~ s/(Oct|October)//i); - $mon = 10 if ($datestring =~ s/(Nov|November)//i); - $mon = 11 if ($datestring =~ s/(Dec|December)//i); - - # Find Time - if ($datestring =~ s/(\d\d?):(\d\d)(:\d\d)?//) { - $hour = $1; - $min = $2; - $sec = $3; - } - - if ($datestring =~ s/(\d\d\d\d)//) { - $year = $1; - } - - if ($datestring =~ s/(\d\d?)//) { - $day = $1; - } - - return timelocal($sec,$min,$hour,$day,$mon,$year); - -} - -sub story { - return 1 if (! $strip_meta_dates); - # This code based on Rael's meta plugin - my($pkg, $path, $filename, $story_ref, $title_ref, $body_ref) = @_; - - # Strip date-based meta tags from body - $$body_ref =~ s/^$meta_timestamp.*//g; - $$body_ref =~ s/^$meta_date.*//g; - - - return 1; -} - -1; - -__END__ - -=head1 NAME - -Blosxom Plug-in: entries_cache - -=head1 SYNOPSIS - -Purpose: This plugin reserves original creation timestamp on weblog -entries, allowing for editing of entries without altering the original -creation time. It maintains an index ($blosxom::plugin_state_dir/ -.entries_cache.index) of filenames and their creation times. It also adds -new entries to the index the first time Blosxom come across them. In -addition, it is possible to rely on entries_cache inserting date-based meta -tags automatically into entries - this is enabled by the $use_date_tags -setting. This makes the entries more portable. Note that if this approach -is used, the meta plugin is required: http://www.blosxom.com/downloads/ -plugins/meta. (NOTE: As of version 0.91 you can use this without the meta -plugin.) - -Replaces the default $blosxom::entries subroutine - -The entries_cache plugin is a "souped-up" version of the entries_index -plugin. It maintains file modification times in the same manner as the -original plugin, but goes one-step further. It uses the modification time -of the index file to determine whether to rescan the datadir. If $delay -minutes have not passed, it relies on the cached information. - -You can force a manual scan by appending ?reindex=y to the end of your base -url. - -The reason for this change is that the original blosxom and the -entries_index plugin rescan the datadir each time a page is viewed. This -plugin allows you to cache the information to speed up processing times on -most page views. According to several posts on the blosxom mailing list, -this is one of the big processor hogs. With a $delay setting of 60 minutes, -there will only be one page view each hour that has to wait for the full -directory scan. To be honest, I have not noticed much of a speed boost -during my testing yet, but I imagine it would only appear for sites with a -large number of files to be indexed. - - -=head1 VERSION - -0.92 - -=head1 VERSION HISTORY -0.92 Checks if meta-creation_date is in the future and only displays - entry if $show_future_entries is set. Otherwise future articles - (by meta-creation_date or file modified time) are not displayed. - Don't think this breaks static rendering... haven't tested it. - -0.91 Improved documentation courtesy of Iain Cheyne - THANKS!!! - Now, if you are not running the meta plugin, you will not see any meta tags in your stories - -0.9 Added parser that detects stories that are not properly formatted for meta-tags and reformats them so that they are. - Additionally, it will not update files that have improper line endings ( ie non-UNIX endings). - -0.8 Fixed typo that caused index to be rebuilt every time... :) - -0.7 Major revisions - fixed the "Year 1900" bug and an issue with statically generated blogs misbehaving - -0.61 Fixed bug reading old styled cache files - -0.6 Added feature to automatically create meta-tags from indexed - time/date - -0.52 Fixed a bug where a new index might not be written - -0.51 Added dd/mm/yy(yy) and mm/dd/yy(yy) date formatting - -0.5 Complete rewrite - add support for %others, meta- tags, added backwards compatibility to using the .entries_index.index file from rael's plugin - -0.2 Removed reliance on Data::Dumper, making it suitable for use on Earthlink - -=head1 AUTHOR - -Fletcher T. Penney -Modified by Steve Schwarz -based on original code by: -Rael Dornfest , http://www.raelity.org/ - -This plugin is now maintained by the Blosxom Sourceforge Team, -. - -=head1 SEE ALSO - -Blosxom Home/Docs/Licensing: http://blosxom.sourceforge.net/ - -Blosxom Plugin Docs: http://blosxom.sourceforge.net/documentation/users/plugins.html - -=head1 BUGS - -None known; please send bug reports and feedback to the Blosxom -development mailing list . - -=head1 LICENSE - -entries_cache plugin -Copyright 2003, Fletcher Penney -except for portions copied from entries_index and entries_index_tagged - -Blosxom and original entries_index plugin -Copyright 2003, Rael Dornfest - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE.