Matěj Suchánek has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/355799 )

Change subject: [WIP] [DNM] Support Wikibase changes in enhanced recent changes 
on clients
......................................................................

[WIP] [DNM] Support Wikibase changes in enhanced recent changes on clients

Bug: T46874
Change-Id: I62d1b4203a135d138f285e491865dec4717ae44e
---
M client/WikibaseClient.hooks.php
M client/WikibaseClient.php
A client/includes/Hooks/ChangesListLinesHandler.php
M client/includes/Hooks/ChangesListSpecialPageHookHandlers.php
M client/includes/RecentChanges/ChangeLineFormatter.php
5 files changed, 355 insertions(+), 81 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/99/355799/1

diff --git a/client/WikibaseClient.hooks.php b/client/WikibaseClient.hooks.php
index 646bbc0..860d25c 100644
--- a/client/WikibaseClient.hooks.php
+++ b/client/WikibaseClient.hooks.php
@@ -4,13 +4,11 @@
 
 use Action;
 use BaseTemplate;
-use ChangesList;
 use EchoEvent;
 use EditPage;
 use IContextSource;
 use OutputPage;
 use Parser;
-use RecentChange;
 use Skin;
 use StubObject;
 use Title;
@@ -24,8 +22,6 @@
 use Wikibase\Client\Hooks\EchoNotificationsHandlers;
 use Wikibase\Client\Hooks\EditActionHookHandler;
 use Wikibase\Client\Hooks\InfoActionHookHandler;
-use Wikibase\Client\RecentChanges\ChangeLineFormatter;
-use Wikibase\Client\RecentChanges\ExternalChangeFactory;
 use Wikibase\Client\Specials\SpecialPagesWithBadges;
 use Wikibase\Client\Specials\SpecialUnconnectedPages;
 use Wikibase\Client\Specials\SpecialEntityUsage;
@@ -79,59 +75,6 @@
                        $extraLibraries['mw.wikibase'] = 
Scribunto_LuaWikibaseLibrary::class;
                        $extraLibraries['mw.wikibase.entity'] = 
Scribunto_LuaWikibaseEntityLibrary::class;
                }
-
-               return true;
-       }
-
-       /**
-        * Hook for formatting recent changes linkes
-        * @see 
https://www.mediawiki.org/wiki/Manual:Hooks/OldChangesListRecentChangesLine
-        *
-        * @param ChangesList $changesList
-        * @param string $s
-        * @param RecentChange $rc
-        * @param string[] &$classes
-        *
-        * @return bool
-        */
-       public static function onOldChangesListRecentChangesLine( ChangesList 
&$changesList, &$s,
-               RecentChange $rc, &$classes = array() ) {
-
-               $type = $rc->getAttribute( 'rc_type' );
-
-               if ( $type == RC_EXTERNAL ) {
-                       $wikibaseClient = WikibaseClient::getDefaultInstance();
-                       $changeFactory = new ExternalChangeFactory(
-                               $wikibaseClient->getSettings()->getSetting( 
'repoSiteId' ),
-                               $wikibaseClient->getContentLanguage()
-                       );
-
-                       try {
-                               $externalChange = 
$changeFactory->newFromRecentChange( $rc );
-                       } catch ( UnexpectedValueException $ex ) {
-                               // @fixme use rc_source column to better 
distinguish
-                               // Wikibase changes vs. non-wikibase, and 
unexpected
-                               // stuff in Wikibase changes.
-                               wfWarn( 'Invalid or not a Wikibase change.' );
-                               return false;
-                       }
-
-                       // fixme: inject formatter and flags into a changes 
list formatter
-                       $formatter = new ChangeLineFormatter(
-                               $changesList->getUser(),
-                               $changesList->getLanguage(),
-                               $wikibaseClient->newRepoLinker()
-                       );
-
-                       $flag = $changesList->recentChangesFlags( array( 
'wikibase-edit' => true ), '' );
-                       $line = $formatter->format( $externalChange, 
$rc->getTitle(), $rc->counter, $flag );
-
-                       $classes[] = 'wikibase-edit';
-                       $s = $line;
-               }
-
-               // OutputPage will ignore multiple calls
-               $changesList->getOutput()->addModuleStyles( 
'wikibase.client.changeslist.css' );
 
                return true;
        }
diff --git a/client/WikibaseClient.php b/client/WikibaseClient.php
index 72c8be2..a37c3da 100644
--- a/client/WikibaseClient.php
+++ b/client/WikibaseClient.php
@@ -116,7 +116,15 @@
        // Hooks
        $wgHooks['UnitTestsList'][] = 
