root/lang/perl/blosxom/plugins/lastmod_cache @ 32802

Revision 32802, 4.1 kB (checked in by nyarla, 6 years ago)

lsatmod_cacheが正常に動作していなかったのを今更ながら修正(妙なコードが混入してた)

Line 
1# Blosxom Plugin:   datesection
2# Author:           Naoki Okamura (Nyarla) <thotep@nyarla.net>
3# Version:          2008-11-07
4# License:          public domain
5
6package lastmod_cache;
7
8use strict;
9use warnings;
10
11use CGI ();
12use File::Find;
13use File::stat;
14use HTTP::Date;
15use FileHandle;
16
17# -- configurable variables ---------- #
18my @check_dirs  = (
19    $blosxom::plugin_dir,
20    $blosxom::plugin_state_dir,
21);
22
23my @check_files = ();
24
25my $cache_dir   = "$blosxom::plugin_state_dir/../cache";
26
27# -- package variables --------------- #
28
29my $cgi = CGI->new;
30my $fh  = FileHandle->new;
31
32our ( $mtime );
33
34my $count = 0;
35
36# ------------------------------------ #
37
38sub start {
39    return 0 if ( $blosxom::static_or_dynamic ne 'dynamic' );
40    return 0 if ( $cgi->param );
41    return 0 if ( $cgi->request_method ne 'GET' );
42
43    return 1;
44}
45
46sub filter {
47    my ( $class, $files, $others ) = @_;
48
49    my %files;
50    for my $source ( $files, $others ) {
51        for my $path ( keys %{ $source } ) {
52            my $stat = stat($path);
53            $files{$path} = $stat->mtime if ( $stat );
54        }
55    }
56    my %others  = find_files();
57
58    # filter by date
59    if ( $blosxom::path_info_yr ) {
60        for my $path ( keys %{ $files } ) {
61            my ( $year, $month, $day )
62                = (blosxom::nice_date( $files->{$path} ))[5,2,3];
63
64            if ( $blosxom::path_info_yr && $blosxom::path_info_yr != $year  ) {
65                delete $files{$path};
66                next;
67            }
68
69            if ( $blosxom::path_info_mo_num && $blosxom::path_info_mo_num != $month ) {
70                delete $files{$path};
71                next;
72            }
73
74            if ( $blosxom::path_info_da && $blosxom::path_info_da != $day ) {
75                delete $files{$path};
76                next;
77            }
78
79        }
80    }
81
82    # filter by path
83    if ( $blosxom::path_info ) {
84        my $path = "$blosxom::datadir/$blosxom::path_info";
85           $path =~ s{\.$blosxom::flavour$}{.$blosxom::file_extension};
86        for my $file ( keys %files ) {
87            if ( $file !~ m{^$path} ) {
88                delete $files{$file};
89            }
90        }
91    }
92
93    # filter by $blosxom::num_entries
94    if ( ! $blosxom::path_info_yr ) {
95        my @files   = sort { $files{$b} <=> $files{$a} } keys %files;
96        my @target  = splice @files, $blosxom::num_entries;
97        delete $files{$_} for @target;
98    }
99
100    # get latest file
101    $mtime = 0;
102    for my $source ( \%files, \%others ) {
103        for my $path ( keys %{ $source } ) {
104            my $lastmod = $source->{$path};
105            $mtime = $lastmod if ( $lastmod > $mtime );
106        }
107    }
108}
109
110sub skip {
111    $blosxom::header->{'-Last_modified'} = time2str($mtime);
112
113    if ( my $since = $ENV{'HTTP_IF_MODIFIED_SINCE'} ) {
114        $since =~ s{;.*$}{};
115        if ( $mtime <= str2time($since) ) {
116            $blosxom::header->{'-status'} = '304 Not Modified';
117            return 1;
118        }
119    }
120
121    my $cache = get_cache_path();
122    if ( ( -e $cache && -r _ ) && ( stat($cache)->mtime > $mtime ) && $fh->open( $cache, '<' ) ) {
123        $blosxom::output = do { local $/; <$fh> };
124        return 1;
125    }
126
127    return;
128}
129
130sub story { $count++ }
131
132sub last {
133    return if ( $count <= 0 );
134
135    my $cache = get_cache_path();
136
137    if ( $fh->open( $cache, '>' ) ) {
138        print $fh $blosxom::output;
139        $fh->close;
140    }
141
142    return 1;
143}
144
145sub find_files {
146    my %files = ();
147    find(
148        sub {
149            return if ( -d $File::Find::name );
150            my $name        = $File::Find::name;
151            my $mtime       = stat($name)->mtime;
152            $files{$name}   = $mtime;
153        },
154        @check_dirs,
155    );
156
157    for my $file ( @check_files ) {
158        my $stat = stat($file);
159        $files{$file} = $stat->mtime if ( $stat );
160    }
161
162    return %files;
163}
164
165sub get_cache_path {
166    my $key   = $cgi->path_info || 'index';
167       $key   =~ s{^/*|/*$}{}g;
168       $key   =~ s{/}{-}g;
169
170    my $path = "$cache_dir/${blosxom::flavour}_$key.cache";
171
172    return $path;
173}
174
1751;
Note: See TracBrowser for help on using the browser.