Добавлен параметр "Включить html-фильтр для сайтов" в раздел "Вид"->"Текст" в настройках
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ const settingDefaults = {
|
|||||||
showServerStorageMessages: true,
|
showServerStorageMessages: true,
|
||||||
showWhatsNewDialog: true,
|
showWhatsNewDialog: true,
|
||||||
showMigrationDialog: true,
|
showMigrationDialog: true,
|
||||||
|
enableSitesFilter: true,
|
||||||
|
|
||||||
fontShifts: {},
|
fontShifts: {},
|
||||||
showToolButton: {},
|
showToolButton: {},
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user