'\Wikibase\ClientHooks::registerUnitTests';
        $wgHooks['BaseTemplateToolbox'][] = 
'\Wikibase\ClientHooks::onBaseTemplateToolbox';
-       $wgHooks['OldChangesListRecentChangesLine'][] = 
'\Wikibase\ClientHooks::onOldChangesListRecentChangesLine';
+       $wgHooks['ChangesListInitRows'][] = 
'\Wikibase\Client\Hooks\ChangesListLinesHandler::onChangesListInitRows';
+       $wgHooks['OldChangesListRecentChangesLine'][] =
+               
'\Wikibase\Client\Hooks\ChangesListLinesHandler::onOldChangesListRecentChangesLine';
+       $wgHooks['EnhancedChangesListModifyLineData'][] =
+               
'\Wikibase\Client\Hooks\ChangesListLinesHandler::onEnhancedChangesListModifyLineData';
+       $wgHooks['EnhancedChangesListModifyBlockLineData'][] =
+               
'\Wikibase\Client\Hooks\ChangesListLinesHandler::onEnhancedChangesListModifyBlockLineData';
+       $wgHooks['EnhancedChangesList::getLogText'][] =
+               
'\Wikibase\Client\Hooks\ChangesListLinesHandler::onEnhancedChangesList_getLogText';
        $wgHooks['OutputPageParserOutput'][] = 
'\Wikibase\Client\Hooks\SidebarHookHandlers::onOutputPageParserOutput';
        $wgHooks['SkinTemplateGetLanguageLink'][] = 
'\Wikibase\Client\Hooks\SidebarHookHandlers::onSkinTemplateGetLanguageLink';
        $wgHooks['ContentAlterParserOutput'][] = 
'\Wikibase\Client\Hooks\ParserOutputUpdateHookHandlers::onContentAlterParserOutput';
@@ -275,7 +283,9 @@
        );
 
        $wgRecentChangesFlags['wikibase-edit'] = array(
+               //'legend' => '', "This edit comes from {{WBREPONAME}}"
                'letter' => 'wikibase-rc-wikibase-edit-letter',
-               'title' => 'wikibase-rc-wikibase-edit-title'
+               'title' => 'wikibase-rc-wikibase-edit-title',
+               'grouping' => 'all',
        );
 } );
