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 <roan.katt...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits