$handler = $wgLogActionsHandlers[$wildcard];
}
- if ( $handler !== '' && class_exists( $handler ) ) {
+ if ( $handler !== '' && is_string( $handler ) && class_exists( $handler ) ) {
return new $handler( $entry );
}
/**
* Replace the default context
- * @param $context RequestContext
+ * @param $context IContextSource
*/
- public function setContext( RequestContext $context ) {
+ public function setContext( IContextSource $context ) {
$this->context = $context;
}
* @return Message|pre-escaped html
*/
protected function getActionMessage() {
- $message = $this->msg( $this->getMessageKey() );
+ $message = $this->msg( $this->getMessageKey() );
$message->params( $this->getMessageParameters() );
return $message;
}
/**
* Extract parameters intented for action message from
- * array of all parameters. The are three hardcoded
+ * array of all parameters. There are three hardcoded
* parameters (array zero-indexed, this list not):
* - 1: user name with premade link
* - 2: usable for gender magic function
* @return array
*/
protected function getMessageParameters() {
+ if ( isset( $this->parsedParameters ) ) {
+ return $this->parsedParameters;
+ }
+
$entry = $this->entry;
$params = array();
}
}
- return $params;
+ return $this->parsedParameters = $params;
}
/**
* @param $parameters array query parameters
* @return String
*/
- protected function makePageLink( Title $title, $parameters = array() ) {
+ protected function makePageLink( Title $title = null, $parameters = array() ) {
if ( !$this->plaintext ) {
$link = Linker::link( $title, null, array(), $parameters );
} else {
+ if ( !$title instanceof Title ) {
+ throw new MWException( "Expected title, got null" );
+ }
$link = '[[' . $title->getPrefixedText() . ']]';
}
return $link;
*/
public function getPerformerElement() {
$performer = $this->entry->getPerformer();
-
- if ( $this->plaintext ) {
- $element = $performer->getName();
- } else {
- $element = Linker::userLink(
- $performer->getId(),
- $performer->getName()
- );
-
- if ( $this->linkFlood ) {
- $element .= Linker::userToolLinks(
- $performer->getId(),
- $performer->getName(),
- true, // Red if no edits
- 0, // Flags
- $performer->getEditCount()
- );
- }
- }
+ $element = $this->makeUserLink( $performer );
if ( $this->entry->isDeleted( LogPage::DELETED_USER ) ) {
$element = self::getRestrictedElement( 'rev-deleted-user' );
* @return string HTML
*/
public function getComment() {
- $lang = $this->context->getLang();
- $element = $lang->getDirMark() . Linker::commentBlock( $this->entry->getComment() );
+ $comment = Linker::commentBlock( $this->entry->getComment() );
+ // No hard coded spaces thanx
+ $element = ltrim( $comment );
if ( $this->entry->isDeleted( LogPage::DELETED_COMMENT ) ) {
$element = self::getRestrictedElement( 'rev-deleted-comment' );
*/
protected function msg( $key ) {
return wfMessage( $key )
- ->inLanguage( $this->context->getLang() )
+ ->inLanguage( $this->context->getLanguage() )
->title( $this->context->getTitle() );
}
+ protected function makeUserLink( User $user ) {
+ if ( $this->plaintext ) {
+ $element = $user->getName();
+ } else {
+ $element = Linker::userLink(
+ $user->getId(),
+ $user->getName()
+ );
+
+ if ( $this->linkFlood ) {
+ $element .= Linker::userToolLinks(
+ $user->getId(),
+ $user->getName(),
+ true, // Red if no edits
+ 0, // Flags
+ $user->getEditCount()
+ );
+ }
+ }
+ return $element;
+ }
+
}
/**
return $params;
}
}
+
+/**
+ * This class formats delete log entries.
+ * @since 1.19
+ */
+class DeleteLogFormatter extends LogFormatter {
+ protected function getMessageKey() {
+ $key = parent::getMessageKey();
+ if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
+ if ( count( $this->getMessageParameters() ) < 5 ) {
+ return "$key-legacy";
+ }
+ }
+ return $key;
+ }
+
+ protected function getMessageParameters() {
+ if ( isset( $this->parsedParametersDeleteLog ) ) {
+ return $this->parsedParametersDeleteLog;
+ }
+
+ $params = parent::getMessageParameters();
+ $subtype = $this->entry->getSubtype();
+ if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
+ if (
+ ($subtype === 'event' && count( $params ) === 6 ) ||
+ ($subtype === 'revision' && isset( $params[3] ) && $params[3] === 'revision' )
+ ) {
+ $paramStart = $subtype === 'revision' ? 4 : 3;
+
+ $old = $this->parseBitField( $params[$paramStart+1] );
+ $new = $this->parseBitField( $params[$paramStart+2] );
+ list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
+ $changes = array();
+ foreach ( $hid as $v ) {
+ $changes[] = $this->msg( "$v-hid" )->plain();
+ }
+ foreach ( $unhid as $v ) {
+ $changes[] = $this->msg( "$v-unhid" )->plain();
+ }
+ foreach ( $extra as $v ) {
+ $changes[] = $this->msg( $v )->plain();
+ }
+ $changeText = $this->context->getLanguage()->listToText( $changes );
+
+
+ $newParams = array_slice( $params, 0, 3 );
+ $newParams[3] = $changeText;
+ $count = count( explode( ',', $params[$paramStart] ) );
+ $newParams[4] = $this->context->getLanguage()->formatNum( $count );
+ return $this->parsedParametersDeleteLog = $newParams;
+ } else {
+ return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
+ }
+ }
+
+ return $this->parsedParametersDeleteLog = $params;
+ }
+
+ protected function parseBitField( $string ) {
+ // Input is like ofield=2134 or just the number
+ if ( strpos( $string, 'field=' ) === 1 ) {
+ list( , $field ) = explode( '=', $string );
+ return (int) $field;
+ } else {
+ return (int) $string;
+ }
+ }
+}
+
+/**
+ * This class formats patrol log entries.
+ * @since 1.19
+ */
+class PatrolLogFormatter extends LogFormatter {
+ protected function getMessageKey() {
+ $key = parent::getMessageKey();
+ $params = $this->getMessageParameters();
+ if ( isset( $params[5] ) && $params[5] ) {
+ $key .= '-auto';
+ }
+ return $key;
+ }
+
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+ $newParams = array_slice( $params, 0, 3 );
+
+ $target = $this->entry->getTarget();
+ $oldid = $params[3];
+ $revision = $this->context->getLanguage()->formatNum( $oldid, true );
+
+ if ( $this->plaintext ) {
+ $revlink = $revision;
+ } elseif ( $target->exists() ) {
+ $query = array(
+ 'oldid' => $oldid,
+ 'diff' => 'prev'
+ );
+ $revlink = Linker::link( $target, htmlspecialchars( $revision ), array(), $query );
+ } else {
+ $revlink = htmlspecialchars( $revision );
+ }
+
+ $newParams[3] = Message::rawParam( $revlink );
+ return $newParams;
+ }
+}
+
+/**
+ * This class formats new user log entries.
+ * @since 1.19
+ */
+class NewUsersLogFormatter extends LogFormatter {
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+ if ( $this->entry->getSubtype() === 'create2' ) {
+ if ( isset( $params[3] ) ) {
+ $target = User::newFromId( $params[3] );
+ } else {
+ $target = User::newFromName( $this->entry->getTarget()->getText(), false );
+ }
+ $params[2] = Message::rawParam( $this->makeUserLink( $target ) );
+ $params[3] = $target->getName();
+ }
+ return $params;
+ }
+
+ public function getComment() {
+ $timestamp = wfTimestamp( TS_MW, $this->entry->getTimestamp() );
+ if ( $timestamp < '20080129000000' ) {
+ # Suppress $comment from old entries (before 2008-01-29),
+ # not needed and can contain incorrect links
+ return '';
+ }
+ return parent::getComment();
+ }
+}