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