Ver Fonte

Добавлен параметр "Включить html-фильтр для сайтов" в раздел "Вид"->"Текст" в настройках

Book Pauk há 5 anos atrás
pai
commit
d76f60639c

+ 2 - 2
client/api/reader.js

@@ -11,11 +11,11 @@ const workerApi = axios.create({
 });
 
 class Reader {
-    async loadBook(url, callback) {
+    async loadBook(opts, callback) {
         const refreshPause = 300;
         if (!callback) callback = () => {};
 
-        let response = await api.post('/load-book', {type: 'url', url});
+        let response = await api.post('/load-book', opts);
 
         const workerId = response.data.workerId;
         if (!workerId)

+ 2 - 1
client/components/Reader/Reader.vue

@@ -356,6 +356,7 @@ class Reader extends Vue {
         this.showWhatsNewDialog = settings.showWhatsNewDialog;
         this.showMigrationDialog = settings.showMigrationDialog;
         this.showToolButton = settings.showToolButton;
+        this.enableSitesFilter = settings.enableSitesFilter;
 
         this.updateHeaderMinWidth();
     }
@@ -1003,7 +1004,7 @@ class Reader extends Vue {
             // не удалось, скачиваем книгу полностью с конвертацией
             let loadCached = true;
             if (!book) {
-                book = await readerApi.loadBook(url, (state) => {
+                book = await readerApi.loadBook({url, enableSitesFilter: this.enableSitesFilter}, (state) => {
                     progress.setState(state);
                 });
                 loadCached = false;

+ 17 - 0
client/components/Reader/SettingsPage/SettingsPage.vue

@@ -304,6 +304,19 @@
                         </el-col>
                         <el-input-number v-model="addEmptyParagraphs" :min="0" :max="2"></el-input-number>
                     </el-form-item>
+                    <el-form-item label="">
+                        <el-tooltip :open-delay="500" effect="light" placement="top">
+                            <template slot="content">
+                                Html-фильтр вырезает лишние элементы со<br>
+                                страницы для определенных сайтов, таких как:<br>
+                                samlib.ru<br>
+                                www.fanfiction.net<br>
+                                archiveofourown.org<br>
+                                и других
+                            </template>
+                            <el-checkbox v-model="enableSitesFilter" @change="needTextReload">Включить html-фильтр для сайтов</el-checkbox>
+                        </el-tooltip>
+                    </el-form-item>
                     
                     <el-form-item label="Изображения">
                         <el-col :span="11">
@@ -688,6 +701,10 @@ class SettingsPage extends Vue {
         this.$notify.warning({message: 'Необходимо обновить страницу (F5), чтобы изменения возымели эффект'});
     }
 
+    needTextReload() {
+        this.$notify.warning({message: 'Необходимо обновить книгу в обход кэша, чтобы изменения возымели эффект'});
+    }
+
     close() {
         this.$emit('settings-toggle');
     }

+ 1 - 0
client/store/modules/reader.js

@@ -183,6 +183,7 @@ const settingDefaults = {
     showServerStorageMessages: true,
     showWhatsNewDialog: true,
     showMigrationDialog: true,
+    enableSitesFilter: true,
 
     fontShifts: {},
     showToolButton: {},

+ 4 - 1
server/controllers/ReaderController.js

@@ -15,7 +15,10 @@ class ReaderController extends BaseController {
         try {
             if (!request.url) 
                 throw new Error(`key 'url' is empty`);
-            const workerId = this.readerWorker.loadBookUrl(request.url);
+            const workerId = this.readerWorker.loadBookUrl({
+                url: request.url, 
+                enableSitesFilter: (request.hasOwnProperty('enableSitesFilter') ? request.enableSitesFilter : true)
+            });
             const state = workerState.getState(workerId);
             return (state ? state : {});
         } catch (e) {

+ 3 - 0
server/core/BookConverter/ConvertSamlib.js

@@ -20,6 +20,9 @@ class ConvertSamlib extends ConvertBase {
     }
 
     async run(data, opts) {
+        if (!opts.enableSitesFilter)
+            return false;
+
         const checkResult = this.check(data, opts);
         if (!checkResult)
             return false;

+ 3 - 0
server/core/BookConverter/ConvertSites.js

@@ -29,6 +29,9 @@ class ConvertSites extends ConvertHtml {
     }
 
     async run(data, opts) {
+        if (!opts.enableSitesFilter)
+            return false;
+        
         const checkResult = this.check(data, opts);
         if (!checkResult)
             return false;

+ 5 - 4
server/core/BookConverter/index.js

@@ -25,13 +25,14 @@ class BookConverter {
         }
     }
 
-    async convertToFb2(inputFiles, outputFile, url, callback) {
+    async convertToFb2(inputFiles, outputFile, opts, callback) {
         const selectedFileType = await this.detector.detectFile(inputFiles.selectedFile);
         const data = await fs.readFile(inputFiles.selectedFile);
 
+        const convertOpts = Object.assign({}, opts, {inputFiles, callback, dataType: selectedFileType});
         let result = false;
         for (const convert of this.convertFactory) {
-            result = await convert.run(data, {inputFiles, url, callback, dataType: selectedFileType});
+            result = await convert.run(data, convertOpts);
             if (result) {
                 await fs.writeFile(outputFile, result);
                 break;
@@ -39,14 +40,14 @@ class BookConverter {
         }
 
         if (!result && inputFiles.nesting) {
-            result = await this.convertToFb2(inputFiles.nesting, outputFile, url, callback);
+            result = await this.convertToFb2(inputFiles.nesting, outputFile, opts, callback);
         }
 
         if (!result) {
             if (selectedFileType)
                 throw new Error(`Этот формат файла не поддерживается: ${selectedFileType.mime}`);
             else {
-                throw new Error(`Не удалось определить формат файла: ${url}`);
+                throw new Error(`Не удалось определить формат файла: ${opts.url}`);
             }
         }
 

+ 5 - 4
server/core/ReaderWorker.js

@@ -32,7 +32,8 @@ class ReaderWorker {
         }
     }
 
-    async loadBook(url, wState) {
+    async loadBook(opts, wState) {
+        const url = opts.url;
         let errMes = '';
         let decompDir = '';
         let downloadedFilename = '';
@@ -77,7 +78,7 @@ class ReaderWorker {
             //конвертирование в fb2
             wState.set({state: 'convert', step: 3, progress: 0});
             convertFilename = `${this.config.tempDownloadDir}/${tempFilename2}`;
-            await this.bookConverter.convertToFb2(decompFiles, convertFilename, url, progress => {
+            await this.bookConverter.convertToFb2(decompFiles, convertFilename, opts, progress => {
                 wState.set({progress});
             });
 
@@ -105,12 +106,12 @@ class ReaderWorker {
         }
     }
 
-    loadBookUrl(url) {
+    loadBookUrl(opts) {
         const workerId = workerState.generateWorkerId();
         const wState = workerState.getControl(workerId);
         wState.set({state: 'start'});
 
-        this.loadBook(url, wState);
+        this.loadBook(opts, wState);
 
         return workerId;
     }