UNPKG

read-xml

Version:

Read a xml file respecting its encoding information

172 lines (126 loc) 4.27 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.readXML = readXML; exports.createStream = createStream; var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs); var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug); var _once = require('once'); var _once2 = _interopRequireDefault(_once); var _concatStream = require('concat-stream'); var _concatStream2 = _interopRequireDefault(_concatStream); 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 _DecoderXMLStream = require('./DecoderXMLStream'); var _DecoderXMLStream2 = _interopRequireDefault(_DecoderXMLStream); var _package = require('../package.json'); var _package2 = _interopRequireDefault(_package); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var debugMe = (0, _debug2.default)(_package2.default.name); var MAX_BYTES_TO_READ = 100; function readOrCopyBytes(xmlData, bytes, ready) { if (Buffer.isBuffer(xmlData)) { ready(null, xmlData.slice(0, bytes)); } else { readXMLBytes(xmlData, bytes, ready); } } function readXMLBytes(path, bytes, ready) { var xmlFileStream = _fs2.default.createReadStream(path, { start: 0, end: bytes }); var concatStream = (0, _concatStream2.default)(function (buf) { ready(null, buf); }); xmlFileStream.on('error', function (err) { debugMe('error trying to read file', path); ready(err); }); xmlFileStream.pipe(concatStream); } function decodeXML(content, encoding, cb) { if (!_iconvLite2.default.encodingExists(encoding)) { return cb(new Error(encoding + ' is not supported')); } (function (next) { if (Buffer.isBuffer(content)) { next(null, content); } else { _fs2.default.readFile(content, function (readFileErr, xmlBuf) { if (readFileErr) { return next(readFileErr); } next(null, xmlBuf); }); } })(function (err, buf) { if (err) { return cb(err); } debugMe('decoding xml content (' + encoding + ')..'); cb(null, { encoding: encoding, content: _iconvLite2.default.decode(buf, encoding) }); }); } function readXML(content, cb) { var done = (0, _once2.default)(function (err, data) { return cb(err, data); }); var readCount = 1, bufLength = void 0; function readBufferHandler(err, encoding) { var hasMoreContent = false, maxBytes = MAX_BYTES_TO_READ * readCount; if (err) { return done(err); } if (bufLength > maxBytes) { hasMoreContent = true; } if (encoding == null) { if (!hasMoreContent) { return decodeXML(content, _defaultEncoding2.default, done); } // eslint-disable-next-line no-plusplus readCount++; readOrCopyBytes(content, MAX_BYTES_TO_READ * readCount, function (readNextErr, nextContent) { if (readNextErr) { return done(readNextErr); } (0, _findEncoding2.default)(nextContent, _defaultEncoding2.default, readBufferHandler); }); } else { decodeXML(content, encoding, done); } } if (Buffer.isBuffer(content)) { debugMe('trying to parse xml from buffer..'); bufLength = content.length; (0, _findEncoding2.default)(content.slice(0, MAX_BYTES_TO_READ), _defaultEncoding2.default, readBufferHandler); } else { debugMe('trying to parse xml from file', content); _fs2.default.stat(content, function (statErr, stats) { if (statErr) { return done(statErr); } // getting the bytes size of file bufLength = stats.size; readXMLBytes(content, MAX_BYTES_TO_READ, function (readXMLErr, xmlBuf) { if (readXMLErr) { return done(readXMLErr); } (0, _findEncoding2.default)(xmlBuf, _defaultEncoding2.default, readBufferHandler); }); }); } } function createStream(streamOpts) { return new _DecoderXMLStream2.default(streamOpts); }