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

This commit is contained in:
Book Pauk
2019-10-18 19:13:17 +07:00
parent e2bea407ee
commit d76f60639c
9 changed files with 42 additions and 12 deletions

View File

@@ -11,11 +11,11 @@ const workerApi = axios.create({
}); });
class Reader { class Reader {
async loadBook(url, callback) { async loadBook(opts, callback) {
const refreshPause = 300; const refreshPause = 300;
if (!callback) callback = () => {}; 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; const workerId = response.data.workerId;
if (!workerId) if (!workerId)

View File

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

View File

@@ -304,6 +304,19 @@
</el-col> </el-col>
<el-input-number v-model="addEmptyParagraphs" :min="0" :max="2"></el-input-number> <el-input-number v-model="addEmptyParagraphs" :min="0" :max="2"></el-input-number>
</el-form-item> </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-form-item label="Изображения">
<el-col :span="11"> <el-col :span="11">
@@ -688,6 +701,10 @@ class SettingsPage extends Vue {
this.$notify.warning({message: 'Необходимо обновить страницу (F5), чтобы изменения возымели эффект'}); this.$notify.warning({message: 'Необходимо обновить страницу (F5), чтобы изменения возымели эффект'});
} }
needTextReload() {
this.$notify.warning({message: 'Необходимо обновить книгу в обход кэша, чтобы изменения возымели эффект'});
}
close() { close() {
this.$emit('settings-toggle'); this.$emit('settings-toggle');
} }

View File

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

View File

@@ -15,7 +15,10 @@ class ReaderController extends BaseController {
try { try {
if (!request.url) if (!request.url)
throw new Error(`key 'url' is empty`); 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); const state = workerState.getState(workerId);
return (state ? state : {}); return (state ? state : {});
} catch (e) { } catch (e) {

View File

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

View File

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

View File

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

View File

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