Send a full document back to Parsoid

To do this, we take the document generated by the converter and
transplant things from the original Parsoid document into it.

Change-Id: I2f5058220669526130a360cec3389c3f42b41771
This commit is contained in:
Catrope 2013-05-10 17:03:48 -07:00
parent 634947198a
commit 9611bf9f64

View file

@ -182,8 +182,7 @@ ve.init.mw.Target.onLoad = function ( response ) {
/** /**
* Handle both DOM and modules being loaded and ready. * Handle both DOM and modules being loaded and ready.
* *
* This method is called within the context of a target instance. After the load event is emitted * This method is called within the context of a target instance.
* this.doc is cleared, allowing it to be garbage collected.
* *
* @static * @static
* @method * @method
@ -192,8 +191,6 @@ ve.init.mw.Target.onLoad = function ( response ) {
ve.init.mw.Target.onReady = function () { ve.init.mw.Target.onReady = function () {
this.loading = false; this.loading = false;
this.emit( 'load', this.doc ); this.emit( 'load', this.doc );
// Release DOM data
this.doc = null;
}; };
/** /**
@ -358,6 +355,36 @@ ve.init.mw.Target.onSerializeError = function ( jqXHR, status, error ) {
/* Methods */ /* Methods */
/**
* Get HTML to send to Parsoid. This takes a document generated by the converter and
* transplants the head tag from the old document into it, as well as the attributes on the
* html and body tags.
*
* @param {HTMLDocument} newDoc Document generated by ve.dm.Converter. Will be modified.
* @returns {string} Full HTML document
*/
ve.init.mw.Target.prototype.getHtml = function ( newDoc ) {
var i, len, oldDoc = this.doc;
function copyAttributes( from, to ) {
var i, len;
for ( i = 0, len = from.attributes.length; i < len; i++ ) {
to.setAttribute( from.attributes[i].name, from.attributes[i].value );
}
}
// Copy the head from the old document
for ( i = 0, len = oldDoc.head.childNodes.length; i < len; i++ ) {
newDoc.head.appendChild( oldDoc.head.childNodes[i].cloneNode( true ) );
}
// Copy attributes from the old document for the html, head and body
copyAttributes( oldDoc.documentElement, newDoc.documentElement );
copyAttributes( oldDoc.head, newDoc.head );
copyAttributes( oldDoc.body, newDoc.body );
return '<!doctype html>' + ve.properOuterHtml( newDoc.documentElement );
};
/** /**
* Get DOM data from the Parsoid API. * Get DOM data from the Parsoid API.
* *
@ -430,7 +457,7 @@ ve.init.mw.Target.prototype.save = function ( doc, options ) {
'oldid': this.oldid, 'oldid': this.oldid,
'basetimestamp': this.baseTimeStamp, 'basetimestamp': this.baseTimeStamp,
'starttimestamp': this.startTimeStamp, 'starttimestamp': this.startTimeStamp,
'html': ve.properInnerHtml( doc.body ), // TODO make this send the whole document in the future 'html': this.getHtml( doc ),
'token': this.editToken, 'token': this.editToken,
'summary': options.summary, 'summary': options.summary,
'minor': Number( options.minor ), 'minor': Number( options.minor ),
@ -461,7 +488,7 @@ ve.init.mw.Target.prototype.showChanges = function ( doc ) {
'paction': 'diff', 'paction': 'diff',
'page': this.pageName, 'page': this.pageName,
'oldid': this.oldid, 'oldid': this.oldid,
'html': ve.properInnerHtml( doc.body ), // TODO make this send the whole document in the future 'html': this.getHtml( doc ),
// TODO: API required editToken, though not relevant for diff // TODO: API required editToken, though not relevant for diff
'token': this.editToken 'token': this.editToken
}, },
@ -549,7 +576,7 @@ ve.init.mw.Target.prototype.serialize = function ( doc, callback ) {
'data': { 'data': {
'action': 'visualeditor', 'action': 'visualeditor',
'paction': 'serialize', 'paction': 'serialize',
'html': ve.properInnerHtml( doc.body ), // TODO make this send the whole document in the future 'html': this.getHtml( doc ),
'page': this.pageName, 'page': this.pageName,
'oldid': this.oldid, 'oldid': this.oldid,
'token': this.editToken, 'token': this.editToken,
@ -594,7 +621,7 @@ ve.init.mw.Target.prototype.reportProblem = function ( message ) {
store, internalList store, internalList
).getData(), ).getData(),
'editedData': editedData, 'editedData': editedData,
'editedHtml': ve.properInnerHtml( ve.dm.converter.getDomFromData( editedData, store, internalList ).body ), 'editedHtml': this.getHtml( ve.dm.converter.getDomFromData( editedData, store, internalList ) ),
'store': doc.data.getUsedStoreValues(), 'store': doc.data.getUsedStoreValues(),
'wiki': mw.config.get( 'wgDBname' ) 'wiki': mw.config.get( 'wgDBname' )
}; };