Esanders has uploaded a new change for review.
https://gerrit.wikimedia.org/r/189737
Change subject: Simplify AlignableNode by inheriting from ClassAttributeNode
......................................................................
Simplify AlignableNode by inheriting from ClassAttributeNode
Change-Id: Ifdc7bf513aefa23648c0b885cd6de1153f56a9ae
---
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
M src/ce/ve.ce.AlignableNode.js
A src/ce/ve.ce.ClassAttributeNode.js
M src/dm/nodes/ve.dm.BlockImageNode.js
M src/dm/ve.dm.AlignableNode.js
M src/dm/ve.dm.ClassAttributeNode.js
M tests/index.html
11 files changed, 81 insertions(+), 107 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor
refs/changes/37/189737/1
diff --git a/.docs/eg-iframe.html b/.docs/eg-iframe.html
index 610ecde..11fea38 100644
--- a/.docs/eg-iframe.html
+++ b/.docs/eg-iframe.html
@@ -230,6 +230,7 @@
<script src="../src/ce/ve.ce.BranchNode.js"></script>
<script src="../src/ce/ve.ce.ContentBranchNode.js"></script>
<script src="../src/ce/ve.ce.LeafNode.js"></script>
+ <script src="../src/ce/ve.ce.ClassAttributeNode.js"></script>
<script src="../src/ce/ve.ce.AlignableNode.js"></script>
<script src="../src/ce/ve.ce.FocusableNode.js"></script>
<script src="../src/ce/ve.ce.ResizableNode.js"></script>
diff --git a/build/modules.json b/build/modules.json
index 501d33e..c74e063 100644
--- a/build/modules.json
+++ b/build/modules.json
@@ -257,6 +257,7 @@
"src/ce/ve.ce.BranchNode.js",
"src/ce/ve.ce.ContentBranchNode.js",
"src/ce/ve.ce.LeafNode.js",
+ "src/ce/ve.ce.ClassAttributeNode.js",
"src/ce/ve.ce.AlignableNode.js",
"src/ce/ve.ce.FocusableNode.js",
"src/ce/ve.ce.ResizableNode.js",
diff --git a/demos/ve/desktop.html b/demos/ve/desktop.html
index 8054a4c..0ce5bd6 100644
--- a/demos/ve/desktop.html
+++ b/demos/ve/desktop.html
@@ -247,6 +247,7 @@
<script src="../../src/ce/ve.ce.BranchNode.js"></script>
<script src="../../src/ce/ve.ce.ContentBranchNode.js"></script>
<script src="../../src/ce/ve.ce.LeafNode.js"></script>
+ <script src="../../src/ce/ve.ce.ClassAttributeNode.js"></script>
<script src="../../src/ce/ve.ce.AlignableNode.js"></script>
<script src="../../src/ce/ve.ce.FocusableNode.js"></script>
<script src="../../src/ce/ve.ce.ResizableNode.js"></script>
diff --git a/demos/ve/mobile.html b/demos/ve/mobile.html
index 7579576..eec79d1 100644
--- a/demos/ve/mobile.html
+++ b/demos/ve/mobile.html
@@ -248,6 +248,7 @@
<script src="../../src/ce/ve.ce.BranchNode.js"></script>
<script src="../../src/ce/ve.ce.ContentBranchNode.js"></script>
<script src="../../src/ce/ve.ce.LeafNode.js"></script>
+ <script src="../../src/ce/ve.ce.ClassAttributeNode.js"></script>
<script src="../../src/ce/ve.ce.AlignableNode.js"></script>
<script src="../../src/ce/ve.ce.FocusableNode.js"></script>
<script src="../../src/ce/ve.ce.ResizableNode.js"></script>
diff --git a/src/ce/nodes/ve.ce.BlockImageNode.js
b/src/ce/nodes/ve.ce.BlockImageNode.js
index 1a6aa7b..17f5732 100644
--- a/src/ce/nodes/ve.ce.BlockImageNode.js
+++ b/src/ce/nodes/ve.ce.BlockImageNode.js
@@ -52,6 +52,9 @@
OO.mixinClass( ve.ce.BlockImageNode, ve.ce.ImageNode );
+// Mixin Alignable's parent class
+OO.mixinClass( ve.ce.BlockImageNode, ve.ce.ClassAttributeNode );
+
OO.mixinClass( ve.ce.BlockImageNode, ve.ce.AlignableNode );
/* Static Properties */
diff --git a/src/ce/ve.ce.AlignableNode.js b/src/ce/ve.ce.AlignableNode.js
index 94af427..95c66f0 100644
--- a/src/ce/ve.ce.AlignableNode.js
+++ b/src/ce/ve.ce.AlignableNode.js
@@ -1,30 +1,22 @@
-/*!
- * VisualEditor ContentEditable AlignableNode class.
- *
- * @copyright 2011-2015 VisualEditor Team and others; see
http://ve.mit-license.org
- */
-
/**
* ContentEditable Alignable node.
*
* @class
* @abstract
+ * @extends ve.ce.ClassAttributeNode
*
* @constructor
*/
-ve.ce.AlignableNode = function VeCeAlignableNode( $alignable, config ) {
- config = config || {};
+ve.ce.AlignableNode = function VeCeAlignableNode() {
+ // Parent constructor
+ ve.ce.AlignableNode.super.apply( this, arguments );
- this.$alignable = $alignable || this.$element;
-
- // Events
- this.connect( this, { setup: 'onAlignableSetup' } );
- this.model.connect( this, { attributeChange:
'onAlignableAttributeChange' } );
+ this.align = null;
};
/* Inheritance */
-OO.initClass( ve.ce.AlignableNode );
+OO.inheritClass( ve.ce.AlignableNode, ve.ce.ClassAttributeNode );
/* Events */
@@ -34,34 +26,13 @@
*/
/**
- * Handle attribute change events
- *
- * @param {string} key Key
- * @param {string} from Old value
- * @param {string} to New value
+ * @inheritdoc
*/
-ve.ce.AlignableNode.prototype.onAlignableAttributeChange = function ( key,
from, to ) {
- var cssClasses;
- if ( key === 'align' ) {
- cssClasses = this.model.constructor.static.cssClasses;
- if ( from && cssClasses[from] ) {
- this.$alignable.removeClass( cssClasses[from] );
- }
- if ( to && cssClasses[to] ) {
- this.$alignable.addClass( cssClasses[to] );
- }
- this.emit( 'align', to );
- }
-};
-
-/**
- * Handle node setup
- */
-ve.ce.AlignableNode.prototype.onAlignableSetup = function () {
- var align = this.model.getAttribute( 'align' ),
- cssClasses = this.model.constructor.static.cssClasses;
- if ( align && cssClasses[align] ) {
- this.$alignable.addClass( cssClasses[align] );
+ve.ce.AlignableNode.prototype.updateAttributeClasses = function () {
+ ve.ce.AlignableNode.super.prototype.updateAttributeClasses.apply( this,
arguments );
+ var align = this.model.getAttribute( 'align' );
+ if ( align && align !== this.align ) {
this.emit( 'align', align );
+ this.align = align;
}
};
diff --git a/src/ce/ve.ce.ClassAttributeNode.js
b/src/ce/ve.ce.ClassAttributeNode.js
new file mode 100644
index 0000000..62b5cdc
--- /dev/null
+++ b/src/ce/ve.ce.ClassAttributeNode.js
@@ -0,0 +1,39 @@
+/*!
+ * VisualEditor ContentEditable ClassAttributeNode class.
+ *
+ * @copyright 2011-2015 VisualEditor Team and others; see
http://ve.mit-license.org
+ */
+
+/**
+ * ContentEditable class-attribute node.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ * @param {jQuery} [$classedElement=this.$element] Element to which
attribute-based classes are attached
+ */
+ve.ce.ClassAttributeNode = function VeCeClassAttributeNode( $classedElement,
config ) {
+ config = config || {};
+
+ // Properties
+ this.$classedElement = $classedElement || this.$element;
+ this.currentAttributeClasses = '';
+
+ // Events
+ this.connect( this, { setup: 'updateAttributeClasses' } );
+ this.model.connect( this, { attributeChange: 'updateAttributeClasses' }
);
+};
+
+/* Inheritance */
+
+OO.initClass( ve.ce.ClassAttributeNode );
+
+/**
+ * Update classes from attributes
+ */
+ve.ce.ClassAttributeNode.prototype.updateAttributeClasses = function () {
+ this.$classedElement.removeClass( this.currentAttributeClasses );
+ this.currentAttributeClasses =
this.model.constructor.static.getClassAttrFromAttributes(
this.model.element.attributes );
+ this.$classedElement.addClass( this.currentAttributeClasses );
+};
diff --git a/src/dm/nodes/ve.dm.BlockImageNode.js
b/src/dm/nodes/ve.dm.BlockImageNode.js
index 2df7333..d23a2f8 100644
--- a/src/dm/nodes/ve.dm.BlockImageNode.js
+++ b/src/dm/nodes/ve.dm.BlockImageNode.js
@@ -31,6 +31,9 @@
OO.mixinClass( ve.dm.BlockImageNode, ve.dm.ImageNode );
+// Mixin Alignable's parent class
+OO.mixinClass( ve.dm.BlockImageNode, ve.dm.ClassAttributeNode );
+
OO.mixinClass( ve.dm.BlockImageNode, ve.dm.AlignableNode );
/* Static Properties */
@@ -60,6 +63,7 @@
var dataElement,
figure = domElements[0],
+ classAttr = figure.getAttribute( 'class' ),
img = findChildren( figure, 'img' )[0] || null,
caption = findChildren( figure, 'figcaption' )[0] || null,
attributes = {
@@ -73,12 +77,14 @@
attributes.alt = altText;
}
+ this.setClassAttributes( attributes, classAttr );
+
attributes.width = width !== undefined && width !== '' ? Number( width
) : null;
attributes.height = height !== undefined && height !== '' ? Number(
height ) : null;
dataElement = {
type: this.name,
- attributes: ve.extendObject(
ve.dm.AlignableNode.static.toDataElementAttributes( domElements, converter ),
attributes )
+ attributes: attributes
};
if ( !caption ) {
@@ -102,6 +108,7 @@
var dataElement = data[0],
width = dataElement.attributes.width,
height = dataElement.attributes.height,
+ classAttr = this.getClassAttrFromAttributes(
dataElement.attributes ),
figure = doc.createElement( 'figure' ),
img = doc.createElement( 'img' ),
wrapper = doc.createElement( 'div' ),
@@ -115,6 +122,10 @@
}
figure.appendChild( img );
+ if ( classAttr ) {
+ figure.className = classAttr;
+ }
+
// If length of captionData is smaller or equal to 2 it means that
there is no caption or that
// it is empty - in both cases we are going to skip appending
<figcaption>.
if ( captionData.length > 2 ) {
@@ -123,8 +134,6 @@
figure.appendChild( wrapper.firstChild );
}
}
-
- ve.dm.AlignableNode.static.modifyDomElement( figure, dataElement );
return [ figure ];
};
diff --git a/src/dm/ve.dm.AlignableNode.js b/src/dm/ve.dm.AlignableNode.js
index 00abcfc..9d33770 100644
--- a/src/dm/ve.dm.AlignableNode.js
+++ b/src/dm/ve.dm.AlignableNode.js
@@ -9,75 +9,23 @@
*
* @class
* @abstract
+ * @extends ve.dm.ClassAttributeNode
+ *
* @constructor
*/
ve.dm.AlignableNode = function VeDmAlignableNode() {
+ // Parent constructor
+ ve.dm.AlignableNode.super.apply( this, arguments );
};
/* Inheritance */
-OO.initClass( ve.dm.AlignableNode );
+OO.inheritClass( ve.dm.AlignableNode, ve.dm.ClassAttributeNode );
/* Static properties */
-/**
- * CSS class to use for each alignment
- *
- * @static
- * @property {Object}
- * @inheritable
- */
-ve.dm.AlignableNode.static.cssClasses = {
- left: 've-align-left',
- right: 've-align-right',
- center: 've-align-center'
-};
-
-/**
- * Creates attributes for the data element from DOM elements
- *
- * @static
- * @param {Node[]} domElements DOM elements from converter
- * @param {ve.dm.Converter} converter Converter object
- * @return {Object} Attributes for data element
- */
-ve.dm.AlignableNode.static.toDataElementAttributes = function ( domElements ) {
- var a, align,
- classList = domElements[0].classList,
- cssClasses = this.cssClasses;
-
- for ( a in cssClasses ) {
- if ( classList.contains( cssClasses[a] ) ) {
- align = a;
- break;
- }
- }
-
- if ( align ) {
- return {
- align: align,
- originalAlign: align
- };
- } else {
- return {};
- }
-};
-
-/**
- * Modify DOM element from the data element during toDomElements
- *
- * @param {Node} domElement Parent DOM element
- * @param {Object} dataElement Linear model element
- * @param {HTMLDocument} doc HTML document for creating elements
- * @return {Object} Attributes for DOM element
- */
-ve.dm.AlignableNode.static.modifyDomElement = function ( domElement,
dataElement ) {
- if ( dataElement.attributes.align !==
dataElement.attributes.originalAlign ) {
- if ( dataElement.attributes.originalAlign ) {
- $( domElement ).removeClass( 've-align-' +
dataElement.attributes.originalAlign );
- }
- if ( dataElement.attributes.align ) {
- $( domElement ).addClass( 've-align-' +
dataElement.attributes.align );
- }
- }
+ve.dm.AlignableNode.static.classAttributes = {
+ 've-align-left': { align: 'left' },
+ 've-align-right': { align: 'right' },
+ 've-align-center': { align: 'center' }
};
diff --git a/src/dm/ve.dm.ClassAttributeNode.js
b/src/dm/ve.dm.ClassAttributeNode.js
index 6cb5cc9..fbd2c16 100644
--- a/src/dm/ve.dm.ClassAttributeNode.js
+++ b/src/dm/ve.dm.ClassAttributeNode.js
@@ -1,8 +1,7 @@
/*!
* VisualEditor DataModel ClassAttribute class.
*
- * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
+ * @copyright 2011-2015 VisualEditor Team and others; see
http://ve.mit-license.org
*/
/**
diff --git a/tests/index.html b/tests/index.html
index 43bd38c..f72b089 100644
--- a/tests/index.html
+++ b/tests/index.html
@@ -189,6 +189,7 @@
<script src="../src/ce/ve.ce.BranchNode.js"></script>
<script src="../src/ce/ve.ce.ContentBranchNode.js"></script>
<script src="../src/ce/ve.ce.LeafNode.js"></script>
+ <script src="../src/ce/ve.ce.ClassAttributeNode.js"></script>
<script src="../src/ce/ve.ce.AlignableNode.js"></script>
<script src="../src/ce/ve.ce.FocusableNode.js"></script>
<script src="../src/ce/ve.ce.ResizableNode.js"></script>
--
To view, visit https://gerrit.wikimedia.org/r/189737
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifdc7bf513aefa23648c0b885cd6de1153f56a9ae
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits