Jforrester has uploaded a new change for review.

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

Change subject: ve.ce.Surface: Move insert HTML path to DM.
......................................................................

ve.ce.Surface: Move insert HTML path to DM.

Using ve.dm.SurfaceFragment#insertHtml and ve.dm.SurfaceFragment#insertDocument
via ve.dm.Document#newFromHtml, so it can be used by other pathways.

Change-Id: I17191f6ffc18cc1f0d780ae48a53d39ceec35643
---
M src/ce/ve.ce.Surface.js
M src/dm/ve.dm.Document.js
M src/dm/ve.dm.SurfaceFragment.js
3 files changed, 71 insertions(+), 22 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/48/172748/1

diff --git a/src/ce/ve.ce.Surface.js b/src/ce/ve.ce.Surface.js
index 59a5907..058fa43 100644
--- a/src/ce/ve.ce.Surface.js
+++ b/src/ce/ve.ce.Surface.js
@@ -882,7 +882,6 @@
        // Properties may be nullified by other events, so cache before 
setTimeout
        var selectionJSON, dragSelection, dragRange, originFragment, originData,
                targetRange, targetOffset, targetFragment, dragHtml, dragText,
-               htmlDoc, doc, data, pasteRules,
                i, l, name, insert,
                fileHandlers = [],
                dataTransfer = e.originalEvent.dataTransfer,
@@ -966,31 +965,18 @@
                        // Re-insert data at new location
                        targetFragment.insertContent( originData );
                } else if ( fileHandlers.length ) {
-                       insert = function ( data ) {
-                               targetFragment.collapseToEnd().insertContent( 
data );
+                       insert = function ( docOrData ) {
+                               if ( docOrData instanceof ve.dm.Document ) {
+                                       
targetFragment.collapseToEnd().insertDocument( docOrData );
+                               } else {
+                                       
targetFragment.collapseToEnd().insertContent( docOrData );
+                               }
                        };
                        for ( i = 0, l = fileHandlers.length; i < l; i++ ) {
                                fileHandlers[i].getInsertableData().done( 
insert );
                        }
                } else if ( dragHtml ) {
-                       pasteRules = this.getSurface().getPasteRules();
-                       htmlDoc = ve.createDocumentFromHtml( dragHtml );
-                       doc = ve.dm.converter.getModelFromDom( htmlDoc, 
this.getModel().getDocument().getHtmlDocument() );
-                       data = doc.data;
-                       // Clear metadata
-                       doc.metadata = new ve.dm.MetaLinearData( 
doc.getStore(), new Array( 1 + data.getLength() ) );
-                       data.sanitize( pasteRules.external, this.pasteSpecial );
-                       if ( pasteRules.all ) {
-                               data.sanitize( pasteRules.all );
-                       }
-                       data.remapInternalListKeys( 
this.model.getDocument().getInternalList() );
-                       // Initialize node tree
-                       doc.buildNodeTree();
-                       this.getModel().change( new 
ve.dm.Transaction.newFromDocumentInsertion(
-                               this.getModel().getDocument(),
-                               targetOffset,
-                               doc
-                       ) );
+                       targetFragment.insertHtml( dragHtml, 
this.getSurface().getPasteRules() );
                } else if ( dragText ) {
                        targetFragment.insertContent( dragText );
                }
diff --git a/src/dm/ve.dm.Document.js b/src/dm/ve.dm.Document.js
index 7a643c3..73219b0 100644
--- a/src/dm/ve.dm.Document.js
+++ b/src/dm/ve.dm.Document.js
@@ -104,6 +104,7 @@
 /**
  * Split data into element data and meta data.
  *
+ * @static
  * @param {ve.dm.FlatLinearData} fullData Full data from converter
  * @returns {Object} Object containing element linear data and meta linear 
data (if processed)
  */
@@ -161,7 +162,7 @@
  *
  * This method modifies data in place.
  *
- * @method
+ * @static
  * @param {Array} data Data to apply annotations to
  * @param {ve.dm.AnnotationSet} annotationSet Annotations to apply
  */
@@ -1229,6 +1230,36 @@
 };
 
 /**
+ * Create a document given an HTML string to insert.
+ *
+ * @method
+ * @param {string} html HTML to insert
+ * @param {Object} pasteRules The paste rules for the target surface
+ * @return {ve.dm.Document} New document
+ */
+ve.dm.Document.prototype.newFromHtml = function ( html, pasteRules ) {
+       var htmlDoc = ve.createDocumentFromHtml( html ),
+               doc = ve.dm.converter.getModelFromDom( htmlDoc, 
this.getHtmlDocument() ),
+               data = doc.data;
+
+       // Clear metadata
+       doc.metadata = new ve.dm.MetaLinearData( doc.getStore(), new Array( 1 + 
data.getLength() ) );
+
+       if ( pasteRules ) {
+               data.sanitize( pasteRules.external );
+               if ( pasteRules.all ) {
+                       data.sanitize( pasteRules.all );
+               }
+       }
+
+       data.remapInternalListKeys( this.getInternalList() );
+       // Initialize node tree
+       doc.buildNodeTree();
+
+       return doc;
+};
+
+/**
  * Get the length of the complete history stack. This is also the current 
pointer.
  * @returns {number} Length of the complete history stack
  */
diff --git a/src/dm/ve.dm.SurfaceFragment.js b/src/dm/ve.dm.SurfaceFragment.js
index 673d70b..388b5a6 100644
--- a/src/dm/ve.dm.SurfaceFragment.js
+++ b/src/dm/ve.dm.SurfaceFragment.js
@@ -754,6 +754,38 @@
 };
 
 /**
+ * Insert HTML in the fragment.
+ *
+ * @method
+ * @param {string} html HTML to insert
+ * @param {pasteRules} pasteRules The paste rules for the target surface
+ * @chainable
+ */
+ve.dm.SurfaceFragment.prototype.insertHtml = function ( html, pasteRules ) {
+       if ( !( this.selection instanceof ve.dm.LinearSelection ) ) {
+               return this;
+       }
+       this.insertDocument( this.getDocument().newFromHtml( html, pasteRules ) 
);
+       return this;
+};
+
+/**
+ */
+ve.dm.SurfaceFragment.prototype.insertDocument = function ( doc ) {
+       if ( !( this.selection instanceof ve.dm.LinearSelection ) ) {
+               return this;
+       }
+
+       this.change( new ve.dm.Transaction.newFromDocumentInsertion(
+               this.getDocument(),
+               this.getSelection().getRange().start,
+               doc
+       ) );
+
+       return this;
+};
+
+/**
  * Remove content in the fragment.
  *
  * @method

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I17191f6ffc18cc1f0d780ae48a53d39ceec35643
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Jforrester <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to