diff options
author | jenkins-bot <jenkins-bot@gerrit.wikimedia.org> | 2019-12-08 09:01:48 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@wikimedia.org> | 2019-12-08 09:01:48 +0000 |
commit | 554feecbb48002ed15fa66cd7635a3f69b1052f9 (patch) | |
tree | ed8a303f1b0cef91115b9176bf6caecbc55bb851 /includes | |
parent | 7d8e1a2b6ced8258e6ad95e68c59cff137fe54d3 (diff) | |
parent | 1c2de3d39759ccff5f987f9ec2208cd081d66630 (diff) | |
download | mediawikicore-554feecbb48002ed15fa66cd7635a3f69b1052f9.tar.gz mediawikicore-554feecbb48002ed15fa66cd7635a3f69b1052f9.zip |
Merge "Inline diffs upstreamed from MobileFrontend to core."
Diffstat (limited to 'includes')
-rw-r--r-- | includes/content/ContentHandler.php | 34 | ||||
-rw-r--r-- | includes/diff/DifferenceEngine.php | 21 | ||||
-rw-r--r-- | includes/diff/TextSlotDiffRenderer.php | 23 | ||||
-rw-r--r-- | includes/page/Article.php | 3 |
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(); |