Catrope has uploaded a new change for review.
https://gerrit.wikimedia.org/r/64613
Change subject: Add a transaction builder for replacing the contents of an
internal node
......................................................................
Add a transaction builder for replacing the contents of an internal node
Change-Id: I69d362c4694104313dd2634434eddfbaf9435b22
---
M modules/ve/dm/ve.dm.Transaction.js
M modules/ve/test/dm/ve.dm.Transaction.test.js
2 files changed, 57 insertions(+), 0 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor
refs/changes/13/64613/1
diff --git a/modules/ve/dm/ve.dm.Transaction.js
b/modules/ve/dm/ve.dm.Transaction.js
index 787cfd7..80b81a5 100644
--- a/modules/ve/dm/ve.dm.Transaction.js
+++ b/modules/ve/dm/ve.dm.Transaction.js
@@ -154,6 +154,29 @@
};
/**
+ * Generate a transaction that replaces the contents of an internal node.
+ *
+ * @param {ve.dm.Document} doc Document to create transaction for
+ * @param {ve.dm.InternalNode|ve.Range} nodeOrRange Internal node or inner
range of such
+ * @param {Array} newData Linear model data to replace the contents of the
internal node with
+ * @returns {ve.dm.Transaction} Transaction that replaces the contents of the
internal node
+ * @throws {Error} nodeOrRange must be a ve.dm.Node or a ve.Range
+ */
+ve.dm.Transaction.newFromInternalNodeReplacement = function ( doc,
nodeOrRange, newData ) {
+ var tx = new ve.dm.Transaction(), range = nodeOrRange;
+ if ( range instanceof ve.dm.Node ) {
+ range = range.getRange();
+ }
+ if ( !( range instanceof ve.Range ) ) {
+ throw new Error( 'nodeOrRange must be a ve.dm.Node or a
ve.Range' );
+ }
+ tx.pushRetain( range.start );
+ tx.pushReplace( doc, range.start, range.end - range.start, newData );
+ tx.pushRetain( doc.data.getLength() - range.end );
+ return tx;
+};
+
+/**
* Generate a transaction that changes an attribute.
*
* @static
diff --git a/modules/ve/test/dm/ve.dm.Transaction.test.js
b/modules/ve/test/dm/ve.dm.Transaction.test.js
index 7944daa..5311f27 100644
--- a/modules/ve/test/dm/ve.dm.Transaction.test.js
+++ b/modules/ve/test/dm/ve.dm.Transaction.test.js
@@ -661,6 +661,40 @@
runConstructorTests( assert, ve.dm.Transaction.newFromRemoval, cases );
} );
+QUnit.test( 'newFromInternalNodeReplacement', function ( assert ) {
+ var i, key, store, doc = ve.dm.example.createExampleDocument(
'internalData' ),
+ paragraph = [ { 'type': 'paragraph' }, 'H', 'e', 'l', 'l', 'o',
{ 'type': '/paragraph' } ],
+ secondNode = doc.internalList.getItemNode( 1 ),
+ cases = {
+ 'replacing first internal node with paragraph': {
+ 'args': [doc, new ve.Range( 7, 12 ), paragraph],
+ 'ops': [
+ { 'type': 'retain', 'length': 7 },
+ {
+ 'type': 'replace',
+ 'remove': doc.data.slice( 7, 12
),
+ 'insert': paragraph
+ },
+ { 'type': 'retain', 'length': 15 }
+ ]
+ },
+ 'replacing second internal node with two paragraphs': {
+ 'args': [doc, secondNode, paragraph.concat(
paragraph )],
+ 'ops': [
+ { 'type': 'retain', 'length': 14 },
+ {
+ 'type': 'replace',
+ 'remove':
doc.data.getDataSlice( secondNode.getRange() ),
+ 'insert': paragraph.concat(
paragraph )
+ },
+ { 'type': 'retain', 'length': 8 }
+ ]
+ }
+ };
+ QUnit.expect( ve.getObjectKeys( cases ).length );
+ runConstructorTests( assert,
ve.dm.Transaction.newFromInternalNodeReplacement, cases );
+} );
+
QUnit.test( 'newFromAttributeChange', function ( assert ) {
var doc = ve.dm.example.createExampleDocument(),
cases = {
--
To view, visit https://gerrit.wikimedia.org/r/64613
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I69d362c4694104313dd2634434eddfbaf9435b22
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Catrope <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits