https://www.mediawiki.org/wiki/Special:Code/MediaWiki/112489
Revision: 112489
Author: gwicke
Date: 2012-02-27 15:46:08 +0000 (Mon, 27 Feb 2012)
Log Message:
-----------
Tweak dumpReader to work with current libxmljs and stdin 'data' events.
Modified Paths:
--------------
trunk/extensions/VisualEditor/tests/parser/dumpReader.js
Modified: trunk/extensions/VisualEditor/tests/parser/dumpReader.js
===================================================================
--- trunk/extensions/VisualEditor/tests/parser/dumpReader.js 2012-02-27
15:03:12 UTC (rev 112488)
+++ trunk/extensions/VisualEditor/tests/parser/dumpReader.js 2012-02-27
15:46:08 UTC (rev 112489)
@@ -4,6 +4,7 @@
function DumpReader() {
events.EventEmitter.call(this);
+ this.makeParser();
}
util.inherits(DumpReader, events.EventEmitter);
@@ -11,7 +12,8 @@
/**
* @param {Stream} stream input stream to read XML from
*/
-DumpReader.prototype.read = function(stream) {
+DumpReader.prototype.makeParser = function() {
+
var self = this;
var complete = false;
@@ -30,82 +32,77 @@
boolNodes = flip(['minor', 'redirect']),
ignoreNodes = flip(['mediawiki', 'siteinfo', 'upload',
'thread']);
- var parser = new libxml.SaxPushParser(function(cb) {
- cb.onStartElementNS(function(elem, attrs, prefix, uri,
namespaces) {
- if (elem in ignoreNodes) {
- // ...
- } else if (elem == 'page') {
- stack = [];
- workspace = {};
- } else if (elem == 'revision') {
- stack.push(workspace);
- workspace = {
- page: workspace
- };
- } else if (elem in textNodes || elem in boolNodes) {
- buffer = '';
- } else {
- stack.push(workspace);
- workspace = {};
- }
- });
+ var parser = new libxml.SaxPushParser();
+ this.parser = parser;
+ parser.on('startElementNS', function(elem, attrs, prefix, uri,
namespaces) {
+ //console.warn( 'elem: ' + elem );
+ if (elem in ignoreNodes) {
+ // ...
+ } else if (elem == 'page') {
+ //console.warn( 'starting page' );
+ stack = [];
+ workspace = {};
+ } else if (elem == 'revision') {
+ stack.push(workspace);
+ workspace = {
+ page: workspace
+ };
+ } else if (elem in textNodes || elem in boolNodes) {
+ buffer = '';
+ } else {
+ stack.push(workspace);
+ workspace = {};
+ }
+ });
- cb.onEndElementNS(function(elem, prefix, uri) {
- // ping something!
- if (elem == 'mediawiki') {
- self.complete = true;
- stream.pause();
- self.emit('end', {});
- } else if (elem == 'page') {
- self.emit('page', workspace);
- workspace = stack.pop();
- } else if (elem == 'revision') {
- self.emit('revision', workspace);
- workspace = stack.pop();
- } else if (elem in textNodes) {
- workspace[elem] = buffer;
- } else if (elem in boolNodes) {
- workspace[elem] = true;
- } else {
- var current = workspace;
- workspace = stack.pop();
- workspace[elem] = current;
- }
- });
- cb.onCharacters(function(chars) {
- buffer += chars;
- });
- cb.onCdata(function(cdata) {
- buffer += cdata;
- });
- cb.onEndDocument(function() {
- // This doesn't seem to run...?
+ parser.on( 'endElementNS', function(elem, prefix, uri) {
+ // ping something!
+ if (elem == 'mediawiki') {
self.complete = true;
- stream.pause();
+ //stream.pause();
self.emit('end', {});
- })
- cb.onError(function(err) {
- self.emit('error', err);
- // Should we.... stop reading now or what?
- });
+ } else if (elem == 'page') {
+ self.emit('page', workspace);
+ workspace = stack.pop();
+ } else if (elem == 'revision') {
+ self.emit('revision', workspace);
+ workspace = stack.pop();
+ } else if (elem in textNodes) {
+ workspace[elem] = buffer;
+ } else if (elem in boolNodes) {
+ workspace[elem] = true;
+ } else {
+ var current = workspace;
+ workspace = stack.pop();
+ workspace[elem] = current;
+ }
+ });
- // Now, start reading the file in :D
- stream.on('data', function(buffer) {
- parser.push(buffer); // @fixme does this want bytes or
chars?
- });
- stream.on('end', function() {
- if (!complete) {
- // uh-oh!
- //self.emit('error', 'End of file before end of
XML stream.');
- }
- });
- stream.on('error', function(err) {
- self.emit('error', err);
- });
+ parser.on( 'characters', function(chars) {
+ buffer += chars;
});
+ parser.on( 'cdata', function(cdata) {
+ buffer += cdata;
+ });
+ parser.on( 'endDocument', function() {
+ // This doesn't seem to run...?
+ self.complete = true;
+ //stream.pause();
+ self.emit('end', {});
+ });
+ parser.on( 'error', function(err) {
+ self.emit('error', err);
+ // Should we.... stop reading now or what?
+ });
+
};
+DumpReader.prototype.push = function( chunk ) {
+ //console.log( 'dr read' + chunk );
+ this.parser.push( chunk );
+};
+
module.exports.DumpReader = DumpReader;
if (module === require.main) {
@@ -127,6 +124,7 @@
});
console.log('Reading!');
process.stdin.setEncoding('utf8');
+
+ process.stdin.on('data', reader.push.bind(reader) );
process.stdin.resume();
- reader.read(process.stdin);
}
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs