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