Tobias Gritschacher has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/55863


Change subject: (bug 46418) Claim Diff View for Qualifiers
......................................................................

(bug 46418) Claim Diff View for Qualifiers

Change-Id: I55cee5597d65ede5d9e3d73a85e55afa75f479a3
---
M lib/includes/ClaimDifferenceVisualizer.php
1 file changed, 85 insertions(+), 49 deletions(-)


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

diff --git a/lib/includes/ClaimDifferenceVisualizer.php 
b/lib/includes/ClaimDifferenceVisualizer.php
index 1efbf93..3c30d22 100644
--- a/lib/includes/ClaimDifferenceVisualizer.php
+++ b/lib/includes/ClaimDifferenceVisualizer.php
@@ -75,12 +75,18 @@
                        $html .= $this->visualizeRankChange( 
$claimDifference->getRankChange() );
                }
 
-               // TODO: html for qualifier changes
+               if ( $claimDifference->getQualifierChanges() !== null ) {
+                       $html .= $this->visualizeQualifierChanges(
+                               $claimDifference->getQualifierChanges(),
+                               $baseClaim
+                       );
+               }
 
                if ( $claimDifference->getReferenceChanges() !== null ) {
-                       $html .= $this->visualizeReferenceChanges(
+                       $html .= $this->visualizeSnakListChanges(
                                $claimDifference->getReferenceChanges(),
-                               $baseClaim
+                               $baseClaim,
+                               wfMessage( 'wikibase-diffview-reference' )
                        );
                }
 
@@ -143,9 +149,9 @@
        protected function visualizeMainSnakChange( $mainSnakChange ) {
                $valueFormatter = new DiffOpValueFormatter(
                        // todo: should show specific headers for both columns
-                       $this->getMainSnakHeader( 
$mainSnakChange->getNewValue() ),
-                       $this->getMainSnakValue( $mainSnakChange->getOldValue() 
),
-                       $this->getMainSnakValue( $mainSnakChange->getNewValue() 
)
+                       $this->getSnakHeader( $mainSnakChange->getNewValue() ),
+                       $this->getSnakValue( $mainSnakChange->getOldValue() ),
+                       $this->getSnakValue( $mainSnakChange->getNewValue() )
                );
 
                return $valueFormatter->generateHtml();
@@ -189,7 +195,7 @@
 
                if ( $newSnak instanceof Snak || $oldSnak instanceof Snak ) {
                        $headerSnak = $newSnak instanceof Snak ? $newSnak : 
$oldSnak;
-                       $snakHeader .= $this->getMainSnakHeader( $headerSnak );
+                       $snakHeader .= $this->getSnakHeader( $headerSnak );
                } else {
                        // something went wrong
                        throw new \MWException( 'Snak parameters not provided.' 
);
@@ -199,11 +205,11 @@
                $newValue = null;
 
                if ( $oldSnak instanceof Snak ) {
-                       $oldValue = $this->getMainSnakValue( $oldSnak );
+                       $oldValue = $this->getSnakValue( $oldSnak );
                }
 
                if ( $newSnak instanceof Snak ) {
-                       $newValue = $this->getMainSnakValue( $newSnak );
+                       $newValue = $this->getSnakValue( $newSnak );
                }
 
                $valueFormatter = new DiffOpValueFormatter( $snakHeader, 
$oldValue, $newValue );
@@ -229,7 +235,7 @@
                        $values[] =
                                $this->getEntityLabel( $snak->getPropertyId() ) 
.
                                ': '.
-                               $this->getMainSnakValue( $snak );
+                               $this->getSnakValue( $snak );
                }
 
                return $values;
@@ -240,12 +246,12 @@
         *
         * @since 0.4
         *
-        * @param Snak $mainSnak
+        * @param Snak $snak
         *
         * @return string
         */
-       protected function getMainSnakHeader( Snak $mainSnak ) {
-               $propertyId = $mainSnak->getPropertyId();
+       protected function getSnakHeader( Snak $snak ) {
+               $propertyId = $snak->getPropertyId();
                $propertyLabel = $this->getEntityLabel( $propertyId );
                $headerText = wfMessage( 'wikibase-entity-property' ) . ' / ' . 
$propertyLabel;
 
@@ -253,7 +259,7 @@
        }
 
        /**
-        * Get main snak value in string form
+        * Get snak value in string form
         *
         * @since 0.4
         *
@@ -261,7 +267,7 @@
         *
         * @return string
         */
-       protected function getMainSnakValue( Snak $snak ) {
+       protected function getSnakValue( Snak $snak ) {
                $snakType = $snak->getType();
 
                if ( $snakType === 'value' ) {
@@ -306,73 +312,103 @@
        }
 
        /**
-        * Get Html for reference changes
+        * Get Html for snaklist changes
         *
         * @since 0.4
         *
-        * @param Diff $referenceChanges
+        * @param Diff[] $changes
         * @param Claim $claim
         *
         * @return string
         */
-       protected function visualizeReferenceChanges( Diff $referenceChanges, 
Claim $claim ) {
+       protected function visualizeSnakListChanges( Diff $changes, Claim 
$claim, $breadcrumb ) {
                $html = '';
 
                $claimMainSnak = $claim->getMainSnak();
-               $claimHeader = $this->getMainSnakHeader( $claimMainSnak );
+               $claimHeader = $this->getSnakHeader( $claimMainSnak );
+               $newVal = $oldVal = null;
 
-               $newRef = $oldRef = null;
-
-               // Because references only have hashes and no ids,
-               // changing a reference value is treated as a diffop add and 
diffop remove;
-               // For diff visualization, it should be more like a change
-               // @todo assert that both reference changes refer to the same 
reference
-               foreach( $referenceChanges as $referenceChange ) {
-                       if ( $referenceChange instanceof \Diff\DiffOpAdd ) {
-                               $newRef = $this->getSnakListValues( 
$referenceChange->getNewValue()->getSnaks() );
-                       } else if ( $referenceChange instanceof 
\Diff\DiffOpRemove ) {
-                               $oldRef = $this->getSnakListValues( 
$referenceChange->getOldValue()->getSnaks() );
-                       } else if ( $referenceChange instanceof 
\Diff\DiffOpChange ) {
-                               $oldRef = $this->getSnakListValues( 
$referenceChange->getOldValue()->getSnaks() );
-                               $newRef = $this->getSnakListValues( 
$referenceChange->getNewValue()->getSnaks() );
+               foreach( $changes as $change ) {
+                       if ( $change instanceof \Diff\DiffOpAdd ) {
+                               $newVal = $this->getSnakListValues( 
$change->getNewValue()->getSnaks() );
+                       } else if ( $change instanceof \Diff\DiffOpRemove ) {
+                               $oldVal = $this->getSnakListValues( 
$change->getOldValue()->getSnaks() );
+                       } else if ( $change instanceof \Diff\DiffOpChange ) {
+                               $oldVal = $this->getSnakListValues( 
$change->getOldValue()->getSnaks() );
+                               $newVal = $this->getSnakListValues( 
$change->getNewValue()->getSnaks() );
                        } else {
                                // something went wrong, never should happen
-                               throw new \MWException( 'There are no 
references in the reference change.' );
+                               throw new \MWException( 'Unknown change 
operation.' );
                        }
 
                        $valueFormatter = new DiffOpValueFormatter(
-                               $claimHeader . ' / ' . wfMessage( 
'wikibase-diffview-reference' ),
-                               $oldRef,
-                               $newRef
+                               $claimHeader . ' / ' . $breadcrumb,
+                               $oldVal,
+                               $newVal
                        );
 
-                       $oldRef = $newRef = null;
-
+                       $oldVal = $newVal = null;
                        $html .= $valueFormatter->generateHtml();
-
                }
 
                return $html;
        }
-
+       
        /**
-        * Format diff header for a reference
+        * Get Html for qualifier changes
         *
         * @since 0.4
         *
-        * @param Reference $ref
+        * @param Diff[] $changes
+        * @param Claim $claim
         *
         * @return string
         */
-       protected function getRefHeader( $ref ) {
-               $headerSnaks = $ref->getSnaks();
+       protected function visualizeQualifierChanges( Diff $changes, Claim 
$claim ) {
+               $html = '';
 
-               foreach( $headerSnaks as $headerSnak ) {
-                       $header = $this->getMainSnakHeader( $headerSnak );
-                       break;
+               $claimMainSnak = $claim->getMainSnak();
+               $claimHeader = $this->getSnakHeader( $claimMainSnak );
+               $newVal = $oldVal = null;
+
+               foreach( $changes as $change ) {
+                       // TODO: change hardcoded ": " so something like 
wfMessage( 'colon-separator' ),
+                       // but this will require further refactoring as it 
would add HTML which gets escaped
+                       if ( $change instanceof \Diff\DiffOpAdd ) {
+                               $newVal =
+                                       $this->getEntityLabel( 
$change->getNewValue()->getPropertyId() ) .
+                                       ': ' .
+                                       $this->getSnakValue( 
$change->getNewValue() );
+                       } else if ( $change instanceof \Diff\DiffOpRemove ) {
+                               $oldVal =
+                                       $this->getEntityLabel( 
$change->getOldValue()->getPropertyId() ) .
+                                       ': ' .
+                                       $this->getSnakValue( 
$change->getOldValue() );
+                       } else if ( $change instanceof \Diff\DiffOpChange ) {
+                               $oldVal =
+                                       $this->getEntityLabel( 
$change->getOldValue()->getPropertyId() ) .
+                                       ': ' .
+                                       $this->getSnakValue( 
$change->getOldValue() );
+                               $newVal =
+                                       $this->getEntityLabel( 
$change->getNewValue()->getPropertyId() ) .
+                                       ': ' .
+                                       $this->getSnakValue( 
$change->getNewValue() );
+                       } else {
+                               // something went wrong, never should happen
+                               throw new \MWException( 'Unknown change 
operation.' );
+                       }
+
+                       $valueFormatter = new DiffOpValueFormatter(
+                                       $claimHeader . ' / ' . wfMessage( 
'wikibase-diffview-qualifier' ),
+                                       $oldVal,
+                                       $newVal
+                       );
+
+                       $oldVal = $newVal = null;
+                       $html .= $valueFormatter->generateHtml();
                }
 
-               return $header;
+               return $html;
        }
 
 }

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I55cee5597d65ede5d9e3d73a85e55afa75f479a3
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Tobias Gritschacher <tobias.gritschac...@wikimedia.de>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to