diff --git a/client/includes/Hooks/ChangesListLinesHandler.php 
b/client/includes/Hooks/ChangesListLinesHandler.php
new file mode 100644
index 0000000..f0da512
--- /dev/null
+++ b/client/includes/Hooks/ChangesListLinesHandler.php
@@ -0,0 +1,247 @@
+<?php
+
+namespace Wikibase\Client\Hooks;
+
+use ChangesList;
+use EnhancedChangesList;
+use OldChangesList;
+use RecentChange;
+use ResultWrapper;
+use UnexpectedValueException;
+use Wikibase\Client\RecentChanges\ChangeLineFormatter;
+use Wikibase\Client\RecentChanges\ExternalChangeFactory;
+use Wikibase\Client\RecentChanges\RecentChangeFactory;
+use Wikibase\Client\WikibaseClient;
+
+class ChangesListLinesHandler {
+
+       /**
+        * @var ExternalChangeFactory
+        */
+       private $changeFactory;
+
+       /**
+        * @var ChangeLineFormatter
+        */
+       private $formatter;
+
+       /**
+        * @var self
+        */
+       private static $instance = null;
+
+       public function __construct( ExternalChangeFactory $changeFactory, 
ChangeLineFormatter $formatter ) {
+               $this->changeFactory = $changeFactory;
+               $this->formatter = $formatter;
+       }
+
+       /**
+        * @param ChangesList
+        * @return self
+        */
+       private static function newFromGlobalState( ChangesList $changesList ) {
+               $wikibaseClient = WikibaseClient::getDefaultInstance();
+               $changeFactory = new ExternalChangeFactory(
+                       $wikibaseClient->getSettings()->getSetting( 
'repoSiteId' ),
+                       $wikibaseClient->getContentLanguage()
+               );
+               $formatter = new ChangeLineFormatter(
+                       $changesList->getUser(),
+                       $changesList->getLanguage(),
+                       $wikibaseClient->newRepoLinker()
+               );
+               return new self( $changeFactory, $formatter );
+       }
+
+       /**
+        * @return self
+        */
+       private static function getInstance( $changesList ) {
+               if ( self::$instance === null ) {
+                       self::$instance = self::newFromGlobalState( 
$changesList );
+               }
+
+               return self::$instance;
+       }
+
+       /**
+        * @param RecentChange $rc
+        * @return bool
+        */
+       private static function isWikibaseChange( RecentChange $rc ) {
+               return $rc->getAttribute( 'rc_source' ) === 
RecentChangeFactory::SRC_WIKIBASE;
+       }
+
+       /**
+        * @param RecentChange[] $block
+        * @return bool
+        */
+       private static function areAllChangesWikibase( array $block ) {
+               return !in_array( false, array_map( 'self::isWikibaseChange', 
$block ) );
+       }
+
+       /**
+        * Hook for formatting recent changes links
+        * @see 
https://www.mediawiki.org/wiki/Manual:Hooks/OldChangesListRecentChangesLine
+        *
+        * @param OldChangesList &$changesList
+        * @param string &$s
+        * @param RecentChange $rc
+        * @param string[] &$classes
+        * @return bool
+        */
+       public static function onOldChangesListRecentChangesLine(
+               OldChangesList &$changesList,
+               &$s,
+               RecentChange $rc,
+               &$classes = []
+       ) {
+               $self = self::getInstance( $changesList );
+               return $self->doOldChangesListRecentChangesLine( $changesList, 
$s, $rc, $classes );
+       }
+
+       /**
+        * @param OldChangesList &$changesList
+        * @param string &$s
+        * @param RecentChange $rc
+        * @param string[] &$classes
+        * @return bool
+        */
+       public function doOldChangesListRecentChangesLine(
+               OldChangesList &$changesList,
+               &$s,
+               RecentChange $rc,
+               &$classes
+       ) {
+               if ( self::isWikibaseChange( $rc ) ) {
+                       try {
+                               $externalChange = 
$this->changeFactory->newFromRecentChange( $rc );
+                       } catch ( UnexpectedValueException $e ) {
+                               return false;
+                       }
+
+                       // fixme: inject formatter and flags into a changes 
list formatter
+                       $flag = $changesList->recentChangesFlags( [ 
'wikibase-edit' => true ], '' );
+                       $line = $this->formatter->format( $externalChange, 
$rc->getTitle(), $rc->counter, $flag );
+
+                       $s = $line;
+               }
+       }
+
+       /**
+        * @param EnhancedChangesList $changesList
+        * @param array &$data
+        * @param RecentChange $rc
+        * @return bool
+        */
+       public static function onEnhancedChangesListModifyBlockLineData(
+               EnhancedChangesList $changesList,
+               array &$data,
+               RecentChange $rc
+       ) {
+               $self = self::getInstance( $changesList );
+               return $self->doEnhancedChangesListModifyBlockLineData( 
$changesList, $data, $rc );
+       }
+
+       /**
+        * @param EnhancedChangesList $changesList
+        * @param array &$data
+        * @param RecentChange $rc
+        * @return bool
+        */
+       public function doEnhancedChangesListModifyBlockLineData(
+               EnhancedChangesList $changesList,
+               array &$data,
+               RecentChange $rc
+       ) {
+               $data['recentChangesFlags']['wikibase-edit'] = false;
+               if ( self::isWikibaseChange( $rc ) ) {
+                       try {
+                               $externalChange = 
$this->changeFactory->newFromRecentChange( $rc );
+                       } catch ( UnexpectedValueException $e ) {
+                               return false;
+                       }
+                       $this->formatter->formatDataForEnhancedBlockLine(
+                               $data,
+                               $externalChange,
+                               $rc->getTitle(),
+                               $rc->counter
+                       );
+               }
+       }
+
+       /**
+        * @param EnhancedChangesList $changesList
+        * @param array &$data
+        * @param RecentChange[] $block
+        * @param RecentChange $rc
+        * @param string[] &$classes
+        * @return bool
+        */
+       public static function onEnhancedChangesListModifyLineData(
+               EnhancedChangesList $changesList,
+               array &$data,
+               array $block,
+               RecentChange $rc,
+               array &$classes
+       ) {
+               $self = self::getInstance( $changesList );
+               return $self->doEnhancedChangesListModifyLineData( 
$changesList, $data, $block, $rc, $classes );
+       }
+
+       /**
+        * @param EnhancedChangesList $changesList
+        * @param array &$data
+        * @param RecentChange[] $block
+        * @param RecentChange $rc
+        * @param string[] &$classes
+        * @return bool
+        */
+       public function doEnhancedChangesListModifyLineData(
+               EnhancedChangesList $changesList,
+               array &$data,
+               array $block,
+               RecentChange $rc,
+               array &$classes
+       ) {
+               $data['recentChangesFlags']['wikibase-edit'] = false;
+               if ( self::isWikibaseChange( $rc ) ) {
+                       try {
+                               $externalChange = 
$this->changeFactory->newFromRecentChange( $rc );
+                       } catch ( UnexpectedValueException $e ) {
+                               return false;
+                       }
+                       $this->formatter->formatDataForEnhancedLine(
+                               $data,
+                               $externalChange,
+                               $rc->getTitle(),
+                               $rc->counter
+                       );
+               }
+       }
+
+       /**
+        * @param EnhancedChangesList $changesList
+        * @param HTML[] &$links
+        * @param RecentChange[] $block
+        */
+       public static function onEnhancedChangesList_getLogText(
+               EnhancedChangesList $changesList,
+               array &$links,
+               array $block
+       ) {
+               if ( self::areAllChangesWikibase( $block ) ) {
+                       // @todo
+                       $links = [];
+               }
+       }
+
+       /**
+        * @param ChangesList $changesList
+        * @param ResultWrapper|array $rows
+        */
+       public static function onChangesListInitRows( ChangesList $changesList, 
$rows ) {
+               $changesList->getOutput()->addModuleStyles( 
'wikibase.client.changeslist.css' );
+       }
+
+}
\ No newline at end of file
diff --git a/client/includes/Hooks/ChangesListSpecialPageHookHandlers.php 
b/client/includes/Hooks/ChangesListSpecialPageHookHandlers.php
index aa394dc..90307d9 100644
--- a/client/includes/Hooks/ChangesListSpecialPageHookHandlers.php
+++ b/client/includes/Hooks/ChangesListSpecialPageHookHandlers.php
@@ -225,6 +225,7 @@
                        },
                        'cssClassSuffix' => 'src-mw-wikibase',
                        'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                               // ChangesListLinesHandler::isWikibaseChange
                                return $rc->getAttribute( 'rc_source' ) === 
