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

Revision: 110043
Author:   inez
Date:     2012-01-26 01:37:12 +0000 (Thu, 26 Jan 2012)
Log Message:
-----------
Basic support for "enter" key

Modified Paths:
--------------
    trunk/extensions/VisualEditor/contentEditable/main.js
    trunk/extensions/VisualEditor/contentEditable/views/es.ContentView.js
    trunk/extensions/VisualEditor/contentEditable/views/es.SurfaceView.js

Modified: trunk/extensions/VisualEditor/contentEditable/main.js
===================================================================
--- trunk/extensions/VisualEditor/contentEditable/main.js       2012-01-26 
01:02:18 UTC (rev 110042)
+++ trunk/extensions/VisualEditor/contentEditable/main.js       2012-01-26 
01:37:12 UTC (rev 110043)
@@ -15,6 +15,13 @@
                                                        }
                                                },
                                                {
+                                                       'type': 
'textStyle/italic',
+                                                       'range': {
+                                                               'start': 10,
+                                                               'end': 17
+                                                       }
+                                               },
+                                               {
                                                        'type': 
'object/template',
                                                        'data': {
                                                                'html': 
'<sup><small>[<a href="#">citation needed</a>]</small></sup>'
@@ -38,7 +45,7 @@
        window.surfaceModel = new es.SurfaceModel( window.documentModel );
        window.surfaceView = new es.SurfaceView( $( '#es-editor' ), 
window.surfaceModel );
 
-
+       /*
        $('#es-editor')[0].addEventListener("DOMSubtreeModified", function() {
                var selection = rangy.getSelection();
                console.log(selection);
@@ -51,6 +58,7 @@
                        console.log(selection);
                }
        });
+       */
 
 
        /*

Modified: trunk/extensions/VisualEditor/contentEditable/views/es.ContentView.js
===================================================================
--- trunk/extensions/VisualEditor/contentEditable/views/es.ContentView.js       
2012-01-26 01:02:18 UTC (rev 110042)
+++ trunk/extensions/VisualEditor/contentEditable/views/es.ContentView.js       
2012-01-26 01:37:12 UTC (rev 110043)
@@ -5,6 +5,14 @@
        // Properties
        this.$ = $container;
        this.model = model;
+       
+       if ( model ) {
+               // Events
+               var _this = this;
+               this.model.on( 'update', function( offset ) {
+                       _this.render( offset || 0 );
+               } );
+       }
 }
 
 

Modified: trunk/extensions/VisualEditor/contentEditable/views/es.SurfaceView.js
===================================================================
--- trunk/extensions/VisualEditor/contentEditable/views/es.SurfaceView.js       
2012-01-26 01:02:18 UTC (rev 110042)
+++ trunk/extensions/VisualEditor/contentEditable/views/es.SurfaceView.js       
2012-01-26 01:37:12 UTC (rev 110043)
@@ -13,34 +13,96 @@
        this.$.keydown( function(e) {
                return _this.onKeyDown( e );
        } );
-       
+
+       this.model.getDocument().on( 'update', function() {
+               _this.emit( 'update' );
+       } );
+
        this.documentView.renderContent();
 };
 
 es.SurfaceView.prototype.onKeyDown = function( e ) {
        if ( e.which == 13 ) {
                e.preventDefault();
-               
-               console.log(this.getSelection());
+               var range = this.getSelection();
+               if ( range.start === range.end ) {
+                       var tx = this.model.getDocument().prepareInsertion( 
range.start, [ { 'type': '/paragraph' }, { 'type': 'paragraph' } ]);
+                       this.model.transact( tx );
+               }
        }
 };
 
-es.SurfaceView.prototype.getSelection = function() {
-       var selection = rangy.getSelection();
-       
-       var node = selection.anchorNode;
-       var $node = $( node );
+es.SurfaceView.prototype.getOffset = function( localNode, localOffset ) {
+       var $node = $( localNode );
        while( !$node.hasClass( 'es-paragraphView' ) ) {
                $node = $node.parent();
        }
-       var $contents = $node.contents();
-       for( var i = 0; i < $contents.length; i++ ) {
-               if ( $contents[i] == node ) {
-                       console.log(node);
+       
+       var traverse = function( data, callback ) {
+               var current = [ data, 0 ];
+               var stack = [ current ];
+               
+               while ( stack.length > 0 ) {
+                       if ( current[1] >= current[0].length ) {
+                               stack.pop();
+                               current = stack[ stack.length - 1 ];
+                               continue;
+                       }
+                       var item = current[0][current[1]];
+                       var out = callback( item );
+                       /*
+                        *      -1 = stop traversing
+                        *       1 = deep traverse
+                        *       0 = skip deep traverse 
+                        */
+                       if ( out === -1 ) {
+                               return;
+                       } else if ( out === 1 && item.nodeType === 1 ) {
+                               stack.push( [ $(item).contents() , 0 ] );
+                               current[1]++;
+                               current = stack[stack.length-1];
+                               continue;
+                       }
+                       current[1]++;
                }
+       };
+       
+       var offset = 0;
+       
+       traverse( $node.contents(), function( item ) {
+               if ( item.nodeType === 3 ) {
+                       if ( item === localNode ) {
+                               offset += localOffset;
+                               return -1;
+                       } else {
+                               offset += item.textContent.length;
+                               
+                       }
+               } else {
+                       if ( $( item ).attr('contentEditable') === "false" ) {
+                               offset += 1;
+                               return 0;
+                       }
+               }
+               return 1;
+       } );
+
+       return offset + 1 + this.documentView.getOffsetFromNode( 
$node.data('view') );
+}
+
+es.SurfaceView.prototype.getSelection = function() {
+       var selection = rangy.getSelection();
+       
+       if ( selection.anchorNode === selection.focusNode && 
selection.anchorOffset === selection.focusOffset ) {
+               // only one offset
+               var offset = this.getOffset( selection.anchorNode, 
selection.anchorOffset );
+               return new es.Range( offset, offset );
+       } else {
+               // two offsets
+               var offset1 = this.getOffset( selection.anchorNode, 
selection.anchorOffset );
+               var offset2 = this.getOffset( selection.focusNode, 
selection.focusOffset );
+               return new es.Range( offset1, offset2 );
        }
-       
-       return 0;
 };
 
 /* Inheritance */


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to