Tchanders has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/374340 )

Change subject: VisualDiff: Don't diff close elements
......................................................................

VisualDiff: Don't diff close elements

Force the content diff to be balanced by removing
close elements prior to diffing, then re-inserting
afterwards.

Bug: T171862
Change-Id: I84aa157897ed5774b170e0dc4a3f7d264663c24d
---
M src/dm/ve.dm.VisualDiff.js
M src/ve.DiffMatchPatch.js
2 files changed, 42 insertions(+), 7 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/40/374340/1

diff --git a/src/dm/ve.dm.VisualDiff.js b/src/dm/ve.dm.VisualDiff.js
index 524cd89..022ee44 100644
--- a/src/dm/ve.dm.VisualDiff.js
+++ b/src/dm/ve.dm.VisualDiff.js
@@ -562,8 +562,7 @@
                                // Diff internal list items
                                diff = this.computeDiff(
                                        oldDocInternalListItems.toDiff,
-                                       newDocInternalListItems.toDiff,
-                                       this.internalListDiff
+                                       newDocInternalListItems.toDiff
                                );
 
                                // Check there actually are any changes
diff --git a/src/ve.DiffMatchPatch.js b/src/ve.DiffMatchPatch.js
index 3d20936..21f12b1 100644
--- a/src/ve.DiffMatchPatch.js
+++ b/src/ve.DiffMatchPatch.js
@@ -70,14 +70,31 @@
        return [];
 };
 
-ve.DiffMatchPatch.prototype.getCleanDiff = function () {
-       var diffs = this.diff_main.apply( this, arguments ),
+ve.DiffMatchPatch.prototype.getCleanDiff = function ( oldData, newData, 
options ) {
+       var cleanDiff, i, ilen, j,
                store = this.store,
                DIFF_DELETE = this.constructor.static.DIFF_DELETE,
                DIFF_INSERT = this.constructor.static.DIFF_INSERT,
                DIFF_EQUAL = this.constructor.static.DIFF_EQUAL,
                DIFF_CHANGE_DELETE = this.constructor.static.DIFF_CHANGE_DELETE,
                DIFF_CHANGE_INSERT = this.constructor.static.DIFF_CHANGE_INSERT;
+
+       /**
+        * Remove the close elements from the linear data, to force a balanced 
diff
+        *
+        * @param {Array} data Linear data
+        * @return {Array} Linear data without close elements
+        */
+       function removeCloseElements( data ) {
+               var i;
+               for ( i = 0; i < data.length; i++ ) {
+                       if ( data[ i ].type && data[ i ].type[ 0 ] === '/' ) {
+                               data.splice( i, 1 );
+                               i--;
+                       }
+               }
+               return data;
+       }
 
        /**
         * Get the index of the the first or last wordbreak in a data array
@@ -285,8 +302,8 @@
                        cleanDiff.push( [ DIFF_INSERT, insert ] );
                }
 
-               // Finally, go over any consecutive remove-inserts (also 
insert-removes?)
-               // and if they have the same character data, or are modified 
content nodes,
+               // Now go over any consecutive remove-inserts (also 
insert-removes?) and
+               // if they have the same character data, or are modified 
content nodes,
                // make them changes instead
                for ( i = 0, ilen = cleanDiff.length - 1; i < ilen; i++ ) {
                        aItem = cleanDiff[ i ];
@@ -345,5 +362,24 @@
                return cleanDiff;
        }
 
-       return getCleanDiff( diffs );
+       // Remove the close elements
+       oldData = removeCloseElements( oldData );
+       newData = removeCloseElements( newData );
+
+       // Get the diff
+       cleanDiff = getCleanDiff( this.diff_main( oldData, newData, options ) );
+
+       // Re-insert the close elements
+       for ( i = 0, ilen = cleanDiff.length; i < ilen; i++ ) {
+               for ( j = 0; j < cleanDiff[ i ][ 1 ].length; j++ ) {
+                       if ( cleanDiff[ i ][ 1 ][ j ].type ) {
+                               cleanDiff[ i ][ 1 ].splice( j + 1, 0, {
+                                       type: '/' + cleanDiff[ i ][ 1 ][ j 
].type
+                               } );
+                               j++;
+                       }
+               }
+       }
+
+       return cleanDiff;
 };

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I84aa157897ed5774b170e0dc4a3f7d264663c24d
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Tchanders <thalia.e.c...@googlemail.com>

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

Reply via email to