https://www.mediawiki.org/wiki/Special:Code/MediaWiki/112868
Revision: 112868
Author: inez
Date: 2012-03-02 01:35:34 +0000 (Fri, 02 Mar 2012)
Log Message:
-----------
Added basic support for enter key
Modified Paths:
--------------
trunk/extensions/VisualEditor/modules/ve/ce/ve.es.Surface.js
Modified: trunk/extensions/VisualEditor/modules/ve/ce/ve.es.Surface.js
===================================================================
--- trunk/extensions/VisualEditor/modules/ve/ce/ve.es.Surface.js
2012-03-02 01:35:26 UTC (rev 112867)
+++ trunk/extensions/VisualEditor/modules/ve/ce/ve.es.Surface.js
2012-03-02 01:35:34 UTC (rev 112868)
@@ -69,7 +69,7 @@
this.poll = {
interval: null,
- frequency: 100,
+ frequency: 75,
node: null,
prevText: null,
prevHash: null,
@@ -217,6 +217,7 @@
}
if ( node !== this.poll.node ) {
+ // TODO: Read content from old node one more time
this.poll.node = node;
this.poll.prevText = text;
this.poll.prevHash = hash;
@@ -266,15 +267,7 @@
this.poll.prevText = text;
}
if ( hash !== this.poll.prevHash ) {
- console.log("hash mismatch", text, hash);
// TODO: redisplay cursor in correct position (with setTimeout)
- /*
- this.stopPolling();
- var _this = this;
- setTimeout(function() {
- _this.startPolling();
- }, 500);
- */
this.getLeafNode( this.poll.node ).data( 'view'
).renderContent();
this.poll.prevHash = hash;
}
@@ -284,6 +277,21 @@
ve.es.Surface.prototype.onKeyDown = function( e ) {
switch ( e.keyCode ) {
+ // Enter
+ case 13:
+ this.handleEnter();
+ e.preventDefault();
+ break;
+ // Backspace
+ case 8:
+ this.handleDelete( true );
+ e.preventDefault();
+ break;
+ // Delete
+ case 46:
+ this.handleDelete( false );
+ e.preventDefault();
+ break;
// Left arrow
case 37:
var rangySel = rangy.getSelection();
@@ -313,6 +321,12 @@
}
break;
}
+ /*
+ var range = this.getSelection();
+ if ( range.getLength() !== 0 ) {
+ e.preventDefault();
+ }
+ */
};
ve.es.Surface.prototype.getOffset = function( elem, offset, global ) {
@@ -408,17 +422,20 @@
};
ve.es.Surface.prototype.getSelection = function() {
- var rangySel = rangy.getSelection();
+ var rangySel = rangy.getSelection(),
+ range;
if ( rangySel.anchorNode === rangySel.focusNode &&
rangySel.anchorOffset === rangySel.focusOffset ) {
var offset = this.getOffset( rangySel.anchorNode,
rangySel.anchorOffset, true );
- return new ve.Range( offset, offset );
+ range = new ve.Range( offset, offset );
} else {
- return new ve.Range(
+ range = new ve.Range(
this.getOffset( rangySel.anchorNode,
rangySel.anchorOffset, true ),
this.getOffset( rangySel.focusNode,
rangySel.focusOffset, true )
);
}
+ range.normalize();
+ return range;
};
ve.es.Surface.prototype.getLeafNode = function( elem ) {
@@ -477,6 +494,143 @@
return ret;
};
+ve.es.Surface.prototype.handleDelete = function( backspace, isPartial ) {
+ this.stopPolling();
+ var selection = this.getSelection().clone(),
+ sourceOffset,
+ targetOffset,
+ sourceSplitableNode,
+ targetSplitableNode,
+ tx,
+ cursorAt;
+// this.resetText();
+ if ( selection.from === selection.to ) {
+ if ( backspace ) {
+ sourceOffset = selection.to;
+ targetOffset =
this.model.getDocument().getRelativeContentOffset(
+ sourceOffset,
+ -1
+ );
+ } else {
+ sourceOffset =
this.model.getDocument().getRelativeContentOffset(
+ selection.to,
+ 1
+ );
+ targetOffset = selection.to;
+ }
+
+ var sourceNode = this.documentView.getNodeFromOffset(
sourceOffset, false ),
+ targetNode = this.documentView.getNodeFromOffset(
targetOffset, false );
+
+ if ( sourceNode.model.getElementType() ===
targetNode.model.getElementType() ) {
+ sourceSplitableNode = ve.es.Node.getSplitableNode(
sourceNode );
+ targetSplitableNode = ve.es.Node.getSplitableNode(
targetNode );
+ }
+
+ cursorAt = targetOffset;
+
+ if ( sourceNode === targetNode ||
+ ( typeof sourceSplitableNode !== 'undefined' &&
+ sourceSplitableNode.getParent() ===
targetSplitableNode.getParent() ) ) {
+ tx = this.model.getDocument().prepareRemoval(
+ new ve.Range( targetOffset, sourceOffset )
+ );
+ this.model.transact( tx );
+ } else {
+ tx = this.model.getDocument().prepareInsertion(
+ targetOffset, sourceNode.model.getContentData()
+ );
+ this.model.transact( tx );
+
+ var nodeToDelete = sourceNode;
+ ve.Node.traverseUpstream( nodeToDelete, function( node
) {
+ if ( node.getParent().children.length === 1 ) {
+ nodeToDelete = node.getParent();
+ return true;
+ } else {
+ return false;
+ }
+ } );
+ var range = new ve.Range();
+ range.from = this.documentView.getOffsetFromNode(
nodeToDelete, false );
+ range.to = range.from + nodeToDelete.getElementLength();
+ tx = this.model.getDocument().prepareRemoval( range );
+ this.model.transact( tx );
+ }
+ } else {
+ // selection removal
+ tx = this.model.getDocument().prepareRemoval( selection );
+ this.model.transact( tx );
+ cursorAt = selection.start;
+ }
+ this.documentView.renderContent();
+ this.showCursorAt(cursorAt);
+ var _this = this;
+ setTimeout( function() {
+ _this.poll.prevText = _this.poll.prevHash =
_this.poll.prevOffset = _this.poll.node = null;
+ _this.startPolling();
+ }, 0 );
+
+};
+
+ve.es.Surface.prototype.handleEnter = function() {
+ this.stopPolling();
+ var selection = this.getSelection().clone(),
+ tx;
+ if ( selection.from !== selection.to ) {
+ this.handleDelete( false, true );
+ }
+ var node = this.documentView.getNodeFromOffset( selection.to, false
),
+ nodeOffset = this.documentView.getOffsetFromNode( node, false );
+
+ if (
+ nodeOffset + node.getContentLength() + 1 === selection.to &&
+ node === ve.es.Node.getSplitableNode( node )
+ ) {
+ tx = this.documentView.model.prepareInsertion(
+ nodeOffset + node.getElementLength(),
+ [ { 'type': 'paragraph' }, { 'type': '/paragraph' } ]
+ );
+ this.model.transact( tx );
+ selection.from = selection.to = nodeOffset +
node.getElementLength() + 1;
+ } else {
+ var stack = [],
+ splitable = false;
+
+ ve.Node.traverseUpstream( node, function( node ) {
+ var elementType = node.model.getElementType();
+ if (
+ splitable === true &&
+ ve.es.DocumentNode.splitRules[ elementType
].children === true
+ ) {
+ return false;
+ }
+ stack.splice(
+ stack.length / 2,
+ 0,
+ { 'type': '/' + elementType },
+ {
+ 'type': elementType,
+ 'attributes': ve.copyObject(
node.model.element.attributes )
+ }
+ );
+ splitable = ve.es.DocumentNode.splitRules[ elementType
].self;
+ return true;
+ } );
+ tx = this.documentView.model.prepareInsertion( selection.to,
stack );
+ this.model.transact( tx );
+ selection.from = selection.to =
+ this.model.getDocument().getRelativeContentOffset(
selection.to, 1 );
+ }
+ this.documentView.renderContent();
+ this.showCursorAt(selection.to);
+ var _this = this;
+ setTimeout( function() {
+ _this.poll.prevText = _this.poll.prevHash =
_this.poll.prevOffset = _this.poll.node = null;
+ _this.startPolling();
+ }, 0 );
+};
+
/* Inheritance */
ve.extendClass( ve.es.Surface, ve.EventEmitter );
\ No newline at end of file
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs