read-xml
Version:
Read a xml file respecting its encoding information
106 lines (76 loc) • 2.72 kB
JavaScript
;
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'];