sax.createStream = function () { var stream = require('stream') , parser = sax.parser.apply(sax, arguments) , stream = new stream.Stream() ; stream.writable = true stream.write = function (data) { parser.write(data.toString()) stream.emit(data) } stream.end = function (chunk) { if (chunk) parser.write(chunk.toString()) emit('end') } parser.onend = function () { stream.end() }; stream.__defineSetter__('onend', function (val) { parser.onend = function () { stream.end() if (val) val() } }) var wraps = [ 'opentag' , 'closetag' , 'text' , 'attribute' , 'error' , 'doctype' , 'processinginstruction' , 'sgmldeclaration' , 'comment' , 'opencdata' , 'cdata' , 'closecdata' , 'ready' ] wraps.forEach(function (name) { var onFunc = function () { var args = Array.prototype.slice.apply(arguments) args.splice(0,0,name) stream.emit.apply(stream, args) } parser['on'+name] = onFunc; stream.__defineSetter__('on'+name, function (val) { parser['on'+name] = function () { onFunc.apply(parser, arguments) if (val) val.apply(stream, arguments) } }) }) return stream }
wraps.forEach(function (name) { var onFunc = function () { var args = Array.prototype.slice.apply(arguments) args.splice(0,0,name) stream.emit.apply(stream, args) } parser['on'+name] = onFunc; stream.__defineSetter__('on'+name, function (val) { parser['on'+name] = function () { onFunc.apply(parser, arguments) if (val) val.apply(stream, arguments) } }) })