Преглед на файлове

Добавлена поддержка формата FB3 "для галочки"

Book Pauk преди 5 години
родител
ревизия
f68c610c0d
променени са 3 файла, в които са добавени 57 реда и са изтрити 3 реда
  1. 4 3
      server/core/Reader/BookConverter/ConvertDocX.js
  2. 52 0
      server/core/Reader/BookConverter/ConvertFb3.js
  3. 1 0
      server/core/Reader/BookConverter/index.js

+ 4 - 3
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();
 

+ 52 - 0
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(/<title>([\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}</title>` + text
+            .replace(/<title>/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;

+ 1 - 0
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'),