Forráskód Böngészése

Добавлена кнопка 'Обновить с разбиением на параграфы'

Book Pauk 4 éve
szülő
commit
c8c0e9ec1a

+ 26 - 4
client/components/Reader/Reader.vue

@@ -39,6 +39,10 @@
                         <q-icon name="la la-copy" size="32px"/>
                         <q-icon name="la la-copy" size="32px"/>
                         <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['copyText'] }}</q-tooltip>
                         <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['copyText'] }}</q-tooltip>
                     </button>
                     </button>
+                    <button ref="splitToPara" v-show="showToolButton['splitToPara']" class="tool-button" :class="buttonActiveClass('splitToPara')" @click="buttonClick('splitToPara')" v-ripple>
+                        <q-icon name="la la-indent" style="transform: rotate(0.5turn); top: 1px" size="32px"/>
+                        <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['splitToPara'] }}</q-tooltip>
+                    </button>
                     <button ref="refresh" v-show="showToolButton['refresh']" class="tool-button" :class="buttonActiveClass('refresh')" @click="buttonClick('refresh')" v-ripple>
                     <button ref="refresh" v-show="showToolButton['refresh']" class="tool-button" :class="buttonActiveClass('refresh')" @click="buttonClick('refresh')" v-ripple>
                         <q-icon name="la la-sync" size="32px" :class="{clear: !showRefreshIcon}"/>
                         <q-icon name="la la-sync" size="32px" :class="{clear: !showRefreshIcon}"/>
                         <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['refresh'] }}</q-tooltip>
                         <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['refresh'] }}</q-tooltip>
@@ -699,6 +703,12 @@ class Reader extends Vue {
         }
         }
     }
     }
 
 
+    refreshBookSplitToPara() {
+        if (this.mostRecentBook()) {
+            this.loadBook({url: this.mostRecentBook().url, skipCheck: true, isText: true, force: true});
+        }
+    }
+
     recentBooksClose() {
     recentBooksClose() {
         this.recentBooksActive = false;
         this.recentBooksActive = false;
     }
     }
