https://www.mediawiki.org/wiki/Special:Code/MediaWiki/103478

Revision: 103478
Author:   catrope
Date:     2011-11-17 18:00:16 +0000 (Thu, 17 Nov 2011)
Log Message:
-----------
Add an extra offset parameter to selectNodes() and use it in the recursion, so 
the results of recursive calls don't need to have their globalRanges translated

Modified Paths:
--------------
    trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js

Modified: 
trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js
===================================================================
--- trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js     
2011-11-17 17:59:15 UTC (rev 103477)
+++ trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js     
2011-11-17 18:00:16 UTC (rev 103478)
@@ -282,11 +282,12 @@
  * @method
  * @param {es.Range} range Range to select nodes within
  * @param {Boolean} [shallow] Do not recurse into child nodes of child nodes
+ * @param {Number} [offset] Used for recursive invocations. Callers should not 
pass this parameter
  * @returns {Array} List of objects with 'node', 'range' and 'globalRange' 
properties describing nodes which are
  * covered by the range and the range within the node that is covered. If an 
entire node is covered, 'range' is
  * absent but 'globalRange' is still set
  */
-es.DocumentBranchNode.prototype.selectNodes = function( range, shallow ) {
+es.DocumentBranchNode.prototype.selectNodes = function( range, shallow, offset 
) {
        if ( typeof range === 'undefined' ) {
                range = new es.Range( 0, this.model.getContentLength() );
        } else {
@@ -301,8 +302,8 @@
                end = range.end,
                startInside,
                endInside,
-               childNode,
-               result;
+               childNode;
+       offset = offset || 0;
        
        if ( start < 0 ) {
                throw 'The start offset of the range is negative';
@@ -314,7 +315,7 @@
                if ( end > this.getContentLength() ) {
                        throw 'The end offset of the range is past the end of 
the node';
                }
-               return [{ 'node': this, 'range': new es.Range( start, end ), 
'globalRange': new es.Range( start, end ) }];
+               return [{ 'node': this, 'range': new es.Range( start, end ), 
'globalRange': new es.Range( start + offset, end + offset ) }];
        }
        
        // This node has children, loop over them
@@ -326,7 +327,7 @@
                
                if ( start == end && ( start == left - 1 || start == right + 1 
) ) {
                        // Empty range outside of any node
-                       return [{ 'node': this, 'range': new es.Range( start, 
end ), 'globalRange': new es.Range( start, end ) }];
+                       return [{ 'node': this, 'range': new es.Range( start, 
end ), 'globalRange': new es.Range( start + offset, end + offset ) }];
                }
                
                startInside = start >= left && start <= right; // is the start 
inside childNode?
@@ -344,19 +345,12 @@
                                        {
                                                'node': childNode,
                                                'range': new es.Range( start - 
left, end - left ),
-                                               'globalRange': new es.Range( 
start, end )
+                                               'globalRange': new es.Range( 
start + offset, end + offset )
                                        }
                                ];
                        } else {
                                // 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 );
-                                       }
-                               }
+                               nodes = childNode.selectNodes( new es.Range( 
start - left, end - left ), false, left + offset );
                        }
                        // Since the start and end are both inside childNode, 
we know for sure that we're
                        // done, so return
@@ -368,18 +362,10 @@
                                nodes.push( {
                                        'node': childNode,
                                        'range': new es.Range( start - left, 
right - left ),
-                                       'globalRange': new es.Range( start, 
right )
+                                       'globalRange': new es.Range( start + 
offset, right + offset )
                                } );
                        } 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 );
+                               nodes = nodes.concat( childNode.selectNodes( 
new es.Range( start - left, right - left ), false, left + offset ) );
                        }
                } else if ( endInside ) {
                        // The end is inside childNode but the start isn't
@@ -388,18 +374,10 @@
                                nodes.push( {
                                        'node': childNode,
                                        'range': new es.Range( 0, end - left ),
-                                       'globalRange': new es.Range( left, end )
+                                       'globalRange': new es.Range( left + 
offset, end + offset )
                                } );
                        } 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 );
+                               nodes = nodes.concat( childNode.selectNodes( 
new es.Range( 0, end - left ), false, left + offset ) );
                        }
                        // We've found the end, so we're done
                        return nodes;
@@ -407,19 +385,19 @@
                        // end is between childNode and this.children[i+1]
                        // start is not inside childNode, so the selection 
covers
                        // all of childNode, then ends
-                       nodes.push( { 'node': childNode, 'globalRange': new 
es.Range( left - 1, right + 1 ) } );
+                       nodes.push( { 'node': childNode, 'globalRange': new 
es.Range( left - 1 + offset, right + 1 + offset ) } );
                        // We've reached the end so we're done
                        return nodes;
                } else if ( start == left - 1 ) {
                        // start is between this.children[i-1] and childNode
                        // end is not inside childNode, so the selection covers
                        // all of childNode and more
-                       nodes.push( { 'node': childNode, 'globalRange': new 
es.Range( left - 1, right + 1 ) } );
+                       nodes.push( { 'node': childNode, 'globalRange': new 
es.Range( left - 1 + offset, right + 1 + offset ) } );
                } else if ( nodes.length > 0 ) {
                        // Neither the start nor the end is inside childNode, 
but nodes is non-empty,
                        // so childNode must be between the start and the end
                        // Add the entire node, so no range property
-                       nodes.push( { 'node': childNode, 'globalRange': new 
es.Range( left - 1, right + 1 ) } );
+                       nodes.push( { 'node': childNode, 'globalRange': new 
es.Range( left - 1 + offset, right + 1 + offset ) } );
                }
                
                // Move left to the start of this.children[i+1] for the next 
iteration


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to