UNPKG

read-xml

Version:

Read a xml file respecting its encoding information

106 lines (76 loc) 2.72 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug); var _once = require('once'); var _once2 = _interopRequireDefault(_once); var _parseAttributes = require('parse-attributes'); var _parseAttributes2 = _interopRequireDefault(_parseAttributes); var _sax = require('sax'); var _sax2 = _interopRequireDefault(_sax); 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 + ':parse-xml'); function findEncodingAttr(xmlDeclaration) { var indexEncoding = void 0, indexUpperEncoding = void 0, propToUse = void 0; // look for the last encoding attr indexEncoding = xmlDeclaration.lastIndexOf('encoding'); indexUpperEncoding = xmlDeclaration.lastIndexOf('ENCODING'); propToUse = indexEncoding > indexUpperEncoding ? 'encoding' : 'ENCODING'; return (0, _parseAttributes2.default)(xmlDeclaration)[propToUse]; } function findEncodingInXMLBuffer(buf, defaultEncoding, cb) { var xmlParser = _sax2.default.parser(false, { trim: false, normalize: false, lowercase: false, strictEntities: false }); var xmlContent = buf.toString(); var done = (0, _once2.default)(function (err, encoding) { return cb(err, encoding); }); xmlParser.onerror = function (err) { debugMe('xml parser error (parsing will be continued):', err.message); xmlParser.error = null; xmlParser.resume(); }; xmlParser.onopentag = function (node) { debugMe('open tag found:', node.name); if (done.called) { return; } debugMe('encoding to be used:', defaultEncoding); done(null, defaultEncoding); }; xmlParser.onprocessinginstruction = function (instruction) { debugMe('processing instruction found:', instruction.name); if (done.called) { return; } if (instruction.name.toLowerCase() === 'xml') { var xmlEncoding = findEncodingAttr(instruction.body); debugMe('detected encoding in xml:', xmlEncoding); xmlEncoding = xmlEncoding || defaultEncoding; debugMe('encoding to be used:', xmlEncoding); done(null, xmlEncoding); } }; xmlParser.onend = function () { debugMe('xml parsing has ended..'); if (done.called) { return; } debugMe('no tag or xml declaration was found..'); done(null, undefined); }; debugMe('parsing chunk:', xmlContent); xmlParser.write(xmlContent).close(); } exports.default = findEncodingInXMLBuffer; module.exports = exports['default'];