@@ -816,6 +826,7 @@ class Reader extends Vue {
             case 'scrolling':
             case 'scrolling':
             case 'search':
             case 'search':
             case 'copyText':
             case 'copyText':
+            case 'splitToPara':
             case 'refresh':
             case 'refresh':
             case 'libs':
             case 'libs':
             case 'recentBooks':
             case 'recentBooks':
@@ -847,8 +858,9 @@ class Reader extends Vue {
                 case 'copyText':
                 case 'copyText':
                     classResult = classDisabled;
                     classResult = classDisabled;
                     break;
                     break;
-                case 'recentBooks':
+                case 'splitToPara':
                 case 'refresh':
                 case 'refresh':
+                case 'recentBooks':
                     if (!this.mostRecentBookReactive)
                     if (!this.mostRecentBookReactive)
                         classResult = classDisabled;
                         classResult = classDisabled;
                     break;
                     break;
@@ -1001,9 +1013,16 @@ class Reader extends Vue {
             // не удалось, скачиваем книгу полностью с конвертацией
             // не удалось, скачиваем книгу полностью с конвертацией
             let loadCached = true;
             let loadCached = true;
             if (!book) {
             if (!book) {
-                book = await readerApi.loadBook({url, enableSitesFilter: this.enableSitesFilter}, (state) => {
-                    progress.setState(state);
-                });
+                book = await readerApi.loadBook({
+                        url,
+                        skipCheck: (opts.skipCheck ? true : false),
+                        isText: (opts.isText ? true : false),
+                        enableSitesFilter: this.enableSitesFilter
+                    },
+                    (state) => {
+                        progress.setState(state);
+                    }
+                );
                 loadCached = false;
                 loadCached = false;
             }
             }
 
 
@@ -1122,6 +1141,9 @@ class Reader extends Vue {
             case 'copyText':
             case 'copyText':
                 this.copyTextToggle();
                 this.copyTextToggle();
                 break;
                 break;
+            case 'splitToPara':
+                this.refreshBookSplitToPara();
+                break;
             case 'refresh':
             case 'refresh':
                 this.refreshBook();
                 this.refreshBook();
                 break;
                 break;

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

@@ -10,6 +10,7 @@ const readerActions = {
     'setPosition': 'Установить позицию',
     'setPosition': 'Установить позицию',
     'search': 'Найти в тексте',
     'search': 'Найти в тексте',
     'copyText': 'Скопировать текст со страницы',
     'copyText': 'Скопировать текст со страницы',
+    'splitToPara': 'Обновить с разбиением на параграфы',
     'refresh': 'Принудительно обновить книгу',
     'refresh': 'Принудительно обновить книгу',
     'offlineMode': 'Автономный режим (без интернета)',
     'offlineMode': 'Автономный режим (без интернета)',
     'libs': 'Библиотека',
     'libs': 'Библиотека',
@@ -37,6 +38,7 @@ const toolButtons = [
     {name: 'setPosition', show: true},
     {name: 'setPosition', show: true},
     {name: 'search',      show: true},
     {name: 'search',      show: true},
     {name: 'copyText',    show: false},
     {name: 'copyText',    show: false},
+    {name: 'splitToPara', show: true},
     {name: 'refresh',     show: true},
     {name: 'refresh',     show: true},
     {name: 'libs',        show: true},
     {name: 'libs',        show: true},
     {name: 'recentBooks', show: true},
     {name: 'recentBooks', show: true},
@@ -55,6 +57,7 @@ const hotKeys = [
     {name: 'setPosition', codes: ['P']},
     {name: 'setPosition', codes: ['P']},
     {name: 'search', codes: ['Ctrl+F']},
     {name: 'search', codes: ['Ctrl+F']},
     {name: 'copyText', codes: ['Ctrl+C']},
     {name: 'copyText', codes: ['Ctrl+C']},
+    {name: 'splitToPara', codes: ['Shift+R']},
     {name: 'refresh', codes: ['R']},
     {name: 'refresh', codes: ['R']},
     {name: 'offlineMode', codes: ['O']},
     {name: 'offlineMode', codes: ['O']},
     {name: 'libs', codes: ['L']},
     {name: 'libs', codes: ['L']},

+ 3 - 1
server/controllers/ReaderController.js

@@ -19,7 +19,9 @@ class ReaderController extends BaseController {
                 throw new Error(`key 'url' is empty`);
                 throw new Error(`key 'url' is empty`);
             const workerId = this.readerWorker.loadBookUrl({
             const workerId = this.readerWorker.loadBookUrl({
                 url: request.url, 
                 url: request.url, 
-                enableSitesFilter: (request.hasOwnProperty('enableSitesFilter') ? request.enableSitesFilter : true)
+                enableSitesFilter: (request.hasOwnProperty('enableSitesFilter') ? request.enableSitesFilter : true),
+                skipCheck: (request.hasOwnProperty('skipCheck') ? request.skipCheck : false),
+                isText: (request.hasOwnProperty('isText') ? request.isText : false),
             });
             });
             const state = this.workerState.getState(workerId);
             const state = this.workerState.getState(workerId);
             return (state ? state : {});
             return (state ? state : {});

+ 1 - 1
server/core/Reader/BookConverter/ConvertHtml.js

@@ -200,7 +200,7 @@ class ConvertHtml extends ConvertBase {
 
 
         titleInfo['book-title'] = title;
         titleInfo['book-title'] = title;
         //подозрение на чистый текст, надо разбить на параграфы
         //подозрение на чистый текст, надо разбить на параграфы
-        if (isText || pars.length < buf.length/2000) {
+        if (isText || (buf.length > 30*1024 && pars.length < buf.length/2000)) {
             let total = 0;
             let total = 0;
             let count = 1;
             let count = 1;
             for (let i = 0; i < spaceCounter.length; i++) {
             for (let i = 0; i < spaceCounter.length; i++) {