mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-12-01 17:36:35 +00:00
61c708ef1c
* ve.ui.MenuWidget.js MenuWidget no longer creates an embeded input element by default. In the case of no configured input element, we bind the keydown handler to window with addEventListner while using the useCapture flag. This nicely prevents elements lower in the dom from triggering ( document node ) Supported in IE9 and above and all modern browsers. * ve.ui.ListAction.js Since MenuWidget is no longer stealing focus from the surface, we no longer need to restore focus after a list item conversion. This is the end goal, as browsers like Chrome like to scroll to the top of elements that gain focus. Bug: 50792 Change-Id: I5b6969bca1a58b040708f8ac9d3dc8b07ddf9e6b
78 lines
2 KiB
JavaScript
78 lines
2 KiB
JavaScript
/*!
|
|
* VisualEditor UserInterface FormatAction class.
|
|
*
|
|
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
|
|
* @license The MIT License (MIT); see LICENSE.txt
|
|
*/
|
|
|
|
/**
|
|
* Format action.
|
|
*
|
|
* @class
|
|
* @extends ve.ui.Action
|
|
* @constructor
|
|
* @param {ve.ui.Surface} surface Surface to act on
|
|
*/
|
|
ve.ui.FormatAction = function VeUiFormatAction( surface ) {
|
|
// Parent constructor
|
|
ve.ui.Action.call( this, surface );
|
|
};
|
|
|
|
/* Inheritance */
|
|
|
|
ve.inheritClass( ve.ui.FormatAction, ve.ui.Action );
|
|
|
|
/* Static Properties */
|
|
|
|
/**
|
|
* List of allowed methods for this action.
|
|
*
|
|
* @static
|
|
* @property
|
|
*/
|
|
ve.ui.FormatAction.static.methods = ['convert'];
|
|
|
|
/* Methods */
|
|
|
|
/**
|
|
* Convert the format of content.
|
|
*
|
|
* Conversion splits and unwraps all lists and replaces content branch nodes.
|
|
*
|
|
* TODO: Refactor functionality into {ve.dm.SurfaceFragment}.
|
|
*
|
|
* @param {string} type
|
|
* @param {Object} attributes
|
|
*/
|
|
ve.ui.FormatAction.prototype.convert = function ( type, attributes ) {
|
|
var selected, i, length, contentBranch, txs,
|
|
surfaceModel = this.surface.getModel(),
|
|
selection = surfaceModel.getSelection(),
|
|
fragmentForSelection = surfaceModel.getFragment( selection, true ),
|
|
doc = surfaceModel.getDocument(),
|
|
fragments = [];
|
|
|
|
// We can't have headings or pre's in a list, so if we're trying to convert
|
|
// things that are in lists to a heading or a pre, split the list
|
|
selected = doc.selectNodes( selection, 'leaves' );
|
|
for ( i = 0, length = selected.length; i < length; i++ ) {
|
|
contentBranch = selected[i].node.isContent() ?
|
|
selected[i].node.getParent() :
|
|
selected[i].node;
|
|
|
|
fragments.push( surfaceModel.getFragment( contentBranch.getOuterRange(), true ) );
|
|
}
|
|
|
|
for ( i = 0, length = fragments.length; i < length; i++ ) {
|
|
fragments[i].isolateAndUnwrap( type );
|
|
}
|
|
selection = fragmentForSelection.getRange();
|
|
|
|
txs = ve.dm.Transaction.newFromContentBranchConversion( doc, selection, type, attributes );
|
|
surfaceModel.change( txs, selection );
|
|
};
|
|
|
|
/* Registration */
|
|
|
|
ve.ui.actionFactory.register( 'format', ve.ui.FormatAction );
|