Esanders has uploaded a new change for review.

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

Change subject: Add #hasContent method to ElementLinearData
......................................................................

Add #hasContent method to ElementLinearData

Optimises data count > 2 by stopping as soon as the count exceeds 2.

Change-Id: I79a97e2f3f6882f9cf5ee631eb57ba88e3b5641c
---
M src/dm/lineardata/ve.dm.ElementLinearData.js
M tests/dm/lineardata/ve.dm.ElementLinearData.test.js
2 files changed, 73 insertions(+), 4 deletions(-)


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

diff --git a/src/dm/lineardata/ve.dm.ElementLinearData.js 
b/src/dm/lineardata/ve.dm.ElementLinearData.js
index 89e5b1b..0833f3b 100644
--- a/src/dm/lineardata/ve.dm.ElementLinearData.js
+++ b/src/dm/lineardata/ve.dm.ElementLinearData.js
@@ -1043,9 +1043,10 @@
 /**
  * Counts all elements that aren't between internalList and /internalList
  *
+ * @param {number} [limit] Number of elements after which to stop counting
  * @returns {number} Number of elements that aren't in an internalList
  */
-ve.dm.ElementLinearData.prototype.countNonInternalElements = function () {
+ve.dm.ElementLinearData.prototype.countNonInternalElements = function ( limit 
) {
        var i, l, type,
                internalDepth = 0,
                count = 0;
@@ -1059,7 +1060,21 @@
                        }
                } else if ( !internalDepth ) {
                        count++;
+                       if ( limit && count >= limit ) {
+                               return count;
+                       }
                }
        }
        return count;
 };
+
+/**
+ * Counts all elements that aren't between internalList and /internalList
+ *
+ * @returns {number} Number of elements that aren't in an internalList
+ */
+ve.dm.ElementLinearData.prototype.hasContent = function () {
+       // Two or less elements (<p>, </p>) is considered an empty document
+       // For performance, abort the count when we reach 3.
+       return this.countNonInternalElements( 3 ) > 2;
+};
diff --git a/tests/dm/lineardata/ve.dm.ElementLinearData.test.js 
b/tests/dm/lineardata/ve.dm.ElementLinearData.test.js
index c463d0d..e95502a 100644
--- a/tests/dm/lineardata/ve.dm.ElementLinearData.test.js
+++ b/tests/dm/lineardata/ve.dm.ElementLinearData.test.js
@@ -1550,7 +1550,7 @@
 } );
 
 QUnit.test( 'countNonInternalElements', function ( assert ) {
-       var i, d,
+       var i, data,
                cases = [
                        {
                                data: [
@@ -1584,8 +1584,62 @@
        QUnit.expect( cases.length );
 
        for ( i = 0; i < cases.length; i++ ) {
-               d = new ve.dm.ElementLinearData( new ve.dm.IndexValueStore(), 
cases[i].data );
-               assert.strictEqual( d.countNonInternalElements(), 
cases[i].expected, cases[i].msg );
+               data = new ve.dm.ElementLinearData( new 
ve.dm.IndexValueStore(), cases[i].data );
+               assert.strictEqual( data.countNonInternalElements(), 
cases[i].expected, cases[i].msg );
+       }
+} );
+
+QUnit.test( 'hasContent', function ( assert ) {
+       var i, data,
+               cases = [
+                       {
+                               data: [],
+                               expected: false,
+                               msg: 'Completely empty document has no content'
+                       },
+                       {
+                               data: [
+                                       { type: 'paragraph' },
+                                       { type: '/paragraph' },
+                                       { type: 'internalList' },
+                                       { type: '/internalList' }
+                               ],
+                               expected: false,
+                               msg: 'Real world empty document has no content'
+                       },
+                       {
+                               data: [
+                                       { type: 'paragraph' },
+                                       'F', [ 'o', [ 0 ] ], 'o',
+                                       { type: '/paragraph' },
+                                       { type: 'internalList' },
+                                       { type: '/internalList' }
+                               ],
+                               expected: true,
+                               msg: 'Document with text has content'
+                       },
+                       {
+                               data: [
+                                       { type: 'paragraph' },
+                                       { type: '/paragraph' },
+                                       { type: 'internalList' },
+                                       { type: 'internalItem' },
+                                       { type: 'paragraph' },
+                                       'a',
+                                       { type: '/paragraph' },
+                                       { type: '/internalItem' },
+                                       { type: '/internalList' }
+                               ],
+                               expected: false,
+                               msg: 'Empty document with internal data has no 
content'
+                       }
+               ];
+
+       QUnit.expect( cases.length );
+
+       for ( i = 0; i < cases.length; i++ ) {
+               data = new ve.dm.ElementLinearData( new 
ve.dm.IndexValueStore(), cases[i].data );
+               assert.strictEqual( data.hasContent(), cases[i].expected, 
cases[i].msg );
        }
 } );
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I79a97e2f3f6882f9cf5ee631eb57ba88e3b5641c
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to