aboutsummaryrefslogtreecommitdiffstats
path: root/includes
diff options
context:
space:
mode:
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>2019-12-08 09:01:48 +0000
committerGerrit Code Review <gerrit@wikimedia.org>2019-12-08 09:01:48 +0000
commit554feecbb48002ed15fa66cd7635a3f69b1052f9 (patch)
treeed8a303f1b0cef91115b9176bf6caecbc55bb851 /includes
parent7d8e1a2b6ced8258e6ad95e68c59cff137fe54d3 (diff)
parent1c2de3d39759ccff5f987f9ec2208cd081d66630 (diff)
downloadmediawikicore-554feecbb48002ed15fa66cd7635a3f69b1052f9.tar.gz
mediawikicore-554feecbb48002ed15fa66cd7635a3f69b1052f9.zip
Merge "Inline diffs upstreamed from MobileFrontend to core."
Diffstat (limited to 'includes')
-rw-r--r--includes/content/ContentHandler.php34
-rw-r--r--includes/diff/DifferenceEngine.php21
-rw-r--r--includes/diff/TextSlotDiffRenderer.php23
-rw-r--r--includes/page/Article.php3
4 files changed, 74 insertions, 7 deletions
diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php
index 7326b808b7fb..affaaef1210a 100644
--- a/includes/content/ContentHandler.php
+++ b/includes/content/ContentHandler.php
@@ -615,10 +615,11 @@ abstract class ContentHandler {
* Get an appropriate SlotDiffRenderer for this content model.
* @since 1.32
* @param IContextSource $context
+ * @param array $options of the slot diff renderer (optional)
* @return SlotDiffRenderer
*/
- final public function getSlotDiffRenderer( IContextSource $context ) {
- $slotDiffRenderer = $this->getSlotDiffRendererInternal( $context );
+ final public function getSlotDiffRenderer( IContextSource $context, array $options = [] ) {
+ $slotDiffRenderer = $this->getSlotDiffRendererWithOptions( $context, $options );
if ( get_class( $slotDiffRenderer ) === TextSlotDiffRenderer::class ) {
// To keep B/C, when SlotDiffRenderer is not overridden for a given content type
// but DifferenceEngine is, use that instead.
@@ -639,10 +640,28 @@ abstract class ContentHandler {
/**
* Return the SlotDiffRenderer appropriate for this content handler.
+ * @deprecated use getSlotDiffRendererWithOptions instead
* @param IContextSource $context
- * @return SlotDiffRenderer
+ * @return SlotDiffRenderer|null
*/
protected function getSlotDiffRendererInternal( IContextSource $context ) {
+ return null;
+ }
+
+ /**
+ * Return the SlotDiffRenderer appropriate for this content handler.
+ * @param IContextSource $context
+ * @param array $options
+ * @return SlotDiffRenderer
+ */
+ protected function getSlotDiffRendererWithOptions( IContextSource $context, $options = [] ) {
+ $internalRenderer = $this->getSlotDiffRendererInternal( $context );
+ // `getSlotDiffRendererInternal` has been overriden by a class using the deprecated method.
+ // Options will not work so exit early!
+ if ( $internalRenderer !== null ) {
+ return $internalRenderer;
+ }
+
$contentLanguage = MediaWikiServices::getInstance()->getContentLanguage();
$statsdDataFactory = MediaWikiServices::getInstance()->getStatsdDataFactory();
$slotDiffRenderer = new TextSlotDiffRenderer();
@@ -650,11 +669,18 @@ abstract class ContentHandler {
// XXX using the page language would be better, but it's unclear how that should be injected
$slotDiffRenderer->setLanguage( $contentLanguage );
+ $inline = ( $options['diff-type'] ?? '' ) === 'inline';
+ $engine = 'wikidiff2';
$engine = DifferenceEngine::getEngine();
+
if ( $engine === 'php' ) {
$slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_PHP );
} elseif ( $engine === 'wikidiff2' ) {
- $slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_WIKIDIFF2 );
+ if ( $inline ) {
+ $slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_WIKIDIFF2_INLINE );
+ } else {
+ $slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_WIKIDIFF2 );
+ }
} else {
$slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_EXTERNAL, $engine );
}
diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php
index 7a94194d0056..672052f76472 100644
--- a/includes/diff/DifferenceEngine.php
+++ b/includes/diff/DifferenceEngine.php
@@ -197,6 +197,11 @@ class DifferenceEngine extends ContextSource {
*/
protected $isSlotDiffRenderer = false;
+ /* A set of options that will be passed to the SlotDiffRenderer upon creation
+ * @var array
+ */
+ private $slotDiffOptions = [];
+
/** #@- */
/**
@@ -252,7 +257,12 @@ class DifferenceEngine extends ContextSource {
$this->slotDiffRenderers = array_map( function ( $contents ) {
/** @var Content $content */
$content = $contents['new'] ?: $contents['old'];
- return $content->getContentHandler()->getSlotDiffRenderer( $this->getContext() );
+ $context = $this->getContext();
+
+ return $content->getContentHandler()->getSlotDiffRenderer(
+ $context,
+ $this->slotDiffOptions
+ );
}, $slotContents );
}
return $this->slotDiffRenderers;
@@ -568,7 +578,7 @@ class DifferenceEngine extends ContextSource {
$rollback = '';
- $query = [];
+ $query = $this->slotDiffOptions;
# Carry over 'diffonly' param via navigation links
if ( $diffOnly != $user->getBoolOption( 'diffonly' ) ) {
$query['diffonly'] = $diffOnly;
@@ -1287,6 +1297,13 @@ class DifferenceEngine extends ContextSource {
}
/**
+ * @param array $options for the difference engine - accepts keys 'diff-type'
+ */
+ public function setSlotDiffOptions( $options ) {
+ $this->slotDiffOptions = $options;
+ }
+
+ /**
* Generate a diff, no caching.
*
* @since 1.21
diff --git a/includes/diff/TextSlotDiffRenderer.php b/includes/diff/TextSlotDiffRenderer.php
index ef8058cd4f16..a0eec4d56c73 100644
--- a/includes/diff/TextSlotDiffRenderer.php
+++ b/includes/diff/TextSlotDiffRenderer.php
@@ -42,6 +42,9 @@ class TextSlotDiffRenderer extends SlotDiffRenderer {
/** Use the wikidiff2 PHP module. */
const ENGINE_WIKIDIFF2 = 'wikidiff2';
+ /** Use the wikidiff2 PHP module. */
+ const ENGINE_WIKIDIFF2_INLINE = 'wikidiff2inline';
+
/** Use an external executable. */
const ENGINE_EXTERNAL = 'external';
@@ -58,6 +61,17 @@ class TextSlotDiffRenderer extends SlotDiffRenderer {
private $externalEngine;
/**
+ * @inheritDoc
+ * @return array
+ */
+ public function getExtraCacheKeys() {
+ // Tell DifferenceEngine this is a different variant from the standard wikidiff2 variant
+ return $this->engine === self::ENGINE_WIKIDIFF2_INLINE ? [
+ phpversion( 'wikidiff2' ), 'inline'
+ ] : [];
+ }
+
+ /**
* Convenience helper to use getTextDiff without an instance.
* @param string $oldText
* @param string $newText
@@ -85,7 +99,8 @@ class TextSlotDiffRenderer extends SlotDiffRenderer {
* @param string|null $executable Path to an external exectable, only when type is ENGINE_EXTERNAL.
*/
public function setEngine( $type, $executable = null ) {
- $engines = [ self::ENGINE_PHP, self::ENGINE_WIKIDIFF2, self::ENGINE_EXTERNAL ];
+ $engines = [ self::ENGINE_PHP, self::ENGINE_WIKIDIFF2, self::ENGINE_EXTERNAL,
+ self::ENGINE_WIKIDIFF2_INLINE ];
Assert::parameter( in_array( $type, $engines, true ), '$type',
'must be one of the TextSlotDiffRenderer::ENGINE_* constants' );
if ( $type === self::ENGINE_EXTERNAL ) {
@@ -248,6 +263,12 @@ class TextSlotDiffRenderer extends SlotDiffRenderer {
}
return $difftext;
+ } elseif ( $this->engine === self::ENGINE_WIKIDIFF2_INLINE ) {
+ // Note wikidiff2_inline_diff returns an element sans table.
+ // Due to the way other diffs work (return a table with before and after), we need to wrap
+ // the output in a row that spans the 4 columns that are expected, so that our diff appears in
+ // the correct place!
+ return '<tr><td colspan="4">' . wikidiff2_inline_diff( $oldText, $newText, 2 ) . '</td></tr>';
}
throw new LogicException( 'Invalid engine: ' . $this->engine );
}
diff --git a/includes/page/Article.php b/includes/page/Article.php
index 11c46a835e4f..87d041c0c4ed 100644
--- a/includes/page/Article.php
+++ b/includes/page/Article.php
@@ -948,6 +948,9 @@ class Article implements Page {
$purge,
$unhide
);
+ $de->setSlotDiffOptions( [
+ 'diff-type' => $request->getVal( 'diff-type' )
+ ] );
// DifferenceEngine directly fetched the revision:
$this->mRevIdFetched = $de->getNewid();