Esanders has uploaded a new change for review.
https://gerrit.wikimedia.org/r/77507
Change subject: Create base MWExtensionNode for simple extension support
......................................................................
Create base MWExtensionNode for simple extension support
MWMath and other simple extensions all behave in a similar way, e.g.
<tagname>Foreign syntax</tagname>.
This creates a base class that should make supporting such extensions,
and editing their contents in a plain text box, very simple.
Change-Id: Icc0acb33fe32704f71dacb552d9dfa3142eaef2b
---
M VisualEditor.php
A modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
M modules/ve-mw/ce/nodes/ve.ce.MWMathNode.js
A modules/ve-mw/dm/nodes/ve.dm.MWExtensionNode.js
M modules/ve-mw/dm/nodes/ve.dm.MWMathNode.js
A modules/ve-mw/ui/inspectors/ve.ui.MWExtensionInspector.js
M modules/ve-mw/ui/inspectors/ve.ui.MWMathInspector.js
7 files changed, 361 insertions(+), 231 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor
refs/changes/07/77507/1
diff --git a/VisualEditor.php b/VisualEditor.php
index ba067d3..9a32d10 100644
--- a/VisualEditor.php
+++ b/VisualEditor.php
@@ -709,8 +709,11 @@
'ext.visualEditor.experimental' => $wgVisualEditorResourceTemplate +
array(
'scripts' => array(
+ 've-mw/dm/nodes/ve.dm.MWExtensionNode.js',
+ 've-mw/ce/nodes/ve.ce.MWExtensionNode.js',
've-mw/dm/nodes/ve.dm.MWMathNode.js',
've-mw/ce/nodes/ve.ce.MWMathNode.js',
+ 've-mw/ui/inspectors/ve.ui.MWExtensionInspector.js',
've-mw/ui/inspectors/ve.ui.MWMathInspector.js',
've-mw/ui/tools/buttons/ve.ui.MWMathButtonTool.js',
've/dm/annotations/ve.dm.LanguageAnnotation.js',
diff --git a/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
b/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
new file mode 100644
index 0000000..b1cbe71
--- /dev/null
+++ b/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
@@ -0,0 +1,125 @@
+/*!
+ * VisualEditor ContentEditable MWExtensionNode class.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/*global mw */
+
+/**
+ * ContentEditable MediaWiki extension node.
+ *
+ * @class
+ * @abstract
+ * @extends ve.ce.LeafNode
+ * @mixins ve.ce.FocusableNode
+ * @mixins ve.ce.ProtectedNode
+ * @mixins ve.ce.GeneratedContentNode
+ *
+ * @constructor
+ * @param {ve.dm.MWExtensionNode} model Model to observe
+ * @param {Object} [config] Config options
+ */
+ve.ce.MWExtensionNode = function VeCeMWExtensionNode( model, config ) {
+ // Parent constructor
+ ve.ce.LeafNode.call( this, model, config );
+
+ // Mixin constructors
+ ve.ce.FocusableNode.call( this );
+ ve.ce.ProtectedNode.call( this );
+ ve.ce.GeneratedContentNode.call( this );
+
+ // Events
+ this.model.connect( this, { 'update': 'onUpdate' } );
+ this.$.on( 'click', ve.bind( this.onClick, this ) );
+
+ // DOM Changes
+ this.$.addClass( 've-ce-mwExtensionNode' );
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.ce.MWExtensionNode, ve.ce.LeafNode );
+
+ve.mixinClass( ve.ce.MWExtensionNode, ve.ce.FocusableNode );
+ve.mixinClass( ve.ce.MWExtensionNode, ve.ce.ProtectedNode );
+ve.mixinClass( ve.ce.MWExtensionNode, ve.ce.GeneratedContentNode );
+
+/* Static Properties */
+
+ve.ce.MWExtensionNode.static.name = 'mwExtension';
+
+/* Methods */
+
+/** */
+ve.ce.MWExtensionNode.prototype.generateContents = function () {
+ var deferred = $.Deferred();
+ $.ajax( {
+ 'url': mw.util.wikiScript( 'api' ),
+ 'data': {
+ 'action': 'visualeditor',
+ 'paction': 'parsefragment',
+ 'page': mw.config.get( 'wgRelevantPageName' ),
+ 'wikitext':
+ '<' +
this.constructor.static.extensionTagWrapper + '>' +
+ this.getModel().getAttribute( 'mw'
).body.extsrc +
+ '</' +
this.constructor.static.extensionTagWrapper + '>',
+ 'token': mw.user.tokens.get( 'editToken' ),
+ 'format': 'json'
+ },
+ 'dataType': 'json',
+ 'type': 'POST',
+ // Wait up to 100 seconds before giving up
+ 'timeout': 100000,
+ 'cache': 'false',
+ 'success': ve.bind( this.onParseSuccess, this, deferred ),
+ 'error': ve.bind( this.onParseError, this, deferred )
+ } );
+ return deferred.promise();
+};
+
+/**
+ * Handle a successful response from the parser for the wikitext fragment.
+ *
+ * @param {jQuery.Deferred} deferred The Deferred object created by
generateContents
+ * @param {Object} response Response data
+ */
+ve.ce.MWExtensionNode.prototype.onParseSuccess = function ( deferred, response
) {
+ var data = response.visualeditor, contentNodes = $( data.content
).get();
+ deferred.resolve( contentNodes );
+};
+
+/**
+ * Handle an unsuccessful response from the parser for the wikitext fragment.
+ *
+ * @param {jQuery.Deferred} deferred The promise object created by
generateContents
+ * @param {Object} response Response data
+ */
+ve.ce.MWExtensionNode.prototype.onParseError = function ( deferred ) {
+ deferred.reject();
+};
+
+/**
+ * Handle the mouse click.
+ *
+ * @method
+ * @param {jQuery.Event} e Click event
+ */
+ve.ce.MWExtensionNode.prototype.onClick = function ( e ) {
+ var surfaceModel = this.getRoot().getSurface().getModel(),
+ selectionRange = surfaceModel.getSelection(),
+ nodeRange = this.model.getOuterRange();
+
+ surfaceModel.getFragment(
+ e.shiftKey ?
+ ve.Range.newCoveringRange(
+ [ selectionRange, nodeRange ],
selectionRange.from > nodeRange.from
+ ) :
+ nodeRange
+ ).select();
+};
+
+/* Registration */
+
+ve.ce.nodeFactory.register( ve.ce.MWExtensionNode );
diff --git a/modules/ve-mw/ce/nodes/ve.ce.MWMathNode.js
b/modules/ve-mw/ce/nodes/ve.ce.MWMathNode.js
index 17ccf52..27f42bc 100644
--- a/modules/ve-mw/ce/nodes/ve.ce.MWMathNode.js
+++ b/modules/ve-mw/ce/nodes/ve.ce.MWMathNode.js
@@ -5,41 +5,21 @@
* @license The MIT License (MIT); see LICENSE.txt
*/
-/*global mw, MathJax */
+/*global MathJax */
/**
* ContentEditable MediaWiki math node.
*
* @class
- * @extends ve.ce.LeafNode
- * @mixins ve.ce.FocusableNode
- * @mixins ve.ce.ProtectedNode
- * @mixins ve.ce.GeneratedContentNode
+ * @extends ve.ce.MWExtensionNode
*
* @constructor
* @param {ve.dm.MWMathNode} model Model to observe
* @param {Object} [config] Config options
*/
ve.ce.MWMathNode = function VeCeMWMathNode( model, config ) {
- var $wrapper;
-
// Parent constructor
- ve.ce.LeafNode.call( this, model, config );
-
- // Wrap image
- this.$image = this.$;
- $wrapper = $( '<span> ');
- this.$.wrap( $wrapper );
- this.$ = $wrapper;
-
- // Mixin constructors
- ve.ce.FocusableNode.call( this );
- ve.ce.ProtectedNode.call( this );
- ve.ce.GeneratedContentNode.call( this );
-
- // Events
- this.model.connect( this, { 'update': 'onUpdate' } );
- this.$.on( 'click', ve.bind( this.onClick, this ) );
+ ve.ce.MWExtensionNode.call( this, model, config );
// DOM Changes
this.$.addClass( 've-ce-mwMathNode' );
@@ -47,50 +27,17 @@
/* Inheritance */
-ve.inheritClass( ve.ce.MWMathNode, ve.ce.LeafNode );
-
-ve.mixinClass( ve.ce.MWMathNode, ve.ce.FocusableNode );
-ve.mixinClass( ve.ce.MWMathNode, ve.ce.ProtectedNode );
-ve.mixinClass( ve.ce.MWMathNode, ve.ce.GeneratedContentNode );
+ve.inheritClass( ve.ce.MWMathNode, ve.ce.MWExtensionNode );
/* Static Properties */
ve.ce.MWMathNode.static.name = 'mwMath';
-ve.ce.MWMathNode.static.tagName = 'img';
+ve.ce.MWMathNode.static.extensionTagWrapper = 'math';
/* Methods */
/** */
-ve.ce.MWMathNode.prototype.generateContents = function () {
- var deferred = $.Deferred();
- $.ajax( {
- 'url': mw.util.wikiScript( 'api' ),
- 'data': {
- 'action': 'visualeditor',
- 'paction': 'parsefragment',
- 'page': mw.config.get( 'wgRelevantPageName' ),
- 'wikitext': '<math>' + this.getModel().getAttribute(
'mw' ).body.extsrc + '</math>',
- 'token': mw.user.tokens.get( 'editToken' ),
- 'format': 'json'
- },
- 'dataType': 'json',
- 'type': 'POST',
- // Wait up to 100 seconds before giving up
- 'timeout': 100000,
- 'cache': 'false',
- 'success': ve.bind( this.onParseSuccess, this, deferred ),
- 'error': ve.bind( this.onParseError, this, deferred )
- } );
- return deferred.promise();
-};
-
-/**
- * Handle a successful response from the parser for the wikitext fragment.
- *
- * @param {jQuery.Deferred} deferred The Deferred object created by
generateContents
- * @param {Object} response Response data
- */
ve.ce.MWMathNode.prototype.onParseSuccess = function ( deferred, response ) {
var data = response.visualeditor, contentNodes = $( data.content
).get();
// HACK: unwrap paragraph from PHP parser
@@ -105,36 +52,6 @@
this.emit( 'rerender' );
}, this ) );
}
-};
-
-/**
- * Handle an unsuccessful response from the parser for the wikitext fragment.
- *
- * @param {jQuery.Deferred} deferred The promise object created by
generateContents
- * @param {Object} response Response data
- */
-ve.ce.MWMathNode.prototype.onParseError = function ( deferred ) {
- deferred.reject();
-};
-
-/**
- * Handle the mouse click.
- *
- * @method
- * @param {jQuery.Event} e Click event
- */
-ve.ce.MWMathNode.prototype.onClick = function ( e ) {
- var surfaceModel = this.getRoot().getSurface().getModel(),
- selectionRange = surfaceModel.getSelection(),
- nodeRange = this.model.getOuterRange();
-
- surfaceModel.getFragment(
- e.shiftKey ?
- ve.Range.newCoveringRange(
- [ selectionRange, nodeRange ],
selectionRange.from > nodeRange.from
- ) :
- nodeRange
- ).select();
};
/* Registration */
diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWExtensionNode.js
b/modules/ve-mw/dm/nodes/ve.dm.MWExtensionNode.js
new file mode 100644
index 0000000..4f2e0a9
--- /dev/null
+++ b/modules/ve-mw/dm/nodes/ve.dm.MWExtensionNode.js
@@ -0,0 +1,93 @@
+/*!
+ * VisualEditor DataModel MWExtensionNode class.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * DataModel MediaWiki Extension node.
+ *
+ * @class
+ * @extends ve.dm.LeafNode
+ * @mixins ve.dm.GeneratedContentNode
+ *
+ * @constructor
+ */
+ve.dm.MWExtensionNode = function VeDmMWExtensionNode( length, element ) {
+ // Parent constructor
+ ve.dm.LeafNode.call( this, 0, element );
+
+ // Mixin constructors
+ ve.dm.GeneratedContentNode.call( this );
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.dm.MWExtensionNode, ve.dm.LeafNode );
+
+ve.mixinClass( ve.dm.MWExtensionNode, ve.dm.GeneratedContentNode );
+
+/* Static members */
+
+ve.dm.MWExtensionNode.static.name = 'mwExtension';
+
+ve.dm.MWExtensionNode.static.enableAboutGrouping = true;
+
+ve.dm.MWExtensionNode.static.matchTagNames = null;
+
+ve.dm.MWExtensionNode.static.isContent = true;
+
+ve.dm.MWExtensionNode.static.tagName = null;
+
+ve.dm.MWExtensionNode.static.toDataElement = function ( domElements, converter
) {
+ var dataElement, index,
+ mwDataJSON = domElements[0].getAttribute( 'data-mw' ),
+ mwData = mwDataJSON ? JSON.parse( mwDataJSON ) : {};
+
+ dataElement = {
+ 'type': this.name,
+ 'attributes': {
+ 'mw': mwData,
+ 'originalDomElements': ve.copy( domElements ),
+ 'originalMw': mwDataJSON
+ }
+ };
+
+ index = this.storeDomElements( dataElement, domElements,
converter.getStore() );
+ dataElement.attributes.originalIndex = index;
+
+ return dataElement;
+};
+
+ve.dm.MWExtensionNode.static.toDomElements = function ( dataElement, doc,
converter ) {
+ var el,
+ index = converter.getStore().indexOfHash( ve.getHash(
this.getHashObject( dataElement ) ) ),
+ originalMw = dataElement.attributes.originalMw;
+
+ // If the transclusion is unchanged just send back the
+ // original DOM elements so selser can skip over it
+ if (
+ index === dataElement.attributes.originalIndex ||
+ ( originalMw && ve.compare( dataElement.attributes.mw,
JSON.parse( originalMw ) ) )
+ ) {
+ // The object in the store is also used for CE rendering so
return a copy
+ return ve.copyDomElements(
dataElement.attributes.originalDomElements, doc );
+ } else {
+ el = doc.createElement( this.tagName );
+ el.setAttribute( 'typeof', this.matchRdfaTypes[0] );
+ el.setAttribute( 'data-mw', JSON.stringify(
dataElement.attributes.mw ) );
+ return [ el ];
+ }
+};
+
+ve.dm.MWExtensionNode.static.getHashObject = function ( dataElement ) {
+ return {
+ type: dataElement.type,
+ mw: dataElement.attributes.mw
+ };
+};
+
+/* Registration */
+
+ve.dm.modelRegistry.register( ve.dm.MWExtensionNode );
diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWMathNode.js
b/modules/ve-mw/dm/nodes/ve.dm.MWMathNode.js
index fd70b1a..2f2c891 100644
--- a/modules/ve-mw/dm/nodes/ve.dm.MWMathNode.js
+++ b/modules/ve-mw/dm/nodes/ve.dm.MWMathNode.js
@@ -9,84 +9,26 @@
* DataModel MediaWiki math node.
*
* @class
- * @extends ve.dm.LeafNode
- * @mixins ve.dm.GeneratedContentNode
+ * @extends ve.dm.MWExtensionNode
*
* @constructor
*/
ve.dm.MWMathNode = function VeDmMWMathNode( length, element ) {
// Parent constructor
- ve.dm.LeafNode.call( this, 0, element );
-
- // Mixin constructors
- ve.dm.GeneratedContentNode.call( this );
+ ve.dm.MWExtensionNode.call( this, 0, element );
};
/* Inheritance */
-ve.inheritClass( ve.dm.MWMathNode, ve.dm.LeafNode );
-
-ve.mixinClass( ve.dm.MWMathNode, ve.dm.GeneratedContentNode );
+ve.inheritClass( ve.dm.MWMathNode, ve.dm.MWExtensionNode );
/* Static members */
ve.dm.MWMathNode.static.name = 'mwMath';
-ve.dm.MWMathNode.static.enableAboutGrouping = true;
-
-ve.dm.MWMathNode.static.matchTagNames = null;
-
ve.dm.MWMathNode.static.matchRdfaTypes = [ 'mw:Extension/math' ];
-ve.dm.MWMathNode.static.isContent = true;
-
-ve.dm.MWMathNode.static.toDataElement = function ( domElements, converter ) {
- var dataElement, index,
- mwDataJSON = domElements[0].getAttribute( 'data-mw' ),
- mwData = mwDataJSON ? JSON.parse( mwDataJSON ) : {};
-
- dataElement = {
- 'type': 'mwMath',
- 'attributes': {
- 'mw': mwData,
- 'originalDomElements': ve.copy( domElements ),
- 'originalMw': mwDataJSON
- }
- };
-
- index = this.storeDomElements( dataElement, domElements,
converter.getStore() );
- dataElement.attributes.originalIndex = index;
-
- return dataElement;
-};
-
-ve.dm.MWMathNode.static.toDomElements = function ( dataElement, doc, converter
) {
- var el,
- index = converter.getStore().indexOfHash( ve.getHash(
this.getHashObject( dataElement ) ) ),
- originalMw = dataElement.attributes.originalMw;
-
- // If the transclusion is unchanged just send back the
- // original DOM elements so selser can skip over it
- if (
- index === dataElement.attributes.originalIndex ||
- ( originalMw && ve.compare( dataElement.attributes.mw,
JSON.parse( originalMw ) ) )
- ) {
- // The object in the store is also used for CE rendering so
return a copy
- return ve.copyDomElements(
dataElement.attributes.originalDomElements, doc );
- } else {
- el = doc.createElement( 'img' );
- el.setAttribute( 'typeof', 'mw:Extension/Math' );
- el.setAttribute( 'data-mw', JSON.stringify(
dataElement.attributes.mw ) );
- return [ el ];
- }
-};
-
-ve.dm.MWMathNode.static.getHashObject = function ( dataElement ) {
- return {
- type: dataElement.type,
- mw: dataElement.attributes.mw
- };
-};
+ve.dm.MWMathNode.static.tagName = 'img';
/* Registration */
diff --git a/modules/ve-mw/ui/inspectors/ve.ui.MWExtensionInspector.js
b/modules/ve-mw/ui/inspectors/ve.ui.MWExtensionInspector.js
new file mode 100644
index 0000000..78dd073
--- /dev/null
+++ b/modules/ve-mw/ui/inspectors/ve.ui.MWExtensionInspector.js
@@ -0,0 +1,122 @@
+/*!
+ * VisualEditor UserInterface MWExtensionInspector class.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * MediaWiki extension inspector.
+ *
+ * @class
+ * @abstract
+ * @extends ve.ui.Inspector
+ *
+ * @constructor
+ * @param {ve.ui.Surface} surface
+ * @param {Object} [config] Config options
+ */
+ve.ui.MWExtensionInspector = function VeUiMWExtensionInspector( surface,
config ) {
+ // Parent constructor
+ ve.ui.Inspector.call( this, surface, config );
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.ui.MWExtensionInspector, ve.ui.Inspector );
+
+/* Static properties */
+
+ve.ui.MWExtensionInspector.static.nodeView = null;
+
+ve.ui.MWExtensionInspector.static.nodeModel = null;
+
+/* Methods */
+
+/**
+ * Handle frame ready events.
+ *
+ * @method
+ */
+ve.ui.MWExtensionInspector.prototype.initialize = function () {
+ // Parent method
+ ve.ui.Inspector.prototype.initialize.call( this );
+
+ this.input = new ve.ui.TextInputWidget( {
+ '$$': this.frame.$$,
+ 'overlay': this.surface.$localOverlay,
+ 'multiline': true
+ } );
+ this.input.$.addClass( 've-ui-mwExtensionInspector-input' );
+
+ // Initialization
+ this.$form.append( this.input.$ );
+};
+
+
+/**
+ * Handle the inspector being opened.
+ */
+ve.ui.MWExtensionInspector.prototype.onOpen = function () {
+ var extsrc = '';
+
+ // Parent method
+ ve.ui.Inspector.prototype.onOpen.call( this );
+
+ this.node = this.surface.getView().getFocusedNode();
+
+ if ( this.node ) {
+ extsrc = this.node.getModel().getAttribute( 'mw' ).body.extsrc;
+ }
+
+ // Wait for animation to complete
+ setTimeout( ve.bind( function () {
+ // Setup input text
+ this.input.setValue( extsrc );
+ this.input.$input.focus().select();
+ }, this ), 200 );
+};
+
+/**
+ * Handle the inspector being closed.
+ *
+ * @param {string} action Action that caused the window to be closed
+ */
+ve.ui.MWExtensionInspector.prototype.onClose = function ( action ) {
+ var mw,
+ surfaceModel = this.surface.getModel();
+
+ // Parent method
+ ve.ui.Inspector.prototype.onClose.call( this, action );
+
+ if ( this.node instanceof this.constructor.static.nodeView ) {
+ mw = this.node.getModel().getAttribute( 'mw' );
+ mw.body.extsrc = this.input.getValue();
+ surfaceModel.change(
+ ve.dm.Transaction.newFromAttributeChanges(
+ surfaceModel.getDocument(),
this.node.getOuterRange().start, { 'mw': mw }
+ )
+ );
+ } else {
+ mw = {
+ 'name':
this.constructor.static.nodeModel.static.matchRdfaTypes[0].split( '/', 2 )[1],
+ 'attrs': {},
+ 'body': {
+ 'extsrc': this.input.getValue()
+ }
+ };
+ surfaceModel.getFragment().collapseRangeToEnd().insertContent( [
+ {
+ 'type':
this.constructor.static.nodeModel.static.name,
+ 'attributes': {
+ 'mw': mw
+ }
+ },
+ { 'type': '/' +
this.constructor.static.nodeModel.static.name }
+ ] );
+ }
+};
+
+/* Registration */
+
+ve.ui.inspectorFactory.register( 'mwExtensionInspector',
ve.ui.MWExtensionInspector );
diff --git a/modules/ve-mw/ui/inspectors/ve.ui.MWMathInspector.js
b/modules/ve-mw/ui/inspectors/ve.ui.MWMathInspector.js
index 5f9dfc6..6b92c05 100644
--- a/modules/ve-mw/ui/inspectors/ve.ui.MWMathInspector.js
+++ b/modules/ve-mw/ui/inspectors/ve.ui.MWMathInspector.js
@@ -9,7 +9,7 @@
* MediaWiki math inspector.
*
* @class
- * @extends ve.ui.Inspector
+ * @extends ve.ui.MWExtensionInspector
*
* @constructor
* @param {ve.ui.Surface} surface
@@ -17,12 +17,12 @@
*/
ve.ui.MWMathInspector = function VeUiMWMathInspector( surface, config ) {
// Parent constructor
- ve.ui.Inspector.call( this, surface, config );
+ ve.ui.MWExtensionInspector.call( this, surface, config );
};
/* Inheritance */
-ve.inheritClass( ve.ui.MWMathInspector, ve.ui.Inspector );
+ve.inheritClass( ve.ui.MWMathInspector, ve.ui.MWExtensionInspector );
/* Static properties */
@@ -30,90 +30,18 @@
ve.ui.MWMathInspector.static.titleMessage =
'visualeditor-mwmathinspector-title';
+ve.ui.MWMathInspector.static.nodeView = ve.ce.MWMathNode;
+
+ve.ui.MWMathInspector.static.nodeModel = ve.dm.MWMathNode;
+
/* Methods */
-/**
- * Handle frame ready events.
- *
- * @method
- */
+/** */
ve.ui.MWMathInspector.prototype.initialize = function () {
// Parent method
- ve.ui.Inspector.prototype.initialize.call( this );
+ ve.ui.MWExtensionInspector.prototype.initialize.call( this );
- this.input = new ve.ui.TextInputWidget( {
- '$$': this.frame.$$,
- 'overlay': this.surface.$localOverlay,
- 'multiline': true
- } );
this.input.$.addClass( 've-ui-mwMathInspector-input' );
-
- // Initialization
- this.$form.append( this.input.$ );
-};
-
-
-/**
- * Handle the inspector being opened.
- */
-ve.ui.MWMathInspector.prototype.onOpen = function () {
- var extsrc = '';
-
- // Parent method
- ve.ui.Inspector.prototype.onOpen.call( this );
-
- this.node = this.surface.getView().getFocusedNode();
-
- if ( this.node ) {
- extsrc = this.node.getModel().getAttribute( 'mw' ).body.extsrc;
- }
-
- // Wait for animation to complete
- setTimeout( ve.bind( function () {
- // Setup input text
- this.input.setValue( extsrc );
- this.input.$input.focus().select();
- }, this ), 200 );
-};
-
-/**
- * Handle the inspector being closed.
- *
- * @param {string} action Action that caused the window to be closed
- */
-ve.ui.MWMathInspector.prototype.onClose = function ( action ) {
- var mw,
- surfaceModel = this.surface.getModel();
-
- // Parent method
- ve.ui.Inspector.prototype.onClose.call( this, action );
-
- if ( this.node instanceof ve.ce.MWMathNode ) {
- mw = this.node.getModel().getAttribute( 'mw' );
- mw.body.extsrc = this.input.getValue();
- surfaceModel.change(
- ve.dm.Transaction.newFromAttributeChanges(
- surfaceModel.getDocument(),
this.node.getOuterRange().start, { 'mw': mw }
- )
- );
- } else {
- mw = {
- 'name': 'math',
- 'attrs': {},
- 'body': {
- 'extsrc': this.input.getValue()
- }
- };
- surfaceModel.getFragment().collapseRangeToEnd().insertContent( [
- {
- 'type': 'mwMath',
- 'attributes': {
- 'mw': mw
- }
- },
- { 'type': '/mwMath' }
- ] );
- }
};
/* Registration */
--
To view, visit https://gerrit.wikimedia.org/r/77507
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Icc0acb33fe32704f71dacb552d9dfa3142eaef2b
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits