/** * Returns a row from the history printout. * * @todo document some more, and maybe clean up the code (some params redundant?) * * @param stdClass $row The database row corresponding to the previous line. * @param mixed $next The database row corresponding to the next line * (chronologically previous) * @param bool|string $notificationtimestamp * @param bool $latest Whether this row corresponds to the page's latest revision. * @param bool $firstInList Whether this row corresponds to the first * displayed on this history page. * @return string HTML output for the row */ function historyLine($row, $next, $notificationtimestamp = false, $latest = false, $firstInList = false) { $rev = new Revision($row); $rev->setTitle($this->getTitle()); if (is_object($next)) { $prevRev = new Revision($next); $prevRev->setTitle($this->getTitle()); } else { $prevRev = null; } $curlink = $this->curLink($rev, $latest); $lastlink = $this->lastLink($rev, $next); $curLastlinks = $curlink . $this->historyPage->message['pipe-separator'] . $lastlink; $histLinks = Html::rawElement('span', array('class' => 'mw-history-histlinks'), $this->msg('parentheses')->rawParams($curLastlinks)->escaped()); $diffButtons = $this->diffButtons($rev, $firstInList); $s = $histLinks . $diffButtons; $link = $this->revLink($rev); $classes = array(); $del = ''; $user = $this->getUser(); // Show checkboxes for each revision if ($user->isAllowed('deleterevision')) { $this->preventClickjacking(); // If revision was hidden from sysops, disable the checkbox if (!$rev->userCan(Revision::DELETED_RESTRICTED, $user)) { $del = Xml::check('deleterevisions', false, array('disabled' => 'disabled')); // Otherwise, enable the checkbox... } else { $del = Xml::check('showhiderevisions', false, array('name' => 'ids[' . $rev->getId() . ']')); } // User can only view deleted revisions... } elseif ($rev->getVisibility() && $user->isAllowed('deletedhistory')) { // If revision was hidden from sysops, disable the link if (!$rev->userCan(Revision::DELETED_RESTRICTED, $user)) { $del = Linker::revDeleteLinkDisabled(false); // Otherwise, show the link... } else { $query = array('type' => 'revision', 'target' => $this->getTitle()->getPrefixedDBkey(), 'ids' => $rev->getId()); $del .= Linker::revDeleteLink($query, $rev->isDeleted(Revision::DELETED_RESTRICTED), false); } } if ($del) { $s .= " {$del} "; } $lang = $this->getLanguage(); $dirmark = $lang->getDirMark(); $s .= " {$link}"; $s .= $dirmark; $s .= " <span class='history-user'>" . Linker::revUserTools($rev, true) . "</span>"; $s .= $dirmark; if ($rev->isMinor()) { $s .= ' ' . ChangesList::flag('minor'); } # Sometimes rev_len isn't populated if ($rev->getSize() !== null) { # Size is always public data $prevSize = isset($this->parentLens[$row->rev_parent_id]) ? $this->parentLens[$row->rev_parent_id] : 0; $sDiff = ChangesList::showCharacterDifference($prevSize, $rev->getSize()); $fSize = Linker::formatRevisionSize($rev->getSize()); $s .= ' <span class="mw-changeslist-separator">. .</span> ' . "{$fSize} {$sDiff}"; } # Text following the character difference is added just before running hooks $s2 = Linker::revComment($rev, false, true); if ($notificationtimestamp && $row->rev_timestamp >= $notificationtimestamp) { $s2 .= ' <span class="updatedmarker">' . $this->msg('updatedmarker')->escaped() . '</span>'; $classes[] = 'mw-history-line-updated'; } $tools = array(); # Rollback and undo links if ($prevRev && $this->getTitle()->quickUserCan('edit', $user)) { if ($latest && $this->getTitle()->quickUserCan('rollback', $user)) { // Get a rollback link without the brackets $rollbackLink = Linker::generateRollback($rev, $this->getContext(), array('verify', 'noBrackets')); if ($rollbackLink) { $this->preventClickjacking(); $tools[] = $rollbackLink; } } if (!$rev->isDeleted(Revision::DELETED_TEXT) && !$prevRev->isDeleted(Revision::DELETED_TEXT)) { # Create undo tooltip for the first (=latest) line only $undoTooltip = $latest ? array('title' => $this->msg('tooltip-undo')->text()) : array(); $undolink = Linker::linkKnown($this->getTitle(), $this->msg('editundo')->escaped(), $undoTooltip, array('action' => 'edit', 'undoafter' => $prevRev->getId(), 'undo' => $rev->getId())); $tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>"; } } // Allow extension to add their own links here wfRunHooks('HistoryRevisionTools', array($rev, &$tools)); if ($tools) { $s2 .= ' ' . $this->msg('parentheses')->rawParams($lang->pipeList($tools))->escaped(); } # Tags list($tagSummary, $newClasses) = ChangeTags::formatSummaryRow($row->ts_tags, 'history'); $classes = array_merge($classes, $newClasses); if ($tagSummary !== '') { $s2 .= " {$tagSummary}"; } # Include separator between character difference and following text if ($s2 !== '') { $s .= ' <span class="mw-changeslist-separator">. .</span> ' . $s2; } wfRunHooks('PageHistoryLineEnding', array($this, &$row, &$s, &$classes)); $attribs = array(); if ($classes) { $attribs['class'] = implode(' ', $classes); } return Xml::tags('li', $attribs, $s) . "\n"; }
private function formatFileRow($row) { $file = ArchivedFile::newFromRow($row); $ts = wfTimestamp(TS_MW, $row->fa_timestamp); $user = $this->getUser(); $checkBox = ''; if ($this->mCanView && $row->fa_storage_key) { if ($this->mAllowed) { $checkBox = Xml::check('fileid' . $row->fa_id); } $key = urlencode($row->fa_storage_key); $pageLink = $this->getFileLink($file, $this->getPageTitle(), $ts, $key); } else { $pageLink = $this->getLanguage()->userTimeAndDate($ts, $user); } $userLink = $this->getFileUser($file); $data = $this->msg('widthheight')->numParams($row->fa_width, $row->fa_height)->text(); $bytes = $this->msg('parentheses')->rawParams($this->msg('nbytes')->numParams($row->fa_size)->text())->plain(); $data = htmlspecialchars($data . ' ' . $bytes); $comment = $this->getFileComment($file); // Add show/hide deletion links if available $canHide = $this->isAllowed('deleterevision'); if ($canHide || $file->getVisibility() && $this->isAllowed('deletedhistory')) { if (!$file->userCan(File::DELETED_RESTRICTED, $user)) { // Revision was hidden from sysops $revdlink = Linker::revDeleteLinkDisabled($canHide); } else { $query = array('type' => 'filearchive', 'target' => $this->mTargetObj->getPrefixedDBkey(), 'ids' => $row->fa_id); $revdlink = Linker::revDeleteLink($query, $file->isDeleted(File::DELETED_RESTRICTED), $canHide); } } else { $revdlink = ''; } return "<li>{$checkBox} {$revdlink} {$pageLink} . . {$userLink} {$data} {$comment}</li>\n"; }
/** * Get a revision-deletion link, or disabled link, or nothing, depending * on user permissions & the settings on the revision. * * Will use forward-compatible revision ID in the Special:RevDelete link * if possible, otherwise the timestamp-based ID which may break after * undeletion. * * @param User $user * @param Revision $rev * @param Revision $title * @return string HTML fragment */ public static function getRevDeleteLink(User $user, Revision $rev, Title $title) { $canHide = $user->isAllowed('deleterevision'); if (!$canHide && !($rev->getVisibility() && $user->isAllowed('deletedhistory'))) { return ''; } if (!$rev->userCan(Revision::DELETED_RESTRICTED, $user)) { return Linker::revDeleteLinkDisabled($canHide); // revision was hidden from sysops } else { if ($rev->getId()) { // RevDelete links using revision ID are stable across // page deletion and undeletion; use when possible. $query = array('type' => 'revision', 'target' => $title->getPrefixedDBkey(), 'ids' => $rev->getId()); } else { // Older deleted entries didn't save a revision ID. // We have to refer to these by timestamp, ick! $query = array('type' => 'archive', 'target' => $title->getPrefixedDBkey(), 'ids' => $rev->getTimestamp()); } return Linker::revDeleteLink($query, $rev->isDeleted(Revision::DELETED_RESTRICTED), $canHide); } }
/** * @param $iscur * @param $file File * @return string */ public function imageHistoryLine($iscur, $file) { global $wgContLang; $user = $this->getUser(); $lang = $this->getLanguage(); $timestamp = wfTimestamp(TS_MW, $file->getTimestamp()); $img = $iscur ? $file->getName() : $file->getArchiveName(); $userId = $file->getUser('id'); $userText = $file->getUser('text'); $description = $file->getDescription(File::FOR_THIS_USER, $user); $local = $this->current->isLocal(); $row = $selected = ''; // Deletion link if ($local && $user->isAllowedAny('delete', 'deletedhistory')) { $row .= '<td>'; # Link to remove from history if ($user->isAllowed('delete')) { $q = array('action' => 'delete'); if (!$iscur) { $q['oldimage'] = $img; } $row .= Linker::linkKnown($this->title, $this->msg($iscur ? 'filehist-deleteall' : 'filehist-deleteone')->escaped(), array(), $q); } # Link to hide content. Don't show useless link to people who cannot hide revisions. $canHide = $user->isAllowed('deleterevision'); if ($canHide || $user->isAllowed('deletedhistory') && $file->getVisibility()) { if ($user->isAllowed('delete')) { $row .= '<br />'; } // If file is top revision or locked from this user, don't link if ($iscur || !$file->userCan(File::DELETED_RESTRICTED, $user)) { $del = Linker::revDeleteLinkDisabled($canHide); } else { list($ts, ) = explode('!', $img, 2); $query = array('type' => 'oldimage', 'target' => $this->title->getPrefixedText(), 'ids' => $ts); $del = Linker::revDeleteLink($query, $file->isDeleted(File::DELETED_RESTRICTED), $canHide); } $row .= $del; } $row .= '</td>'; } // Reversion link/current indicator $row .= '<td>'; if ($iscur) { $row .= $this->msg('filehist-current')->escaped(); } elseif ($local && $this->title->quickUserCan('edit', $user) && $this->title->quickUserCan('upload', $user)) { if ($file->isDeleted(File::DELETED_FILE)) { $row .= $this->msg('filehist-revert')->escaped(); } else { $row .= Linker::linkKnown($this->title, $this->msg('filehist-revert')->escaped(), array(), array('action' => 'revert', 'oldimage' => $img, 'wpEditToken' => $user->getEditToken($img))); } } $row .= '</td>'; // Date/time and image link if ($file->getTimestamp() === $this->img->getTimestamp()) { $selected = "class='filehistory-selected'"; } $row .= "<td {$selected} style='white-space: nowrap;'>"; if (!$file->userCan(File::DELETED_FILE, $user)) { # Don't link to unviewable files $row .= '<span class="history-deleted">' . $lang->userTimeAndDate($timestamp, $user) . '</span>'; } elseif ($file->isDeleted(File::DELETED_FILE)) { if ($local) { $this->preventClickjacking(); $revdel = SpecialPage::getTitleFor('Revisiondelete'); # Make a link to review the image $url = Linker::linkKnown($revdel, $lang->userTimeAndDate($timestamp, $user), array(), array('target' => $this->title->getPrefixedText(), 'file' => $img, 'token' => $user->getEditToken($img))); } else { $url = $lang->userTimeAndDate($timestamp, $user); } $row .= '<span class="history-deleted">' . $url . '</span>'; } else { $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl($img); $row .= Xml::element('a', array('href' => $url), $lang->userTimeAndDate($timestamp, $user)); } $row .= "</td>"; // Thumbnail if ($this->showThumb) { $row .= '<td>' . $this->getThumbForLine($file) . '</td>'; } // Image dimensions + size $row .= '<td>'; $row .= htmlspecialchars($file->getDimensionsString()); $row .= $this->msg('word-separator')->plain(); $row .= '<span style="white-space: nowrap;">'; $row .= $this->msg('parentheses')->rawParams(Linker::formatSize($file->getSize()))->plain(); $row .= '</span>'; $row .= '</td>'; // Uploading user $row .= '<td>'; // Hide deleted usernames if ($file->isDeleted(File::DELETED_USER)) { $row .= '<span class="history-deleted">' . $this->msg('rev-deleted-user')->escaped() . '</span>'; } else { if ($local) { $row .= Linker::userLink($userId, $userText); $row .= $this->msg('word-separator')->plain(); $row .= '<span style="white-space: nowrap;">'; $row .= Linker::userToolLinks($userId, $userText); $row .= '</span>'; } else { $row .= htmlspecialchars($userText); } } $row .= '</td>'; // Don't show deleted descriptions if ($file->isDeleted(File::DELETED_COMMENT)) { $row .= '<td><span class="history-deleted">' . $this->msg('rev-deleted-comment')->escaped() . '</span></td>'; } else { $row .= '<td dir="' . $wgContLang->getDir() . '">' . Linker::formatComment($description, $this->title) . '</td>'; } $rowClass = null; wfRunHooks('ImagePageFileHistoryLine', array($this, $file, &$row, &$rowClass)); $classAttr = $rowClass ? " class='{$rowClass}'" : ''; return "<tr{$classAttr}>{$row}</tr>\n"; }
/** * @param $row Row * @return string */ private function getShowHideLinks($row) { if ($this->flags == self::NO_ACTION_LINK || $row->log_type == 'suppress') { // no one can hide items from the suppress log return ''; } $del = ''; $user = $this->getUser(); // Don't show useless checkbox to people who cannot hide log entries if ($user->isAllowed('deletedhistory')) { $canHide = $user->isAllowed('deletelogentry'); if ($row->log_deleted || $canHide) { if ($canHide && $this->flags & self::USE_REVDEL_CHECKBOXES) { // Show checkboxes instead of links. if (!self::userCan($row, LogPage::DELETED_RESTRICTED, $user)) { // If event was hidden from sysops $del = Xml::check('deleterevisions', false, array('disabled' => 'disabled')); } else { $del = Xml::check('showhiderevisions', false, array('name' => 'ids[' . $row->log_id . ']')); } } else { if (!self::userCan($row, LogPage::DELETED_RESTRICTED, $user)) { // If event was hidden from sysops $del = Linker::revDeleteLinkDisabled($canHide); } else { $query = array('target' => SpecialPage::getTitleFor('Log', $row->log_type)->getPrefixedDBkey(), 'type' => 'logging', 'ids' => $row->log_id); $del = Linker::revDeleteLink($query, self::isDeleted($row, LogPage::DELETED_RESTRICTED), $canHide); } } } } return $del; }
/** * @param stdClass $row Row * @return string */ private function getShowHideLinks($row) { // We don't want to see the links and if ($this->flags == self::NO_ACTION_LINK) { return ''; } $user = $this->getUser(); // If change tag editing is available to this user, return the checkbox if ($this->flags & self::USE_CHECKBOXES && $this->showTagEditUI) { return Xml::check('showhiderevisions', false, array('name' => 'ids[' . $row->log_id . ']')); } // no one can hide items from the suppress log. if ($row->log_type == 'suppress') { return ''; } $del = ''; // Don't show useless checkbox to people who cannot hide log entries if ($user->isAllowed('deletedhistory')) { $canHide = $user->isAllowed('deletelogentry'); $canViewSuppressedOnly = $user->isAllowed('viewsuppressed') && !$user->isAllowed('suppressrevision'); $entryIsSuppressed = self::isDeleted($row, LogPage::DELETED_RESTRICTED); $canViewThisSuppressedEntry = $canViewSuppressedOnly && $entryIsSuppressed; if ($row->log_deleted || $canHide) { // Show checkboxes instead of links. if ($canHide && $this->flags & self::USE_CHECKBOXES && !$canViewThisSuppressedEntry) { // If event was hidden from sysops if (!self::userCan($row, LogPage::DELETED_RESTRICTED, $user)) { $del = Xml::check('deleterevisions', false, array('disabled' => 'disabled')); } else { $del = Xml::check('showhiderevisions', false, array('name' => 'ids[' . $row->log_id . ']')); } } else { // If event was hidden from sysops if (!self::userCan($row, LogPage::DELETED_RESTRICTED, $user)) { $del = Linker::revDeleteLinkDisabled($canHide); } else { $query = array('target' => SpecialPage::getTitleFor('Log', $row->log_type)->getPrefixedDBkey(), 'type' => 'logging', 'ids' => $row->log_id); $del = Linker::revDeleteLink($query, $entryIsSuppressed, $canHide && !$canViewThisSuppressedEntry); } } } } return $del; }
public function revDeleteLinkDisabled($delete = true) { return Linker::revDeleteLinkDisabled($delete); }
/** * @param $row Row * @return string */ private function getShowHideLinks($row) { global $wgUser; if ($this->flags & self::NO_ACTION_LINK || $row->log_type == 'suppress') { // no one can hide items from the suppress log return ''; } $del = ''; // Don't show useless link to people who cannot hide revisions if ($wgUser->isAllowed('deletedhistory')) { if ($row->log_deleted || $wgUser->isAllowed('deleterevision')) { $canHide = $wgUser->isAllowed('deleterevision'); // If event was hidden from sysops if (!self::userCan($row, LogPage::DELETED_RESTRICTED)) { $del = Linker::revDeleteLinkDisabled($canHide); } else { $target = SpecialPage::getTitleFor('Log', $row->log_type); $query = array('target' => $target->getPrefixedDBkey(), 'type' => 'logging', 'ids' => $row->log_id); $del = Linker::revDeleteLink($query, self::isDeleted($row, LogPage::DELETED_RESTRICTED), $canHide); } } } return $del; }
/** * Returns a row from the history printout. * * @todo document some more, and maybe clean up the code (some params redundant?) * * @param $row Object: the database row corresponding to the previous line. * @param $next Mixed: the database row corresponding to the next line. (chronologically previous) * @param $notificationtimestamp * @param $latest Boolean: whether this row corresponds to the page's latest revision. * @param $firstInList Boolean: whether this row corresponds to the first displayed on this history page. * @return String: HTML output for the row */ function historyLine($row, $next, $notificationtimestamp = false, $latest = false, $firstInList = false) { $rev = new Revision($row); $rev->setTitle($this->getTitle()); if (is_object($next)) { $prevRev = new Revision($next); $prevRev->setTitle($this->getTitle()); } else { $prevRev = null; } $curlink = $this->curLink($rev, $latest); $lastlink = $this->lastLink($rev, $next); $diffButtons = $this->diffButtons($rev, $firstInList); $histLinks = Html::rawElement('span', array('class' => 'mw-history-histlinks'), '(' . $curlink . $this->historyPage->message['pipe-separator'] . $lastlink . ') '); $s = $histLinks . $diffButtons; $link = $this->revLink($rev); $classes = array(); $del = ''; $user = $this->getUser(); // Show checkboxes for each revision if ($user->isAllowed('deleterevision')) { $this->preventClickjacking(); // If revision was hidden from sysops, disable the checkbox if (!$rev->userCan(Revision::DELETED_RESTRICTED, $user)) { $del = Xml::check('deleterevisions', false, array('disabled' => 'disabled')); // Otherwise, enable the checkbox... } else { $del = Xml::check('showhiderevisions', false, array('name' => 'ids[' . $rev->getId() . ']')); } // User can only view deleted revisions... } elseif ($rev->getVisibility() && $user->isAllowed('deletedhistory')) { // If revision was hidden from sysops, disable the link if (!$rev->userCan(Revision::DELETED_RESTRICTED, $user)) { $cdel = Linker::revDeleteLinkDisabled(false); // Otherwise, show the link... } else { $query = array('type' => 'revision', 'target' => $this->getTitle()->getPrefixedDbkey(), 'ids' => $rev->getId()); $del .= Linker::revDeleteLink($query, $rev->isDeleted(Revision::DELETED_RESTRICTED), false); } } if ($del) { $s .= " {$del} "; } $lang = $this->getLanguage(); $dirmark = $lang->getDirMark(); $s .= " {$link}"; $s .= $dirmark; $s .= " <span class='history-user'>" . Linker::revUserTools($rev, true) . "</span>"; $s .= $dirmark; if ($rev->isMinor()) { $s .= ' ' . ChangesList::flag('minor'); } # Size is always public data $prevSize = $prevRev ? $prevRev->getSize() : 0; $sDiff = ChangesList::showCharacterDifference($prevSize, $rev->getSize()); $fSize = Linker::formatRevisionSize($rev->getSize()); $s .= " . . {$fSize} {$sDiff} . . "; $s .= Linker::revComment($rev, false, true); if ($notificationtimestamp && $row->rev_timestamp >= $notificationtimestamp) { $s .= ' <span class="updatedmarker">' . $this->msg('updatedmarker')->escaped() . '</span>'; } $tools = array(); # Rollback and undo links if ($prevRev && !count($this->getTitle()->getUserPermissionsErrors('edit', $this->getUser()))) { if ($latest && !count($this->getTitle()->getUserPermissionsErrors('rollback', $this->getUser()))) { $this->preventClickjacking(); $tools[] = '<span class="mw-rollback-link">' . Linker::buildRollbackLink($rev) . '</span>'; } if (!$rev->isDeleted(Revision::DELETED_TEXT) && !$prevRev->isDeleted(Revision::DELETED_TEXT)) { # Create undo tooltip for the first (=latest) line only $undoTooltip = $latest ? array('title' => $this->msg('tooltip-undo')->text()) : array(); $undolink = Linker::linkKnown($this->getTitle(), $this->msg('editundo')->escaped(), $undoTooltip, array('action' => 'edit', 'undoafter' => $prevRev->getId(), 'undo' => $rev->getId())); $tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>"; } } if ($tools) { $s .= ' (' . $lang->pipeList($tools) . ')'; } # Tags list($tagSummary, $newClasses) = ChangeTags::formatSummaryRow($row->ts_tags, 'history'); $classes = array_merge($classes, $newClasses); $s .= " {$tagSummary}"; wfRunHooks('PageHistoryLineEnding', array($this, &$row, &$s, &$classes)); $attribs = array(); if ($classes) { $attribs['class'] = implode(' ', $classes); } return Xml::tags('li', $attribs, $s) . "\n"; }
private function formatFileRow($row) { $file = ArchivedFile::newFromRow($row); $ts = wfTimestamp(TS_MW, $row->fa_timestamp); if ($this->mAllowed && $row->fa_storage_key) { $checkBox = Xml::check('fileid' . $row->fa_id); $key = urlencode($row->fa_storage_key); $pageLink = $this->getFileLink($file, $this->getTitle(), $ts, $key); } else { $checkBox = ''; $pageLink = $this->getLang()->timeanddate($ts, true); } $userLink = $this->getFileUser($file); $data = wfMsg('widthheight', $this->getLang()->formatNum($row->fa_width), $this->getLang()->formatNum($row->fa_height)) . ' (' . wfMsg('nbytes', $this->getLang()->formatNum($row->fa_size)) . ')'; $data = htmlspecialchars($data); $comment = $this->getFileComment($file); // Add show/hide deletion links if available $canHide = $this->getUser()->isAllowed('deleterevision'); if ($canHide || $file->getVisibility() && $this->getUser()->isAllowed('deletedhistory')) { if (!$file->userCan(File::DELETED_RESTRICTED)) { $revdlink = Linker::revDeleteLinkDisabled($canHide); // revision was hidden from sysops } else { $query = array('type' => 'filearchive', 'target' => $this->mTargetObj->getPrefixedDBkey(), 'ids' => $row->fa_id); $revdlink = Linker::revDeleteLink($query, $file->isDeleted(File::DELETED_RESTRICTED), $canHide); } } else { $revdlink = ''; } return "<li>{$checkBox} {$revdlink} {$pageLink} . . {$userLink} {$data} {$comment}</li>\n"; }
/** * Generate the navigation links when browsing through an article revisions * It shows the information as: * Revision as of \<date\>; view current revision * \<- Previous version | Next Version -\> * * @param $oldid String: revision ID of this article revision */ public function setOldSubtitle($oldid = 0) { global $wgLang, $wgOut, $wgUser, $wgRequest; if (!wfRunHooks('DisplayOldSubtitle', array(&$this, &$oldid))) { return; } $unhide = $wgRequest->getInt('unhide') == 1; # Cascade unhide param in links for easy deletion browsing $extraParams = array(); if ($wgRequest->getVal('unhide')) { $extraParams['unhide'] = 1; } $revision = Revision::newFromId($oldid); $timestamp = $revision->getTimestamp(); $current = $oldid == $this->mPage->getLatest(); $td = $wgLang->timeanddate($timestamp, true); $tddate = $wgLang->date($timestamp, true); $tdtime = $wgLang->time($timestamp, true); $lnk = $current ? wfMsgHtml('currentrevisionlink') : Linker::link($this->getTitle(), wfMsgHtml('currentrevisionlink'), array(), $extraParams, array('known', 'noclasses')); $curdiff = $current ? wfMsgHtml('diff') : Linker::link($this->getTitle(), wfMsgHtml('diff'), array(), array('diff' => 'cur', 'oldid' => $oldid) + $extraParams, array('known', 'noclasses')); $prev = $this->getTitle()->getPreviousRevisionID($oldid); $prevlink = $prev ? Linker::link($this->getTitle(), wfMsgHtml('previousrevision'), array(), array('direction' => 'prev', 'oldid' => $oldid) + $extraParams, array('known', 'noclasses')) : wfMsgHtml('previousrevision'); $prevdiff = $prev ? Linker::link($this->getTitle(), wfMsgHtml('diff'), array(), array('diff' => 'prev', 'oldid' => $oldid) + $extraParams, array('known', 'noclasses')) : wfMsgHtml('diff'); $nextlink = $current ? wfMsgHtml('nextrevision') : Linker::link($this->getTitle(), wfMsgHtml('nextrevision'), array(), array('direction' => 'next', 'oldid' => $oldid) + $extraParams, array('known', 'noclasses')); $nextdiff = $current ? wfMsgHtml('diff') : Linker::link($this->getTitle(), wfMsgHtml('diff'), array(), array('diff' => 'next', 'oldid' => $oldid) + $extraParams, array('known', 'noclasses')); $cdel = ''; // User can delete revisions or view deleted revisions... $canHide = $wgUser->isAllowed('deleterevision'); if ($canHide || $revision->getVisibility() && $wgUser->isAllowed('deletedhistory')) { if (!$revision->userCan(Revision::DELETED_RESTRICTED)) { $cdel = Linker::revDeleteLinkDisabled($canHide); // rev was hidden from Sysops } else { $query = array('type' => 'revision', 'target' => $this->getTitle()->getPrefixedDbkey(), 'ids' => $oldid); $cdel = Linker::revDeleteLink($query, $revision->isDeleted(File::DELETED_RESTRICTED), $canHide); } $cdel .= ' '; } # Show user links if allowed to see them. If hidden, then show them only if requested... $userlinks = Linker::revUserTools($revision, !$unhide); $infomsg = $current && !wfMessage('revision-info-current')->isDisabled() ? 'revision-info-current' : 'revision-info'; $r = "\n\t\t\t\t<div id=\"mw-{$infomsg}\">" . wfMsgExt($infomsg, array('parseinline', 'replaceafter'), $td, $userlinks, $revision->getID(), $tddate, $tdtime, $revision->getUser()) . "</div>\n" . "\n\t\t\t\t<div id=\"mw-revision-nav\">" . $cdel . wfMsgExt('revision-nav', array('escapenoentities', 'parsemag', 'replaceafter'), $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff) . "</div>\n\t\t\t"; $wgOut->setSubtitle($r); }