Port getScope() from the old VE code and add tests for it

Change-Id: I8c34fed919e60fa1b8cb6a13cb9ca98f3e695421
This commit is contained in:
Catrope 2012-05-11 16:03:22 -07:00
parent 43c2393c03
commit 5b9a2645a6
2 changed files with 104 additions and 0 deletions

View file

@ -186,6 +186,39 @@ ve.dm.Document.containsElementData = function( data ) {
return false;
};
/**
* Get the parent node that would be affected by inserting given data into its child.
*
* This is used when inserting data that closes and reopens one or more parent nodes into a
* child node, which requires rebuilding at a higher level.
*
* @param {ve.Node} node Child node to start from
* @param {Array} data Data to inspect for closings
* @returns {ve.Node} Lowest level parent node being affected
*/
ve.dm.Document.getScope = function( node, data ) {
debugger;
var i,
length,
level = 0,
max = 0;
for ( i = 0, length = data.length; i < length; i++ ) {
if ( data[i].type ) {
level += data[i].type.charAt( 0 ) === '/' ? 1 : -1;
max = level > max ? level : max;
}
}
for ( i = 0; i < max; i++ ) {
// Skip over unwrapped parents, they're not counted in the level count
while ( !node.isWrapped() && node.getParent() ) {
node = node.getParent();
}
// Go up one level
node = node.getParent() || node;
}
return node;
};
/* Methods */
/**

View file

@ -180,6 +180,77 @@ test( 'containsElementData', 1, function() {
}
} );
test( 'getScope', function() {
var doc = new ve.dm.Document( ve.dm.example.data.slice( 0 ) );
var documentNode = doc.getDocumentNode();
var lookup = ve.example.lookupNode;
var cases = [
{
'msg': 'enclosed paragraph in a listItem',
// table/tableRow/tableCell/list/listItem
'node': lookup( documentNode, 1, 0, 0, 1, 0 ),
'data': [ { 'type': 'paragraph' }, 'A', { 'type': '/paragraph' } ],
// Same node
'expected': lookup( documentNode, 1, 0, 0, 1, 0 )
},
{
'msg': 'enclosed list in the document',
'node': documentNode,
'data': [
{ 'type': 'list', 'attributes': { 'style': 'bullet' } },
{ 'type': 'listItem' },
{ 'type': 'paragraph' },
'A',
{ 'type': '/paragraph' },
{ 'type': 'paragraph' },
'B',
{ 'type': '/paragraph' },
{ 'type': '/listItem' },
{ 'type': 'listItem' },
{ 'type': 'paragraph' },
'C',
{ 'type': 'image', 'attributes': { 'html/src': 'image.png' } },
{ 'type': '/image' },
'D',
{ 'type': '/paragraph' },
{ 'type': '/listItem' },
{ 'type': '/list' }
],
// Same node
'expected': documentNode
},
{
'msg': 'heading split',
// heading
'node': lookup( documentNode, 0 ),
'data': [
{ 'type': '/heading' },
{ 'type': 'heading', 'attributes': { 'level': 1 } }
],
'expected': documentNode
},
{
'msg': 'listItem split, passing textnode',
// table/tableRow/tableCell/list/listItem/paragraph/text
'node': lookup( documentNode, 1, 0, 0, 1, 0, 0, 0 ),
'data': [
{ 'type': '/paragraph' },
{ 'type': '/listItem' },
{ 'type': 'listItem' },
{ 'type': 'paragraph' }
],
// table/tableRow/tableCell/list
'expected': lookup( documentNode, 1, 0, 0, 1 )
}
];
for ( var i = 0; i < cases.length; i++ ) {
ok( ve.dm.Document.getScope( cases[i].node, cases[i].data ) === cases[i].expected,
cases[i].msg
);
}
} );
test( 'rebuildNodes', function() {
var doc = new ve.dm.Document( ve.dm.example.data.slice( 0 ) ),
documentNode = doc.getDocumentNode();