proof of concept implementation of static recentchanges

Currently hardcoded to write to recentchanges/*, and the page format needs
to be rethought to be usable for aggregation, but it basically works.
master
Joey Hess 2008-01-28 23:56:26 -05:00
parent 2d3dc86d07
commit 5921b86fcc
7 changed files with 145 additions and 84 deletions

View File

@ -0,0 +1,92 @@
#!/usr/bin/perl
package IkiWiki::Plugin::recentchanges;
use warnings;
use strict;
use IkiWiki 2.00;
sub import { #{{{
hook(type => "checkconfig", id => "recentchanges",
call => \&checkconfig);
hook(type => "needsbuild", id => "recentchanges",
call => \&needsbuild);
hook(type => "preprocess", id => "recentchanges",
call => \&preprocess);
hook(type => "htmlize", id => "_change",
call => \&htmlize);
} #}}}
sub checkconfig () { #{{{
updatechanges();
} #}}}
sub needsbuild () { #{{{
# TODO
} #}}}
sub preprocess (@) { #{{{
my %params=@_;
# TODO
return "";
} #}}}
# Pages with extension _change have plain html markup, pass through.
sub htmlize (@) { #{{{
my %params=@_;
return $params{content};
} #}}}
sub store ($$) { #{{{
my $change=shift;
my $subdir=shift;
my $page="$subdir/change_".IkiWiki::titlepage($change->{rev});
# Optimisation to avoid re-writing pages. Assumes commits never
# change, or that any changes are not important.
return if exists $pagesources{$page} && ! $config{rebuild};
# Limit pages to first 10, and add links to the changed pages.
my $is_excess = exists $change->{pages}[10];
delete @{$change->{pages}}[10 .. @{$change->{pages}}] if $is_excess;
$change->{pages} = [
map {
if (length $config{url}) {
$_->{link} = "<a href=\"$config{url}/".
urlto($_->{page},"")."\">".
IkiWiki::pagetitle($_->{page})."</a>";
}
else {
$_->{link} = IkiWiki::pagetitle($_->{page});
}
$_;
} @{$change->{pages}}
];
push @{$change->{pages}}, { link => '...' } if $is_excess;
# Fill out a template with the change info.
$change->{user} = IkiWiki::userlink($change->{user});
my $ctime=$change->{when};
$change->{when} = IkiWiki::displaytime($change->{when}, "%X %x");
my $template=template("change.tmpl", blind_cache => 1);
$template->param(%$change);
$template->param(baseurl => "$config{url}/") if length $config{url};
IkiWiki::run_hooks(pagetemplate => sub {
shift->(page => $page, destpage => $page, template => $template);
});
writefile($page."._change", $config{srcdir}, $template->output);
utime $ctime, $ctime, "$config{srcdir}/$page._change";
} #}}}
sub updatechanges () { #{{{
my @changelog=IkiWiki::rcs_recentchanges(100);
foreach my $change (@changelog) {
store($change, "recentchanges");
}
# TODO: delete old
} #}}}
1

View File

@ -0,0 +1,14 @@
[[template id=plugin name=recentchanges core=1 author="[[Joey]]"]]
This plugin examines the [[revision_control_system|rcs]] history and
generates a page describing each recent change made to the wiki. These
pages can be joined together with [[inline]] to generate the
[[RecentChanges]] page.
Typically only the RecentChanges page will use the plugin, but you can
use it elsewhere too if you like. It's used like this:
\[[recentchanges pages="*" num=100 template=change]]
The pages describing recent changes will be created as [[subpages|subpage]]
of the page where the `recentchanges` directive is placed.

View File

@ -1,3 +1,3 @@
ikiwiki generates the list of recent changes by examining the history of [[recentchanges pages="*" num=100 template=change]]
the [[revision_control_system|rcs]] that the wiki is configured to use. You [[inline pages="recentchanges/change_* and !*/Discussion"
have to have [[CGI]] set up for this feature to be enabled. template=recentchanges show=0]]

View File

@ -107,11 +107,8 @@ Here's a full design for redoing recentchanges, based on Ethan's ideas:
aggregator, or they can set up their own page that uses the recentchanges aggregator, or they can set up their own page that uses the recentchanges
directive for only the pages they want. directive for only the pages they want.
* The `rcs_notify` functions will be removed. * The `rcs_notify` functions will be removed.
* `rcs_getchange` is passed a change id (as returned from rcs_recentchanges) * To add diffs, another plugin can add a pagetemplate hook that calls
and a partially filled out HTML::Template and fills out the remainer of the a `rcs_diff`. (optional)
template. So if a template is used that includes diffs, it will need to run
some expensive diffing operation, wikis with less resources can use a
template that doesn't include diffs and avoid that overhead.
* So to update the changes files, just call `rcs_recentchanges`, create * So to update the changes files, just call `rcs_recentchanges`, create
files for each new id, and delete files for each id that is no longer files for each new id, and delete files for each id that is no longer
included. included.

View File

