Button tool to switch to edit source with changes

By serialising the current DOM, and injecting it into a form we can
end up in the source editor with our VE changes converted.

Bug: 50687
Change-Id: Iafcc02a737d9c6c3a59dce1caff130d47ca25650
This commit is contained in:
Ed Sanders 2013-09-05 17:10:06 -07:00 committed by Roan Kattouw
parent a3295f0939
commit 7b2cacbe57
4 changed files with 110 additions and 1 deletions

View file

@ -159,6 +159,10 @@ $messages['en'] = array(
'visualeditor-media-input-placeholder' => 'Search for media',
'visualeditor-meta-tool' => 'Page settings',
'visualeditor-mwalienextensioninspector-title' => 'MediaWiki extension',
'visualeditor-mweditmodesource-title' => 'Switch to source editing',
'visualeditor-mweditmodesource-warning' => 'You are about to switch to source editing.
Any changes you\'ve made to this document will be kept, but you will not be able switch back to VisualEditor without saving or reloading the page.
Do you want to continue?',
'visualeditor-mwhieroinspector-title' => 'Hieroglyphics',
'visualeditor-mwmathinspector-title' => 'LaTeX',
'visualeditor-notification-created' => '"$1" has been created.',
@ -529,6 +533,8 @@ Parameters:
{{Identical|Page settings}}',
'visualeditor-mwalienextensioninspector-title' => 'Used as title for unknown MediaWiki extensions.
{{Identical|MediaWiki extension}}',
'visualeditor-mweditmodesource-title' => 'Label for changing edit mode to source editing.',
'visualeditor-mweditmodesource-warning' => 'Warning message show before changing edit mode to source editing.',
'visualeditor-mwhieroinspector-title' => 'Used as title for hieroglyphics inspector.',
'visualeditor-mwmathinspector-title' => 'Used as title for MathInspector.

View file

@ -572,6 +572,7 @@ $wgResourceModules += array(
've/ui/tools/ve.ui.InspectorTool.js',
've/ui/tools/ve.ui.ListTool.js',
've-mw/ui/tools/ve.ui.MWEditModeTool.js',
've-mw/ui/tools/ve.ui.MWFormatTool.js',
've-mw/ui/tools/ve.ui.MWDialogTool.js',
've-mw/ui/tools/ve.ui.MWPopupTool.js',
@ -705,6 +706,8 @@ $wgResourceModules += array(
'visualeditor-listbutton-number-tooltip',
'visualeditor-media-input-placeholder',
'visualeditor-meta-tool',
'visualeditor-mweditmodesource-title',
'visualeditor-mweditmodesource-warning',
'visualeditor-parameter-input-placeholder',
'visualeditor-parameter-search-no-unused',
'visualeditor-parameter-search-unknown',

View file

@ -792,6 +792,47 @@ ve.init.mw.ViewPageTarget.prototype.saveDocument = function () {
}
};
/**
* Switch to edit source mode with the current wikitext
*
* @method
*/
ve.init.mw.ViewPageTarget.prototype.editSource = function () {
var doc = this.surface.getModel().getDocument();
this.$document.css( 'opacity', 0.5 );
if ( !confirm( ve.msg( 'visualeditor-mweditmodesource-warning' ) ) ) {
this.$document.css( 'opacity', 1 );
return;
}
// Get Wikitext from the DOM
this.serialize(
ve.dm.converter.getDomFromData( doc.getFullData(), doc.getStore(), doc.getInternalList() ),
ve.bind( function ( wikitext ) {
var options = this.getSaveOptions(),
action = new mw.Uri( mw.util.wikiScript() ).extend( { title: this.pageName, action: 'edit' } ).toString();
this.submitting = true;
$( '<form method="post" enctype="multipart/form-data"></form>' )
.attr( 'action', action )
.append( $( '<textarea name="wpTextbox1"></textarea>' ).val( wikitext ) )
.append( $( '<input type="checkbox" name="wpMinoredit" value="1">' ).prop( 'checked', options.minor ) )
.append( $( '<input type="checkbox" name="wpWatchthis" value="1">' ).prop( 'checked', options.watch ) )
.append( $( '<input type="hidden" name="wpSummary">' ).val( options.summary ) )
.append( $( '<input type="hidden" name="wpStarttime">' ).val( this.startTimeStamp ) )
.append( $( '<input type="hidden" name="wpEditToken">' ).val( this.editToken ) )
.append( $( '<input type="hidden" name="wpDiff" value="1">' ) )
.append( $( '<input type="hidden" name="model" value="wikitext">' ) )
.append( $( '<input type="hidden" name="format" value="text/x-wiki">' ) )
.append( $( '<input type="hidden" name="wpEdittime">' ) )
.submit()
;
}, this )
);
};
/**
* Handle clicks on the resolve conflict button in the conflict dialog.
*
@ -1096,7 +1137,7 @@ ve.init.mw.ViewPageTarget.prototype.attachToolbarButtons = function () {
{
'type': 'list',
'icon': 'menu',
'include': [ 'meta', 'categories', 'languages' ] }
'include': [ 'meta', 'categories', 'languages', 'editModeSource' ] }
] );
$actionTools

View file

@ -0,0 +1,59 @@
/*!
* VisualEditor MediaWiki UserInterface edit mode tool classes.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* MediaWiki UserInterface media edit tool.
*
* @class
* @abstract
* @extends OO.ui.Tool
* @constructor
* @param {OO.ui.ToolGroup} toolGroup
* @param {Object} [config] Config options
*/
ve.ui.MWEditModeTool = function VeUiMWEditModeTool( toolGroup, config ) {
OO.ui.Tool.call( this, toolGroup, config );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWEditModeTool, OO.ui.Tool );
/* Static Properties */
ve.ui.MWEditModeTool.static.group = 'editMode';
ve.ui.MWEditModeTool.static.autoAdd = false;
/* Methods */
ve.ui.MWEditModeTool.prototype.onUpdateState = function () {
this.setActive( false );
};
/**
* MediaWiki UserInterface edit mode source tool.
*
* @class
* @extends ve.ui.MWEditModeTool
* @constructor
* @param {OO.ui.ToolGroup} toolGroup
* @param {Object} [config] Config options
*/
ve.ui.MWEditModeSourceTool = function VeUiMWEditModeSourceTool( toolGroup, config ) {
ve.ui.MWEditModeTool.call( this, toolGroup, config );
};
OO.inheritClass( ve.ui.MWEditModeSourceTool, ve.ui.MWEditModeTool );
ve.ui.MWEditModeSourceTool.static.name = 'editModeSource';
ve.ui.MWEditModeSourceTool.static.icon = 'source';
ve.ui.MWEditModeSourceTool.static.titleMessage = 'visualeditor-mweditmodesource-title';
ve.ui.MWEditModeSourceTool.prototype.onSelect = function () {
this.setActive( false );
this.toolbar.getTarget().editSource();
};
ve.ui.toolFactory.register( ve.ui.MWEditModeSourceTool );