_args = $rc_args;
$this->_diffargs = array('action' => 'diff');
if ($rc_args['show_minor'] || !$rc_args['show_major'])
$this->_diffargs['previous'] = 'minor';
// PageHistoryPlugin doesn't have a 'daylist' arg.
if (!isset($this->_args['daylist']))
$this->_args['daylist'] = false;
}
function title()
{
global $request;
extract($this->_args);
if ($author) {
$title = $author;
if ($title == '[]') {
$title = $request->_user->getID();
}
$title = _("UserContribs") . ": $title";
} elseif ($owner) {
$title = $owner;
if ($title == '[]') {
$title = $request->_user->getID();
}
$title = _("UserContribs") . ": $title";
} elseif ($only_new) {
$title = _("RecentNewPages");
} elseif ($show_minor) {
$title = _("RecentEdits");
} else $title = _("RecentChanges");
if (!empty($category))
$title = $category;
elseif (!empty($pagematch))
$title .= ":$pagematch";
return $title;
}
function include_versions_in_URLs()
{
return (bool)$this->_args['show_all'];
}
function date($rev)
{
global $WikiTheme;
return $WikiTheme->getDay($rev->get('mtime'));
}
function time($rev)
{
global $WikiTheme;
return $WikiTheme->formatTime($rev->get('mtime'));
}
function diffURL($rev)
{
$args = $this->_diffargs;
if ($this->include_versions_in_URLs())
$args['version'] = $rev->getVersion();
$page = $rev->getPage();
return WikiURL($page->getName(), $args, $this->_absurls);
}
function historyURL($rev)
{
$page = $rev->getPage();
return WikiURL($page, array('action' => _("PageHistory")),
$this->_absurls);
}
function pageURL($rev)
{
return WikiURL($this->include_versions_in_URLs() ? $rev : $rev->getPage(),
'', $this->_absurls);
}
function authorHasPage($author)
{
global $WikiNameRegexp, $request;
$dbi = $request->getDbh();
return isWikiWord($author) && $dbi->isWikiPage($author);
}
function authorURL($author)
{
return $this->authorHasPage() ? WikiURL($author) : false;
}
function status($rev)
{
if ($rev->hasDefaultContents())
return 'deleted';
$page = $rev->getPage();
$prev = $page->getRevisionBefore($rev->getVersion());
if ($prev->hasDefaultContents())
return 'new';
return 'updated';
}
function importance($rev)
{
return $rev->get('is_minor_edit') ? 'minor' : 'major';
}
function summary($rev)
{
if (($summary = $rev->get('summary')))
return $summary;
switch ($this->status($rev)) {
case 'deleted':
return _("Deleted");
case 'new':
return _("New page");
default:
return '';
}
}
function setValidators($most_recent_rev)
{
$rev = $most_recent_rev;
$validators = array('RecentChanges-top' =>
array($rev->getPageName(), $rev->getVersion()),
'%mtime' => $rev->get('mtime'));
global $request;
$request->appendValidators($validators);
}
}
class _RecentChanges_HtmlFormatter
extends _RecentChanges_Formatter
{
function diffLink($rev)
{
global $WikiTheme;
$button = $WikiTheme->makeButton(_("diff"), $this->diffURL($rev), 'wiki-rc-action');
$button->setAttr('rel', 'nofollow');
return HTML("(", $button, ")");
}
/* deletions: red, additions: green */
function diffSummary($rev)
{
$html = $this->diffURL($rev);
return '';
}
function historyLink($rev)
{
global $WikiTheme;
$button = $WikiTheme->makeButton(_("hist"), $this->historyURL($rev), 'wiki-rc-action');
$button->setAttr('rel', 'nofollow');
return HTML("(", $button, ")");
}
function pageLink($rev, $link_text = false)
{
return WikiLink($this->include_versions_in_URLs() ? $rev : $rev->getPage(),
'auto', $link_text);
/*
$page = $rev->getPage();
global $WikiTheme;
if ($this->include_versions_in_URLs()) {
$version = $rev->getVersion();
if ($rev->isCurrent())
$version = false;
$exists = !$rev->hasDefaultContents();
}
else {
$version = false;
$cur = $page->getCurrentRevision();
$exists = !$cur->hasDefaultContents();
}
if ($exists)
return $WikiTheme->linkExistingWikiWord($page->getName(), $link_text, $version);
else
return $WikiTheme->linkUnknownWikiWord($page->getName(), $link_text);
*/
}
function authorLink($rev)
{
return WikiLink($rev->get('author'), 'if_known');
}
/* Link to all users contributions (contribs and owns) */
function authorContribs($rev)
{
$author = $rev->get('author');
if (preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $author)) return '';
return HTML('(',
Button(array('action' => _("RecentChanges"),
'format' => 'contribs',
'author' => $author,
'days' => 360),
_("contribs"),
$author),
' | ',
Button(array('action' => _("RecentChanges"),
'format' => 'contribs',
'owner' => $author,
'days' => 360),
_("new pages"),
$author),
')');
}
function summaryAsHTML($rev)
{
if (!($summary = $this->summary($rev)))
return '';
return HTML::span(array('class' => 'wiki-summary'),
"(",
// TransformLinks($summary, $rev->get('markup'), $rev->getPageName()),
// We do parse the summary:
// 1) if the summary contains {{foo}}, the template must no be
// expanded
// 2) if the summary contains camel case, and DISABLE_MARKUP_WIKIWORD
// is true, the camel case must not be linked.
// Side-effect: brackets are not linked. TBD.
$summary,
")");
}
function format_icon($format, $filter = array())
{
global $request, $WikiTheme;
$args = $this->_args;
// remove links not used for those formats
unset($args['daylist']);
unset($args['difflinks']);
unset($args['historylinks']);
$rss_url = $request->getURLtoSelf
(array_merge($args,
array('action' => $this->action, 'format' => $format),
$filter));
return $WikiTheme->makeButton($format, $rss_url, 'rssicon');
}
function rss_icon($args = array())
{
return $this->format_icon("rss", $args);
}
function rss2_icon($args = array())
{
return $this->format_icon("rss2", $args);
}
function atom_icon($args = array())
{
return $this->format_icon("atom", $args);
}
function rdf_icon($args = array())
{
return DEBUG ? $this->format_icon("rdf", $args) : '';
}
function rdfs_icon($args = array())
{
return DEBUG ? $this->format_icon("rdfs", $args) : '';
}
function owl_icon($args = array())
{
return DEBUG ? $this->format_icon("owl", $args) : '';
}
function grazr_icon($args = array())
{
global $request, $WikiTheme;
if (is_localhost()) return '';
if (SERVER_PROTOCOL == "https") return '';
$our_url = WikiURL($request->getArg('pagename'),
array_merge(array('action' => $this->action, 'format' => 'rss2'), $args),
true);
$rss_url = 'http://grazr.com/gzpanel.html?' . $our_url;
return $WikiTheme->makeButton("grazr", $rss_url, 'rssicon');
}
function pre_description()
{
extract($this->_args);
// FIXME: say something about show_all.
if ($show_major && $show_minor)
$edits = _("edits");
elseif ($show_major)
$edits = _("major edits"); else
$edits = _("minor edits");
if (isset($caption) and $caption == _("Recent Comments"))
$edits = _("comments");
if (!empty($only_new)) {
$edits = _("created new pages");
}
if (!empty($author)) {
global $request;
if ($author == '[]')
$author = $request->_user->getID();
$edits .= sprintf(_(" for pages changed by %s"), $author);
}
if (!empty($owner)) {
global $request;
if ($owner == '[]')
$owner = $request->_user->getID();
$edits .= sprintf(_(" for pages owned by %s"), $owner);
}
if (!empty($category)) {
$edits .= sprintf(_(" for all pages linking to %s"), $category);
}
if (!empty($pagematch)) {
$edits .= sprintf(_(" for all pages matching “%s”"), $pagematch);
}
if ($timespan = $days > 0) {
if (intval($days) != $days)
$days = sprintf("%.1f", $days);
}
$lmt = abs($limit);
/**
* Depending how this text is split up it can be tricky or
* impossible to translate with good grammar. So the seperate
* strings for 1 day and %s days are necessary in this case
* for translating to multiple languages, due to differing
* overlapping ideal word cutting points.
*
* en: day/days "The %d most recent %s [during (the past] day) are listed below."
* de: 1 Tag "Die %d jüngste %s [innerhalb (von des letzten] Tages) sind unten aufgelistet."
* de: %s days "Die %d jüngste %s [innerhalb (von] %s Tagen) sind unten aufgelistet."
*
* en: day/days "The %d most recent %s during [the past] (day) are listed below."
* fr: 1 jour "Les %d %s les plus récentes pendant [le dernier (d'une] jour) sont énumérées ci-dessous."
* fr: %s jours "Les %d %s les plus récentes pendant [les derniers (%s] jours) sont énumérées ci-dessous."
*/
if ($limit > 0) {
if ($timespan) {
if (intval($days) == 1)
$desc = fmt("The %d most recent %s during the past day are listed below.",
$limit, $edits);
else
$desc = fmt("The %d most recent %s during the past %s days are listed below.",
$limit, $edits, $days);
} else
$desc = fmt("The %d most recent %s are listed below.",
$limit, $edits);
} elseif ($limit < 0) { //$limit < 0 means we want oldest pages
if ($timespan) {
if (intval($days) == 1)
$desc = fmt("The %d oldest %s during the past day are listed below.",
$lmt, $edits);
else
$desc = fmt("The %d oldest %s during the past %s days are listed below.",
$lmt, $edits, $days);
} else
$desc = fmt("The %d oldest %s are listed below.",
$lmt, $edits);
} else {
if ($timespan) {
if (intval($days) == 1)
$desc = fmt("The most recent %s during the past day are listed below.",
$edits);
else
$desc = fmt("The most recent %s during the past %s days are listed below.",
$edits, $days);
} else
$desc = fmt("All %s are listed below.", $edits);
}
return $desc;
}
function description()
{
return HTML::p(false, $this->pre_description());
}
/* was title */
function headline()
{
extract($this->_args);
return array($this->title(),
' ',
$this->rss_icon(),
$this->rss2_icon(),
$this->atom_icon(),
$this->rdf_icon(),
/*$this->rdfs_icon(),
$this->owl_icon(),*/
$this->grazr_icon(),
$this->sidebar_link());
}
function empty_message()
{
if (isset($this->_args['caption']) and $this->_args['caption'] == _("Recent Comments"))
return _("No comments found");
else
return _("No changes found");
}
function sidebar_link()
{
extract($this->_args);
$pagetitle = $show_minor ? _("RecentEdits") : _("RecentChanges");
global $request;
$sidebarurl = WikiURL($pagetitle, array('format' => 'sidebar'), 'absurl');
$addsidebarjsfunc =
"function addPanel() {\n"
. " window.sidebar.addPanel (\"" . sprintf("%s - %s", WIKI_NAME, $pagetitle) . "\",\n"
. " \"$sidebarurl\",\"\");\n"
. "}\n";
$jsf = JavaScript($addsidebarjsfunc);
global $WikiTheme;
$sidebar_button = $WikiTheme->makeButton("sidebar", 'javascript:addPanel();', 'sidebaricon',
array('title' => _("Click to add this feed to your sidebar"),
'style' => 'font-size:9pt;font-weight:normal; vertical-align:middle;'));
$addsidebarjsclick = asXML($sidebar_button);
$jsc = JavaScript("if ((typeof window.sidebar == 'object') &&\n"
. " (typeof window.sidebar.addPanel == 'function'))\n"
. " {\n"
. " document.write('$addsidebarjsclick');\n"
. " }\n"
);
return HTML(new RawXML("\n"), $jsf, new RawXML("\n"), $jsc);
}
function format($changes)
{
include_once 'lib/InlineParser.php';
$html = HTML(HTML::h2(false, $this->headline()));
if (($desc = $this->description()))
$html->pushContent($desc);
if ($this->_args['daylist']) {
$html->pushContent(new OptionsButtonBars($this->_args));
}
$last_date = '';
$lines = false;
$first = true;
while ($rev = $changes->next()) {
if (($date = $this->date($rev)) != $last_date) {
if ($lines)
$html->pushContent($lines);
// for user contributions no extra date line
$html->pushContent(HTML::h3($date));
$lines = HTML::ul();
$last_date = $date;
}
// enforce view permission
if (mayAccessPage('view', $rev->_pagename)) {
$lines->pushContent($this->format_revision($rev));
if ($first)
$this->setValidators($rev);
$first = false;
}
}
if ($lines)
$html->pushContent($lines);
if ($first) {
if ($this->_args['daylist'])
$html->pushContent // force display of OptionsButtonBars
(JavaScript
("document.getElementById('rc-action-body').style.display='block';"));
$html->pushContent(HTML::p(array('class' => 'rc-empty'),
$this->empty_message()));
}
return $html;
}
function format_revision($rev)
{
global $WikiTheme;
$args = &$this->_args;
$class = 'rc-' . $this->importance($rev);
$time = $this->time($rev);
if ($rev->get('is_minor_edit')) {
$minor_flag = HTML(" ",
HTML::span(array('class' => 'pageinfo-minoredit'),
"(" . _("minor edit") . ")"));
} else {
$time = HTML::span(array('class' => 'pageinfo-majoredit'), $time);
$minor_flag = '';
}
$line = HTML::li(array('class' => $class));
if ($args['difflinks'])
$line->pushContent($this->diffLink($rev), ' ');
if ($args['historylinks'])
$line->pushContent($this->historyLink($rev), ' ');
// Do not display a link for a deleted page, just the page name
if ($rev->hasDefaultContents()) {
$linkorname = $rev->_pagename;
} else {
$linkorname = $this->pageLink($rev);
}
if ((isa($WikiTheme, 'WikiTheme_MonoBook')) or (isa($WikiTheme, 'WikiTheme_fusionforge'))) {
$line->pushContent(
$args['historylinks'] ? '' : $this->historyLink($rev),
' . . ', $linkorname, '; ',
$time, ' . . ',
$this->authorLink($rev), ' ',
$this->authorContribs($rev), ' ',
$this->summaryAsHTML($rev), ' ',
$minor_flag);
} else {
$line->pushContent($linkorname, ' ',
$time, ' ',
$this->summaryAsHTML($rev),
' ... ',
$this->authorLink($rev));
}
return $line;
}
}
/* format=contribs: no seperation into extra dates
* 14:41, 3 December 2006 (hist) (diff) Talk:PhpWiki (added diff link) (top)
*/
class _RecentChanges_UserContribsFormatter
extends _RecentChanges_HtmlFormatter
{
function headline()
{
global $request;
extract($this->_args);
if ($author == '[]') $author = $request->_user->getID();
if ($owner == '[]') $owner = $request->_user->getID();
$author_args = $owner
? array('owner' => $owner)
: array('author' => $author);
return array(_("UserContribs"), ":", $owner ? $owner : $author,
' ',
$this->rss_icon($author_args),
$this->rss2_icon($author_args),
$this->atom_icon($author_args),
$this->rdf_icon($author_args),
$this->grazr_icon($author_args));
}
function format($changes)
{
include_once 'lib/InlineParser.php';
$html = HTML(HTML::h2(false, $this->headline()));
$lines = HTML::ol();
$first = true;
$count = 0;
while ($rev = $changes->next()) {
if (mayAccessPage('view', $rev->_pagename)) {
$lines->pushContent($this->format_revision($rev));
if ($first)
$this->setValidators($rev);
$first = false;
}
$count++;
}
$this->_args['limit'] = $count;
if (($desc = $this->description()))
$html->pushContent($desc);
if ($this->_args['daylist']) {
$html->pushContent(new OptionsButtonBars($this->_args));
}
if ($first)
$html->pushContent(HTML::p(array('class' => 'rc-empty'),
$this->empty_message()));
else
$html->pushContent($lines);
return $html;
}
function format_revision($rev)
{
$args = &$this->_args;
$class = 'rc-' . $this->importance($rev);
$time = $this->time($rev);
if (!$rev->get('is_minor_edit'))
$time = HTML::span(array('class' => 'pageinfo-majoredit'), $time);
$line = HTML::li(array('class' => $class));
$line->pushContent($this->time($rev), ", ");
$line->pushContent($this->date($rev), " ");
$line->pushContent($this->diffLink($rev), ' ');
$line->pushContent($this->historyLink($rev), ' ');
$line->pushContent($this->pageLink($rev), ' ',
$this->summaryAsHTML($rev));
return $line;
}
}
class _RecentChanges_SideBarFormatter
extends _RecentChanges_HtmlFormatter
{
function rss_icon()
{
//omit rssicon
}
function rss2_icon()
{
}
function headline()
{
//title click opens the normal RC or RE page in the main browser frame
extract($this->_args);
$titlelink = WikiLink($this->title());
$titlelink->setAttr('target', '_content');
return HTML($this->logo(), $titlelink);
}
function logo()
{
//logo click opens the HomePage in the main browser frame
global $WikiTheme;
$img = HTML::img(array('src' => $WikiTheme->getImageURL('logo'),
'align' => 'right',
'style' => 'height:2.5ex'
));
$linkurl = WikiLink(HOME_PAGE, false, $img);
$linkurl->setAttr('target', '_content');
return $linkurl;
}
function authorLink($rev)
{
$author = $rev->get('author');
if ($this->authorHasPage($author)) {
$linkurl = WikiLink($author);
$linkurl->setAttr('target', '_content'); // way to do this using parent::authorLink ??
return $linkurl;
} else
return $author;
}
function diffLink($rev)
{
$linkurl = parent::diffLink($rev);
$linkurl->setAttr('target', '_content');
$linkurl->setAttr('rel', 'nofollow');
// FIXME: Smelly hack to get smaller diff buttons in sidebar
$linkurl = new RawXML(str_replace('setAttr('target', '_content');
// FIXME: Smelly hack to get smaller history buttons in sidebar
$linkurl = new RawXML(str_replace('
setAttr('target', '_content');
return $linkurl;
}
// Overriding summaryAsHTML, because there is no way yet to
// return summary as transformed text with
// links setAttr('target', '_content') in Mozilla sidebar.
// So for now don't create clickable links inside summary
// in the sidebar, or else they target the sidebar and not the
// main content window.
function summaryAsHTML($rev)
{
if (!($summary = $this->summary($rev)))
return '';
return HTML::span(array('class' => 'wiki-summary'),
"[",
/*TransformLinks(*/
$summary, /* $rev->get('markup')),*/
"]");
}
function format($changes)
{
$this->_args['daylist'] = false; //don't show day buttons in Mozilla sidebar
$html = _RecentChanges_HtmlFormatter::format($changes);
$html = HTML::div(array('class' => 'wikitext'), $html);
global $request;
$request->discardOutput();
printf("\n", $GLOBALS['charset']);
printf('');
printf('');
printf("