jenkins-bot has submitted this change and it was merged.
Change subject: Provide a generic mechanism for mapping classes to attributes
......................................................................
Provide a generic mechanism for mapping classes to attributes
Currently this is only used by MW nodes (BlockImage and Table)
but this may be useful to core or other extensions in the future.
Change-Id: I2db656351942be14d320b4221d2f268c02875b7a
---
M .docs/eg-iframe.html
M build/modules.json
M demos/ve/desktop.html
M demos/ve/mobile.html
A src/dm/ve.dm.ClassAttributeNode.js
M tests/index.html
6 files changed, 110 insertions(+), 0 deletions(-)
Approvals:
Catrope: Looks good to me, approved
jenkins-bot: Verified
diff --git a/.docs/eg-iframe.html b/.docs/eg-iframe.html
index a1caf86..3b4e665 100644
--- a/.docs/eg-iframe.html
+++ b/.docs/eg-iframe.html
@@ -124,6 +124,7 @@
<script src="../src/dm/ve.dm.AnnotationFactory.js"></script>
<script src="../src/dm/ve.dm.AnnotationSet.js"></script>
<script src="../src/dm/ve.dm.MetaItemFactory.js"></script>
+ <script src="../src/dm/ve.dm.ClassAttributeNode.js"></script>
<script src="../src/dm/ve.dm.FocusableNode.js"></script>
<script src="../src/dm/ve.dm.Scalable.js"></script>
<script src="../src/dm/ve.dm.ResizableNode.js"></script>
diff --git a/build/modules.json b/build/modules.json
index 902118e..08cb2b7 100644
--- a/build/modules.json
+++ b/build/modules.json
@@ -148,6 +148,7 @@
"src/dm/ve.dm.AnnotationFactory.js",
"src/dm/ve.dm.AnnotationSet.js",
"src/dm/ve.dm.MetaItemFactory.js",
+ "src/dm/ve.dm.ClassAttributeNode.js",
"src/dm/ve.dm.FocusableNode.js",
"src/dm/ve.dm.Scalable.js",
"src/dm/ve.dm.ResizableNode.js",
diff --git a/demos/ve/desktop.html b/demos/ve/desktop.html
index c2dbdbb..cbc24b8 100644
--- a/demos/ve/desktop.html
+++ b/demos/ve/desktop.html
@@ -136,6 +136,7 @@
<script src="../../src/dm/ve.dm.AnnotationFactory.js"></script>
<script src="../../src/dm/ve.dm.AnnotationSet.js"></script>
<script src="../../src/dm/ve.dm.MetaItemFactory.js"></script>
+ <script src="../../src/dm/ve.dm.ClassAttributeNode.js"></script>
<script src="../../src/dm/ve.dm.FocusableNode.js"></script>
<script src="../../src/dm/ve.dm.Scalable.js"></script>
<script src="../../src/dm/ve.dm.ResizableNode.js"></script>
diff --git a/demos/ve/mobile.html b/demos/ve/mobile.html
index e2ddd95..b8766c7 100644
--- a/demos/ve/mobile.html
+++ b/demos/ve/mobile.html
@@ -137,6 +137,7 @@
<script src="../../src/dm/ve.dm.AnnotationFactory.js"></script>
<script src="../../src/dm/ve.dm.AnnotationSet.js"></script>
<script src="../../src/dm/ve.dm.MetaItemFactory.js"></script>
+ <script src="../../src/dm/ve.dm.ClassAttributeNode.js"></script>
<script src="../../src/dm/ve.dm.FocusableNode.js"></script>
<script src="../../src/dm/ve.dm.Scalable.js"></script>
<script src="../../src/dm/ve.dm.ResizableNode.js"></script>
diff --git a/src/dm/ve.dm.ClassAttributeNode.js
b/src/dm/ve.dm.ClassAttributeNode.js
new file mode 100644
index 0000000..fe3b6d6
--- /dev/null
+++ b/src/dm/ve.dm.ClassAttributeNode.js
@@ -0,0 +1,105 @@
+/*!
+ * VisualEditor DataModel ClassAttribute class.
+ *
+ * @copyright 2011-2014 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * DataModel class-attribute node.
+ *
+ * Used for nodes which use classes to store attributes.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ */
+ve.dm.ClassAttributeNode = function VeDmClassAttributeNode() {};
+
+/* Inheritance */
+
+OO.initClass( ve.dm.ClassAttributeNode );
+
+/* Static methods */
+
+/**
+ * Mapping from class names to attributes
+ *
+ * e.g. { alignLeft: { align: 'left' } } sets the align attribute to 'left'
+ * if the element has the class 'alignLeft'
+ *
+ * @type {Object}
+ */
+ve.dm.ClassAttributeNode.static.classAttributes = {};
+
+/**
+ * Set attributes from a class attribute
+ *
+ * Unrecognized classes are also preserved.
+ *
+ * @param {Object} attributes Attributes object to modify
+ * @param {string|null} classAttr Class attribute from an element
+ */
+ve.dm.ClassAttributeNode.static.setClassAttributes = function ( attributes,
classAttr ) {
+ var className, i, l,
+ unrecognizedClasses = [],
+ classNames = classAttr ? classAttr.trim().split( /\s+/ ) : [];
+
+ if ( !classNames.length ) {
+ return;
+ }
+
+ for ( i = 0, l = classNames.length; i < l; i++ ) {
+ className = classNames[i];
+ if ( className in this.classAttributes ) {
+ attributes = ve.extendObject( attributes,
this.classAttributes[className] );
+ } else {
+ unrecognizedClasses.push( className );
+ }
+ }
+
+ attributes.originalClasses = classAttr;
+ attributes.unrecognizedClasses = unrecognizedClasses;
+};
+
+/**
+ * Get class attribute from element attributes
+ *
+ * @param {Object} elementAttributes Element attributes
+ * @return {string|null} Class name, or null if no classes to set
+ */
+ve.dm.ClassAttributeNode.static.getClassAttrFromAttributes = function (
attributes ) {
+ var className, key, classAttributeSet, hasClass,
+ classNames = [];
+
+ for ( className in this.classAttributes ) {
+ classAttributeSet = this.classAttributes[className];
+ hasClass = true;
+ for ( key in classAttributeSet ) {
+ if ( attributes[key] !== classAttributeSet[key] ) {
+ hasClass = false;
+ break;
+ }
+ }
+ if ( hasClass ) {
+ classNames.push( className );
+ }
+ }
+
+ if ( attributes.unrecognizedClasses ) {
+ classNames = OO.simpleArrayUnion( classNames,
attributes.unrecognizedClasses );
+ }
+
+ // If no meaningful change in classes, preserve order
+ if (
+ attributes.originalClasses &&
+ ve.compare( attributes.originalClasses.trim().split( /\s+/
).sort(), classNames.sort() )
+ ) {
+ return attributes.originalClasses;
+ } else if ( classNames.length > 0 ) {
+ return classNames.join( ' ' );
+ }
+
+ return null;
+};
diff --git a/tests/index.html b/tests/index.html
index 3e8c942..0c9f131 100644
--- a/tests/index.html
+++ b/tests/index.html
@@ -89,6 +89,7 @@
<script src="../src/dm/ve.dm.AnnotationFactory.js"></script>
<script src="../src/dm/ve.dm.AnnotationSet.js"></script>
<script src="../src/dm/ve.dm.MetaItemFactory.js"></script>
+ <script src="../src/dm/ve.dm.ClassAttributeNode.js"></script>
<script src="../src/dm/ve.dm.FocusableNode.js"></script>
<script src="../src/dm/ve.dm.Scalable.js"></script>
<script src="../src/dm/ve.dm.ResizableNode.js"></script>
--
To view, visit https://gerrit.wikimedia.org/r/169661
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I2db656351942be14d320b4221d2f268c02875b7a
Gerrit-PatchSet: 2
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
Gerrit-Reviewer: Catrope <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits