https://www.mediawiki.org/wiki/Special:Code/MediaWiki/103466
Revision: 103466
Author: catrope
Date: 2011-11-17 15:01:47 +0000 (Thu, 17 Nov 2011)
Log Message:
-----------
Make selectNodes() also descend (recurse) into child nodes when only the start
or only the end is in the middle of a child node. Without this, it was stuff
like ranges with only openings and no closings.
Modified Paths:
--------------
trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js
trunk/extensions/VisualEditor/tests/es/es.DocumentBranchNode.test.js
Modified:
trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js
===================================================================
--- trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js
2011-11-17 14:50:38 UTC (rev 103465)
+++ trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js
2011-11-17 15:01:47 UTC (rev 103466)
@@ -301,7 +301,8 @@
end = range.end,
startInside,
endInside,
- childNode;
+ childNode,
+ result;
if ( start < 0 ) {
throw 'The start offset of the range is negative';
@@ -350,6 +351,7 @@
// Recurse into childNode
nodes = childNode.selectNodes( new es.Range(
start - left, end - left ) );
// Adjust globalRange
+ // TODO: do this with an extra parameter
for ( j = 0; j < nodes.length; j++ ) {
if ( nodes[j].globalRange !== undefined
) {
nodes[j].globalRange =
es.Range.newFromTranslatedRange( nodes[j].globalRange, left );
@@ -361,20 +363,44 @@
return nodes;
} else if ( startInside ) {
// The start is inside childNode but the end isn't
- // Add a range from the start of the range to the end
of childNode
- nodes.push( {
- 'node': childNode,
- 'range': new es.Range( start - left, right -
left ),
- 'globalRange': new es.Range( start, right )
- } );
+ if ( shallow || !childNode.children ) {
+ // Add a range from the start of the range to
the end of childNode
+ nodes.push( {
+ 'node': childNode,
+ 'range': new es.Range( start - left,
right - left ),
+ 'globalRange': new es.Range( start,
right )
+ } );
+ } else {
+ result = childNode.selectNodes( new es.Range(
start - left, right - left ) );
+ // Adjust globalRange
+ // TODO: do this with an extra parameter
+ for ( j = 0; j < result.length; j++ ) {
+ if ( result[j].globalRange !==
undefined ) {
+ result[j].globalRange =
es.Range.newFromTranslatedRange( result[j].globalRange, left );
+ }
+ }
+ nodes = nodes.concat( result );
+ }
} else if ( endInside ) {
// The end is inside childNode but the start isn't
- // Add a range from the start of childNode to the end
of the range
- nodes.push( {
- 'node': childNode,
- 'range': new es.Range( 0, end - left ),
- 'globalRange': new es.Range( left, end )
- } );
+ if ( shallow || !childNode.children ) {
+ // Add a range from the start of childNode to
the end of the range
+ nodes.push( {
+ 'node': childNode,
+ 'range': new es.Range( 0, end - left ),
+ 'globalRange': new es.Range( left, end )
+ } );
+ } else {
+ result = childNode.selectNodes( new es.Range(
0, end - left ) );
+ // Adjust globalRange
+ // TODO: do this with an extra parameter
+ for ( j = 0; j < result.length; j++ ) {
+ if ( result[j].globalRange !==
undefined ) {
+ result[j].globalRange =
es.Range.newFromTranslatedRange( result[j].globalRange, left );
+ }
+ }
+ nodes = nodes.concat( result );
+ }
// We've found the end, so we're done
return nodes;
} else if ( end == right + 1 ) {
Modified: trunk/extensions/VisualEditor/tests/es/es.DocumentBranchNode.test.js
===================================================================
--- trunk/extensions/VisualEditor/tests/es/es.DocumentBranchNode.test.js
2011-11-17 14:50:38 UTC (rev 103465)
+++ trunk/extensions/VisualEditor/tests/es/es.DocumentBranchNode.test.js
2011-11-17 15:01:47 UTC (rev 103466)
@@ -139,7 +139,7 @@
}
} );
-test( 'es.DocumentBranchNode.selectNodes', 75, function() {
+test( 'es.DocumentBranchNode.selectNodes', 77, function() {
// selectNodes tests
@@ -839,7 +839,7 @@
'input': new es.Range( 2, 10 ),
'output': [
{ 'node': big.children[0], 'range': new
es.Range( 1, 3 ), 'globalRange': new es.Range( 2, 4 ) },
- { 'node': big.children[1], 'range': new
es.Range( 0, 4 ), 'globalRange': new es.Range( 6, 10 ) }
+ { 'node':
big.children[1].children[0].children[0].children[0], 'range': new es.Range( 0,
1 ), 'globalRange': new es.Range( 9, 10 ) }
],
'desc': 'Select from before the b to after the d'
},
@@ -860,7 +860,8 @@
'input': new es.Range( 9, 20 ),
'output': [
{ 'node':
big.children[1].children[0].children[0].children[0], 'range': new es.Range( 0,
1 ), 'globalRange': new es.Range( 9, 10 ) },
- { 'node':
big.children[1].children[0].children[0].children[1], 'range': new es.Range( 0,
8 ), 'globalRange': new es.Range( 12, 20 ) }
+ { 'node':
big.children[1].children[0].children[0].children[1].children[0], 'globalRange':
new es.Range( 12, 17 ) },
+ { 'node':
big.children[1].children[0].children[0].children[1].children[1].children[0],
'range': new es.Range( 0, 1 ), 'globalRange': new es.Range( 19, 20 ) }
],
'desc': 'Select from before the d to after the f, with
recursion'
},
@@ -873,6 +874,27 @@
{ 'node': big.children[1], 'range': new
es.Range( 3, 14 ), 'globalRange': new es.Range( 9, 20 ) }
],
'desc': 'Select from before the d to after the f,
without recursion'
+ },
+ // Test 76
+ {
+ 'node': big,
+ 'input': new es.Range( 3, 9 ),
+ 'output': [
+ { 'node': big.children[0], 'range': new
es.Range( 2, 3 ), 'globalRange': new es.Range( 3, 4 ) },
+ { 'node':
big.children[1].children[0].children[0].children[0], 'range': new es.Range( 0,
0 ), 'globalRange': new es.Range( 9, 9 ) }
+ ],
+ 'desc': 'Select from before the c to before the d'
+ },
+ // Test 77
+ {
+ 'node': big,
+ 'input': new es.Range( 3, 9 ),
+ 'shallow': true,
+ 'output': [
+ { 'node': big.children[0], 'range': new
es.Range( 2, 3 ), 'globalRange': new es.Range( 3, 4 ) },
+ { 'node': big.children[1], 'range': new
es.Range( 0, 3 ), 'globalRange': new es.Range( 6, 9 ) }
+ ],
+ 'desc': 'Select from before the c to before the d,
without recursion'
}
];
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs