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

Revision: 113322
Author:   inez
Date:     2012-03-07 23:32:26 +0000 (Wed, 07 Mar 2012)
Log Message:
-----------
Added getDOMNodeAndOffset and showSelection methods to Surface. Ohhh and little 
wrapper around it - showCursor.

Modified Paths:
--------------
    trunk/extensions/VisualEditor/modules/ve/ce/ve.ce.Surface.js

Modified: trunk/extensions/VisualEditor/modules/ve/ce/ve.ce.Surface.js
===================================================================
--- trunk/extensions/VisualEditor/modules/ve/ce/ve.ce.Surface.js        
2012-03-07 23:23:50 UTC (rev 113321)
+++ trunk/extensions/VisualEditor/modules/ve/ce/ve.ce.Surface.js        
2012-03-07 23:32:26 UTC (rev 113322)
@@ -563,6 +563,70 @@
        }
 };
 
+ve.ce.Surface.prototype.getDOMNodeAndOffset = function( offset ) {
+       var     $node = this.documentView.getNodeFromOffset( offset ).$,
+               nodeOffset = this.documentView.getOffsetFromNode( 
$node.data('view') ) + 1,
+               current = [$node.contents(), 0],
+               stack = [current],
+               localNode,
+               localOffset;
+
+       while ( stack.length > 0 ) {
+               if ( current[1] >= current[0].length ) {
+                       stack.pop();
+                       current = stack[ stack.length - 1 ];
+                       continue;
+               }
+               var     item = current[0][current[1]],
+                       $item = current[0].eq( current[1] );
+               
+               if ( item.nodeType === 3 ) {
+                       var length = item.textContent.length;
+                       if ( offset >= nodeOffset && offset <= nodeOffset + 
length ) {
+                               return {
+                                       node: item,
+                                       offset: offset - nodeOffset
+                               };
+                               break;
+                       } else {
+                               nodeOffset += length;
+                       }
+               } else if ( item.nodeType === 1 ) {
+                       if ( $( item ).attr('contentEditable') === 'false' ) {
+                               nodeOffset += 1;
+                       } else {
+                               stack.push( [$item.contents(), 0] );
+                               current[1]++;
+                               current = stack[stack.length-1];
+                               continue;
+                       }
+               }
+               current[1]++;
+       }
+       return null;
+};
+
+
+/**
+ * @method
+ */
+ve.ce.Surface.prototype.showCursor = function( offset ) {
+       this.showSelection( new ve.Range( offset ) );
+};
+
+/**
+ * @method
+ */
+ve.ce.Surface.prototype.showSelection = function( range ) {
+       var     start = this.getDOMNodeAndOffset( range.start ),
+               stop = this.getDOMNodeAndOffset( range.end ),
+               range = rangy.createRange(),
+               sel = rangy.getSelection();
+       range.setStart( start.node, start.offset );
+       range.setEnd( stop.node, stop.offset );
+       sel.setSingleRange( range );
+};
+
 ve.ce.Surface.prototype.getLeafNode = function( elem ) {
        var     $node = $( elem );
        while( !$node.hasClass( 'ce-leafNode' ) ) {


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

Reply via email to