mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-09-27 12:16:51 +00:00
Merge "Selecting generated content with cursor keys"
This commit is contained in:
commit
22cd7cfe98
|
@ -834,7 +834,7 @@ ve.ce.Surface.prototype.endRelocation = function () {
|
||||||
* @method
|
* @method
|
||||||
*/
|
*/
|
||||||
ve.ce.Surface.prototype.handleLeftOrRightArrowKey = function ( e ) {
|
ve.ce.Surface.prototype.handleLeftOrRightArrowKey = function ( e ) {
|
||||||
var selection, offset, range;
|
var selection, offset, range, offsetDelta, toNode, selectedNodes, i;
|
||||||
// On Mac OS pressing Command (metaKey) + Left/Right is same as pressing Home/End.
|
// On Mac OS pressing Command (metaKey) + Left/Right is same as pressing Home/End.
|
||||||
// As we are not able to handle it programmatically (because we don't know at which offsets
|
// As we are not able to handle it programmatically (because we don't know at which offsets
|
||||||
// lines starts and ends) let it happen natively.
|
// lines starts and ends) let it happen natively.
|
||||||
|
@ -846,15 +846,44 @@ ve.ce.Surface.prototype.handleLeftOrRightArrowKey = function ( e ) {
|
||||||
// Stop with final poll cycle so we have correct information in model
|
// Stop with final poll cycle so we have correct information in model
|
||||||
this.surfaceObserver.stop( true );
|
this.surfaceObserver.stop( true );
|
||||||
selection = this.model.getSelection();
|
selection = this.model.getSelection();
|
||||||
offset = this.getDocument().getRelativeOffset(
|
offsetDelta = e.keyCode === ve.Keys.DOM_VK_LEFT ? -1 : 1;
|
||||||
selection.to,
|
|
||||||
e.keyCode === ve.Keys.DOM_VK_LEFT ? -1 : 1, // direction (left or right)
|
// Check for selecting/deselecting inline images and aliens
|
||||||
e.altKey === true || e.ctrlKey === true ? 'word' : 'character' // unit
|
if ( selection.isCollapsed() ) {
|
||||||
);
|
toNode = this.documentView.documentNode.getNodeFromOffset( selection.to + offsetDelta );
|
||||||
if ( e.shiftKey === true ) { // expanded range
|
// TODO: Develop better method to test for generated content
|
||||||
range = new ve.Range( selection.from, offset );
|
if ( toNode.model.constructor.static.generatedContent === true ) {
|
||||||
} else { // collapsed range (just a cursor)
|
range = new ve.Range(
|
||||||
range = new ve.Range( offset );
|
selection.to,
|
||||||
|
selection.to + toNode.getOuterLength() * offsetDelta
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else if ( !e.shiftKey ) {
|
||||||
|
selectedNodes = this.model.documentModel.selectNodes( selection );
|
||||||
|
for ( i = 0; i < Math.min( selectedNodes.length, 2 ); i++ ) {
|
||||||
|
if (
|
||||||
|
// TODO: Develop better method to test for generated content
|
||||||
|
selectedNodes[i].node.constructor.static.generatedContent === true &&
|
||||||
|
selectedNodes[i].nodeOuterRange.equals( selection ) ||
|
||||||
|
selectedNodes[i].nodeOuterRange.equals( selection.flip() )
|
||||||
|
) {
|
||||||
|
range = new ve.Range( offsetDelta === 1 ? selection.end : selection.start );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normal cursor movement
|
||||||
|
if ( range === undefined ) {
|
||||||
|
offset = this.getDocument().getRelativeOffset(
|
||||||
|
selection.to,
|
||||||
|
offsetDelta,
|
||||||
|
e.altKey === true || e.ctrlKey === true ? 'word' : 'character' // unit
|
||||||
|
);
|
||||||
|
if ( e.shiftKey === true ) { // expanded range
|
||||||
|
range = new ve.Range( selection.from, offset );
|
||||||
|
} else { // collapsed range (just a cursor)
|
||||||
|
range = new ve.Range( offset );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.model.change( null, range );
|
this.model.change( null, range );
|
||||||
this.surfaceObserver.start();
|
this.surfaceObserver.start();
|
||||||
|
|
|
@ -30,6 +30,9 @@ ve.dm.AlienNode.static.name = 'alien';
|
||||||
|
|
||||||
ve.dm.AlienNode.static.storeHtmlAttributes = false;
|
ve.dm.AlienNode.static.storeHtmlAttributes = false;
|
||||||
|
|
||||||
|
// TODO: Develop better method to test for generated content
|
||||||
|
ve.dm.AlienNode.static.generatedContent = true;
|
||||||
|
|
||||||
ve.dm.AlienNode.static.toDataElement = function ( domElements, converter ) {
|
ve.dm.AlienNode.static.toDataElement = function ( domElements, converter ) {
|
||||||
var isInline = this.isHybridInline( domElements, converter ),
|
var isInline = this.isHybridInline( domElements, converter ),
|
||||||
type = isInline ? 'alienInline' : 'alienBlock',
|
type = isInline ? 'alienInline' : 'alienBlock',
|
||||||
|
|
|
@ -28,6 +28,9 @@ ve.dm.MWImageNode.static.name = 'MWimage';
|
||||||
|
|
||||||
ve.dm.MWImageNode.static.matchTagNames = null;
|
ve.dm.MWImageNode.static.matchTagNames = null;
|
||||||
|
|
||||||
|
// TODO: Develop better method to test for generated content
|
||||||
|
ve.dm.MWImageNode.static.generatedContent = true;
|
||||||
|
|
||||||
ve.dm.MWImageNode.static.matchRdfaTypes = [ 'mw:Image' ];
|
ve.dm.MWImageNode.static.matchRdfaTypes = [ 'mw:Image' ];
|
||||||
|
|
||||||
ve.dm.MWImageNode.static.toDataElement = function ( domElements ) {
|
ve.dm.MWImageNode.static.toDataElement = function ( domElements ) {
|
||||||
|
|
Loading…
Reference in a new issue