Now that it's working, it's will be put into the next version of UseModWiki. As it's a complex patch, you may just want to wait until then.
Fixed
To do
Good patch, but there is a little error, under the use strict
pragma,
yo have to send references to functions and not function name strings...
sub BrowsePage { ... if (($id eq $RCName) || (T($RCName) eq $id) || (T($id) eq $RCName)) { print $fullHtml; &DoRc(\&GetRcHtml);
Add $InterWikiMoniker, $SiteDescription, and $RssLogoUrl to use vars qw(), and then add the following two configurations lines somewhere:
$InterWikiMoniker = ''; # InterWiki prefix for this wiki. (for RSS) $SiteDescription = $SiteName; # Description of this wiki. (for RSS) $RssLogoUrl = <logo goes here> # URL to image to associate with your RSS feed
Then configure them in your config file.
sub GetDiffHTML { ... $diffType = &GetParam("defaultdiff", 1) if ($diffType == 4); if ($diffType == 1) { ... }
sub BrowsePage { ... if (($id eq $RCName) || (T($RCName) eq $id) || (T($id) eq $RCName)) { print $fullHtml; &DoRc('GetRcHtml'); print "<hr>\n" if (!&GetParam('embed', $EmbedWiki)); ... }
sub DoPost { ... &SavePage(); &WriteRcLog($id, $summary, $isEdit, $editTime, $Section{'revision'}, $user, $Section{'host'}); if ($UseCache) { ... }
sub GetOldPageParameters { my ($kind, $id, $revision) = @_; $id = &FreeToNormal($id) if $FreeLinks; return "action=$kind&id=$id&revision=$revision"; } sub GetOldPageLink { my ($kind, $id, $revision, $name) = @_; $name =~ s/_/ /g if $FreeLinks; return &ScriptLink(&GetOldPageParameters($kind, $id, $revision), $name); }
# Note: all diff and recent-list operations should be done within locks. sub WriteRcLog { my ($id, $summary, $isEdit, $editTime, $revision, $name, $rhost) = @_; my ($extraTemp, %extra); %extra = (); $extra{'id'} = $UserID if ($UserID > 0); $extra{'name'} = $name if ($name ne ""); $extra{'revision'} = $revision if ($revision ne ""); ... }
sub DoOtherRequest { ... } elsif ($action eq "version") { &DoShowVersion(); } elsif ($action eq "rss") { &DoRss(); } else { ... }
sub DoRc { my ($GetRC) = @_; my ($fileData, $rcline, $i, $daysago, $lastTs, $ts, $idOnly); my (@fullrc, $status, $oldFileData, $firstTs, $errorText); my $starttime = 0; my $showbar = 0; my $showHTML = $GetRC eq \&GetRcHtml; # Special (normative) case if (&GetParam("from", 0)) { $starttime = &GetParam("from", 0); if( $showHTML ) { print "<h2>" . Ts('Updates since %s', &TimeToText($starttime)) . "</h2>\n"; } } else { $daysago = &GetParam("days", 0); $daysago = &GetParam("rcdays", 0) if ($daysago == 0); if ($daysago) { $starttime = $Now - ((24*60*60)*$daysago); if( $showHTML ) { print "<h2>" . Ts('Updates in the last %s day' . (($daysago != 1)?"s":""), $daysago) . "</h2>\n"; } # Note: must have two translations (for "day" and "days") # Following comment line is for translation helper script # Ts('Updates in the last %s days', ''); } } if ($starttime == 0) { $starttime = $Now - ((24*60*60)*$RcDefault); if( $showHTML ) { print "<h2>" . Ts('Updates in the last %s day' . (($RcDefault != 1)?"s":""), $RcDefault) . "</h2>\n"; } # Translation of above line is identical to previous version } # Read rclog data (and oldrclog data if needed) ($status, $fileData) = &ReadFile($RcFile); $errorText = ""; if (!$status) { # Save error text if needed. $errorText = '<p><strong>' . Ts('Could not open %s log file', $RCName) . ":</strong> $RcFile<p>" . T('Error was') . ":\n<pre>$!</pre>\n" . '<p>' . T('Note: This error is normal if no changes have been made.') . "\n"; } @fullrc = split(/\n/, $fileData); $firstTs = 0; if (@fullrc > 0) { # Only false if no lines in file ($firstTs) = split(/$FS3/, $fullrc[0]); } if (($firstTs == 0) || ($starttime <= $firstTs)) { ($status, $oldFileData) = &ReadFile($RcOldFile); if ($status) { @fullrc = split(/\n/, $oldFileData . $fileData); } else { if ($errorText ne "") { # could not open either rclog file print $errorText; print "<p><strong>" . Ts('Could not open old %s log file', $RCName) . ":</strong> $RcOldFile<p>" . T('Error was') . ":\n<pre>$!</pre>\n"; return; } } } $lastTs = 0; if (@fullrc > 0) { # Only false if no lines in file ($lastTs) = split(/$FS3/, $fullrc[$#fullrc]); } $lastTs++ if (($Now - $lastTs) > 5); # Skip last unless very recent $idOnly = &GetParam("rcidonly", ""); if ($idOnly && $showHTML) { print '<b>(' . Ts('for %s only', &ScriptLink($idOnly, $idOnly)) . ')</b><br>'; } if( $showHTML ) { foreach $i (@RcDays) { print " | " if $showbar; $showbar = 1; print &ScriptLink("action=rc&days=$i", Ts('%s day' . (($i != 1)?'s':''), $i)); # Note: must have two translations (for "day" and "days") # Following comment line is for translation helper script # Ts('%s days', ''); } print "<br>" . &ScriptLink("action=rc&from=$lastTs", T('List new changes starting from')); print " " . &TimeToText($lastTs) . "<br>\n"; } # Later consider a binary search? $i = 0; while ($i < @fullrc) { # Optimization: skip old entries quickly ($ts) = split(/$FS3/, $fullrc[$i]); if ($ts >= $starttime) { $i -= 1000 if ($i > 0); last; } $i += 1000; } $i -= 1000 if (($i > 0) && ($i >= @fullrc)); for (; $i < @fullrc ; $i++) { ($ts) = split(/$FS3/, $fullrc[$i]); last if ($ts >= $starttime); } if ($i == @fullrc && $showHTML) { print '<br><strong>' . Ts('No updates since %s', &TimeToText($starttime)) . "</strong><br>\n"; } else { splice(@fullrc, 0, $i); # Remove items before index $i # Later consider an end-time limit (items older than X) print &$GetRC(@fullrc); } print '<p>' . Ts('Page generated %s', &TimeToText($Now)), "<br>\n" if $showHTML; } sub GetRc { my $printDailyTear = shift; my $printRCLine = shift; my @outrc = @_; my ($rcline, $date, $newtop, $author); my ($showedit, $link, $all, $idOnly); my ($ts, $pagename, $summary, $isEdit, $host, $kind, $extraTemp); my %extra = (); my %changetime = (); my %pagecount = (); # Slice minor edits $showedit = &GetParam("rcshowedit", $ShowEdits); $showedit = &GetParam("showedit", $showedit); if ($showedit != 1) { my @temprc = (); foreach $rcline (@outrc) { ($ts, $pagename, $summary, $isEdit, $host) = split(/$FS3/, $rcline); if ($showedit == 0) { # 0 = No edits push(@temprc, $rcline) if (!$isEdit); } else { # 2 = Only edits push(@temprc, $rcline) if ($isEdit); } } @outrc = @temprc; } # Later consider folding into loop above? # Later add lines to assoc. pagename array (for new RC display) foreach $rcline (@outrc) { ($ts, $pagename) = split(/$FS3/, $rcline); $pagecount{$pagename}++; $changetime{$pagename} = $ts; } $date = ""; $all = &GetParam("rcall", 0); $all = &GetParam("all", $all); $newtop = &GetParam("rcnewtop", $RecentTop); $newtop = &GetParam("newtop", $newtop); $idOnly = &GetParam("rcidonly", ""); @outrc = reverse @outrc if ($newtop); foreach $rcline (@outrc) { ($ts, $pagename, $summary, $isEdit, $host, $kind, $extraTemp) = split(/$FS3/, $rcline); # Later: need to change $all for new-RC? next if ((!$all) && ($ts < $changetime{$pagename})); next if (($idOnly ne "") && ($idOnly ne $pagename)); %extra = split(/$FS2/, $extraTemp, -1); if ($date ne &CalcDay($ts)) { $date = &CalcDay($ts); &$printDailyTear($date); } &$printRCLine( $pagename, $ts, $host, $extra{'name'}, $extra{'id'}, $summary, $isEdit, $pagecount{$pagename}, $extra{'revision'} ); } } sub GetRcHtml { my ($html, $inlist, $all, $rcchangehist); my ($tEdit, $tChanges, $tDiff); # Optimize param fetches out of main loop $all = &GetParam("rcall", 0); $all = &GetParam("all", $all); $rcchangehist = &GetParam("rcchangehist", 1); # Optimize translations out of main loop $tEdit = T('(edit)'); $tDiff = T('(diff)'); $tChanges = T('changes'); GetRc # printDailyTear sub { my $date = shift; if ($inlist) { $html .= "</UL>\n"; $inlist = 0; } $html .= "<p><strong>" . $date . "</strong><p>\n"; if (!$inlist) { $html .= "<UL>\n"; $inlist = 1; } }, # printRCLine sub { my( $pagename, $timestamp, $host, $userName, $userID, $summary, $isEdit, $pagecount, $revision ) = @_; my( $author, $sum, $edit, $count, $link ); $host = &QuoteHtml($host); if (defined($userName) && defined($userID)) { $author = &GetAuthorLink($host, $userName, $userID); } else { $author = &GetAuthorLink($host, "", 0); } $sum = ""; if (($summary ne "") && ($summary ne "*")) { $summary = &QuoteHtml($summary); $sum = "<strong>[$summary]</strong> "; } $edit = ""; $edit = "<em>$tEdit</em> " if ($isEdit); $count = ""; if ((!$all) && ($pagecount > 1)) { $count = "($pagecount "; if ($rcchangehist) { $count .= &GetHistoryLink($pagename, $tChanges); } else { $count .= $tChanges; } $count .= ") "; } $link = ""; if ($UseDiff && &GetParam("diffrclink", 1)) { $link .= &ScriptLinkDiff(4, $pagename, $tDiff, "") . " "; } $link .= &GetPageLink($pagename); $html .= "<li>$link "; # Later do new-RC looping here. $html .= &CalcTime($timestamp) . " $count$edit" . " $sum"; $html .= ". . . . . $author\n"; # Make dots optional? }, @_; $html .= "</UL>\n" if ($inlist); return $html; }
sub GetRcRss { my ($rssHeader, $items, $historyPrefix, $diffPrefix); my ($QuotedFullUrl, $ChannelAbout); # Normally get URL from script, but allow override. $FullUrl = $q->url(-full=>1) if ($FullUrl eq ""); $QuotedFullUrl = &QuoteHtml($FullUrl); $SiteDescription = &QuoteHtml($SiteDescription); $ChannelAbout = &QuoteHtml($FullUrl . '?' . $ENV{QUERY_STRING}); $diffPrefix = $QuotedFullUrl . &QuoteHtml("?action=browse\&diff=4\&id="); $historyPrefix = $QuotedFullUrl . &QuoteHtml("?action=history\&id="); $rssHeader = <<RSS ; <?xml version="1.0" encoding="ISO-8859-1"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wiki="http://purl.org/rss/1.0/modules/wiki/" > <channel rdf:about="$QuotedFullUrl"> <title>${\(&QuoteHtml($SiteName))}</title> <link>${\($QuotedFullUrl . &QuoteHtml("?$RCName"))}</link> <description>${\(&QuoteHtml($SiteDescription))}</description> <wiki:interwiki> <rdf:Description link="$QuotedFullUrl"> <rdf:value>$InterWikiMoniker</rdf:value> </rdf:Description> </wiki:interwiki> <items> <rdf:Seq> RSS GetRc # printDailyTear sub {}, # printRCLine sub { my( $pagename, $timestamp, $host, $userName, $userID, $summary, $isEdit, $pagecount, $revision ) = @_; my( $itemID, $description, $authorLink, $author, $status, $importance, $date ); # Add to list of items in the <channel/> $itemID = $FullUrl . '?' . &GetOldPageParameters('browse', $pagename, $revision); $itemID = &QuoteHtml($itemID); $rssHeader .= " <rdf:li rdf:resource=\"$itemID\"/>\n"; # Add to list of items proper. if (($summary ne "") && ($summary ne "*")) { $description = &QuoteHtml($summary); } $host = &QuoteHtml($host); if( $userName ) { $author = &QuoteHtml($userName); $authorLink = "link=\"$QuotedFullUrl?$author\""; } else { $author = $host; } $status = (1 == $revision) ? 'new' : 'updated'; $importance = $isEdit ? 'minor' : 'major'; $timestamp += $TimeZoneOffset; my ($sec, $min, $hour, $mday, $mon, $year) = localtime($timestamp); $year += 1900; $date = sprintf( "%4d-%02d-%02dT%02d:%02d:%02d+%02d:00", $year, $mon+1, $mday, $hour, $min, $sec, $TimeZoneOffset/(60*60) ); $pagename = &QuoteHtml($pagename); # Write it out longhand $items .= <<RSS <item rdf:about="$itemID"> <title>$pagename</title> <link>$QuotedFullUrl?$pagename</link> <description>$description</description> <dc:date>$date</dc:date> <dc:contributor> <rdf:Description wiki:host="$host" $authorLink> <rdf:value>$author</rdf:value> </rdf:Description> </dc:contributor> <wiki:status>$status</wiki:status> <wiki:importance>$importance</wiki:importance> <wiki:diff>$diffPrefix$pagename</wiki:diff> <wiki:version>$revision</wiki:version> <wiki:history>$historyPrefix$pagename</wiki:history> </item> RSS }, @_; return <<RSS ; $rssHeader </rdf:Seq> </items> </channel> <image rdf:about="${\(&QuoteHtml($RssLogoUrl))}"> <title>${\(&QuoteHtml($SiteName))}</title> <url>$RssLogoUrl</url> <link>$QuotedFullUrl</link> </image> $items </rdf:RDF> RSS }
sub DoRss { print "Content-type: text/plain\n\n"; &DoRc(\&GetRcRss); }