diff --git a/server/core/Reader/BookConverter/ConvertDocX.js b/server/core/Reader/BookConverter/ConvertDocX.js index 11ab67f7..d8c85b78 100644 --- a/server/core/Reader/BookConverter/ConvertDocX.js +++ b/server/core/Reader/BookConverter/ConvertDocX.js @@ -4,14 +4,15 @@ const path = require('path'); const ConvertBase = require('./ConvertBase'); class ConvertDocX extends ConvertBase { - check(data, opts) { + async check(data, opts) { const {inputFiles} = opts; if (this.config.useExternalBookConverter && inputFiles.sourceFileType && inputFiles.sourceFileType.ext == 'zip') { //ищем файл '[Content_Types].xml' for (const file of inputFiles.files) { if (file.path == '[Content_Types].xml') { - return true; + const contentTypes = await fs.readFile(`${inputFiles.filesDir}/${file.path}`, 'utf8'); + return contentTypes.indexOf('/word/document.xml') >= 0; } } } @@ -30,7 +31,7 @@ class ConvertDocX extends ConvertBase { } async run(data, opts) { - if (!this.check(data, opts)) + if (!(await this.check(data, opts))) return false; await this.checkExternalConverterPresent(); diff --git a/server/core/Reader/BookConverter/ConvertFb3.js b/server/core/Reader/BookConverter/ConvertFb3.js new file mode 100644 index 00000000..ef2123d6 --- /dev/null +++ b/server/core/Reader/BookConverter/ConvertFb3.js @@ -0,0 +1,52 @@ +const fs = require('fs-extra'); + +const ConvertHtml = require('./ConvertHtml'); + +class ConvertDocX extends ConvertHtml { + async check(data, opts) { + const {inputFiles} = opts; + if (this.config.useExternalBookConverter && + inputFiles.sourceFileType && inputFiles.sourceFileType.ext == 'zip') { + //ищем файл '[Content_Types].xml' + for (const file of inputFiles.files) { + if (file.path == '[Content_Types].xml') { + const contentTypes = await fs.readFile(`${inputFiles.filesDir}/${file.path}`, 'utf8'); + return contentTypes.indexOf('/fb3/body.xml') >= 0; + } + } + } + + return false; + } + + getTitle(text) { + let title = ''; + const m = text.match(/([\s\S]*?)<\/title>/); + if (m) + title = m[1]; + + return title.trim(); + } + + async run(data, opts) { + if (!(await this.check(data, opts))) + return false; + await this.checkExternalConverterPresent(); + + const {inputFiles} = opts; + + let text = await fs.readFile(`${inputFiles.filesDir}/fb3/body.xml`, 'utf8'); + + const title = this.getTitle(text) + .replace(/<\/?p>/g, '') + ; + text = `<title>${title}` + text + .replace(//g, '<br><b>') + .replace(/<\/title>/g, '</b><br>') + .replace(/<subtitle>/g, '<br><br><subtitle>') + ; + return await super.run(Buffer.from(text), {skipCheck: true, cutTitle: true}); + } +} + +module.exports = ConvertDocX; diff --git a/server/core/Reader/BookConverter/index.js b/server/core/Reader/BookConverter/index.js index ebb4c1da..89b73f5a 100644 --- a/server/core/Reader/BookConverter/index.js +++ b/server/core/Reader/BookConverter/index.js @@ -7,6 +7,7 @@ const convertClassFactory = [ require('./ConvertPdf'), require('./ConvertRtf'), require('./ConvertDocX'), + require('./ConvertFb3'), require('./ConvertDoc'), require('./ConvertMobi'), require('./ConvertFb2'),