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

Reply via email to