epub-full-text-search
Version:
115 lines (85 loc) • 2.95 kB
JavaScript
import fs from 'fs';
import cheerio from 'cheerio';
import parser from './EpubMetaDataParser';
import ic from './IndexingController';
import winston from './../Logger';
const indexingController = ic();
const Preparer = {};
/**************
* public
*************/
Preparer.normalize = function (pathToEPUBs, options) {
winston.log('info', 'EPUB data local: ' + pathToEPUBs.red);
return parser.getMetaData(pathToEPUBs)
.then(metaDataList => {
winston.log('info', 'Analyse local:');
metaDataList = indexingController.doWork(metaDataList, options);
const dataSet = [];
metaDataList.forEach(metaData => {
//winston.log('info', metaDataList[metaData].title + " " + metaDataList[metaData].writeToIndex);
const title = metaData.title;
if (metaData.writeToIndex) {
winston.log('info', "\t--> EPUB title " + title.bold.blue + ' will be added to index');
prepareEPUBDataForIndexing(metaData, dataSet);
} else {
winston.log('info', "\t--> EPUB title " + title.red + ' already indexed');
}
});
return dataSet;
});
};
Preparer.normalizeEpupTitle = function (str) {
if(str === '*')
return str;
return str.replace(/\s/g,'').toLowerCase();
};
/**************
* private
*************/
function prepareEPUBDataForIndexing(metaData, data) {
if(!metaData.spineItems.length) {
return;
}
if (!data.FirstSpineItemsId) {
data.FirstSpineItemsId = [];
}
data.FirstSpineItemsId.push(
metaData.spineItems[0].id + ':' + metaData.title
);
metaData.spineItems.forEach( spineItem => {
const spineItemPath = metaData.manifestPath + '/' + spineItem.href;
const json = htmlToJSON(spineItemPath);
setMetaData(json, metaData, spineItem);
data.push(json);
});
}
function setMetaData(jsonDoc, meta, spineItemMeta) {
jsonDoc.filename = meta.filename;
jsonDoc.epubTitle = Preparer.normalizeEpupTitle(meta.title);
jsonDoc.spineItemPath = meta.manifestPath + '/' + spineItemMeta.href;
jsonDoc.href = spineItemMeta.href;
jsonDoc.baseCfi = spineItemMeta.baseCfi;
jsonDoc.id = spineItemMeta.id + ':' + meta.title;
}
function htmlToJSON(file) {
const doc = {};
try {
const html = fs.readFileSync(file);
const $ = cheerio.load(html);
$("title").each((i, e) => {
const title = $(e);
doc.title = trim(title.text());
});
$("body").each((i, e)=> {
const body = $(e);
doc.body = trim(body.text());
});
} catch (err) {
winston.log('error', err);
}
return doc;
}
function trim(str) {
return str.replace(/\W/g, ' ').replace(/\s+/g, ' ');
}
module.exports = Preparer;