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

Reply via email to