epub-full-text-search
Version:
143 lines (107 loc) • 4.17 kB
JavaScript
;
var _xml2js = require('xml2js');
var _xml2js2 = _interopRequireDefault(_xml2js);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _q = require('q');
var _q2 = _interopRequireDefault(_q);
var _Logger = require('./../Logger');
var _Logger2 = _interopRequireDefault(_Logger);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var readdir = _q2.default.denodeify(_fs2.default.readdir),
readFile = _q2.default.denodeify(_fs2.default.readFile),
stat = _q2.default.denodeify(_fs2.default.stat),
parser = new _xml2js2.default.Parser(),
parseString = _q2.default.denodeify(parser.parseString);
var MetaDataParser = {};
var container = 'container.xml';
MetaDataParser.getMetaData = function (pathToEPUBs) {
return getContainerFiles(pathToEPUBs).then(function (containerFiles) {
return _q2.default.all(containerFiles.map(function (file) {
return getBookMetaData(file);
}));
}).fail(function (err) {
_Logger2.default.log('error', err);
});
};
function getContainerFiles(dir, results) {
results = results || [];
return readdir(dir).then(function (files) {
return _q2.default.all(files.map(function (file) {
file = dir + '/' + file;
return stat(file).then(function (fileStat) {
if (fileStat && fileStat.isDirectory()) {
return getContainerFiles(file, results);
} else if (_path2.default.basename(file) === container) {
results.push(file);
}
});
}));
}).then(function () {
return results;
}).fail(function (err) {
_Logger2.default.log('error', err);
});
}
var getBookMetaData = function getBookMetaData(containerFile) {
var root = _path2.default.dirname(_path2.default.dirname(containerFile));
var manifestPath;
return getManifest(containerFile).then(function (result) {
var opfFile = root + '/' + result;
manifestPath = _path2.default.dirname(root + '/' + result);
return readFile(opfFile);
}).then(function (opfContent) {
return _q2.default.all([getBookTitle(opfContent), getSpineItems(opfContent)]);
}).then(function (results) {
return {
filename: _path2.default.basename(root),
manifestPath: manifestPath,
title: results[0],
spineItems: results[1]
};
}).fail(function (err) {
_Logger2.default.log('error', err);
});
};
function getManifest(containerFile) {
return readFile(containerFile).then(function (data) {
return parseString(data);
}).then(function (result) {
return result.container.rootfiles[0].rootfile[0].$['full-path'];
}).fail(function (err) {
if (err && err.code === 'ENOENT') {
throw new Error('File ' + containerFile + 'doesn\'t exist');
}
});
}
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;