X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fblosxom-plugins.git;a=blobdiff_plain;f=general%2Fentries_cache;fp=general%2Fentries_cache;h=7c7160e1b56d30bad9c136842a4c2e826636e3cb;hp=0000000000000000000000000000000000000000;hb=6aa36d38cdb908ca471aba5b0759edadfd03206d;hpb=50a6bf7b20a02807adb4bdba2e57515b25abe9d5 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.