epub-full-text-search
Version:
101 lines (72 loc) • 2.83 kB
JavaScript
;
var _xml2js = require('xml2js');
var _xml2js2 = _interopRequireDefault(_xml2js);
var _q = require('q');
var _q2 = _interopRequireDefault(_q);
var _Helper = require('./../Helper');
var _Helper2 = _interopRequireDefault(_Helper);
var _Logger = require('./../Logger');
var _Logger2 = _interopRequireDefault(_Logger);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var parser = new _xml2js2.default.Parser(),
parseString = _q2.default.denodeify(parser.parseString);
var MetaDataParser = {};
var container = 'container.xml';
MetaDataParser.getMetaDataFromUrl = function (urlToEpub) {
var containerLink = urlToEpub + 'META-INF/' + container;
return new Promise(function (resolve, reject) {
_Helper2.default.getContent(containerLink).then(function (xmlString) {
return getManifest(xmlString);
}).then(function (result) {
var opfFile = urlToEpub + result;
return _Helper2.default.getContent(opfFile);
}).then(function (opfContent) {
return _q2.default.all([getBookTitle(opfContent), getSpineItems(opfContent)]);
}).then(function (results) {
resolve({
title: results[0],
spineItems: results[1],
url: urlToEpub
});
}).catch(function (err) {
_Logger2.default.log('error', err);
reject(err);
});
});
};
function getManifest(data) {
return parseString(data).then(function (result) {
return result.container.rootfiles[0].rootfile[0].$['full-path'];
}).fail(function (err) {
_Logger2.default.log('error', err);
});
}
function getBookTitle(data) {
return parseString(data).then(function (result) {
var metadata = result.package.metadata[0];
return metadata['dc:title'][0]._ || metadata['dc:title'][0];
}).fail(function (err) {
_Logger2.default.log('error', err);
});
}
function getSpineItems(data) {
return parseString(data).then(function (r) {
var manifest = r.package.manifest[0];
var spine = r.package.spine[0];
var result = [];
for (var i = 0; i < spine.itemref.length; i++) {
var spineItem = manifest.item.filter(function (value) {
if (value.$.id === spine.itemref[i].$.idref) return value;
});
var spineitem = {};
spineitem.id = spineItem[0].$.id;
spineitem.href = spineItem[0].$.href;
spineitem.baseCfi = "/" + '6' + "/" + (i + 1) * 2 + '[' + spineitem.id + ']!';
result.push(spineitem);
}
return result;
}).fail(function (err) {
_Logger2.default.log('error', err);
});
}
module.exports = MetaDataParser;