In LogFormatter:
authorAaron Schulz <aaron@users.mediawiki.org>
Tue, 7 Feb 2012 23:12:17 +0000 (23:12 +0000)
committerAaron Schulz <aaron@users.mediawiki.org>
Tue, 7 Feb 2012 23:12:17 +0000 (23:12 +0000)
* Changed LogFormatter to support displaying redacting log items if the context user can see them. The default mode is still "show only public items".
* Fixed static calls to non-static getRestrictedElement() function.
* Cleaned up LogFormatter that build up vars only to then throw them away and replace them with rev-deleted placeholders.
In RevDel_LogItem:
* Use LogFormatter instead of raw LogPage::actionText call as such calls are broken and just displayed things like the string "move" (the log action name) instead of "x moved a to b: reason" and such. Fixes r96546.

includes/logging/LogFormatter.php
includes/revisiondelete/RevisionDelete.php

index cae6cb9..7c8645f 100644 (file)
@@ -16,6 +16,9 @@
  * @since 1.19
  */
 class LogFormatter {
+       // Audience options for viewing usernames, comments, and actions
+       const FOR_PUBLIC = 1;
+       const FOR_THIS_USER = 2;
 
        // Static->
 
@@ -59,6 +62,9 @@ class LogFormatter {
        /// @var LogEntry
        protected $entry;
 
+       /// Integer constant for handling log_deleted
+       protected $audience = self::FOR_PUBLIC;
+
        /// Whether to output user tool links
        protected $linkFlood = false;
 
@@ -84,6 +90,32 @@ class LogFormatter {
                $this->context = $context;
        }
 
+       /**
+        * Set the visibility restrictions for displaying content.
+        * If set to public, and an item is deleted, then it will be replaced 
+        * with a placeholder even if the context user is allowed to view it.
+        * @param $audience integer self::FOR_THIS_USER or self::FOR_PUBLIC
+        */
+       public function setAudience( $audience ) {
+               $this->audience = ( $audience == self::FOR_THIS_USER )
+                       ? self::FOR_THIS_USER 
+                       : self::FOR_PUBLIC;
+       }
+
+       /**
+        * Check if a log item can be displayed
+        * @param $field integer LogPage::DELETED_* constant
+        * @return bool 
+        */
+       protected function canView( $field ) {
+               if ( $this->audience == self::FOR_THIS_USER ) {
+                       return LogEventsList::userCanBitfield( 
+                               $this->entry->getDeleted(), $field, $this->context->getUser() );
+               } else {
+                       return !$this->entry->isDeleted( $field );
+               }
+       }
+
        /**
         * If set to true, will produce user tool links after
         * the user name. This should be replaced with generic
@@ -113,14 +145,17 @@ class LogFormatter {
         * @return string HTML
         */
        public function getActionText() {
-               $element = $this->getActionMessage();
-               if ( $element instanceof Message ) {
-                       $element = $this->plaintext ? $element->text() : $element->escaped();
-               }
-
-               if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
+               if ( $this->canView( LogPage::DELETED_ACTION ) ) {
+                       $element = $this->getActionMessage();
+                       if ( $element instanceof Message ) {
+                               $element = $this->plaintext ? $element->text() : $element->escaped();
+                       }
+                       if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
+                               $element = $this->styleRestricedElement( $element );
+                       }
+               } else {
                        $performer = $this->getPerformerElement() . $this->msg( 'word-separator' )->text();
-                       $element = $performer . self::getRestrictedElement( 'rev-deleted-event' );
+                       $element = $performer . $this->getRestrictedElement( 'rev-deleted-event' );
                }
 
                return $element;
@@ -239,11 +274,14 @@ class LogFormatter {
         * which parts of the log entry has been hidden.
         */
        public function getPerformerElement() {
-               $performer = $this->entry->getPerformer();
-               $element = $this->makeUserLink( $performer );
-
-               if ( $this->entry->isDeleted( LogPage::DELETED_USER ) ) {
-                       $element = self::getRestrictedElement( 'rev-deleted-user' );
+               if ( $this->canView( LogPage::DELETED_USER ) ) {
+                       $performer = $this->entry->getPerformer();
+                       $element = $this->makeUserLink( $performer );
+                       if ( $this->entry->isDeleted( LogPage::DELETED_USER ) ) {
+                               $element = $this->styleRestricedElement( $element );
+                       }
+               } else {
+                       $element = $this->getRestrictedElement( 'rev-deleted-user' );
                }
 
                return $element;
@@ -254,12 +292,15 @@ class LogFormatter {
         * @return string HTML
         */
        public function 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' );
+               if ( $this->canView( LogPage::DELETED_COMMENT ) ) {
+                       $comment = Linker::commentBlock( $this->entry->getComment() );
+                       // No hard coded spaces thanx
+                       $element = ltrim( $comment );
+                       if ( $this->entry->isDeleted( LogPage::DELETED_COMMENT ) ) {
+                               $element = $this->styleRestricedElement( $element );
+                       }
+               } else {
+                       $element = $this->getRestrictedElement( 'rev-deleted-comment' );
                }
 
                return $element;
@@ -268,7 +309,7 @@ class LogFormatter {
        /**
         * Helper method for displaying restricted element.
         * @param $message string
-        * @return string HTML
+        * @return string HTML or wikitext
         */
        protected function getRestrictedElement( $message ) {
                if ( $this->plaintext ) {
@@ -280,6 +321,19 @@ class LogFormatter {
                return Html::rawElement( 'span', $attribs, $content );
        }
 
+       /**
+        * Helper method for styling restricted element.
+        * @param $content string
+        * @return string HTML or wikitext
+        */
+       protected function styleRestricedElement( $content ) {
+               if ( $this->plaintext ) {
+                       return $content;
+               }
+               $attribs = array( 'class' => 'history-deleted' );
+               return Html::rawElement( 'span', $attribs, $content );
+       }
+
        /**
         * Shortcut for wfMessage which honors local context.
         * @todo Would it be better to require replacing the global context instead?
index c34b07c..6cee624 100644 (file)
@@ -848,8 +848,9 @@ class RevDel_LogItem extends RevDel_Item {
 
        public function getHTML() {
                $date = htmlspecialchars( $this->list->getLanguage()->timeanddate( $this->row->log_timestamp ) );
-               $paramArray = LogPage::extractParams( $this->row->log_params );
                $title = Title::makeTitle( $this->row->log_namespace, $this->row->log_title );
+               $formatter = LogFormatter::newFromRow( $this->row );
+               $formatter->setAudience( LogFormatter::FOR_THIS_USER );
 
                // Log link for this page
                $loglink = Linker::link(
@@ -858,27 +859,14 @@ class RevDel_LogItem extends RevDel_Item {
                        array(),
                        array( 'page' => $title->getPrefixedText() )
                );
-               // Action text
-               if( !$this->canView() ) {
-                       $action = '<span class="history-deleted">' . wfMsgHtml('rev-deleted-event') . '</span>';
-               } else {
-                       $skin = $this->list->getSkin();
-                       $action = LogPage::actionText( $this->row->log_type, $this->row->log_action,
-                               $title, $skin, $paramArray, true, true );
-                       if( $this->row->log_deleted & LogPage::DELETED_ACTION )
-                               $action = '<span class="history-deleted">' . $action . '</span>';
-               }
-               // User links
-               $userLink = Linker::userLink( $this->row->log_user,
-                       User::WhoIs( $this->row->log_user ) );
-               if( LogEventsList::isDeleted($this->row,LogPage::DELETED_USER) ) {
-                       $userLink = '<span class="history-deleted">' . $userLink . '</span>';
-               }
+               // User links and action text
+               $action = $formatter->getActionText();
                // Comment
                $comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
                if( LogEventsList::isDeleted($this->row,LogPage::DELETED_COMMENT) ) {
                        $comment = '<span class="history-deleted">' . $comment . '</span>';
                }
-               return "<li>($loglink) $date $userLink $action $comment</li>";
+
+               return "<li>($loglink) $date $action $comment</li>";
        }
 }