* Implemented expiry options for aggregate plugin.

* Use precalculated backlinks info when determining if files need an update
  due to a page they link to being added/removed. Mostly significant if
  there are lots of pages.
* Remove duplicate link info when saving index. In some cases it could
  pile up rather badly. (Probably not the best way to deal with this
  problem.)
master
joey 2006-11-01 05:41:37 +00:00
parent 5a9064dea8
commit 5a82103526
5 changed files with 64 additions and 30 deletions

View File

@ -593,7 +593,8 @@ sub saveindex () { #{{{
"ctime=$pagectime{$page} ".
"src=$pagesources{$page}";
$line.=" dest=$_" foreach @{$renderedfiles{$page}};
$line.=" link=$_" foreach @{$links{$page}};
my %count;
$line.=" link=$_" foreach grep { ++$count{$_} == 1 } @{$links{$page}};
if (exists $depends{$page}) {
$line.=" depends=".encode_entities($depends{$page}, " \t\n");
}

View File

@ -34,6 +34,7 @@ sub checkconfig () { #{{{
if ($config{aggregate}) {
IkiWiki::loadindex();
aggregate();
expire();
savestate();
}
IkiWiki::unlockwiki();
@ -79,6 +80,7 @@ sub preprocess (@) { #{{{
$feed->{expireage}=defined $params{expireage} ? $params{expireage} : 0;
$feed->{expirecount}=defined $params{expirecount} ? $params{expirecount} : 0;
delete $feed->{remove};
delete $feed->{expired};
$feed->{lastupdate}=0 unless defined $feed->{lastupdate};
$feed->{numposts}=0 unless defined $feed->{numposts};
$feed->{newposts}=0 unless defined $feed->{newposts};
@ -164,6 +166,11 @@ sub savestate () { #{{{
}
next;
}
elsif ($data->{expired} && exists $data->{page}) {
unlink pagefile($data->{page});
delete $data->{page};
delete $data->{md5};
}
my @line;
foreach my $field (keys %$data) {
@ -183,6 +190,32 @@ sub savestate () { #{{{
close OUT;
} #}}}
sub expire () { #{{{
foreach my $feed (values %feeds) {
next unless $feed->{expireage} || $feed->{expirecount};
my $count=0;
foreach my $item (sort { $IkiWiki::pagectime{$b->{page}} <=> $IkiWiki::pagectime{$a->{page}} }
grep { exists $_->{page} && $_->{feed} eq $feed->{name} && $IkiWiki::pagectime{$_->{page}} }
values %guids) {
if ($feed->{expireage}) {
my $days_old = (time - $IkiWiki::pagectime{$item->{page}}) / 60 / 60 / 24;
if ($days_old > $feed->{expireage}) {
debug("expiring ".$item->{page}." ($days_old days old)");
$item->{expired}=1;
}
}
elsif ($feed->{expirecount} &&
$count >= $feed->{expirecount}) {
debug("expiring ".$item->{page});
$item->{expired}=1;
}
else {
$count++;
}
}
}
} #}}}
sub aggregate () { #{{{
eval q{use XML::Feed};
die $@ if $@;
@ -237,8 +270,6 @@ sub aggregate () { #{{{
displaytime($feed->{lastupdate});
$feed->{error}=0;
}
# TODO: expiry
} #}}}
sub add_page (@) { #{{{

View File

@ -11,6 +11,7 @@ my %backlinks;
my $backlinks_calculated=0;
sub calculate_backlinks () { #{{{
return if $backlinks_calculated;
%backlinks=();
foreach my $page (keys %links) {
foreach my $link (@{$links{$page}}) {
@ -26,7 +27,7 @@ sub calculate_backlinks () { #{{{
sub backlinks ($) { #{{{
my $page=shift;
calculate_backlinks() unless $backlinks_calculated;
calculate_backlinks();
my @links;
return unless $backlinks{$page};
@ -303,6 +304,7 @@ sub refresh () { #{{{
scan($file);
}
}
calculate_backlinks();
# render changed and new pages
foreach my $file (@changed) {
@ -311,22 +313,16 @@ sub refresh () { #{{{
$rendered{$file}=1;
}
# if any files were added or removed, check to see if each page
# needs an update due to linking to them or inlining them
# rebuild pages that link to added or removed pages
if (@add || @del) {
FILE: foreach my $file (@files) {
next if $rendered{$file};
my $page=pagename($file);
foreach my $f (@add, @del) {
my $p=pagename($f);
foreach my $link (@{$links{$page}}) {
if (bestlink($page, $link) eq $p) {
debug("rendering $file, which links to $p");
render($file);
$rendered{$file}=1;
next FILE;
}
}
foreach my $f (@add, @del) {
my $p=pagename($f);
foreach my $page (keys %{$backlinks{$p}}) {
my $file=$pagesources{$page};
next if $rendered{$file};
debug("rendering $file, which links to $p");
render($file);
$rendered{$file}=1;
}
}
}

9
debian/changelog vendored
View File

@ -23,8 +23,15 @@ ikiwiki (1.32) UNRELEASED; urgency=low
* Improve login/register process, the login dialog has only name and
password fields, which allows more web browsers to regognise it as a login
field, and is less confusing.
* Implemented expiry options for aggregate plugin.
* Use precalculated backlinks info when determining if files need an update
due to a page they link to being added/removed. Mostly significant if
there are lots of pages.
* Remove duplicate link info when saving index. In some cases it could
pile up rather badly. (Probably not the best way to deal with this
problem.)
-- Joey Hess <joeyh@debian.org> Mon, 30 Oct 2006 18:26:55 -0500
-- Joey Hess <joeyh@debian.org> Wed, 1 Nov 2006 00:00:10 -0500
ikiwiki (1.31) unstable; urgency=low

View File

@ -1,8 +1,8 @@
[[template id=plugin name=aggregate included=1 author="[[Joey]]"]]
[[tag type/useful]]
This plugin allows content from other blogs to be aggregated into the wiki.
Aggregate a blog as follows:
This plugin allows content from other feeds to be aggregated into the wiki.
Aggregate a feed as follows
\[[aggregate name="example blog"
feedurl="http://example.com/index.rss"
@ -35,7 +35,7 @@ directive:
* `name` - A name for the feed. Each feed must have a unique name.
Required.
* `url` - The url to the web page for the blog that's being aggregated.
* `url` - The url to the web page for the feed that's being aggregated.
Required.
* `dir` - The directory in the wiki where pages should be saved. Optional,
if not specified, the directory is based on the name of the feed.
@ -43,14 +43,13 @@ directive:
will look for feeds on the `url`. RSS and atom feeds are supported.
* `updateinterval` - How often to check for new posts, in minutes. Default
is 15 minutes.
* `expireage` - Expire old items from this blog if they are older than
a specified number of days. Default is to never expire on age. (Not yet
implemented.)
* `expirecount` - Expire old items from this blog if there are more than
* `expireage` - Expire old items from this feed if they are older than
a specified number of days. Default is to never expire on age.
* `expirecount` - Expire old items from this feed if there are more than
the specified number total. Oldest items will be expired first. Default
is to never expire on count. (Not yet implemented.)
* `tag` - A tag to tag each post from the blog with. A good tag to use is
the name of the blog. Can be repeated multiple times. The [[tag]] plugin
is to never expire on count.
* `tag` - A tag to tag each post from the feed with. A good tag to use is
the name of the feed. Can be repeated multiple times. The [[tag]] plugin
must be enabled for this to work.
Note that even if you are using subversion or another revision control