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