Esanders has uploaded a new change for review.
https://gerrit.wikimedia.org/r/169661
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(-)
git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor
refs/changes/61/169661/1
diff --git a/.docs/eg-iframe.html b/.docs/eg-iframe.html
index a1caf86..0aa1c92 100644
--- a/.docs/eg-iframe.html
+++ b/.docs/eg-iframe.html
@@ -209,6 +209,7 @@
<script src="../src/ce/ve.ce.Annotation.js"></script>
<script src="../src/ce/ve.ce.Node.js"></script>
<script src="../src/ce/ve.ce.BranchNode.js"></script>
+ <script src="../src/ce/ve.ce.ClassAttributeNode.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.FocusableNode.js"></script>
diff --git a/build/modules.json b/build/modules.json
index 902118e..e262fb9 100644
--- a/build/modules.json
+++ b/build/modules.json
@@ -233,6 +233,7 @@
"src/ce/ve.ce.Annotation.js",
"src/ce/ve.ce.Node.js",
"src/ce/ve.ce.BranchNode.js",
+ "src/ce/ve.ce.ClassAttributeNode.js",
"src/ce/ve.ce.ContentBranchNode.js",
"src/ce/ve.ce.LeafNode.js",
"src/ce/ve.ce.FocusableNode.js",
diff --git a/demos/ve/desktop.html b/demos/ve/desktop.html
index c2dbdbb..a36fa66 100644
--- a/demos/ve/desktop.html
+++ b/demos/ve/desktop.html
@@ -221,6 +221,7 @@
<script src="../../src/ce/ve.ce.Annotation.js"></script>
<script src="../../src/ce/ve.ce.Node.js"></script>
<script src="../../src/ce/ve.ce.BranchNode.js"></script>
+ <script src="../../src/ce/ve.ce.ClassAttributeNode.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.FocusableNode.js"></script>
diff --git a/demos/ve/mobile.html b/demos/ve/mobile.html
index e2ddd95..bee38a5 100644
--- a/demos/ve/mobile.html
+++ b/demos/ve/mobile.html
@@ -222,6 +222,7 @@
<script src="../../src/ce/ve.ce.Annotation.js"></script>
<script src="../../src/ce/ve.ce.Node.js"></script>
<script src="../../src/ce/ve.ce.BranchNode.js"></script>
+ <script src="../../src/ce/ve.ce.ClassAttributeNode.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.FocusableNode.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..86a9659 100644
--- a/tests/index.html
+++ b/tests/index.html
@@ -174,6 +174,7 @@
<script src="../src/ce/ve.ce.Annotation.js"></script>
<script src="../src/ce/ve.ce.Node.js"></script>
<script src="../src/ce/ve.ce.BranchNode.js"></script>
+ <script src="../src/ce/ve.ce.ClassAttributeNode.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.FocusableNode.js"></script>
--
To view, visit https://gerrit.wikimedia.org/r/169661
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I2db656351942be14d320b4221d2f268c02875b7a
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