RecentChangeFactory::SRC_WIKIBASE;
                        }
                ] );
@@ -274,9 +275,7 @@
         * @return bool
         */
        protected function hasWikibaseChangesEnabled() {
-               // do not include wikibase changes for activated enhanced 
watchlist
-               // since we do not support that format yet (T46222)
-               return $this->showExternalChanges && 
!$this->isEnhancedChangesEnabled();
+               return $this->showExternalChanges;
        }
 
        /**
@@ -284,15 +283,6 @@
         */
        private function hasShowWikibaseEditsPrefEnabled() {
                return (bool)$this->user->getOption( $this->getOptionName() );
-       }
-
-       /**
-        * @return bool
-        */
-       private function isEnhancedChangesEnabled() {
-               $enhancedChangesUserOption = $this->user->getOption( 'usenewrc' 
);
-
-               return $this->request->getBool( 'enhanced', 
$enhancedChangesUserOption );
        }
 
        /**
diff --git a/client/includes/RecentChanges/ChangeLineFormatter.php 
b/client/includes/RecentChanges/ChangeLineFormatter.php
index 132c722..ded942e 100644
--- a/client/includes/RecentChanges/ChangeLineFormatter.php
+++ b/client/includes/RecentChanges/ChangeLineFormatter.php
@@ -71,7 +71,7 @@
                }
 
                $line .= $this->formatTimestamp( $rev->getTimestamp() );
-               $line .= $this->formatUserLinks( $rev->getUserName() );
+               $line .= implode( '', $this->formatUserLinks( 
$rev->getUserName() ) );
 
                $commentHtml = $rev->getCommentHtml();
 
@@ -82,6 +82,72 @@
                $line .= $this->wrapCommentBlock( $commentHtml );
 
                return $line;
+       }
+
+       /**
+        * @param array &$data
+        * @param ExternalChange $externalChange
+        * @param Title $title
+        */
+       private function formatCommonDataForEnhancedLine( array &$data, 
ExternalChange $externalChange, Title $title ) {
+               $entityId = $externalChange->getEntityId();
+               $rev = $externalChange->getRev();
+
+               $data['recentChangesFlags']['wikibase-edit'] = true;
+               $data['timestampLink'] = $this->buildPermanentLink( $entityId, 
$rev );
+
+               list( $data['userLink'], $data['userTalkLink'] ) = 
$this->formatUserLinks( $rev->getUserName() );
+
+               $commentHtml = $rev->getCommentHtml();
+               if ( $commentHtml === null || $commentHtml === '' ) {
+                       $commentHtml = Linker::formatComment( 
$rev->getComment(), $title, false, $externalChange->getSiteId() );
+               }
+               $data['comment'] = $this->wrapCommentBlock( $commentHtml );
+       }
+
+       /**
+        * @param array &$data
+        * @param ExternalChange $externalChange
+        * @param Title $title
+        * @param int $count
+        */
+       public function formatDataForEnhancedLine( array &$data, ExternalChange 
$externalChange, Title $title, $count ) {
+               $this->formatCommonDataForEnhancedLine( $data, $externalChange, 
$title );
+
+               $entityId = $externalChange->getEntityId();
+               $rev = $externalChange->getRev();
+
+               $data['currentAndLastLinks'] = ''
+                       . $this->repoLinker->buildEntityLink( $entityId )
+                       . wfMessage( 'word-separator' )->escaped()
+                       . $this->formatDiffHist( $entityId, $rev, $count );
+
+               $data['separatorAfterCurrentAndLastLinks'] = 
$this->changeSeparator();
+
+               unset( $data['characterDiff'] );
+               unset( $data['separatorAfterCharacterDiff'] );
+       }
+
+       /**
+        * @param array &$data
+        * @param ExternalChange $externalChange
+        * @param Title $title
+        * @param int $count
+        */
+       public function formatDataForEnhancedBlockLine( array &$data, 
ExternalChange $externalChange, Title $title, $count ) {
+               $this->formatCommonDataForEnhancedLine( $data, $externalChange, 
$title );
+
+               $entityId = $externalChange->getEntityId();
+               $rev = $externalChange->getRev();
+
+               $data['articleLink'] .= $this->formatEntityLink( $entityId );
+               $data['historyLink'] = ''
+                       . wfMessage( 'word-separator' )->escaped()
+                       . $this->formatDiffHist( $entityId, $rev, $count );
+
+               unset( $data['characterDiff'] );
+               // @fixme: this has different case than in 
formatDataForEnhancedLine
+               unset( $data['separatorAftercharacterDiff'] );
        }
 
        /**
@@ -117,7 +183,7 @@
        /**
         * @param string $userName
         *
-        * @return string HTML
+        * @return HTML[]
         */
        private function formatUserLinks( $userName ) {
                $links = $this->buildUserLinks( $userName );
@@ -134,17 +200,18 @@
         *
         * @param string[] $links
         *
-        * @return string HTML
+        * @return HTML[]
         */
        private function formatIpUserLinks( array $links ) {
-               $userlinks = $links['contribs'];
+               $ret = [];
 
-               $userlinks .= wfMessage( 'word-separator' )->plain()
+               $ret[] = $links['contribs'];
+               $ret[] .= wfMessage( 'word-separator' )->plain()
                        . wfMessage( 'parentheses' )->rawParams(
                                $links['usertalk']
                        )->text();
 
-               return $userlinks;
+               return $ret;
        }
 
        /**
@@ -152,24 +219,26 @@
         *
         * @param string[] $links
         *
-        * @return string HTML
+        * @return HTML[]
         */
        private function formatRegisteredUserLinks( array $links ) {
-               $userlinks = $links['user'];
+               $ret = [];
+
+               $ret[] = $links['user'];
 
                $usertools = array(
                        $links['usertalk'],
                        $links['contribs']
                );
 
-               $userlinks .= wfMessage( 'word-separator' )->plain()
+               $ret[] = wfMessage( 'word-separator' )->plain()
                        . '<span class="mw-usertoollinks">'
                        . wfMessage( 'parentheses' )->rawParams(
                                $this->lang->pipeList( $usertools )
                        )->text()
                        . '</span>';
 
-               return $userlinks;
+               return $ret;
        }
 
        /**
@@ -212,6 +281,21 @@
                )->text();
        }
 
+       private function buildPermanentLink( EntityId $entityId, RevisionData 
$rev ) {
+               $params = array(
+                       'title' => $this->repoLinker->getEntityTitle( $entityId 
),
+                       'curid' => $rev->getPageId(),
+                       'oldid' => $rev->getRevId()
+               );
+
+               $url = $this->repoLinker->addQueryParams( 
$this->repoLinker->getIndexUrl(), $params );
+
+               return $this->repoLinker->formatLink(
+                       $url,
+                       $this->lang->userTime( $rev->getTimestamp(), 
$this->user )
+               );
+       }
+
        /**
         * @param EntityId $entityId
         * @param RevisionData $rev

-- 
To view, visit https://gerrit.wikimedia.org/r/355799
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I62d1b4203a135d138f285e491865dec4717ae44e
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Matěj Suchánek <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to