/** * If the revision requested for view is deleted, check permissions. * Send either an error message or a warning header to $wgOut. * * @return boolean true if the view is allowed, false if not. */ public function showDeletedRevisionHeader() { global $wgOut, $wgRequest; if (!$this->mRevision->isDeleted(Revision::DELETED_TEXT)) { // Not deleted return true; } // If the user is not allowed to see it... if (!$this->mRevision->userCan(Revision::DELETED_TEXT)) { $wgOut->wrapWikiMsg("<div class='mw-warning plainlinks'>\n\$1\n</div>\n", 'rev-deleted-text-permission'); return false; // If the user needs to confirm that they want to see it... } elseif ($wgRequest->getInt('unhide') != 1) { # Give explanation and add a link to view the revision... $oldid = intval($this->getOldID()); $link = $this->getTitle()->getFullUrl("oldid={$oldid}&unhide=1"); $msg = $this->mRevision->isDeleted(Revision::DELETED_RESTRICTED) ? 'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide'; $wgOut->wrapWikiMsg("<div class='mw-warning plainlinks'>\n\$1\n</div>\n", array($msg, $link)); return false; // We are allowed to see... } else { $msg = $this->mRevision->isDeleted(Revision::DELETED_RESTRICTED) ? 'rev-suppressed-text-view' : 'rev-deleted-text-view'; $wgOut->wrapWikiMsg("<div class='mw-warning plainlinks'>\n\$1\n</div>\n", $msg); return true; } }
function formatRow($row) { wfProfileIn(__METHOD__); global $wgLang, $wgUser, $wgContLang; $sk = $this->getSkin(); $rev = new Revision($row); $page = Title::makeTitle($row->page_namespace, $row->page_title); $link = $sk->makeKnownLinkObj($page); $difftext = $topmarktext = ''; if ($row->rev_id == $row->page_latest) { if (!$row->page_is_new) { $difftext .= '(' . $sk->makeKnownLinkObj($page, $this->messages['diff'], 'diff=0') . ')'; } else { $difftext .= $this->messages['newarticle']; } } if ($rev->userCan(Revision::DELETED_TEXT)) { $difftext = '(' . $sk->makeKnownLinkObj($page, $this->messages['diff'], 'diff=prev&oldid=' . $row->rev_id) . ')'; } else { $difftext = '(' . $this->messages['diff'] . ')'; } $comment = $wgContLang->getDirMark() . $sk->revComment($rev); $d = $wgLang->timeanddate(wfTimestamp(TS_MW, $row->rev_timestamp), true); if ($this->target == 'newbies') { $userlink = ' . . ' . $sk->userLink($row->rev_user, $row->rev_user_text); $userlink .= ' (' . $sk->userTalkLink($row->rev_user, $row->rev_user_text) . ') '; } else { $userlink = ''; } if ($rev->isDeleted(Revision::DELETED_TEXT)) { $d = '<span class="history-deleted">' . $d . '</span>'; } if ($row->rev_minor_edit) { $mflag = '<span class="minor">' . $this->messages['minoreditletter'] . '</span> '; } else { $mflag = ''; } $ret = "{$d} {$difftext} {$mflag} {$link}{$userlink}{$comment} {$topmarktext}"; if ($rev->isDeleted(Revision::DELETED_TEXT)) { $ret .= ' ' . wfMsgHtml('deletedrev'); } $ret = "<li>{$ret}</li>\n"; wfProfileOut(__METHOD__); return $ret; }
/** * Create radio buttons for page history * * @param Revision $rev * @param bool $firstInList Is this version the first one? * * @return string HTML output for the radio buttons */ function diffButtons($rev, $firstInList) { if ($this->getNumRows() > 1) { $id = $rev->getId(); $radio = array('type' => 'radio', 'value' => $id); /** @todo Move title texts to javascript */ if ($firstInList) { $first = Xml::element('input', array_merge($radio, array('style' => 'visibility:hidden', 'name' => 'oldid', 'id' => 'mw-oldid-null'))); $checkmark = array('checked' => 'checked'); } else { # Check visibility of old revisions if (!$rev->userCan(Revision::DELETED_TEXT, $this->getUser())) { $radio['disabled'] = 'disabled'; $checkmark = array(); // We will check the next possible one } elseif (!$this->oldIdChecked) { $checkmark = array('checked' => 'checked'); $this->oldIdChecked = $id; } else { $checkmark = array(); } $first = Xml::element('input', array_merge($radio, $checkmark, array('name' => 'oldid', 'id' => "mw-oldid-{$id}"))); $checkmark = array(); } $second = Xml::element('input', array_merge($radio, $checkmark, array('name' => 'diff', 'id' => "mw-diff-{$id}"))); return $first . $second; } else { return ''; } }
/** * Show a row in history, including: * time of edit * changed bytes * name of editor * comment of edit * @param Revision $rev Revision id of the row wants to show * @param Revision|null $prev Revision id of previous Revision to display the difference */ protected function showRow(Revision $rev, $prev) { $user = $this->getUser(); $userId = $rev->getUser(Revision::FOR_THIS_USER, $user); if ($userId === 0) { $username = IP::prettifyIP($rev->getUserText(Revision::RAW)); $isAnon = true; } else { $username = $rev->getUserText(Revision::FOR_THIS_USER, $user); $isAnon = false; } // FIXME: Style differently user comment when this is the case if ($rev->userCan(Revision::DELETED_COMMENT, $user)) { $comment = $rev->getComment(Revision::FOR_THIS_USER, $user); $comment = $this->formatComment($comment, $this->title); } else { $comment = $this->msg('rev-deleted-comment')->plain(); } $ts = $rev->getTimestamp(); $this->renderListHeaderWhereNeeded($this->getLanguage()->userDate($ts, $this->getUser())); $ts = new MWTimestamp($ts); $canSeeText = $rev->userCan(Revision::DELETED_TEXT, $user); if ($canSeeText && $prev && $prev->userCan(Revision::DELETED_TEXT, $user)) { $diffLink = SpecialPage::getTitleFor('MobileDiff', $rev->getId())->getLocalUrl(); } elseif ($canSeeText && $rev->getTitle() !== null) { $diffLink = $rev->getTitle()->getLocalUrl(array('oldid' => $rev->getId())); } else { $diffLink = false; } // FIXME: Style differently user comment when this is the case if (!$rev->userCan(Revision::DELETED_USER, $user)) { $username = $this->msg('rev-deleted-user')->plain(); } // When the page is named there is no need to print it in output if ($this->title) { $title = null; } else { $title = $rev->getTitle(); } $bytes = $rev->getSize(); if ($prev) { $bytes -= $prev->getSize(); } $isMinor = $rev->isMinor(); $this->renderFeedItemHtml($ts, $diffLink, $username, $comment, $title, $isAnon, $bytes, $isMinor); }
/** * Extract information from the Revision * * @param Revision $revision * @param object $row Should have a field 'ts_tags' if $this->fld_tags is set * @return array */ protected function extractRevisionInfo(Revision $revision, $row) { $title = $revision->getTitle(); $user = $this->getUser(); $vals = array(); $anyHidden = false; if ($this->fld_ids) { $vals['revid'] = intval($revision->getId()); if (!is_null($revision->getParentId())) { $vals['parentid'] = intval($revision->getParentId()); } } if ($this->fld_flags) { $vals['minor'] = $revision->isMinor(); } if ($this->fld_user || $this->fld_userid) { if ($revision->isDeleted(Revision::DELETED_USER)) { $vals['userhidden'] = true; $anyHidden = true; } if ($revision->userCan(Revision::DELETED_USER, $user)) { if ($this->fld_user) { $vals['user'] = $revision->getUserText(Revision::RAW); } $userid = $revision->getUser(Revision::RAW); if (!$userid) { $vals['anon'] = true; } if ($this->fld_userid) { $vals['userid'] = $userid; } } } if ($this->fld_timestamp) { $vals['timestamp'] = wfTimestamp(TS_ISO_8601, $revision->getTimestamp()); } if ($this->fld_size) { if (!is_null($revision->getSize())) { $vals['size'] = intval($revision->getSize()); } else { $vals['size'] = 0; } } if ($this->fld_sha1) { if ($revision->isDeleted(Revision::DELETED_TEXT)) { $vals['sha1hidden'] = true; $anyHidden = true; } if ($revision->userCan(Revision::DELETED_TEXT, $user)) { if ($revision->getSha1() != '') { $vals['sha1'] = wfBaseConvert($revision->getSha1(), 36, 16, 40); } else { $vals['sha1'] = ''; } } } if ($this->fld_contentmodel) { $vals['contentmodel'] = $revision->getContentModel(); } if ($this->fld_comment || $this->fld_parsedcomment) { if ($revision->isDeleted(Revision::DELETED_COMMENT)) { $vals['commenthidden'] = true; $anyHidden = true; } if ($revision->userCan(Revision::DELETED_COMMENT, $user)) { $comment = $revision->getComment(Revision::RAW); if ($this->fld_comment) { $vals['comment'] = $comment; } if ($this->fld_parsedcomment) { $vals['parsedcomment'] = Linker::formatComment($comment, $title); } } } if ($this->fld_tags) { if ($row->ts_tags) { $tags = explode(',', $row->ts_tags); ApiResult::setIndexedTagName($tags, 'tag'); $vals['tags'] = $tags; } else { $vals['tags'] = array(); } } $content = null; global $wgParser; if ($this->fetchContent) { $content = $revision->getContent(Revision::FOR_THIS_USER, $this->getUser()); // Expand templates after getting section content because // template-added sections don't count and Parser::preprocess() // will have less input if ($content && $this->section !== false) { $content = $content->getSection($this->section, false); if (!$content) { $this->dieUsage("There is no section {$this->section} in r" . $revision->getId(), 'nosuchsection'); } } if ($revision->isDeleted(Revision::DELETED_TEXT)) { $vals['texthidden'] = true; $anyHidden = true; } elseif (!$content) { $vals['textmissing'] = true; } } if ($this->fld_content && $content) { $text = null; if ($this->generateXML) { if ($content->getModel() === CONTENT_MODEL_WIKITEXT) { $t = $content->getNativeData(); # note: don't set $text $wgParser->startExternalParse($title, ParserOptions::newFromContext($this->getContext()), Parser::OT_PREPROCESS); $dom = $wgParser->preprocessToDom($t); if (is_callable(array($dom, 'saveXML'))) { $xml = $dom->saveXML(); } else { $xml = $dom->__toString(); } $vals['parsetree'] = $xml; } else { $vals['badcontentformatforparsetree'] = true; $this->setWarning("Conversion to XML is supported for wikitext only, " . $title->getPrefixedDBkey() . " uses content model " . $content->getModel()); } } if ($this->expandTemplates && !$this->parseContent) { #XXX: implement template expansion for all content types in ContentHandler? if ($content->getModel() === CONTENT_MODEL_WIKITEXT) { $text = $content->getNativeData(); $text = $wgParser->preprocess($text, $title, ParserOptions::newFromContext($this->getContext())); } else { $this->setWarning("Template expansion is supported for wikitext only, " . $title->getPrefixedDBkey() . " uses content model " . $content->getModel()); $vals['badcontentformat'] = true; $text = false; } } if ($this->parseContent) { $po = $content->getParserOutput($title, $revision->getId(), ParserOptions::newFromContext($this->getContext())); $text = $po->getText(); } if ($text === null) { $format = $this->contentFormat ? $this->contentFormat : $content->getDefaultFormat(); $model = $content->getModel(); if (!$content->isSupportedFormat($format)) { $name = $title->getPrefixedDBkey(); $this->setWarning("The requested format {$this->contentFormat} is not " . "supported for content model {$model} used by {$name}"); $vals['badcontentformat'] = true; $text = false; } else { $text = $content->serialize($format); // always include format and model. // Format is needed to deserialize, model is needed to interpret. $vals['contentformat'] = $format; $vals['contentmodel'] = $model; } } if ($text !== false) { ApiResult::setContentValue($vals, 'content', $text); } } if ($content && (!is_null($this->diffto) || !is_null($this->difftotext))) { static $n = 0; // Number of uncached diffs we've had if ($n < $this->getConfig()->get('APIMaxUncachedDiffs')) { $vals['diff'] = array(); $context = new DerivativeContext($this->getContext()); $context->setTitle($title); $handler = $revision->getContentHandler(); if (!is_null($this->difftotext)) { $model = $title->getContentModel(); if ($this->contentFormat && !ContentHandler::getForModelID($model)->isSupportedFormat($this->contentFormat)) { $name = $title->getPrefixedDBkey(); $this->setWarning("The requested format {$this->contentFormat} is not " . "supported for content model {$model} used by {$name}"); $vals['diff']['badcontentformat'] = true; $engine = null; } else { $difftocontent = ContentHandler::makeContent($this->difftotext, $title, $model, $this->contentFormat); $engine = $handler->createDifferenceEngine($context); $engine->setContent($content, $difftocontent); } } else { $engine = $handler->createDifferenceEngine($context, $revision->getID(), $this->diffto); $vals['diff']['from'] = $engine->getOldid(); $vals['diff']['to'] = $engine->getNewid(); } if ($engine) { $difftext = $engine->getDiffBody(); ApiResult::setContentValue($vals['diff'], 'body', $difftext); if (!$engine->wasCacheHit()) { $n++; } } } else { $vals['diff']['notcached'] = true; } } if ($anyHidden && $revision->isDeleted(Revision::DELETED_RESTRICTED)) { $vals['suppressed'] = true; } return $vals; }
function formatRevisionRow($row) { global $wgUser, $wgLang; $rev = new Revision($row); $stxt = ''; $last = $this->message['last']; $ts = wfTimestamp(TS_MW, $row->rev_timestamp); $checkBox = Xml::radio("mergepoint", $ts, false); $pageLink = $this->sk->makeKnownLinkObj($rev->getTitle(), htmlspecialchars($wgLang->timeanddate($ts)), 'oldid=' . $rev->getId()); if ($rev->isDeleted(Revision::DELETED_TEXT)) { $pageLink = '<span class="history-deleted">' . $pageLink . '</span>'; } # Last link if (!$rev->userCan(Revision::DELETED_TEXT)) { $last = $this->message['last']; } else { if (isset($this->prevId[$row->rev_id])) { $last = $this->sk->makeKnownLinkObj($rev->getTitle(), $this->message['last'], "diff=" . $row->rev_id . "&oldid=" . $this->prevId[$row->rev_id]); } } $userLink = $this->sk->revUserTools($rev); if (!is_null($size = $row->rev_len)) { $stxt = $this->sk->formatRevisionSize($size); } $comment = $this->sk->revComment($rev); return "<li>{$checkBox} ({$last}) {$pageLink} . . {$userLink} {$stxt} {$comment}</li>"; }
/** * @param Revision $rev * @returns string */ private function historyLine($rev) { global $wgLang; $date = $wgLang->timeanddate($rev->getTimestamp()); $difflink = $del = ''; // Live revisions if ($this->deleteKey == 'oldid') { $revlink = $this->skin->makeLinkObj($this->page, $date, 'oldid=' . $rev->getId()); $difflink = '(' . $this->skin->makeKnownLinkObj($this->page, wfMsgHtml('diff'), 'diff=' . $rev->getId() . '&oldid=prev') . ')'; // Archived revisions } else { $undelete = SpecialPage::getTitleFor('Undelete'); $target = $this->page->getPrefixedText(); $revlink = $this->skin->makeLinkObj($undelete, $date, "target={$target}×tamp=" . $rev->getTimestamp()); $difflink = '(' . $this->skin->makeKnownLinkObj($undelete, wfMsgHtml('diff'), "target={$target}&diff=prev×tamp=" . $rev->getTimestamp()) . ')'; } if ($rev->isDeleted(Revision::DELETED_TEXT)) { $revlink = '<span class="history-deleted">' . $revlink . '</span>'; $del = ' <tt>' . wfMsgHtml('deletedrev') . '</tt>'; if (!$rev->userCan(Revision::DELETED_TEXT)) { $revlink = '<span class="history-deleted">' . $date . '</span>'; $difflink = '(' . wfMsgHtml('diff') . ')'; } } return "<li> {$difflink} {$revlink} " . $this->skin->revUserLink($rev) . " " . $this->skin->revComment($rev) . "{$del}</li>"; }
/** * Wrap and format the given revision's comment block, if the current * user is allowed to view it. * * @param $rev Revision object * @param $local Boolean: whether section links should refer to local page * @param $isPublic Boolean: show only if all users can see it * @return String: HTML fragment */ static function revComment(Revision $rev, $local = false, $isPublic = false) { if ($rev->getRawComment() == "") { return ""; } if ($rev->isDeleted(Revision::DELETED_COMMENT) && $isPublic) { $block = " <span class=\"comment\">" . wfMsgHtml('rev-deleted-comment') . "</span>"; } elseif ($rev->userCan(Revision::DELETED_COMMENT)) { $block = self::commentBlock($rev->getComment(Revision::FOR_THIS_USER), $rev->getTitle(), $local); } else { $block = " <span class=\"comment\">" . wfMsgHtml('rev-deleted-comment') . "</span>"; } if ($rev->isDeleted(Revision::DELETED_COMMENT)) { return " <span class=\"history-deleted\">{$block}</span>"; } return $block; }
/** * Render the contribution of the pagerevision (time, bytes added/deleted, pagename comment) * @param Revision $rev */ protected function showContributionsRow(Revision $rev) { $user = $this->getUser(); $userId = $rev->getUser(Revision::FOR_THIS_USER, $user); if ($userId === 0) { $username = IP::prettifyIP($rev->getUserText(Revision::RAW)); $isAnon = true; } else { $username = $rev->getUserText(Revision::FOR_THIS_USER, $user); $isAnon = false; } // FIXME: Style differently user comment when this is the case if ($rev->userCan(Revision::DELETED_COMMENT, $user)) { $comment = $rev->getComment(Revision::FOR_THIS_USER, $user); $comment = $this->formatComment($comment, $this->title); } else { $comment = $this->msg('rev-deleted-comment')->plain(); } $ts = $rev->getTimestamp(); $this->renderListHeaderWhereNeeded($this->getLanguage()->userDate($ts, $this->getUser())); $ts = new MWTimestamp($ts); if ($rev->userCan(Revision::DELETED_TEXT, $user)) { $diffLink = SpecialPage::getTitleFor('MobileDiff', $rev->getId())->getLocalUrl(); } else { $diffLink = false; } // FIXME: Style differently user comment when this is the case if (!$rev->userCan(Revision::DELETED_USER, $user)) { $username = $this->msg('rev-deleted-user')->plain(); } $bytes = null; if (isset($this->prevLengths[$rev->getParentId()])) { $bytes = $rev->getSize() - $this->prevLengths[$rev->getParentId()]; } $isMinor = $rev->isMinor(); $this->renderFeedItemHtml($ts, $diffLink, $username, $comment, $rev->getTitle(), $isAnon, $bytes, $isMinor); }
/** * 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 Revision $rev * @return string HTML fragment */ function revDeleteLink($rev) { $canHide = $this->getUser()->isAllowed('deleterevision'); if ($canHide || $rev->getVisibility() && $this->getUser()->isAllowed('deletedhistory')) { if (!$rev->userCan(Revision::DELETED_RESTRICTED)) { $revdlink = 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' => $this->mTargetObj->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' => $this->mTargetObj->getPrefixedDBkey(), 'ids' => $rev->getTimestamp()); } return Linker::revDeleteLink($query, $rev->isDeleted(File::DELETED_RESTRICTED), $canHide); } } else { return ''; } }
/** * Wrap and format the given revision's comment block, if the current * user is allowed to view it. * * @param Revision $rev * @param bool $local Whether section links should refer to local page * @return string HTML */ function revComment(Revision $rev, $local = false) { if ($rev->userCan(Revision::DELETED_COMMENT)) { $block = $this->commentBlock($rev->getRawComment(), $rev->getTitle(), $local); } else { $block = " <span class=\"comment\">" . wfMsgHtml('rev-deleted-comment') . "</span>"; } if ($rev->isDeleted(Revision::DELETED_COMMENT)) { return " <span class=\"history-deleted\">{$block}</span>"; } return $block; }
/** * Get a header for a specified revision. * * @param $rev Revision * @param $complete String: 'complete' to get the header wrapped depending * the visibility of the revision and a link to edit the page. * @return String HTML fragment */ private function getRevisionHeader(Revision $rev, $complete = '') { $lang = $this->getLanguage(); $user = $this->getUser(); $revtimestamp = $rev->getTimestamp(); $timestamp = $lang->userTimeAndDate($revtimestamp, $user); $dateofrev = $lang->userDate($revtimestamp, $user); $timeofrev = $lang->userTime($revtimestamp, $user); $header = $this->msg($rev->isCurrent() ? 'currentrev-asof' : 'revisionasof', $timestamp, $dateofrev, $timeofrev)->escaped(); if ($complete !== 'complete') { return $header; } $title = $rev->getTitle(); $header = Linker::linkKnown($title, $header, array(), array('oldid' => $rev->getID())); if ($rev->userCan(Revision::DELETED_TEXT, $user)) { $editQuery = array('action' => 'edit'); if (!$rev->isCurrent()) { $editQuery['oldid'] = $rev->getID(); } $msg = $this->msg($title->userCan('edit', $user) ? 'editold' : 'viewsourceold')->escaped(); /* Wikia Change begin */ $header .= ' <span class="mw-rev-head-action">(' . Linker::linkKnown($title, $msg, array(), $editQuery) . ')</span>'; /* Wikia Change end */ if ($rev->isDeleted(Revision::DELETED_TEXT)) { $header = Html::rawElement('span', array('class' => 'history-deleted'), $header); } } else { $header = Html::rawElement('span', array('class' => 'history-deleted'), $header); } return $header; }
/** * Generates each row in the contributions list. * * Contributions which are marked "top" are currently on top of the history. * For these contributions, a [rollback] link is shown for users with sysop * privileges. The rollback link restores the most recent version that was not * written by the target user. * * If the contributions page is called with the parameter &bot=1, all rollback * links also get that parameter. It causes the edit itself and the rollback * to be marked as "bot" edits. Bot edits are hidden by default from recent * changes, so this allows sysops to combat a busy vandal without bothering * other users. * * @todo This would probably look a lot nicer in a table. */ function ucListEdit($sk, $row) { $fname = 'ucListEdit'; wfProfileIn($fname); global $wgLang, $wgUser, $wgRequest; static $messages; if (!isset($messages)) { foreach (explode(' ', 'uctop diff newarticle rollbacklink diff hist minoreditletter') as $msg) { $messages[$msg] = wfMsgExt($msg, array('escape')); } } $rev = new Revision($row); $page = Title::makeTitle($row->page_namespace, $row->page_title); $link = $sk->makeKnownLinkObj($page); $difftext = $topmarktext = ''; if ($row->rev_id == $row->page_latest) { $topmarktext .= '<strong>' . $messages['uctop'] . '</strong>'; if (!$row->page_is_new) { $difftext .= '(' . $sk->makeKnownLinkObj($page, $messages['diff'], 'diff=0') . ')'; } else { $difftext .= $messages['newarticle']; } if ($wgUser->isAllowed('rollback')) { $extraRollback = $wgRequest->getBool('bot') ? '&bot=1' : ''; $extraRollback .= '&token=' . urlencode($wgUser->editToken(array($page->getPrefixedText(), $row->rev_user_text))); $topmarktext .= ' [' . $sk->makeKnownLinkObj($page, $messages['rollbacklink'], 'action=rollback&from=' . urlencode($row->rev_user_text) . $extraRollback) . ']'; } } if ($rev->userCan(Revision::DELETED_TEXT)) { $difftext = '(' . $sk->makeKnownLinkObj($page, $messages['diff'], 'diff=prev&oldid=' . $row->rev_id) . ')'; } else { $difftext = '(' . $messages['diff'] . ')'; } $histlink = '(' . $sk->makeKnownLinkObj($page, $messages['hist'], 'action=history') . ')'; $comment = $sk->revComment($rev); $d = $wgLang->timeanddate(wfTimestamp(TS_MW, $row->rev_timestamp), true); if ($rev->isDeleted(Revision::DELETED_TEXT)) { $d = '<span class="history-deleted">' . $d . '</span>'; } if ($row->rev_minor_edit) { $mflag = '<span class="minor">' . $messages['minoreditletter'] . '</span> '; } else { $mflag = ''; } $ret = "{$d} {$histlink} {$difftext} {$mflag} {$link} {$comment} {$topmarktext}"; if ($rev->isDeleted(Revision::DELETED_TEXT)) { $ret .= ' ' . wfMsgHtml('deletedrev'); } $ret = "<li>{$ret}</li>\n"; wfProfileOut($fname); return $ret; }
function formatRevisionRow($row) { $rev = new Revision($row); $stxt = ''; $last = $this->message['last']; $ts = wfTimestamp(TS_MW, $row->rev_timestamp); $checkBox = Xml::radio('mergepoint', $ts, false); $pageLink = Linker::linkKnown($rev->getTitle(), htmlspecialchars($this->getLanguage()->timeanddate($ts)), array(), array('oldid' => $rev->getId())); if ($rev->isDeleted(Revision::DELETED_TEXT)) { $pageLink = '<span class="history-deleted">' . $pageLink . '</span>'; } # Last link if (!$rev->userCan(Revision::DELETED_TEXT, $this->getUser())) { $last = $this->message['last']; } elseif (isset($this->prevId[$row->rev_id])) { $last = Linker::linkKnown($rev->getTitle(), $this->message['last'], array(), array('diff' => $row->rev_id, 'oldid' => $this->prevId[$row->rev_id])); } $userLink = Linker::revUserTools($rev); $size = $row->rev_len; if (!is_null($size)) { $stxt = Linker::formatRevisionSize($size); } $comment = Linker::revComment($rev); return "<li>{$checkBox} ({$last}) {$pageLink} . . {$userLink} {$stxt} {$comment}</li>"; }
public function canViewContent() { return $this->revision->userCan(Revision::DELETED_TEXT, $this->context->getUser()); }
/** * @brief Adjusting Special:Contributions * * @param ContribsPager $contribsPager * @param String $ret string passed to wgOutput * @param Object $row Std Object with values from database table * * @return true */ public function onContributionsLineEnding(&$contribsPager, &$ret, $row) { wfProfileIn(__METHOD__); $app = F::app(); if (isset($row->page_namespace) && in_array(MWNamespace::getSubject($row->page_namespace), $app->wg->WallNS)) { $topmarktext = ''; $rev = new Revision($row); $page = $rev->getTitle(); $page->resetArticleId($row->rev_page); $skin = $app->wg->User->getSkin(); $wfMsgOptsBase = $this->getMessageOptions(null, $row, true); $isThread = $wfMsgOptsBase['isThread']; $isNew = $wfMsgOptsBase['isNew']; $wfMsgOptsBase['createdAt'] = Xml::element('a', array('href' => $wfMsgOptsBase['articleUrl']), $app->wg->Lang->timeanddate($app->wf->Timestamp(TS_MW, $row->rev_timestamp), true)); if ($isNew) { $wfMsgOptsBase['DiffLink'] = $app->wf->Msg('diff'); } else { $query = array('diff' => 'prev', 'oldid' => $row->rev_id); $wfMsgOptsBase['DiffLink'] = Xml::element('a', array('href' => $rev->getTitle()->getLocalUrl($query)), $app->wf->Msg('diff')); } $wallMessage = F::build('WallMessage', array($page)); $historyLink = $wallMessage->getMessagePageUrl(true) . '?action=history'; $wfMsgOptsBase['historyLink'] = Xml::element('a', array('href' => $historyLink), $app->wf->Msg('hist')); // Don't show useless link to people who cannot hide revisions $canHide = $app->wg->User->isAllowed('deleterevision'); if ($canHide || $rev->getVisibility() && $app->wg->User->isAllowed('deletedhistory')) { if (!$rev->userCan(Revision::DELETED_RESTRICTED)) { $del = $skin->revDeleteLinkDisabled($canHide); // revision was hidden from sysops } else { $query = array('type' => 'revision', 'target' => $page->getPrefixedDbkey(), 'ids' => $rev->getId()); $del = $skin->revDeleteLink($query, $rev->isDeleted(Revision::DELETED_RESTRICTED), $canHide); } $del .= ' '; } else { $del = ''; } $ret = $del; if (wfRunHooks('WallContributionsLine', array(MWNamespace::getSubject($row->page_namespace), $wallMessage, $wfMsgOptsBase, &$ret))) { $wfMsgOpts = array($wfMsgOptsBase['articleUrl'], $wfMsgOptsBase['articleTitleTxt'], $wfMsgOptsBase['wallPageUrl'], $wfMsgOptsBase['wallPageName'], $wfMsgOptsBase['createdAt'], $wfMsgOptsBase['DiffLink'], $wfMsgOptsBase['historyLink']); if ($isThread && $isNew) { $wfMsgOpts[7] = Xml::element('strong', array(), wfMsg('newpageletter') . ' '); } else { $wfMsgOpts[7] = ''; } $ret .= $app->wf->Msg('wall-contributions-wall-line', $wfMsgOpts); } if (!$isNew) { $summary = $rev->getComment(); if (empty($summary)) { $msg = $app->wf->MsgForContent($this->getMessagePrefix($row->page_namespace) . '-edit'); } else { $msg = $app->wf->MsgForContent('wall-recentchanges-summary', $summary); } $ret .= ' ' . Xml::openElement('span', array('class' => 'comment')) . $msg . Xml::closeElement('span'); } } wfProfileOut(__METHOD__); return true; }
/** * Fetch revision text link if it's available to all users * * @param Revision $rev * @param Title $titleObj * @param string $ts Timestamp * @return string */ function getPageLink($rev, $titleObj, $ts) { $user = $this->getUser(); $time = $this->getLanguage()->userTimeAndDate($ts, $user); if (!$rev->userCan(Revision::DELETED_TEXT, $user)) { return '<span class="history-deleted">' . $time . '</span>'; } $link = Linker::linkKnown($titleObj, htmlspecialchars($time), array(), array('target' => $this->mTargetObj->getPrefixedText(), 'timestamp' => $ts)); if ($rev->isDeleted(Revision::DELETED_TEXT)) { $link = '<span class="history-deleted">' . $link . '</span>'; } return $link; }
/** * @param Revision $rev * @returns string */ private function historyLine($rev) { global $wgLang, $wgUser; $date = $wgLang->timeanddate($rev->getTimestamp()); $difflink = $del = ''; // Live revisions if ($this->deleteKey == 'oldid') { $tokenParams = '&unhide=1&token=' . urlencode($wgUser->editToken($rev->getId())); $revlink = $this->skin->makeLinkObj($this->page, $date, 'oldid=' . $rev->getId() . $tokenParams); $difflink = '(' . $this->skin->makeKnownLinkObj($this->page, wfMsgHtml('diff'), 'diff=' . $rev->getId() . '&oldid=prev' . $tokenParams) . ')'; // Archived revisions } else { $undelete = SpecialPage::getTitleFor('Undelete'); $target = $this->page->getPrefixedText(); $revlink = $this->skin->makeLinkObj($undelete, $date, "target={$target}×tamp=" . $rev->getTimestamp()); $difflink = '(' . $this->skin->makeKnownLinkObj($undelete, wfMsgHtml('diff'), "target={$target}&diff=prev×tamp=" . $rev->getTimestamp()) . ')'; } // Check permissions; items may be "suppressed" if ($rev->isDeleted(Revision::DELETED_TEXT)) { $revlink = '<span class="history-deleted">' . $revlink . '</span>'; $del = ' <tt>' . wfMsgHtml('deletedrev') . '</tt>'; if (!$rev->userCan(Revision::DELETED_TEXT)) { $revlink = '<span class="history-deleted">' . $date . '</span>'; $difflink = '(' . wfMsgHtml('diff') . ')'; } } $userlink = $this->skin->revUserLink($rev); $comment = $this->skin->revComment($rev); return "<li>{$difflink} {$revlink} {$userlink} {$comment}{$del}</li>"; }
function formatRevisionRow($row) { $rev = new Revision($row); $stxt = ''; $last = $this->msg('last')->escaped(); $ts = wfTimestamp(TS_MW, $row->rev_timestamp); $checkBox = Xml::radio('mergepoint', $ts, $this->mTimestamp === $ts); $user = $this->getUser(); $pageLink = Linker::linkKnown($rev->getTitle(), htmlspecialchars($this->getLanguage()->userTimeAndDate($ts, $user)), [], ['oldid' => $rev->getId()]); if ($rev->isDeleted(Revision::DELETED_TEXT)) { $pageLink = '<span class="history-deleted">' . $pageLink . '</span>'; } # Last link if (!$rev->userCan(Revision::DELETED_TEXT, $user)) { $last = $this->msg('last')->escaped(); } elseif (isset($this->prevId[$row->rev_id])) { $last = Linker::linkKnown($rev->getTitle(), $this->msg('last')->escaped(), [], ['diff' => $row->rev_id, 'oldid' => $this->prevId[$row->rev_id]]); } $userLink = Linker::revUserTools($rev); $size = $row->rev_len; if (!is_null($size)) { $stxt = Linker::formatRevisionSize($size); } $comment = Linker::revComment($rev); return Html::rawElement('li', [], $this->msg('mergehistory-revisionrow')->rawParams($checkBox, $last, $pageLink, $userLink, $stxt, $comment)->escaped()); }
/** * 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); } }
/** * Get a header for a specified revision. * * @param Revision $rev * @param string $complete 'complete' to get the header wrapped depending * the visibility of the revision and a link to edit the page. * * @return string HTML fragment */ protected function getRevisionHeader(Revision $rev, $complete = '') { $lang = $this->getLanguage(); $user = $this->getUser(); $revtimestamp = $rev->getTimestamp(); $timestamp = $lang->userTimeAndDate($revtimestamp, $user); $dateofrev = $lang->userDate($revtimestamp, $user); $timeofrev = $lang->userTime($revtimestamp, $user); $header = $this->msg($rev->isCurrent() ? 'currentrev-asof' : 'revisionasof', $timestamp, $dateofrev, $timeofrev)->escaped(); if ($complete !== 'complete') { return $header; } $title = $rev->getTitle(); $header = Linker::linkKnown($title, $header, array(), array('oldid' => $rev->getID())); if ($rev->userCan(Revision::DELETED_TEXT, $user)) { $editQuery = array('action' => 'edit'); if (!$rev->isCurrent()) { $editQuery['oldid'] = $rev->getID(); } $key = $title->quickUserCan('edit', $user) ? 'editold' : 'viewsourceold'; $msg = $this->msg($key)->escaped(); $editLink = $this->msg('parentheses')->rawParams(Linker::linkKnown($title, $msg, array(), $editQuery))->escaped(); $header .= ' ' . Html::rawElement('span', array('class' => 'mw-diff-edit'), $editLink); if ($rev->isDeleted(Revision::DELETED_TEXT)) { $header = Html::rawElement('span', array('class' => 'history-deleted'), $header); } } else { $header = Html::rawElement('span', array('class' => 'history-deleted'), $header); } return $header; }
/** * Create a diff-to-current link for this revision for this page * @param Revision $rev * @param Bool $latest, this is the latest revision of the page? * @returns string */ function curLink($rev, $latest) { $cur = $this->message['cur']; if ($latest || !$rev->userCan(Revision::DELETED_TEXT)) { return $cur; } else { return $this->mSkin->makeKnownLinkObj($this->mTitle, $cur, 'diff=' . $this->mTitle->getLatestRevID() . "&oldid=" . $rev->getId()); } }