浏览代码

Merge branch 'release/0.1.5'

Book Pauk 6 年之前
父节点
当前提交
ae30c3865d

+ 1 - 0
client/components/Reader/HelpPage/MouseHelpPage/MouseHelpPage.vue

@@ -9,6 +9,7 @@
             <li><b>ПКМ</b> - показать/скрыть панель управления</li>
             <li><b>СКМ</b> - вкл./выкл. плавный скроллинг текста</li>
         </ul>
+        * Для управления с помощью мыши/тачпада необходимо установить галочку "Включить управление кликом" в настройках
     </div>
 </template>
 

+ 13 - 6
client/components/Reader/Reader.vue

@@ -199,7 +199,7 @@ class Reader extends Vue {
 
     mounted() {
         (async() => {
-            await bookManager.init();
+            await bookManager.init(this.settings);
             await restoreOldSettings(this.settings, bookManager, this.commit);
 
             if (this.$root.rootRoute == '/reader') {
@@ -439,6 +439,12 @@ class Reader extends Vue {
         }
     }
 
+    refreshBook() {
+        if (this.mostRecentBook()) {
+            this.loadBook({url: this.mostRecentBook().url, force: true});
+        }
+    }
+
     buttonClick(button) {
         const activeClass = this.buttonActiveClass(button);
 
@@ -482,9 +488,7 @@ class Reader extends Vue {
                 this.historyToggle();
                 break;
             case 'refresh':
-                if (this.mostRecentBook()) {
-                    this.loadBook({url: this.mostRecentBook().url, force: true});
-                }
+                this.refreshBook();
                 break;
             case 'settings':
                 this.settingsToggle();
@@ -790,6 +794,9 @@ class Reader extends Vue {
                             event.preventDefault();
                             event.stopPropagation();
                             break;
+                        case 'KeyZ':
+                            this.scrollingToggle();
+                            break;
                         case 'KeyP':
                             this.setPositionToggle();
                             break;
@@ -807,8 +814,8 @@ class Reader extends Vue {
                                 event.stopPropagation();
                             }
                             break;
-                        case 'KeyZ':
-                            this.scrollingToggle();
+                        case 'KeyR':
+                            this.refreshBook();
                             break;
                         case 'KeyX':
                             this.historyToggle();

+ 24 - 7
client/components/Reader/SettingsPage/SettingsPage.vue

@@ -81,7 +81,7 @@
                             </el-form-item>
                             <el-form-item label="Размер">
                                 <el-col :span="17">
-                                    <el-input-number v-model="fontSize" :min="5" :max="100"></el-input-number>
+                                    <el-input-number v-model="fontSize" :min="5" :max="200"></el-input-number>
                                 </el-col>
                                 <el-col :span="1">
                                     <a href="https://fonts.google.com/?subset=cyrillic" target="_blank">Примеры</a>
@@ -112,10 +112,10 @@
                             <div class="partHeader">Текст</div>
 
                             <el-form-item label="Интервал">
-                                <el-input-number v-model="lineInterval" :min="0" :max="100"></el-input-number>
+                                <el-input-number v-model="lineInterval" :min="0" :max="200"></el-input-number>
                             </el-form-item>
                             <el-form-item label="Параграф">
-                                <el-input-number v-model="p" :min="0" :max="200"></el-input-number>
+                                <el-input-number v-model="p" :min="0" :max="1000"></el-input-number>
                             </el-form-item>
                             <el-form-item label="Отступ">
                                 <el-col :span="11">
@@ -123,7 +123,7 @@
                                         <template slot="content">
                                             Слева/справа
                                         </template>
-                                        <el-input-number v-model="indentLR" :min="0" :max="200"></el-input-number>
+                                        <el-input-number v-model="indentLR" :min="0" :max="500"></el-input-number>
                                     </el-tooltip>
                                 </el-col>
                                 <el-col :span="1">
@@ -134,7 +134,7 @@
                                         <template slot="content">
                                             Сверху/снизу
                                         </template>
-                                        <el-input-number v-model="indentTB" :min="0" :max="200"></el-input-number>
+                                        <el-input-number v-model="indentTB" :min="0" :max="500"></el-input-number>
                                     </el-tooltip>
                                 </el-col>
                             </el-form-item>
@@ -184,6 +184,16 @@
                                 <el-checkbox v-model="textAlignJustify">По ширине</el-checkbox>
                                 <el-checkbox v-model="wordWrap">Перенос по слогам</el-checkbox>
                             </el-form-item>
+                            <el-form-item label="Обработка">
+                                <el-checkbox v-model="cutEmptyParagraphs" @change="needReload">Убирать пустые параграфы</el-checkbox>
+                            </el-form-item>
+                            <el-form-item label="">
+                                <el-col :span="12">
+                                    Добавлять пустые
+                                </el-col>
+                                <el-input-number v-model="addEmptyParagraphs" :min="0" :max="2" @change="needReload"></el-input-number>
+                            </el-form-item>
+                            
                         </el-form>
 
                         <el-form :model="form" size="mini" label-width="120px" @submit.native.prevent>
@@ -194,7 +204,7 @@
                                 <el-checkbox v-model="statusBarTop" :disabled="!showStatusBar">Вверху/внизу</el-checkbox>
                             </el-form-item>
                             <el-form-item label="Высота">
-                                <el-input-number v-model="statusBarHeight" :min="5" :max="50" :disabled="!showStatusBar"></el-input-number>
+                                <el-input-number v-model="statusBarHeight" :min="5" :max="100" :disabled="!showStatusBar"></el-input-number>
                             </el-form-item>
                             <el-form-item label="Прозрачность">
                                 <el-input-number v-model="statusBarColorAlpha" :min="0" :max="1" :precision="2" :step="0.1" :disabled="!showStatusBar"></el-input-number>
@@ -234,6 +244,9 @@
                     <!--------------------------------------------------------------------------->
                     <el-tab-pane label="Прочее">
                         <el-form :model="form" size="mini" label-width="120px" @submit.native.prevent>
+                            <el-form-item label="Управление">
+                                <el-checkbox v-model="clickControl">Включить управление кликом</el-checkbox>
+                            </el-form-item>
                             <el-form-item label="Подсказка">
                                 <el-tooltip :open-delay="500" effect="light">
                                     <template slot="content">
@@ -241,7 +254,7 @@
                                     </template>
                                     <el-checkbox v-model="showClickMapPage">Показывать области управления кликом</el-checkbox>
                                 </el-tooltip>
-                            </el-form-item>                            
+                            </el-form-item>
                             <el-form-item label="URL">
                                 <el-tooltip :open-delay="500" effect="light">
                                     <template slot="content">
@@ -384,6 +397,10 @@ class SettingsPage extends Vue {
         ];
     }
 
+    needReload() {
+        this.$notify.warning({message: 'Необходимо обновить страницу (F5), чтобы изменения возымели эффект'});
+    }
+
     close() {
         this.$emit('settings-toggle');
     }

+ 7 - 3
client/components/Reader/TextPage/TextPage.vue

@@ -4,18 +4,18 @@
             <div v-html="background"></div>
             <!-- img -->
         </div>
-        <div ref="scrollBox1" class="layout" style="overflow: hidden">
+        <div ref="scrollBox1" class="layout" style="overflow: hidden" @wheel.prevent.stop="onMouseWheel">
             <div ref="scrollingPage" class="layout" @transitionend="onScrollingTransitionEnd">
                 <div v-html="page1"></div>
             </div>
         </div>
-        <div ref="scrollBox2" class="layout" style="overflow: hidden">
+        <div ref="scrollBox2" class="layout" style="overflow: hidden" @wheel.prevent.stop="onMouseWheel">
             <div v-html="page2"></div>
         </div>
         <div v-show="showStatusBar" ref="statusBar" class="layout">
             <div v-html="statusBar"></div>
         </div>
-        <div ref="layoutEvents" class="layout events" @mousedown.prevent.stop="onMouseDown" @mouseup.prevent.stop="onMouseUp"
+        <div v-show="clickControl" ref="layoutEvents" class="layout events" @mousedown.prevent.stop="onMouseDown" @mouseup.prevent.stop="onMouseUp"
             @wheel.prevent.stop="onMouseWheel"
             @touchstart.stop="onTouchStart" @touchend.stop="onTouchEnd" @touchcancel.prevent.stop="onTouchCancel"
             oncontextmenu="return false;">
@@ -23,6 +23,8 @@
                 @click.prevent.stop="onStatusBarClick"></div>
             <div v-show="fontsLoading" ref="fontsLoading"></div>
         </div>
+        <div v-show="!clickControl && showStatusBar" class="layout" v-html="statusBarClickable" @mousedown.prevent.stop @touchstart.stop
+            @click.prevent.stop="onStatusBarClick"></div>
         <!-- невидимым делать нельзя, вовремя не подгружаютя шрифты -->
         <canvas ref="offscreenCanvas" class="layout" style="width: 0px; height: 0px"></canvas>
     </div>
@@ -63,6 +65,8 @@ export default @Component({
 class TextPage extends Vue {
     toggleLayout = false;
     showStatusBar = false;
+    clickControl = true;
+
     background = null;
     page1 = null;
     page2 = null;

+ 25 - 2
client/components/Reader/share/BookParser.js

@@ -3,7 +3,7 @@ import sax from '../../../../server/core/BookConverter/sax';
 import {sleep} from '../../../share/utils';
 
 export default class BookParser {
-    constructor() {
+    constructor(settings) {
         // defaults
         this.p = 30;// px, отступ параграфа
         this.w = 300;// px, ширина страницы
@@ -13,6 +13,12 @@ export default class BookParser {
         this.measureText = (text, style) => {// eslint-disable-line no-unused-vars
             return text.length*20;
         };
+
+        //настройки
+        if (settings) {
+            this.cutEmptyParagraphs = settings.cutEmptyParagraphs;
+            this.addEmptyParagraphs = settings.addEmptyParagraphs;
+        }
     }
 
     async parse(data, callback) {
@@ -48,7 +54,14 @@ export default class BookParser {
                 text: String //текст параграфа (или title или epigraph и т.д) с вложенными тегами
             }
         */
-        const newParagraph = (text, len) => {
+        const newParagraph = (text, len, noCut) => {
+            //схлопывание пустых параграфов
+            if (!noCut && this.cutEmptyParagraphs && paraIndex >= 0 && len == 1 && text[0] == ' ') {
+                let p = para[paraIndex];
+                if (p.length == 1 && p.text[0] == ' ')
+                    return;
+            }
+
             paraIndex++;
             let p = {
                 index: paraIndex,
@@ -70,6 +83,16 @@ export default class BookParser {
 
             let p = para[paraIndex];
             if (p) {
+                //добавление пустых параграфов
+                if (this.addEmptyParagraphs && p.length == 1 && p.text[0] == ' ' && len > 0) {
+                    let i = this.addEmptyParagraphs;
+                    while (i > 0) {
+                        newParagraph(' ', 1, true);
+                        i--;
+                    }
+                    p = para[paraIndex];
+                }
+
                 paraOffset -= p.length;
                 if (p.length == 1 && p.text[0] == ' ' && len > 0) {
                     p.length = 0;

+ 3 - 2
client/components/Reader/share/bookManager.js

@@ -18,7 +18,8 @@ const bmRecentStore = localForage.createInstance({
 });
 
 class BookManager {
-    async init() {
+    async init(settings) {
+        this.settings = settings;
         this.books = {};
         this.recent = {};
         this.recentChanged = true;
@@ -130,7 +131,7 @@ class BookManager {
     async parseBook(meta, data, callback) {
         if (!this.books) 
             await this.init();
-        const parsed = new BookParser();
+        const parsed = new BookParser(this.settings);
 
         const parsedMeta = await parsed.parse(data, callback);
         const result = Object.assign({}, meta, parsedMeta, {

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

@@ -159,6 +159,10 @@ const settingDefaults = {
         lazyParseEnabled: false,
         copyFullText: false,
         showClickMapPage: true,
+        clickControl: true,
+        cutEmptyParagraphs: false,
+        addEmptyParagraphs: 0,
+
         fontShifts: {},
 };
 

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "Liberama",
-  "version": "0.1.4",
+  "version": "0.1.5",
   "engines": {
     "node": ">=10.0.0"
   },