const fs = require('fs-extra'); const iconv = require('iconv-lite'); const textUtils = require('./textUtils'); const XmlParser = require('../xml/XmlParser'); const utils = require('../utils'); class Fb2Parser { checkEncoding(data) { //Корректируем кодировку UTF-16 let encoding = textUtils.getEncoding(data); if (encoding.indexOf('UTF-16') == 0) { data = Buffer.from(iconv.decode(data, encoding)); encoding = 'utf-8'; } //Корректируем пробелы, всякие файлы попадаются :( if (data[0] == 32) { data = Buffer.from(data.toString().trim()); } //Окончательно корректируем кодировку let result = data; let left = data.indexOf('= 0) { const right = data.indexOf('?>', left); if (right >= 0) { const head = data.slice(left, right + 2).toString(); const m = head.match(/encoding=['"](.*?)['"]/); if (m) { let enc = m[1].toLowerCase(); if (enc != 'utf-8') { //enc может не соответсвовать реальной кодировке файла, поэтому: if (encoding.indexOf('ISO-8859') >= 0) { encoding = enc; } result = iconv.decode(data, encoding); result = Buffer.from(result.toString().replace(m[0], `encoding="utf-8"`)); } } } } return result; } async getDescAndCover(bookFile) { let data = await fs.readFile(bookFile); data = await utils.gunzipBuffer(data); data = this.checkEncoding(data); const xml = new XmlParser(); xml.fromString(data.toString(), { lowerCase: true, pickNode: route => route.indexOf('fictionbook/body') !== 0, }); let cover = null; //console.log(xml.toString()); //xml.each(node => console.log(node.name)); const desc = xml.$$('description').toObject(); return {desc, cover}; } } module.exports = Fb2Parser;