Arlolra has uploaded a new change for review.
https://gerrit.wikimedia.org/r/200095
Change subject: Remove chunk callback from serializeDOM
......................................................................
Remove chunk callback from serializeDOM
* We only ever return one large chunk (accumulation happens internally)
and this process is sync. Just pass it all in the final callback.
Change-Id: I0122f1e015f35badb4598a74b39ebc6a7d8ef377
---
M api/routes.js
M lib/mediawiki.SelectiveSerializer.js
M lib/mediawiki.WikitextSerializer.js
M tests/mocha/parse.js
M tests/parserTests.js
5 files changed, 30 insertions(+), 50 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/parsoid
refs/changes/95/200095/1
diff --git a/api/routes.js b/api/routes.js
index 97b18ee..3ff6e73 100644
--- a/api/routes.js
+++ b/api/routes.js
@@ -124,8 +124,6 @@
};
var roundTripDiff = function( env, req, res, selser, doc ) {
- var out = [];
-
// Re-parse the HTML to uncover foster-parenting issues
doc = domino.createDocument( doc.outerHTML );
@@ -133,17 +131,14 @@
serializer = new Serializer({ env: env });
return Promise.promisify( serializer.serializeDOM, false, serializer )(
- doc.body, function( chunk ) { out.push(chunk); }, false
- ).then(function() {
- var i;
- out = out.join('');
-
+ doc.body, false
+ ).then(function( out ) {
// Strip selser trigger comment
out = out.replace(/<!--rtSelserEditTestComment-->\n*$/, '');
// Emit base href so all relative urls resolve properly
var hNodes = doc.body.firstChild.childNodes;
- var headNodes = "";
+ var i, headNodes = "";
for (i = 0; i < hNodes.length; i++) {
if (hNodes[i].nodeName.toLowerCase() === 'base') {
headNodes += DU.serializeNode(hNodes[i]);
@@ -270,7 +265,6 @@
env.conf.parsoid.allowCORS );
}
- var out = [];
var p = new Promise(function( resolve, reject ) {
if ( v2 && v2.original && v2.original.wikitext ) {
env.setPageSrcInfo( v2.original.wikitext.body );
@@ -323,11 +317,10 @@
}
}
return Promise.promisify( serializer.serializeDOM, false,
serializer )(
- doc.body, function( chunk ) { out.push( chunk ); },
false
+ doc.body, false
);
- }).timeout( REQ_TIMEOUT ).then(function() {
- var output = out.join(''),
- contentType =
'text/plain;profile=mediawiki.org/specs/wikitext/1.0.0;charset=utf-8';
+ }).timeout( REQ_TIMEOUT ).then(function( output ) {
+ var contentType =
'text/plain;profile=mediawiki.org/specs/wikitext/1.0.0;charset=utf-8';
if ( v2 ) {
apiUtils.jsonResponse(res, env, {
wikitext: {
diff --git a/lib/mediawiki.SelectiveSerializer.js
b/lib/mediawiki.SelectiveSerializer.js
index 788a8bf..e525854 100644
--- a/lib/mediawiki.SelectiveSerializer.js
+++ b/lib/mediawiki.SelectiveSerializer.js
@@ -50,11 +50,9 @@
*
* @param {Error} err
* @param {Node} body
- * @param {Function} cb Callback that is called for each chunk.
- * @param {string} cb.res The wikitext of the chunk we've just serialized.
* @param {Function} finalcb The callback for when we've finished serializing
the DOM.
*/
-SSP.doSerializeDOM = function( err, body, cb, finalcb ) {
+SSP.doSerializeDOM = function( err, body, finalcb ) {
var self = this;
var startTimers = new Map();
@@ -64,7 +62,7 @@
}
// If there's no old source, fall back to non-selective
serialization.
- this.wts.serializeDOM( body, cb, false, finalcb );
+ this.wts.serializeDOM( body, false, finalcb );
if ( this.timer ) {
this.timer.timing( 'html2wt.full.serialize', '', (
Date.now() - startTimers.get( 'html2wt.full.serialize' )) );
@@ -97,7 +95,7 @@
}
// Call the WikitextSerializer to do our bidding
- this.wts.serializeDOM( body, cb, true, finalcb );
+ this.wts.serializeDOM( body, true, finalcb );
if ( this.timer ) {
this.timer.timing( 'html2wt.selser.serialize',
'', ( Date.now() - startTimers.get( 'html2wt.selser.serialize' )) );
@@ -105,8 +103,7 @@
} else {
// Nothing was modified, just re-use the original source
- cb( this.env.page.src );
- finalcb();
+ finalcb( null, this.env.page.src );
}
}
};
@@ -118,14 +115,12 @@
* Parse the wikitext source of the page for DOM-diffing purposes.
*
* @param {Node} body The node for which we're getting the source.
- * @param {Function} cb A callback to call after each chunk is serialized.
- * @param {string} cb.res The result of the chunk serialization.
* @param {Function} finalcb The callback for after we've serialized the
entire document.
* @param {Error} err
* @param {string} src The wikitext source of the document (optionally
* including page metadata)
*/
-SSP.parseOriginalSource = function( body, cb, finalcb, err, src ) {
+SSP.parseOriginalSource = function( body, finalcb, err, src ) {
var self = this,
parserPipelineFactory = new ParserPipelineFactory( this.env ),
parserPipeline = parserPipelineFactory.getPipeline(
'text/x-mediawiki/full' );
@@ -137,7 +132,7 @@
// doSerializeDOM
parserPipeline.once( 'document', function( origDoc ) {
self.env.page.dom = DU.parseHTML( DU.serializeNode( origDoc )
).body;
- self.doSerializeDOM( null, body, cb, finalcb );
+ self.doSerializeDOM( null, body, finalcb );
} );
parserPipeline.processToplevelDoc( this.env.page.src );
};
@@ -150,18 +145,16 @@
* WikitextSerializer.serializeDOM if changes were found.
*
* @param {Node} body The document to serialize.
- * @param {Function} cb A callback for any serialized chunks, called whenever
we get a chunk of wikitext.
- * @param {string} cb.res The chunk of wikitext just serialized.
+ * @param {null} dummy Preserves the wt serializer interface.
* @param {Function} finalcb The callback fired on completion of the
serialization.
*/
-SSP.serializeDOM = function( body, cb, dummy, finalcb ) {
- // dummy preserves the wt serializer interface
+SSP.serializeDOM = function( body, dummy, finalcb ) {
var self = this;
if ( this.env.page.dom || this.env.page.domdiff ) {
- this.doSerializeDOM( null, body, cb, finalcb );
+ this.doSerializeDOM( null, body, finalcb );
} else if ( this.env.page.src ) {
// Have the src, only parse the src to the dom
- this.parseOriginalSource( body, cb, finalcb, null,
this.env.page.src );
+ this.parseOriginalSource( body, finalcb, null,
this.env.page.src );
} else if ( this.env.page.id && this.env.page.id !== '0' ) {
// Start by getting the old text of this page
if ( this.env.conf.parsoid.parsoidCacheURI ) {
@@ -187,16 +180,16 @@
// Selective serialization if there was no
error, full
// serialization if there was one.
- self.doSerializeDOM( err, body, cb, finalcb );
+ self.doSerializeDOM( err, body, finalcb );
});
} else {
Util.getPageSrc(
this.env, this.env.page.name, this.env.page.id
|| null,
- this.parseOriginalSource.bind( this, body, cb,
finalcb )
+ this.parseOriginalSource.bind( this, body,
finalcb )
);
}
} else {
- this.doSerializeDOM( null, body, cb, finalcb );
+ this.doSerializeDOM( null, body, finalcb );
}
};
diff --git a/lib/mediawiki.WikitextSerializer.js
b/lib/mediawiki.WikitextSerializer.js
index 87644ca..038b598 100644
--- a/lib/mediawiki.WikitextSerializer.js
+++ b/lib/mediawiki.WikitextSerializer.js
@@ -1379,7 +1379,7 @@
/**
* Serialize an HTML DOM document.
*/
-WSP.serializeDOM = function( body, chunkCB, selserMode, finalCB ) {
+WSP.serializeDOM = function( body, selserMode, finalCB ) {
this.logType = selserMode ? "trace/selser" : "trace/wts";
this.trace = this.env.log.bind(this.env, this.logType);
@@ -1427,17 +1427,13 @@
// Strip excess/useless nowikis
out = stripUnnecessaryIndentPreNowikis( this.env, out );
}
+
if (state.hasQuoteNowikis) {
// FIXME: Perhaps this can be done on a per-line basis
// rather than do one post-pass on the entire document.
//
// Strip excess/useless nowikis
out = stripUnnecessaryQuoteNowikis(out);
- }
-
- if (chunkCB) {
- // Pass entire output in one big chunk
- chunkCB(out);
}
if ( finalCB && typeof finalCB === 'function' ) {
diff --git a/tests/mocha/parse.js b/tests/mocha/parse.js
index df44848..3ae6a23 100644
--- a/tests/mocha/parse.js
+++ b/tests/mocha/parse.js
@@ -55,9 +55,9 @@
DU.applyDataParsoid( doc, dp );
}
var serializer = new WikitextSerializer({ env:
env });
- return Promise.promisify(
serializer.serializeDOM, false, serializer )(
- doc.body, null, false
- );
+ return Promise.promisify(
+ serializer.serializeDOM, false,
serializer
+ )( doc.body, false );
});
};
diff --git a/tests/parserTests.js b/tests/parserTests.js
index ec05097..1a6f8cc 100755
--- a/tests/parserTests.js
+++ b/tests/parserTests.js
@@ -415,8 +415,7 @@
// Maybe pass this as an option, or clone the entire environment.
this.env.conf.parsoid.rtTestMode = options.rtTestMode;
- var wt = '', self = this,
- startsAtWikitext = mode === 'wt2wt' || mode === 'wt2html' ||
mode === 'selser',
+ var startsAtWikitext = mode === 'wt2wt' || mode === 'wt2html' || mode
=== 'selser',
serializer = (mode === 'selser')
? new SelectiveSerializer({ env: this.env })
: new WikitextSerializer({ env: this.env });
@@ -432,13 +431,12 @@
this.env.setPageSrcInfo( null );
}
- serializer.serializeDOM( body, function ( res ) {
- wt += res;
- }, false, function(err) {
- if (err) {
- self.env.log("fatal", err);
+ var self = this;
+ serializer.serializeDOM( body, false, function( err, wt ) {
+ if ( err ) {
+ self.env.log("error", err);
}
- processWikitextCB( null, wt );
+ processWikitextCB( err, wt );
self.env.setPageSrcInfo( null );
self.env.page.dom = null;
} );
--
To view, visit https://gerrit.wikimedia.org/r/200095
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0122f1e015f35badb4598a74b39ebc6a7d8ef377
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Arlolra <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits