Compare commits

...

15 Commits

Author SHA1 Message Date
Book Pauk
ce8dcb75bf Merge branch 'release/0.7.7c' 2019-11-16 18:05:40 +07:00
Book Pauk
1bd51b5565 Поправил robots.txt 2019-11-16 18:04:48 +07:00
Book Pauk
1f9ec305b4 Merge tag '0.7.7b' into develop
0.7.7b
2019-11-13 19:42:30 +07:00
Book Pauk
be0f6e57d7 Merge branch 'release/0.7.7b' 2019-11-13 19:42:21 +07:00
Book Pauk
b268e9ee74 Улучшение парсинга html 2019-11-13 19:41:20 +07:00
Book Pauk
e97774435b Merge tag '0.7.7a' into develop
0.7.7a
2019-11-08 17:21:17 +07:00
Book Pauk
93586bc5bb Merge branch 'release/0.7.7a' 2019-11-08 17:21:03 +07:00
Book Pauk
fe23089714 Небольшие поправки верстки 2019-11-08 17:20:31 +07:00
Book Pauk
e743986f38 Merge tag '0.7.7' into develop
0.7.7
2019-11-06 20:18:02 +07:00
Book Pauk
a6c9b700ed Merge branch 'release/0.7.7' 2019-11-06 20:17:42 +07:00
Book Pauk
afa3fcb524 Merge branch 'feature/lss' into develop 2019-11-06 20:17:25 +07:00
Book Pauk
b9aeb648d6 Версия 0.7.7 2019-11-06 20:16:56 +07:00
Book Pauk
5f5df1e5b7 Добавлены жесты для тачскрина 2019-11-06 20:02:21 +07:00
Book Pauk
ad885679e4 Merge branch 'develop' into feature/lss 2019-11-03 18:06:19 +07:00
Book Pauk
e002bebfbe Merge tag '0.7.6c' into develop
0.7.6c
2019-11-03 18:05:52 +07:00
9 changed files with 138 additions and 43 deletions

View File

@@ -1,3 +1,2 @@
User-agent: * User-agent: *
Disallow: /?*url= Disallow: /?*url=
Disallow: /#/

View File

@@ -11,7 +11,7 @@
<el-tab-pane label="Клавиатура"> <el-tab-pane label="Клавиатура">
<HotkeysHelpPage></HotkeysHelpPage> <HotkeysHelpPage></HotkeysHelpPage>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="Мышь/тачпад"> <el-tab-pane label="Мышь/тачскрин">
<MouseHelpPage></MouseHelpPage> <MouseHelpPage></MouseHelpPage>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="История версий" name="releases"> <el-tab-pane label="История версий" name="releases">

View File

@@ -1,15 +1,25 @@
<template> <template>
<div class="page"> <div class="page">
<h4>Управление с помощью мыши/тачпада:</h4> <h4>Управление с помощью мыши/тачскрина:</h4>
<ul> <ul>
<li><b>ЛКМ/ТАЧ</b> по экрану в одну из областей - активация действия:</li> <li><b>ЛКМ/ТАЧ</b> по экрану в одну из областей - активация действия:</li>
<div class="click-map-page"> <div class="click-map-page">
<ClickMapPage ref="clickMapPage"></ClickMapPage> <ClickMapPage ref="clickMapPage"></ClickMapPage>
</div> </div>
<li><b>ПКМ</b> - показать/скрыть панель управления</li> <li><b>ПКМ</b> - показать/скрыть панель управления</li>
<li><b>СКМ</b> - вкл./выкл. плавный скроллинг текста</li> <li><b>СКМ</b> - вкл./выкл. плавный скроллинг текста</li>
<br>
<li>Жесты для тачскрина:</li>
<ul>
<li style="list-style-type: square">от центра вверх: на весь экран</li>
<li style="list-style-type: square">от центра вниз: плавный скроллинг</li>
<li style="list-style-type: square">от центра вправо: увеличить скорость скроллинга</li>
<li style="list-style-type: square">от центра влево: уменьшить скорость скроллинга</li>
</ul>
</ul> </ul>
* Для управления с помощью мыши/тачпада необходимо установить галочку "Включить управление кликом" в настройках * Для управления с помощью мыши/тачскрина необходимо установить галочку "Включить управление кликом" в настройках
</div> </div>
</template> </template>

View File

@@ -1,6 +1,6 @@
<template> <template>
<div ref="main" class="main"> <div ref="main" class="main">
<div class="part"> <div class="part top">
<span class="greeting bold-font">{{ title }}</span> <span class="greeting bold-font">{{ title }}</span>
<div class="space"></div> <div class="space"></div>
<span class="greeting">Добро пожаловать!</span> <span class="greeting">Добро пожаловать!</span>
@@ -14,6 +14,7 @@
</el-input> </el-input>
<div class="space"></div> <div class="space"></div>
<input type="file" id="file" ref="file" @change="loadFile" style='display: none;'/> <input type="file" id="file" ref="file" @change="loadFile" style='display: none;'/>
<el-button size="mini" @click="loadFileClick"> <el-button size="mini" @click="loadFileClick">
Загрузить файл с диска Загрузить файл с диска
</el-button> </el-button>
@@ -21,13 +22,16 @@
<el-button size="mini" @click="loadBufferClick"> <el-button size="mini" @click="loadBufferClick">
Из буфера обмена Из буфера обмена
</el-button> </el-button>
<div class="space"></div> <div class="space"></div>
<div class="space"></div> <div class="space"></div>
<div v-if="mode == 'omnireader'" ref="yaShare2" class="ya-share2" <div v-if="mode == 'omnireader'">
data-services="collections,vkontakte,facebook,odnoklassniki,twitter,telegram" <div ref="yaShare2" class="ya-share2"
data-description="Чтение fb2-книг онлайн. Загрузка любой страницы интернета одним кликом, синхронизация между устройствами, удобное управление, регистрация не требуется." data-services="collections,vkontakte,facebook,odnoklassniki,twitter,telegram"
data-title="Omni Reader - браузерная онлайн-читалка" data-description="Чтение fb2-книг онлайн. Загрузка любой страницы интернета одним кликом, синхронизация между устройствами, удобное управление, регистрация не требуется."
data-url="https://omnireader.ru"> data-title="Omni Reader - браузерная онлайн-читалка"
data-url="https://omnireader.ru">
</div>
</div> </div>
<div class="space"></div> <div class="space"></div>
<span v-if="mode == 'omnireader'" class="bottom-span clickable" @click="openComments">Отзывы о читалке</span> <span v-if="mode == 'omnireader'" class="bottom-span clickable" @click="openComments">Отзывы о читалке</span>
@@ -184,7 +188,7 @@ class LoaderPage extends Vue {
flex: 1; flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
min-height: 400px; min-height: 480px;
} }
.part { .part {
@@ -210,9 +214,14 @@ class LoaderPage extends Vue {
cursor: pointer; cursor: pointer;
} }
.top {
min-height: 120px;
}
.center { .center {
justify-content: flex-start; justify-content: flex-start;
padding: 0 10px 0 10px; padding: 0 10px 0 10px;
min-height: 250px;
} }
.bottom { .bottom {

View File

@@ -19,7 +19,7 @@
</div> </div>
<div v-show="clickControl" 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" @wheel.prevent.stop="onMouseWheel"
@touchstart.stop="onTouchStart" @touchend.stop="onTouchEnd" @touchcancel.prevent.stop="onTouchCancel" @touchstart.stop="onTouchStart" @touchend.stop="onTouchEnd" @touchmove.stop="onTouchMove" @touchcancel.prevent.stop="onTouchCancel"
oncontextmenu="return false;"> oncontextmenu="return false;">
<div v-show="showStatusBar" v-html="statusBarClickable" @mousedown.prevent.stop @touchstart.stop <div v-show="showStatusBar" v-html="statusBarClickable" @mousedown.prevent.stop @touchstart.stop
@click.prevent.stop="onStatusBarClick"></div> @click.prevent.stop="onStatusBarClick"></div>
@@ -877,6 +877,14 @@ class TextPage extends Vue {
this.$emit('tool-bar-toggle'); this.$emit('tool-bar-toggle');
} }
doScrollingToggle() {
this.$emit('scrolling-toggle');
}
doFullScreenToggle() {
this.$emit('full-screen-toogle');
}
async doFontSizeInc() { async doFontSizeInc() {
if (!this.settingsChanging) { if (!this.settingsChanging) {
this.settingsChanging = true; this.settingsChanging = true;
@@ -968,7 +976,7 @@ class TextPage extends Vue {
case 'Enter': case 'Enter':
case 'Backquote'://` case 'Backquote'://`
case 'KeyF': case 'KeyF':
this.$emit('full-screen-toogle'); this.doFullScreenToggle();
break; break;
case 'Tab': case 'Tab':
case 'KeyQ': case 'KeyQ':
@@ -1009,22 +1017,64 @@ class TextPage extends Vue {
if (!this.$isMobileDevice) if (!this.$isMobileDevice)
return; return;
this.endClickRepeat(); this.endClickRepeat();
if (event.touches.length == 1) { if (event.touches.length == 1) {
const touch = event.touches[0]; const touch = event.touches[0];
const rect = event.target.getBoundingClientRect(); const rect = event.target.getBoundingClientRect();
const x = touch.pageX - rect.left; const x = touch.pageX - rect.left;
const y = touch.pageY - rect.top; const y = touch.pageY - rect.top;
if (this.handleClick(x, y)) { const hc = this.handleClick(x, y, new Set(['Menu']));
this.repDoing = true; if (hc) {
this.debouncedStartClickRepeat(x, y); if (hc != 'Menu') {
this.repDoing = true;
this.debouncedStartClickRepeat(x, y);
} else {
this.startTouch = {x, y};
}
} }
} }
} }
onTouchEnd() { onTouchMove(event) {
if (this.startTouch) {
event.preventDefault();
}
}
onTouchEnd(event) {
if (!this.$isMobileDevice) if (!this.$isMobileDevice)
return; return;
this.endClickRepeat(); this.endClickRepeat();
if (event.changedTouches.length == 1) {
const touch = event.changedTouches[0];
const rect = event.target.getBoundingClientRect();
const x = touch.pageX - rect.left;
const y = touch.pageY - rect.top;
if (this.startTouch) {
const dy = this.startTouch.y - y;
const dx = this.startTouch.x - x;
const moveDelta = 30;
const touchDelta = 15;
if (dy > 0 && Math.abs(dy) >= moveDelta && Math.abs(dy) > Math.abs(dx)) {
//движение вверх
this.doFullScreenToggle();
} else if (dy < 0 && Math.abs(dy) >= moveDelta && Math.abs(dy) > Math.abs(dx)) {
//движение вниз
this.doScrollingToggle();
} else if (dx > 0 && Math.abs(dx) >= moveDelta && Math.abs(dy) < Math.abs(dx)) {
//движение влево
this.doScrollingSpeedDown();
} else if (dx < 0 && Math.abs(dx) >= moveDelta && Math.abs(dy) < Math.abs(dx)) {
//движение вправо
this.doScrollingSpeedUp();
} else if (Math.abs(dy) < touchDelta && Math.abs(dx) < touchDelta) {
this.doToolBarToggle();
}
this.startTouch = null;
}
}
} }
onTouchCancel() { onTouchCancel() {
@@ -1038,12 +1088,13 @@ class TextPage extends Vue {
return; return;
this.endClickRepeat(); this.endClickRepeat();
if (event.button == 0) { if (event.button == 0) {
if (this.handleClick(event.offsetX, event.offsetY)) { const hc = this.handleClick(event.offsetX, event.offsetY);
if (hc && hc != 'Menu') {
this.repDoing = true; this.repDoing = true;
this.debouncedStartClickRepeat(event.offsetX, event.offsetY); this.debouncedStartClickRepeat(event.offsetX, event.offsetY);
} }
} else if (event.button == 1) { } else if (event.button == 1) {
this.$emit('scrolling-toggle'); this.doScrollingToggle();
} else if (event.button == 2) { } else if (event.button == 2) {
this.doToolBarToggle(); this.doToolBarToggle();
} }
@@ -1074,7 +1125,7 @@ class TextPage extends Vue {
} }
} }
handleClick(pointX, pointY) { getClickAction(pointX, pointY) {
const w = pointX/this.realWidth*100; const w = pointX/this.realWidth*100;
const h = pointY/this.realHeight*100; const h = pointY/this.realHeight*100;
@@ -1090,27 +1141,35 @@ class TextPage extends Vue {
} }
} }
switch (action) { return action;
case 'Down' ://Down }
this.doDown();
break; handleClick(pointX, pointY, exclude) {
case 'Up' ://Up const action = this.getClickAction(pointX, pointY);
this.doUp();
break; if (!exclude || !exclude.has(action)) {
case 'PgDown' ://PgDown switch (action) {
this.doPageDown(); case 'Down' ://Down
break; this.doDown();
case 'PgUp' ://PgUp break;
this.doPageUp(); case 'Up' ://Up
break; this.doUp();
case 'Menu' : break;
this.doToolBarToggle(); case 'PgDown' ://PgDown
break; this.doPageDown();
default : break;
// Nothing case 'PgUp' ://PgUp
this.doPageUp();
break;
case 'Menu' :
this.doToolBarToggle();
break;
default :
// Nothing
}
} }
return (action && action != 'Menu'); return action;
} }
} }

View File

@@ -1,4 +1,21 @@
export const versionHistory = [ export const versionHistory = [
{
showUntil: '2019-11-10',
header: '0.7.7 (2019-11-06)',
content:
`
<ul>
<li>добавлены следующие жесты для тачскрина (только при включенной опции "управление кликом"):</li>
<ul>
<li style="list-style-type: square">от центра вверх: на весь экран</li>
<li style="list-style-type: square">от центра вниз: плавный скроллинг</li>
<li style="list-style-type: square">от центра вправо: увеличить скорость скроллинга</li>
<li style="list-style-type: square">от центра влево: уменьшить скорость скроллинга</li>
</ul>
</ul>
`
},
{ {
showUntil: '2019-10-29', showUntil: '2019-10-29',
header: '0.7.6 (2019-10-30)', header: '0.7.6 (2019-10-30)',

View File

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

View File

@@ -82,7 +82,7 @@ class ConvertBase {
} }
escapeEntities(text) { escapeEntities(text) {
return he.escape(he.decode(text)); return he.escape(he.decode(text.replace(/&nbsp;/g, ' ')));
} }
formatFb2(fb2) { formatFb2(fb2) {

View File

@@ -64,6 +64,7 @@ class ConvertHtml extends ConvertBase {
for (let line of lines) { for (let line of lines) {
if (line.trim() == '') if (line.trim() == '')
continue; continue;
line = repCrLfTab(line); line = repCrLfTab(line);
let l = 0; let l = 0;
@@ -171,7 +172,6 @@ class ConvertHtml extends ConvertBase {
}); });
titleInfo['book-title'] = title; titleInfo['book-title'] = title;
//подозрение на чистый текст, надо разбить на параграфы //подозрение на чистый текст, надо разбить на параграфы
if (isText || pars.length < buf.length/2000) { if (isText || pars.length < buf.length/2000) {
let total = 0; let total = 0;
@@ -257,8 +257,9 @@ class ConvertHtml extends ConvertBase {
pars[i]._t = this.repSpaces(pars[i]._t).trim(); pars[i]._t = this.repSpaces(pars[i]._t).trim();
if (pars[i]._t.indexOf('<') >= 0) { if (pars[i]._t.indexOf('<') >= 0 || bold || italic) {
const t = pars[i]._t; const t = pars[i]._t;
let a = []; let a = [];
const onTextNode = (text) => { const onTextNode = (text) => {