mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-25 14:56:20 +00:00
109 lines
3.1 KiB
JavaScript
109 lines
3.1 KiB
JavaScript
|
/*!
|
||
|
* VisualEditor DataModel MWWikitextSurfaceFragment class.
|
||
|
*
|
||
|
* @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* DataModel MWWikitextSurfaceFragment.
|
||
|
*
|
||
|
* @class
|
||
|
* @extends ve.dm.SourceSurfaceFragment
|
||
|
*
|
||
|
* @constructor
|
||
|
* @param {ve.dm.Document} doc
|
||
|
*/
|
||
|
ve.dm.MWWikitextSurfaceFragment = function VeDmMwWikitextSurfaceFragment() {
|
||
|
// Parent constructors
|
||
|
ve.dm.MWWikitextSurfaceFragment.super.apply( this, arguments );
|
||
|
};
|
||
|
|
||
|
/* Inheritance */
|
||
|
|
||
|
OO.inheritClass( ve.dm.MWWikitextSurfaceFragment, ve.dm.SourceSurfaceFragment );
|
||
|
|
||
|
/**
|
||
|
* Wrap a text selection.
|
||
|
*
|
||
|
* If the selection is already identically wrapped it will be unwrapped.
|
||
|
*
|
||
|
* @param {string} before Text to go before selection
|
||
|
* @param {string} after Text to go after selection
|
||
|
* @param {Function|string} placeholder Placeholder text to insert at an empty selection
|
||
|
* @param {boolean} forceWrap Force wrapping, even if matching wrapping exists
|
||
|
* @chainable
|
||
|
*/
|
||
|
ve.dm.MWWikitextSurfaceFragment.prototype.wrapText = function ( before, after, placeholder, forceWrap ) {
|
||
|
var wrappedFragment, wasExcludingInsertions;
|
||
|
|
||
|
placeholder = OO.ui.resolveMsg( placeholder );
|
||
|
|
||
|
function unwrap( fragment ) {
|
||
|
var text = fragment.getText();
|
||
|
if (
|
||
|
( !before || text.slice( 0, before.length ) === before ) &&
|
||
|
( !after || text.slice( -after.length ) === after )
|
||
|
) {
|
||
|
fragment.unwrapText( before.length, after.length );
|
||
|
// Just the placeholder left, nothing meaningful was selected so just remove it
|
||
|
if ( fragment.getText() === placeholder ) {
|
||
|
fragment.removeContent();
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( !forceWrap && ( unwrap( this ) || unwrap( this.adjustLinearSelection( -before.length, after.length ) ) ) ) {
|
||
|
return this;
|
||
|
} else {
|
||
|
if ( placeholder && this.getSelection().isCollapsed() ) {
|
||
|
this.insertContent( placeholder );
|
||
|
}
|
||
|
wrappedFragment = this.clone();
|
||
|
wasExcludingInsertions = this.willExcludeInsertions();
|
||
|
this.setExcludeInsertions( true );
|
||
|
this.collapseToStart().insertContent( before );
|
||
|
this.collapseToEnd().insertContent( after );
|
||
|
this.setExcludeInsertions( wasExcludingInsertions );
|
||
|
return wrappedFragment;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Unwrap a fixed amount of text
|
||
|
*
|
||
|
* @param {number} before Amount of text to remove from start
|
||
|
* @param {number} after Amount of text to remove from end
|
||
|
* @chainable
|
||
|
*/
|
||
|
ve.dm.MWWikitextSurfaceFragment.prototype.unwrapText = function ( before, after ) {
|
||
|
this.collapseToStart().adjustLinearSelection( 0, before ).removeContent();
|
||
|
this.collapseToEnd().adjustLinearSelection( -after, 0 ).removeContent();
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @inheritdoc
|
||
|
*/
|
||
|
ve.dm.MWWikitextSurfaceFragment.prototype.convertDocument = function ( doc ) {
|
||
|
var wikitextPromise;
|
||
|
|
||
|
if ( !doc.data.hasContent() ) {
|
||
|
return $.Deferred().reject().promise();
|
||
|
}
|
||
|
|
||
|
wikitextPromise = ve.init.target.getWikitextFragment( doc );
|
||
|
|
||
|
// TODO: Emit an event to trigger the progress bar
|
||
|
ve.init.target.getSurface().createProgress(
|
||
|
wikitextPromise, ve.msg( 'visualeditor-generating-wikitext-progress' )
|
||
|
).done( function ( progressBar, cancelPromise ) {
|
||
|
cancelPromise.fail( function () {
|
||
|
wikitextPromise.abort();
|
||
|
} );
|
||
|
} );
|
||
|
|
||
|
return wikitextPromise;
|
||
|
};
|