UNPKG

read-xml

Version:

Read a xml file respecting its encoding information

114 lines (79 loc) 3.17 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug); var _stream = require('stream'); var _stream2 = _interopRequireDefault(_stream); var _iconvLite = require('iconv-lite'); var _iconvLite2 = _interopRequireDefault(_iconvLite); var _findEncoding = require('./findEncoding'); var _findEncoding2 = _interopRequireDefault(_findEncoding); var _defaultEncoding = require('./defaultEncoding'); var _defaultEncoding2 = _interopRequireDefault(_defaultEncoding); var _package = require('../package.json'); var _package2 = _interopRequireDefault(_package); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Transform = _stream2.default.Transform; var debugMe = (0, _debug2.default)(_package2.default.name + ':stream'); function concatBuffers(chunks) { var totalLength = chunks.reduce(function (previousValue, chunk) { return previousValue + chunk.length; }, 0); return Buffer.concat(chunks, totalLength); } function DecoderXMLStream(streamOpts) { var options = streamOpts || {}; // eslint-disable-next-line no-multi-assign options.encoding = this.encoding = _defaultEncoding2.default; // we output strings this.chunks = []; this.bufContent = null; this.encodingDetected = null; Transform.call(this, options); } DecoderXMLStream.prototype = Object.create(Transform.prototype, { constructor: { value: DecoderXMLStream } }); // eslint-disable-next-line no-underscore-dangle DecoderXMLStream.prototype._transform = function (chunk, encoding, done) { var _this = this; if (!Buffer.isBuffer(chunk)) { return done(new Error('read-xml#createStream needs buffers as its input')); } debugMe('receiving chunk..'); try { if (this.encodingDetected) { debugMe('encoding was detected before, decoding chunk to ' + this.encodingDetected + '..'); this.push(_iconvLite2.default.decode(chunk, this.encodingDetected), this.encoding); return done(); } this.chunks.push(chunk); this.bufContent = concatBuffers(this.chunks); debugMe('trying to find encoding..'); (0, _findEncoding2.default)(this.bufContent, _defaultEncoding2.default, function (err, detectedEncoding) { if (err) { return done(err); } if (detectedEncoding == null) { debugMe('could not find encoding in chunk, decoding to default ' + _this.encoding + '..'); _this.push(_iconvLite2.default.decode(chunk, _this.encoding), _this.encoding); return done(); } if (!_iconvLite2.default.encodingExists(detectedEncoding)) { return done(new Error(detectedEncoding + ' is not supported')); } debugMe('encoding detected, decoding chunk to ' + detectedEncoding + '..'); _this.emit('encodingDetected', detectedEncoding); _this.encodingDetected = detectedEncoding; _this.push(_iconvLite2.default.decode(chunk, detectedEncoding), _this.encoding); done(); }); } catch (err) { done(err); } }; exports.default = DecoderXMLStream; module.exports = exports['default'];