@ -10,11 +10,12 @@ located in /usr/share/ikiwiki/templates by default.
* `page.tmpl` - Used for displaying all regular wiki pages. * `page.tmpl` - Used for displaying all regular wiki pages.
* `misc.tmpl` - Generic template used for any page that doesn't * `misc.tmpl` - Generic template used for any page that doesn't
have a custom template. have a custom template.
* `recentchanges.tmpl` - Used for the RecentChanges page.
* `editpage.tmpl` - Create/edit page. * `editpage.tmpl` - Create/edit page.
* `notifymail.tmpl` - Not a html template, this is used to * `notifymail.tmpl` - Not a html template, this is used to
generate change notification mails for users who have subscribed to generate change notification mails for users who have subscribed to
changes to a page. changes to a page.
* `recentchanges.tmpl` - Used to generate a RecentChanges table with inline.
* `change.tmpl` - Used to create a page describing a change made to the wiki.
* `passwordmail.tmpl` - Not a html template, this is used to * `passwordmail.tmpl` - Not a html template, this is used to
generate the mail with the user's password in it. generate the mail with the user's password in it.
* `rsspage.tmpl` - Used for generating rss feeds for [blogs|[ikiwiki/blog]]. * `rsspage.tmpl` - Used for generating rss feeds for [blogs|[ikiwiki/blog]].

View File

@ -1,15 +1,27 @@
[[meta title=""" <!-- <TMPL_VAR NAME="REV"> -->
<TMPL_LOOP NAME="MESSAGE"><TMPL_IF NAME="LINE"><TMPL_VAR NAME="LINE" ESCAPE="HTML"><br /></TMPL_IF></TMPL_LOOP> <tr class="changeinfo">
"""]] <td class="changeinfo"><TMPL_VAR NAME="USER"></td>
[[meta author="<TMPL_VAR NAME="USER">"]] <td class="changetime"><TMPL_VAR NAME="WHEN"></td>
<TMPL_LOOP NAME="PAGES"> <td class="changeinfo">
<TMPL_IF NAME="DIFFURL"> <TMPL_LOOP NAME="PAGES">
<TMPL_IF NAME="BASEURL"> <TMPL_IF NAME="DIFFURL">
<a href="<TMPL_VAR NAME="DIFFURL">"> <a href="<TMPL_VAR NAME="DIFFURL">">
<img alt="diff" src="<TMPL_VAR BASEURL>wikiicons/diff.png" /> <img alt="diff" src="wikiicons/diff.png" />
</a> </a>
</TMPL_IF> <TMPL_VAR NAME="LINK">
</TMPL_IF> <TMPL_ELSE>
<TMPL_VAR NAME="LINK"> <TMPL_VAR NAME="LINK">
</TMPL_LOOP> </TMPL_IF>
<TMPL_VAR NAME="COMMITTYPE"> </TMPL_LOOP>
</td>
<td class="changeinfo"><TMPL_VAR NAME="COMMITTYPE"></td>
</tr>
<tr>
<td class="changelog" colspan="4">
<TMPL_LOOP NAME="MESSAGE">
<TMPL_IF NAME="LINE">
<TMPL_VAR NAME="LINE" ESCAPE="HTML"><br />
</TMPL_IF>
</TMPL_LOOP>
</td>
</tr>

View File

@ -1,26 +1,4 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <TMPL_IF FIRST>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<TMPL_VAR BASEURL>" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><TMPL_VAR TITLE></title>
<link rel="stylesheet" href="<TMPL_VAR BASEURL>style.css" type="text/css" />
<link rel="stylesheet" href="<TMPL_VAR BASEURL>local.css" type="text/css" />
<TMPL_IF NAME="FAVICON">
<link rel="icon" href="<TMPL_VAR BASEURL><TMPL_VAR FAVICON>" type="image/x-icon" />
</TMPL_IF>
</head>
<body>
<div class="header">
<span>
<TMPL_VAR INDEXLINK>/ <TMPL_VAR TITLE>
</span>
</div>
<div id="content">
<br />
<table border="1" frame="border" rules="groups"> <table border="1" frame="border" rules="groups">
<thead> <thead>
<tr class="changeheader"> <tr class="changeheader">
@ -30,42 +8,9 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<TMPL_LOOP NAME="CHANGELOG"> </TMPL_IF>
<!-- <TMPL_VAR NAME="REV"> --> <TMPL_VAR CONTENT>
<tr class="changeinfo"> <TMPL_IF LAST>
<td class="changeinfo"><TMPL_VAR NAME="USER"></td>
<td class="changetime"><TMPL_VAR NAME="WHEN"></td>
<td class="changeinfo">
<TMPL_LOOP NAME="PAGES">
<TMPL_IF NAME="DIFFURL">
<a href="<TMPL_VAR NAME="DIFFURL">">
<img alt="diff" src="wikiicons/diff.png" />
</a>
<TMPL_VAR NAME="LINK">
<TMPL_ELSE>
<TMPL_VAR NAME="LINK">
</TMPL_IF>
</TMPL_LOOP>
</td>
<td class="changeinfo"><TMPL_VAR NAME="COMMITTYPE"></td>
</tr>
<tr>
<td class="changelog" colspan="4">
<TMPL_LOOP NAME="MESSAGE">
<TMPL_IF NAME="LINE">
<TMPL_VAR NAME="LINE" ESCAPE="HTML"><br />
</TMPL_IF>
</TMPL_LOOP>
</td>
</tr>
</TMPL_LOOP>
</tbody> </tbody>
</table> </table>
</div> </TMPL_IF>
<div id="footer">
<!-- from <TMPL_VAR NAME=WIKINAME> -->
</div>
</body>
</html>