Esanders has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/173807

Change subject: Create 'preserveGenerated' mode for cloneElements and use in 
copy
......................................................................

Create 'preserveGenerated' mode for cloneElements and use in copy

The copy operation should preserve the 'generated' internal property
so that source style is preserved.

Bug: 72426
Change-Id: I77e2a9936459a15f6fbb94817ffcad97ef75dcd6
---
M src/dm/lineardata/ve.dm.ElementLinearData.js
M src/dm/ve.dm.Node.js
M tests/dm/ve.dm.Node.test.js
3 files changed, 39 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/07/173807/1

diff --git a/src/dm/lineardata/ve.dm.ElementLinearData.js 
b/src/dm/lineardata/ve.dm.ElementLinearData.js
index 1f71b5e..50d3827 100644
--- a/src/dm/lineardata/ve.dm.ElementLinearData.js
+++ b/src/dm/lineardata/ve.dm.ElementLinearData.js
@@ -938,13 +938,15 @@
  * Run all elements through getClonedElement(). This should be done if
  * you intend to insert the sliced data back into the document as a copy
  * of the original data (e.g. for copy and paste).
+ *
+ * @param {boolean} preserveGenerated Preserve internal.generated properties 
of elements
  */
-ve.dm.ElementLinearData.prototype.cloneElements = function () {
+ve.dm.ElementLinearData.prototype.cloneElements = function ( preserveGenerated 
) {
        var i, len, node;
        for ( i = 0, len = this.getLength(); i < len; i++ ) {
                if ( this.isOpenElementData( i ) ) {
                        node = ve.dm.nodeFactory.create( this.getType( i ), 
this.getData( i ) );
-                       this.data[i] = node.getClonedElement();
+                       this.data[i] = ve.dm.Node.static.cloneElement( 
this.getData( i ), preserveGenerated );
                }
        }
 };
diff --git a/src/dm/ve.dm.Node.js b/src/dm/ve.dm.Node.js
index 70567d4..8dd1a0d 100644
--- a/src/dm/ve.dm.Node.js
+++ b/src/dm/ve.dm.Node.js
@@ -242,6 +242,7 @@
  * tags; unless we're in a content location, in which case we have no choice
  * but to generate an inline element.
  *
+ * @static
  * @param {HTMLElement[]} domElements DOM elements being converted
  * @param {ve.dm.Converter} converter Converter object
  * @returns {boolean} The element is inline
@@ -264,19 +265,20 @@
                allTagsInline;
 };
 
-/* Methods */
-
 /**
  * Get a clone of the node's document data element.
  *
  * The attributes object will be deep-copied and the .internal.generated
  * property will be removed if present.
  *
+ * @static
+ * @param {Object} element Element object
+ * @param {boolean} preserveGenerated Preserve internal.generated property of 
element
  * @returns {Object} Cloned element object
  */
-ve.dm.Node.prototype.getClonedElement = function () {
-       var clone = ve.copy( this.element );
-       if ( clone.internal ) {
+ve.dm.Node.static.cloneElement = function ( element, preserveGenerated ) {
+       var clone = ve.copy( element );
+       if ( !preserveGenerated && clone.internal ) {
                delete clone.internal.generated;
                if ( ve.isEmptyObject( clone.internal ) ) {
                        delete clone.internal;
@@ -285,6 +287,17 @@
        return clone;
 };
 
+/* Methods */
+
+/**
+ * @see #static-cloneElement
+ * @param {boolean} preserveGenerated Preserve internal.generated property of 
element
+ * @returns {Object} Cloned element object
+ */
+ve.dm.Node.prototype.getClonedElement = function ( preserveGenerated ) {
+       return this.constructor.static.cloneElement( this.element, 
preserveGenerated );
+};
+
 /**
  * @inheritdoc ve.Node
  */
diff --git a/tests/dm/ve.dm.Node.test.js b/tests/dm/ve.dm.Node.test.js
index e9267e3..65e8803 100644
--- a/tests/dm/ve.dm.Node.test.js
+++ b/tests/dm/ve.dm.Node.test.js
@@ -168,6 +168,22 @@
                                        }
                                },
                                clone: {
+                                       type: 'foo',
+                                       internal: {
+                                               generated: 'wrapper'
+                                       }
+                               },
+                               preserveGenerated: true,
+                               msg: 'internal.generated not removed if 
preserveGenerated set'
+                       },
+                       {
+                               original: {
+                                       type: 'foo',
+                                       internal: {
+                                               generated: 'wrapper'
+                                       }
+                               },
+                               clone: {
                                        type: 'foo'
                                },
                                msg: 'internal property is removed if it only 
contained .generated'
@@ -217,6 +233,6 @@
 
        for ( i = 0; i < cases.length; i++ ) {
                node = new ve.dm.NodeStub( cases[i].original );
-               assert.deepEqual( node.getClonedElement(), cases[i].clone, 
cases[i].msg );
+               assert.deepEqual( node.getClonedElement( 
cases[i].preserveGenerated ), cases[i].clone, cases[i].msg );
        }
 } );

-- 
To view, visit https://gerrit.wikimedia.org/r/173807
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I77e2a9936459a15f6fbb94817ffcad97ef75dcd6
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

Reply via email to