jenkins-bot has submitted this change and it was merged.
Change subject: Create ImageNode mixin to share logic between Block & Inline
......................................................................
Create ImageNode mixin to share logic between Block & Inline
Change-Id: I90b543e1a91ab950ff9e857c038bf670dde5634d
---
M .docs/eg-iframe.html
M build/modules.json
M demos/ve/desktop.html
M demos/ve/mobile.html
M src/ce/nodes/ve.ce.BlockImageNode.js
A src/ce/nodes/ve.ce.ImageNode.js
M src/ce/nodes/ve.ce.InlineImageNode.js
M src/dm/nodes/ve.dm.BlockImageNode.js
A src/dm/nodes/ve.dm.ImageNode.js
M src/dm/nodes/ve.dm.InlineImageNode.js
M tests/index.html
11 files changed, 158 insertions(+), 123 deletions(-)
Approvals:
Catrope: Looks good to me, approved
jenkins-bot: Verified
diff --git a/.docs/eg-iframe.html b/.docs/eg-iframe.html
index 20d3ad6..db8c60e 100644
--- a/.docs/eg-iframe.html
+++ b/.docs/eg-iframe.html
@@ -175,6 +175,7 @@
<script src="../src/dm/nodes/ve.dm.TableRowNode.js"></script>
<script
src="../src/dm/nodes/ve.dm.TableSectionNode.js"></script>
<script src="../src/dm/nodes/ve.dm.TextNode.js"></script>
+ <script src="../src/dm/nodes/ve.dm.ImageNode.js"></script>
<script src="../src/dm/nodes/ve.dm.BlockImageNode.js"></script>
<script
src="../src/dm/nodes/ve.dm.BlockImageCaptionNode.js"></script>
<script src="../src/dm/nodes/ve.dm.InlineImageNode.js"></script>
@@ -239,6 +240,7 @@
<script src="../src/ce/nodes/ve.ce.TableRowNode.js"></script>
<script
src="../src/ce/nodes/ve.ce.TableSectionNode.js"></script>
<script src="../src/ce/nodes/ve.ce.TextNode.js"></script>
+ <script src="../src/ce/nodes/ve.ce.ImageNode.js"></script>
<script src="../src/ce/nodes/ve.ce.BlockImageNode.js"></script>
<script
src="../src/ce/nodes/ve.ce.BlockImageCaptionNode.js"></script>
<script src="../src/ce/nodes/ve.ce.InlineImageNode.js"></script>
diff --git a/build/modules.json b/build/modules.json
index 40fd4d4..e2aea3b 100644
--- a/build/modules.json
+++ b/build/modules.json
@@ -197,6 +197,7 @@
"src/dm/nodes/ve.dm.TableRowNode.js",
"src/dm/nodes/ve.dm.TableSectionNode.js",
"src/dm/nodes/ve.dm.TextNode.js",
+ "src/dm/nodes/ve.dm.ImageNode.js",
"src/dm/nodes/ve.dm.BlockImageNode.js",
"src/dm/nodes/ve.dm.BlockImageCaptionNode.js",
"src/dm/nodes/ve.dm.InlineImageNode.js",
@@ -261,6 +262,7 @@
"src/ce/nodes/ve.ce.TableRowNode.js",
"src/ce/nodes/ve.ce.TableSectionNode.js",
"src/ce/nodes/ve.ce.TextNode.js",
+ "src/ce/nodes/ve.ce.ImageNode.js",
"src/ce/nodes/ve.ce.BlockImageNode.js",
"src/ce/nodes/ve.ce.BlockImageCaptionNode.js",
"src/ce/nodes/ve.ce.InlineImageNode.js",
diff --git a/demos/ve/desktop.html b/demos/ve/desktop.html
index 3379a4c..fb3c4d3 100644
--- a/demos/ve/desktop.html
+++ b/demos/ve/desktop.html
@@ -187,6 +187,7 @@
<script src="../../src/dm/nodes/ve.dm.TableRowNode.js"></script>
<script
src="../../src/dm/nodes/ve.dm.TableSectionNode.js"></script>
<script src="../../src/dm/nodes/ve.dm.TextNode.js"></script>
+ <script src="../../src/dm/nodes/ve.dm.ImageNode.js"></script>
<script
src="../../src/dm/nodes/ve.dm.BlockImageNode.js"></script>
<script
src="../../src/dm/nodes/ve.dm.BlockImageCaptionNode.js"></script>
<script
src="../../src/dm/nodes/ve.dm.InlineImageNode.js"></script>
@@ -251,6 +252,7 @@
<script src="../../src/ce/nodes/ve.ce.TableRowNode.js"></script>
<script
src="../../src/ce/nodes/ve.ce.TableSectionNode.js"></script>
<script src="../../src/ce/nodes/ve.ce.TextNode.js"></script>
+ <script src="../../src/ce/nodes/ve.ce.ImageNode.js"></script>
<script
src="../../src/ce/nodes/ve.ce.BlockImageNode.js"></script>
<script
src="../../src/ce/nodes/ve.ce.BlockImageCaptionNode.js"></script>
<script
src="../../src/ce/nodes/ve.ce.InlineImageNode.js"></script>
diff --git a/demos/ve/mobile.html b/demos/ve/mobile.html
index 9f8f2fa..a62c906 100644
--- a/demos/ve/mobile.html
+++ b/demos/ve/mobile.html
@@ -188,6 +188,7 @@
<script src="../../src/dm/nodes/ve.dm.TableRowNode.js"></script>
<script
src="../../src/dm/nodes/ve.dm.TableSectionNode.js"></script>
<script src="../../src/dm/nodes/ve.dm.TextNode.js"></script>
+ <script src="../../src/dm/nodes/ve.dm.ImageNode.js"></script>
<script
src="../../src/dm/nodes/ve.dm.BlockImageNode.js"></script>
<script
src="../../src/dm/nodes/ve.dm.BlockImageCaptionNode.js"></script>
<script
src="../../src/dm/nodes/ve.dm.InlineImageNode.js"></script>
@@ -252,6 +253,7 @@
<script src="../../src/ce/nodes/ve.ce.TableRowNode.js"></script>
<script
src="../../src/ce/nodes/ve.ce.TableSectionNode.js"></script>
<script src="../../src/ce/nodes/ve.ce.TextNode.js"></script>
+ <script src="../../src/ce/nodes/ve.ce.ImageNode.js"></script>
<script
src="../../src/ce/nodes/ve.ce.BlockImageNode.js"></script>
<script
src="../../src/ce/nodes/ve.ce.BlockImageCaptionNode.js"></script>
<script
src="../../src/ce/nodes/ve.ce.InlineImageNode.js"></script>
diff --git a/src/ce/nodes/ve.ce.BlockImageNode.js
b/src/ce/nodes/ve.ce.BlockImageNode.js
index 822cf09..5130f43 100644
--- a/src/ce/nodes/ve.ce.BlockImageNode.js
+++ b/src/ce/nodes/ve.ce.BlockImageNode.js
@@ -10,8 +10,7 @@
*
* @class
* @extends ve.ce.BranchNode
- * @mixins ve.ce.FocusableNode
- * @mixins ve.ce.ResizableNode
+ * @mixins ve.ce.ImageNode
*
* @constructor
* @param {ve.dm.BlockImageNode} model Model to observe
@@ -31,15 +30,10 @@
.prependTo( this.$element );
// Mixin constructors
- ve.ce.FocusableNode.call( this );
- ve.ce.ResizableNode.call( this, this.$image, config );
-
- // Events
- this.$image.on( 'load', ve.bind( this.onLoad, this ) );
- this.model.connect( this, { attributeChange: 'onAttributeChange' } );
+ ve.ce.ImageNode.call( this, this.$element, this.$image, config );
// Initialization
- this.$element.addClass( 've-ce-imageNode' );
+ this.$element.addClass( 've-ce-blockImageNode' );
this.$image
.attr( {
alt: this.model.getAttribute( 'alt' ),
@@ -55,46 +49,13 @@
OO.inheritClass( ve.ce.BlockImageNode, ve.ce.BranchNode );
-OO.mixinClass( ve.ce.BlockImageNode, ve.ce.FocusableNode );
-OO.mixinClass( ve.ce.BlockImageNode, ve.ce.ResizableNode );
+OO.mixinClass( ve.ce.BlockImageNode, ve.ce.ImageNode );
/* Static Properties */
ve.ce.BlockImageNode.static.name = 'blockImage';
ve.ce.BlockImageNode.static.tagName = 'figure';
-
-/* Methods */
-
-/**
- * Update the rendering of the 'src', 'width' and 'height' attributes when
they change in the model.
- *
- * @method
- * @param {string} key Attribute key
- * @param {string} from Old value
- * @param {string} to New value
- */
-ve.ce.BlockImageNode.prototype.onAttributeChange = function ( key, from, to ) {
- if ( key === 'src' ) {
- this.$image.attr( 'src', this.getResolvedAttribute( 'src' ) );
- }
- if ( key === 'width' || key === 'height' ) {
- this.$image.css( key, to !== null ? to : '' );
- }
-};
-
-/**
- * Handle the image load
- *
- * @method
- * @param {jQuery.Event} e Load event
- */
-ve.ce.BlockImageNode.prototype.onLoad = function () {
- this.setOriginalDimensions( {
- width: this.$image.prop( 'naturalWidth' ),
- height: this.$image.prop( 'naturalHeight' )
- } );
-};
/* Registration */
diff --git a/src/ce/nodes/ve.ce.ImageNode.js b/src/ce/nodes/ve.ce.ImageNode.js
new file mode 100644
index 0000000..b80e652
--- /dev/null
+++ b/src/ce/nodes/ve.ce.ImageNode.js
@@ -0,0 +1,92 @@
+/*!
+ * VisualEditor ContentEditable ImageNode class.
+ *
+ * @copyright 2011-2014 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * ContentEditable image node.
+ *
+ * @class
+ * @abstract
+ * @mixins ve.ce.FocusableNode
+ * @mixins ve.ce.ResizableNode
+ *
+ * @constructor
+ * @param {jQuery} $figure Image or figure element
+ * @param {jQuery} [$image] Actual image element, if $figure is just a
container
+ * @param {Object} [config] Configuration options
+ */
+ve.ce.ImageNode = function VeCeImageNode( $figure, $image, config ) {
+ config = ve.extendObject( {
+ enforceMax: false,
+ minDimensions: { width: 1, height: 1 }
+ }, config );
+
+ this.$figure = $figure;
+ this.$image = $image || $figure;
+
+ // Mixin constructors
+ ve.ce.FocusableNode.call( this, this.$figure, config );
+ ve.ce.ResizableNode.call( this, this.$image, config );
+
+ // Events
+ this.$image.on( 'load', ve.bind( this.onLoad, this ) );
+ this.model.connect( this, { attributeChange: 'onAttributeChange' } );
+
+ // Initialization
+ this.$element.addClass( 've-ce-imageNode' );
+};
+
+/* Inheritance */
+
+OO.mixinClass( ve.ce.ImageNode, ve.ce.FocusableNode );
+
+OO.mixinClass( ve.ce.ImageNode, ve.ce.ResizableNode );
+
+/* Static Methods */
+
+/**
+ * @inheritdoc ve.ce.Node
+ */
+ve.ce.ImageNode.static.getDescription = function ( model ) {
+ return model.getAttribute( 'src' );
+};
+
+/* Methods */
+
+/**
+ * Update the rendering of the 'align', src', 'width' and 'height' attributes
+ * when they change in the model.
+ *
+ * @method
+ * @param {string} key Attribute key
+ * @param {string} from Old value
+ * @param {string} to New value
+ */
+ve.ce.ImageNode.prototype.onAttributeChange = function ( key, from, to ) {
+ switch ( key ) {
+ case 'src':
+ this.$image.attr( 'src', this.getResolvedAttribute(
'src' ) );
+ break;
+
+ case 'width':
+ case 'height':
+ this.$image.css( key, to !== null ? to : '' );
+ break;
+ }
+};
+
+/**
+ * Handle the image load
+ *
+ * @method
+ * @param {jQuery.Event} e Load event
+ */
+ve.ce.ImageNode.prototype.onLoad = function () {
+ this.setOriginalDimensions( {
+ width: this.$image.prop( 'naturalWidth' ),
+ height: this.$image.prop( 'naturalHeight' )
+ } );
+};
diff --git a/src/ce/nodes/ve.ce.InlineImageNode.js
b/src/ce/nodes/ve.ce.InlineImageNode.js
index 898ee19..d23c6eb 100644
--- a/src/ce/nodes/ve.ce.InlineImageNode.js
+++ b/src/ce/nodes/ve.ce.InlineImageNode.js
@@ -10,7 +10,7 @@
*
* @class
* @extends ve.ce.LeafNode
- * @mixins ve.ce.FocusableNode
+ * @mixins ve.ce.ImageNode
* @mixins ve.ce.ResizableNode
*
* @constructor
@@ -26,16 +26,11 @@
ve.ce.LeafNode.call( this, model, config );
// Mixin constructors
- ve.ce.FocusableNode.call( this );
- ve.ce.ResizableNode.call( this, this.$element, config );
-
- // Events
- this.$element.on( 'load', ve.bind( this.onLoad, this ) );
- this.model.connect( this, { attributeChange: 'onAttributeChange' } );
+ ve.ce.ImageNode.call( this, this.$element, null, config );
// Initialization
this.$element
- .addClass( 've-ce-imageNode' )
+ .addClass( 've-ce-inlineImageNode' )
.attr( {
alt: this.model.getAttribute( 'alt' ),
src: this.getResolvedAttribute( 'src' )
@@ -50,46 +45,13 @@
OO.inheritClass( ve.ce.InlineImageNode, ve.ce.LeafNode );
-OO.mixinClass( ve.ce.InlineImageNode, ve.ce.FocusableNode );
-OO.mixinClass( ve.ce.InlineImageNode, ve.ce.ResizableNode );
+OO.mixinClass( ve.ce.InlineImageNode, ve.ce.ImageNode );
/* Static Properties */
ve.ce.InlineImageNode.static.name = 'inlineImage';
ve.ce.InlineImageNode.static.tagName = 'img';
-
-/* Methods */
-
-/**
- * Update the rendering of the 'src', 'width' and 'height' attributes when
they change in the model.
- *
- * @method
- * @param {string} key Attribute key
- * @param {string} from Old value
- * @param {string} to New value
- */
-ve.ce.InlineImageNode.prototype.onAttributeChange = function ( key, from, to )
{
- if ( key === 'src' ) {
- this.$element.attr( 'src', this.getResolvedAttribute( 'src' ) );
- }
- if ( key === 'width' || key === 'height' ) {
- this.$element.css( key, to !== null ? to : '' );
- }
-};
-
-/**
- * Handle the image load
- *
- * @method
- * @param {jQuery.Event} e Load event
- */
-ve.ce.InlineImageNode.prototype.onLoad = function () {
- this.setOriginalDimensions( {
- width: this.$element.prop( 'naturalWidth' ),
- height: this.$element.prop( 'naturalHeight' )
- } );
-};
/* Registration */
diff --git a/src/dm/nodes/ve.dm.BlockImageNode.js
b/src/dm/nodes/ve.dm.BlockImageNode.js
index 6015ad9..68139ac 100644
--- a/src/dm/nodes/ve.dm.BlockImageNode.js
+++ b/src/dm/nodes/ve.dm.BlockImageNode.js
@@ -10,7 +10,7 @@
*
* @class
* @extends ve.dm.BranchNode
- * @mixins ve.dm.ResizableNode
+ * @mixins ve.dm.ImageNode
*
* @constructor
* @param {Object} [element] Reference to element in linear model
@@ -21,14 +21,14 @@
ve.dm.BranchNode.apply( this, arguments );
// Mixin constructor
- ve.dm.ResizableNode.call( this );
+ ve.dm.ImageNode.call( this );
};
/* Inheritance */
OO.inheritClass( ve.dm.BlockImageNode, ve.dm.BranchNode );
-OO.mixinClass( ve.dm.BlockImageNode, ve.dm.ResizableNode );
+OO.mixinClass( ve.dm.BlockImageNode, ve.dm.ImageNode );
/* Static Properties */
@@ -123,22 +123,6 @@
ve.dm.BlockImageNode.prototype.getCaptionNode = function () {
var node = this.children[0];
return node instanceof ve.dm.BlockImageCaptionNode ? node : null;
-};
-
-/**
- * @inheritdoc
- */
-ve.dm.BlockImageNode.prototype.createScalable = function () {
- return new ve.dm.Scalable( {
- currentDimensions: {
- width: this.getAttribute( 'width' ),
- height: this.getAttribute( 'height' )
- },
- minDimensions: {
- width: 1,
- height: 1
- }
- } );
};
/* Registration */
diff --git a/src/dm/nodes/ve.dm.ImageNode.js b/src/dm/nodes/ve.dm.ImageNode.js
new file mode 100644
index 0000000..073cc5b
--- /dev/null
+++ b/src/dm/nodes/ve.dm.ImageNode.js
@@ -0,0 +1,42 @@
+/*!
+ * VisualEditor DataModel ImageNode class.
+ *
+ * @copyright 2011-2014 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * DataModel image node.
+ *
+ * @class
+ * @abstract
+ * @mixins ve.dm.ResizableNode
+ *
+ * @constructor
+ */
+ve.dm.ImageNode = function VeDmImageNode() {
+ // Mixin constructor
+ ve.dm.ResizableNode.call( this );
+};
+
+/* Inheritance */
+
+OO.mixinClass( ve.dm.ImageNode, ve.dm.ResizableNode );
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+ve.dm.ImageNode.prototype.createScalable = function () {
+ return new ve.dm.Scalable( {
+ currentDimensions: {
+ width: this.getAttribute( 'width' ),
+ height: this.getAttribute( 'height' )
+ },
+ minDimensions: {
+ width: 1,
+ height: 1
+ }
+ } );
+};
diff --git a/src/dm/nodes/ve.dm.InlineImageNode.js
b/src/dm/nodes/ve.dm.InlineImageNode.js
index 7cd9387..f77ff1e 100644
--- a/src/dm/nodes/ve.dm.InlineImageNode.js
+++ b/src/dm/nodes/ve.dm.InlineImageNode.js
@@ -10,7 +10,7 @@
*
* @class
* @extends ve.dm.LeafNode
- * @mixins ve.dm.ResizableNode
+ * @mixins ve.dm.ImageNode
*
* @constructor
* @param {Object} [element] Reference to element in linear model
@@ -20,14 +20,14 @@
ve.dm.LeafNode.apply( this, arguments );
// Mixin constructor
- ve.dm.ResizableNode.call( this );
+ ve.dm.ImageNode.call( this );
};
/* Inheritance */
OO.inheritClass( ve.dm.InlineImageNode, ve.dm.LeafNode );
-OO.mixinClass( ve.dm.InlineImageNode, ve.dm.ResizableNode );
+OO.mixinClass( ve.dm.InlineImageNode, ve.dm.ImageNode );
/* Static Properties */
@@ -58,22 +58,6 @@
var domElement = doc.createElement( 'img' );
ve.setDomAttributes( domElement, dataElement.attributes, [ 'alt',
'src', 'width', 'height' ] );
return [ domElement ];
-};
-
-/**
- * @inheritdoc
- */
-ve.dm.InlineImageNode.prototype.createScalable = function () {
- return new ve.dm.Scalable( {
- currentDimensions: {
- width: this.getAttribute( 'width' ),
- height: this.getAttribute( 'height' )
- },
- minDimensions: {
- width: 1,
- height: 1
- }
- } );
};
/* Registration */
diff --git a/tests/index.html b/tests/index.html
index f969b27..0a86837 100644
--- a/tests/index.html
+++ b/tests/index.html
@@ -136,6 +136,7 @@
<script src="../src/dm/nodes/ve.dm.TableRowNode.js"></script>
<script
src="../src/dm/nodes/ve.dm.TableSectionNode.js"></script>
<script src="../src/dm/nodes/ve.dm.TextNode.js"></script>
+ <script src="../src/dm/nodes/ve.dm.ImageNode.js"></script>
<script src="../src/dm/nodes/ve.dm.BlockImageNode.js"></script>
<script
src="../src/dm/nodes/ve.dm.BlockImageCaptionNode.js"></script>
<script src="../src/dm/nodes/ve.dm.InlineImageNode.js"></script>
@@ -200,6 +201,7 @@
<script src="../src/ce/nodes/ve.ce.TableRowNode.js"></script>
<script
src="../src/ce/nodes/ve.ce.TableSectionNode.js"></script>
<script src="../src/ce/nodes/ve.ce.TextNode.js"></script>
+ <script src="../src/ce/nodes/ve.ce.ImageNode.js"></script>
<script src="../src/ce/nodes/ve.ce.BlockImageNode.js"></script>
<script
src="../src/ce/nodes/ve.ce.BlockImageCaptionNode.js"></script>
<script src="../src/ce/nodes/ve.ce.InlineImageNode.js"></script>
--
To view, visit https://gerrit.wikimedia.org/r/155023
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I90b543e1a91ab950ff9e857c038bf670dde5634d
Gerrit-PatchSet: 6
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
Gerrit-Reviewer: Catrope <[email protected]>
Gerrit-Reviewer: Esanders <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: Mooeypoo <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits