@internetarchive/bookreader 5.0.0-5 → 5.0.0-50-a1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +17 -15
- package/.github/workflows/node.js.yml +77 -6
- package/.github/workflows/npm-publish.yml +6 -20
- package/.testcaferc.js +10 -0
- package/BookReader/BookReader.css +131 -339
- package/BookReader/BookReader.js +1 -1
- package/BookReader/BookReader.js.LICENSE.txt +24 -0
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/ia-bookreader-bundle.js +1493 -0
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +17 -0
- package/BookReader/ia-bookreader-bundle.js.map +1 -0
- package/BookReader/icons/close-circle-dark.svg +1 -0
- package/BookReader/icons/magnify-minus.svg +1 -1
- package/BookReader/icons/magnify-plus.svg +1 -1
- package/BookReader/icons/pause.svg +1 -1
- package/BookReader/icons/playback-speed.svg +1 -1
- package/BookReader/icons/read-aloud.svg +1 -1
- package/BookReader/icons/voice.svg +1 -0
- package/BookReader/images/BRicons.svg +2 -2
- package/BookReader/images/books_graphic.svg +1 -1
- package/BookReader/images/icon_book.svg +1 -1
- package/BookReader/images/icon_gear.svg +1 -1
- package/BookReader/images/icon_info.svg +1 -1
- package/BookReader/images/icon_playback-rate.svg +1 -1
- package/BookReader/images/icon_search_button.svg +1 -1
- package/BookReader/images/icon_share.svg +1 -1
- package/BookReader/images/icon_speaker.svg +1 -1
- package/BookReader/images/icon_speaker_open.svg +1 -1
- package/BookReader/images/marker_chap-off.svg +1 -1
- package/BookReader/images/marker_chap-on.svg +1 -1
- package/BookReader/images/marker_srch-on.svg +1 -1
- package/BookReader/jquery-3.js +2 -0
- package/BookReader/jquery-3.js.LICENSE.txt +24 -0
- package/BookReader/plugins/plugin.archive_analytics.js +1 -1
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +1 -1
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +1 -1
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.iframe.js +1 -1
- package/BookReader/plugins/plugin.iframe.js.map +1 -1
- package/BookReader/plugins/plugin.mobile_nav.js +1 -1
- package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
- package/BookReader/plugins/plugin.resume.js +1 -1
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +1 -1
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +1 -1
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.tts.js +1 -1
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +1 -1
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
- package/BookReader/webcomponents-bundle.js +3 -0
- package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
- package/BookReader/webcomponents-bundle.js.map +1 -0
- package/BookReaderDemo/BookReaderDemo.css +14 -1
- package/BookReaderDemo/IADemoBr.js +148 -0
- package/BookReaderDemo/demo-advanced.html +2 -2
- package/BookReaderDemo/demo-autoplay.html +2 -1
- package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
- package/BookReaderDemo/demo-fullscreen-mobile.html +2 -1
- package/BookReaderDemo/demo-fullscreen.html +2 -1
- package/BookReaderDemo/demo-iiif.html +2 -1
- package/BookReaderDemo/demo-internetarchive.html +84 -17
- package/BookReaderDemo/demo-multiple.html +2 -1
- package/BookReaderDemo/demo-preview-pages.html +2 -1
- package/BookReaderDemo/demo-simple.html +2 -1
- package/BookReaderDemo/demo-vendor-fullscreen.html +2 -1
- package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
- package/BookReaderDemo/immersion-1up.html +2 -1
- package/BookReaderDemo/immersion-mode.html +2 -1
- package/BookReaderDemo/toggle_controls.html +2 -1
- package/BookReaderDemo/view_mode.html +2 -1
- package/BookReaderDemo/viewmode-cycle.html +2 -3
- package/CHANGELOG.md +202 -0
- package/README.md +14 -1
- package/babel.config.js +18 -0
- package/codecov.yml +6 -0
- package/index.html +3 -0
- package/jsconfig.json +19 -0
- package/package.json +66 -56
- package/renovate.json +52 -0
- package/scripts/preversion.js +4 -1
- package/src/BookNavigator/assets/bookmark-colors.js +1 -1
- package/src/BookNavigator/assets/button-base.js +9 -2
- package/src/BookNavigator/assets/ia-logo.js +17 -0
- package/src/BookNavigator/assets/icon_checkmark.js +1 -1
- package/src/BookNavigator/assets/icon_close.js +1 -1
- package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
- package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
- package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
- package/src/BookNavigator/assets/icon_volumes.js +11 -0
- package/src/BookNavigator/book-navigator.js +583 -0
- package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
- package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
- package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
- package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +21 -8
- package/src/BookNavigator/bookmarks/ia-bookmarks.js +102 -66
- package/src/BookNavigator/delete-modal-actions.js +1 -1
- package/src/BookNavigator/downloads/downloads-provider.js +36 -21
- package/src/BookNavigator/downloads/downloads.js +41 -25
- package/src/BookNavigator/search/a-search-result.js +18 -13
- package/src/BookNavigator/search/search-provider.js +80 -28
- package/src/BookNavigator/search/search-results.js +10 -18
- package/src/BookNavigator/sharing.js +27 -0
- package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
- package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
- package/src/BookNavigator/volumes/volumes-provider.js +114 -0
- package/src/BookNavigator/volumes/volumes.js +188 -0
- package/src/BookReader/BookModel.js +0 -29
- package/src/BookReader/DebugConsole.js +3 -3
- package/src/BookReader/DragScrollable.js +233 -0
- package/src/BookReader/Mode1Up.js +51 -351
- package/src/BookReader/Mode1UpLit.js +441 -0
- package/src/BookReader/Mode2Up.js +120 -105
- package/src/BookReader/ModeSmoothZoom.js +179 -0
- package/src/BookReader/ModeThumb.js +17 -11
- package/src/BookReader/Navbar/Navbar.js +10 -36
- package/src/BookReader/PageContainer.js +69 -6
- package/src/BookReader/ReduceSet.js +1 -1
- package/src/BookReader/Toolbar/Toolbar.js +10 -37
- package/src/BookReader/options.js +10 -0
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/ScrollClassAdder.js +31 -0
- package/src/BookReader/utils.js +92 -13
- package/src/BookReader.js +431 -620
- package/src/assets/icons/close-circle-dark.svg +1 -0
- package/src/assets/icons/magnify-minus.svg +3 -7
- package/src/assets/icons/magnify-plus.svg +3 -7
- package/src/assets/icons/voice.svg +1 -0
- package/src/css/BookReader.scss +0 -12
- package/src/css/_BRComponent.scss +1 -1
- package/src/css/_BRmain.scss +19 -24
- package/src/css/_BRnav.scss +4 -26
- package/src/css/_BRpages.scss +35 -0
- package/src/css/_BRsearch.scss +25 -216
- package/src/css/_TextSelection.scss +14 -17
- package/src/css/_colorbox.scss +2 -2
- package/src/css/_controls.scss +17 -5
- package/src/css/_icons.scss +6 -0
- package/src/ia-bookreader/ia-bookreader.js +224 -0
- package/src/plugins/plugin.autoplay.js +4 -4
- package/src/plugins/plugin.chapters.js +28 -35
- package/src/plugins/plugin.mobile_nav.js +11 -10
- package/src/plugins/plugin.resume.js +3 -3
- package/src/plugins/plugin.text_selection.js +26 -39
- package/src/plugins/plugin.vendor-fullscreen.js +4 -4
- package/src/plugins/search/plugin.search.js +174 -116
- package/src/plugins/search/view.js +63 -179
- package/src/plugins/tts/AbstractTTSEngine.js +46 -37
- package/src/plugins/tts/FestivalTTSEngine.js +13 -14
- package/src/plugins/tts/PageChunk.js +15 -21
- package/src/plugins/tts/PageChunkIterator.js +8 -12
- package/src/plugins/tts/WebTTSEngine.js +66 -69
- package/src/plugins/tts/plugin.tts.js +92 -109
- package/src/plugins/tts/utils.js +0 -9
- package/src/plugins/url/UrlPlugin.js +184 -0
- package/src/plugins/{plugin.url.js → url/plugin.url.js} +28 -6
- package/src/util/manifestGenerator.js +0 -0
- package/tests/e2e/README.md +37 -0
- package/tests/e2e/autoplay.test.js +2 -2
- package/tests/e2e/base.test.js +7 -7
- package/tests/e2e/helpers/base.js +9 -3
- package/tests/e2e/helpers/debug.js +1 -1
- package/tests/e2e/helpers/desktopSearch.js +14 -13
- package/tests/e2e/helpers/mobileSearch.js +3 -3
- package/tests/e2e/helpers/params.js +17 -0
- package/tests/e2e/models/Navigation.js +13 -4
- package/tests/e2e/rightToLeft.test.js +4 -5
- package/tests/e2e/viewmode.test.js +38 -33
- package/tests/jest/BookNavigator/book-navigator.test.js +634 -0
- package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
- package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
- package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
- package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
- package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
- package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
- package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
- package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +102 -58
- package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
- package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
- package/tests/jest/BookNavigator/volumes/volumes-provider.test.js +184 -0
- package/tests/jest/BookNavigator/volumes/volumes.test.js +97 -0
- package/tests/{BookReader → jest/BookReader}/BookModel.test.js +34 -14
- package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +176 -0
- package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
- package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
- package/tests/jest/BookReader/Mode1UpLit.test.js +92 -0
- package/tests/{BookReader → jest/BookReader}/Mode2Up.test.js +36 -15
- package/tests/jest/BookReader/ModeSmoothZoom.test.js +149 -0
- package/tests/jest/BookReader/ModeThumb.test.js +71 -0
- package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +7 -7
- package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
- package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
- package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
- package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
- package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
- package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
- package/tests/jest/BookReader/utils.test.js +186 -0
- package/tests/jest/BookReader.keyboard.test.js +190 -0
- package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
- package/tests/{BookReader.test.js → jest/BookReader.test.js} +18 -37
- package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
- package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
- package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +10 -11
- package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
- package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
- package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
- package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +39 -47
- package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
- package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +63 -47
- package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +35 -6
- package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +9 -9
- package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
- package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
- package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
- package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +1 -1
- package/tests/{plugins → jest/plugins}/tts/utils.test.js +3 -28
- package/tests/jest/plugins/url/UrlPlugin.test.js +190 -0
- package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +33 -14
- package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
- package/tests/{util → jest/util}/docCookies.test.js +1 -1
- package/tests/{util → jest/util}/strings.test.js +1 -1
- package/tests/{utils.js → jest/utils.js} +38 -0
- package/webpack.config.js +11 -5
- package/.babelrc +0 -12
- package/.dependabot/config.yml +0 -6
- package/.testcaferc.json +0 -5
- package/BookReader/bookreader-component-bundle.js +0 -1450
- package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
- package/BookReader/bookreader-component-bundle.js.map +0 -1
- package/BookReader/jquery-1.10.1.js +0 -2
- package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
- package/BookReader/plugins/plugin.menu_toggle.js +0 -2
- package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
- package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
- package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
- package/karma.conf.js +0 -23
- package/src/BookNavigator/BookModel.js +0 -14
- package/src/BookNavigator/BookNavigator.js +0 -438
- package/src/BookNavigator/assets/book-loader.js +0 -27
- package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
- package/src/BookReaderComponent/BookReaderComponent.js +0 -112
- package/src/ItemNavigator/ItemNavigator.js +0 -372
- package/src/ItemNavigator/providers/sharing.js +0 -29
- package/src/Layers/sharing/sharing-provider.js +0 -22
- package/src/dragscrollable-br.js +0 -261
- package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
- package/src/plugins/plugin.bookmarks.js +0 -50
- package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
- package/tests/BookReader/Mode1Up.test.js +0 -164
- package/tests/BookReader/utils.test.js +0 -109
- package/tests/e2e/ia-production/ia-prod-base.js +0 -17
- package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
- package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
- package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
package/src/BookReader.js
CHANGED
@@ -27,23 +27,17 @@ import 'jquery-ui/ui/widget.js';
|
|
27
27
|
import 'jquery-ui/ui/widgets/mouse.js';
|
28
28
|
import 'jquery-ui-touch-punch';
|
29
29
|
|
30
|
-
import './dragscrollable-br.js';
|
31
30
|
import PACKAGE_JSON from '../package.json';
|
32
31
|
import * as utils from './BookReader/utils.js';
|
33
32
|
import { exposeOverrideable } from './BookReader/utils/classes.js';
|
34
|
-
import { Navbar
|
33
|
+
import { Navbar } from './BookReader/Navbar/Navbar.js';
|
35
34
|
import { DEFAULT_OPTIONS } from './BookReader/options.js';
|
36
35
|
/** @typedef {import('./BookReader/options.js').BookReaderOptions} BookReaderOptions */
|
37
36
|
/** @typedef {import('./BookReader/options.js').ReductionFactor} ReductionFactor */
|
38
37
|
/** @typedef {import('./BookReader/BookModel.js').PageIndex} PageIndex */
|
39
38
|
import { EVENTS } from './BookReader/events.js';
|
40
39
|
import { DebugConsole } from './BookReader/DebugConsole.js';
|
41
|
-
import {
|
42
|
-
Toolbar,
|
43
|
-
blankInfoDiv,
|
44
|
-
blankShareDiv,
|
45
|
-
createPopup,
|
46
|
-
} from './BookReader/Toolbar/Toolbar.js';
|
40
|
+
import { Toolbar } from './BookReader/Toolbar/Toolbar.js';
|
47
41
|
import { BookModel } from './BookReader/BookModel.js';
|
48
42
|
import { Mode1Up } from './BookReader/Mode1Up.js';
|
49
43
|
import { Mode2Up } from './BookReader/Mode2Up.js';
|
@@ -152,18 +146,13 @@ BookReader.prototype.setup = function(options) {
|
|
152
146
|
this.ui = options.ui;
|
153
147
|
this.uiAutoHide = options.uiAutoHide;
|
154
148
|
|
155
|
-
this.thumbWidth = 100; // will be overridden during
|
149
|
+
this.thumbWidth = 100; // will be overridden during this._modes.modeThumb.prepare();
|
156
150
|
this.thumbRowBuffer = options.thumbRowBuffer;
|
157
151
|
this.thumbColumns = options.thumbColumns;
|
158
152
|
this.thumbMaxLoading = options.thumbMaxLoading;
|
159
153
|
this.thumbPadding = options.thumbPadding;
|
160
154
|
this.displayedRows = [];
|
161
|
-
|
162
155
|
this.displayedIndices = [];
|
163
|
-
/** @deprecated Unused; will be remove in v5 */
|
164
|
-
this.imgs = {};
|
165
|
-
/** @deprecated No longer used; will be remove in v5 */
|
166
|
-
this.prefetchedImgs = {}; //an object with numeric keys corresponding to page index, reduce
|
167
156
|
|
168
157
|
this.animating = false;
|
169
158
|
this.flipSpeed = options.flipSpeed;
|
@@ -179,7 +168,7 @@ BookReader.prototype.setup = function(options) {
|
|
179
168
|
*/
|
180
169
|
this.firstIndex = null;
|
181
170
|
this.lastDisplayableIndex2up = null;
|
182
|
-
this.isFullscreenActive = false;
|
171
|
+
this.isFullscreenActive = options.startFullscreen || false;
|
183
172
|
this.lastScroll = null;
|
184
173
|
|
185
174
|
this.showLogo = options.showLogo;
|
@@ -212,26 +201,22 @@ BookReader.prototype.setup = function(options) {
|
|
212
201
|
|
213
202
|
// Assign the data methods
|
214
203
|
this.data = options.data;
|
215
|
-
if (options.getNumLeafs) BookReader.prototype.getNumLeafs = options.getNumLeafs;
|
216
|
-
if (options.getPageWidth) BookReader.prototype.getPageWidth = options.getPageWidth;
|
217
|
-
if (options.getPageHeight) BookReader.prototype.getPageHeight = options.getPageHeight;
|
218
|
-
if (options.getPageURI) BookReader.prototype.getPageURI = options.getPageURI;
|
219
|
-
if (options.getPageSide) BookReader.prototype.getPageSide = options.getPageSide;
|
220
|
-
if (options.getPageNum) BookReader.prototype.getPageNum = options.getPageNum;
|
221
|
-
if (options.getPageProp) BookReader.prototype.getPageProp = options.getPageProp;
|
222
|
-
if (options.getSpreadIndices) BookReader.prototype.getSpreadIndices = options.getSpreadIndices;
|
223
|
-
if (options.leafNumToIndex) BookReader.prototype.leafNumToIndex = options.leafNumToIndex;
|
224
204
|
|
225
205
|
/** @type {{[name: string]: JQuery}} */
|
226
206
|
this.refs = {};
|
227
207
|
|
228
|
-
/**
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
this.
|
233
|
-
|
234
|
-
|
208
|
+
/** The book being displayed in BookReader*/
|
209
|
+
this.book = new BookModel(this);
|
210
|
+
|
211
|
+
if (options.getNumLeafs) this.book.getNumLeafs = options.getNumLeafs.bind(this);
|
212
|
+
if (options.getPageWidth) this.book.getPageWidth = options.getPageWidth.bind(this);
|
213
|
+
if (options.getPageHeight) this.book.getPageHeight = options.getPageHeight.bind(this);
|
214
|
+
if (options.getPageURI) this.book.getPageURI = options.getPageURI.bind(this);
|
215
|
+
if (options.getPageSide) this.book.getPageSide = options.getPageSide.bind(this);
|
216
|
+
if (options.getPageNum) this.book.getPageNum = options.getPageNum.bind(this);
|
217
|
+
if (options.getPageProp) this.book.getPageProp = options.getPageProp.bind(this);
|
218
|
+
if (options.getSpreadIndices) this.book.getSpreadIndices = options.getSpreadIndices.bind(this);
|
219
|
+
if (options.leafNumToIndex) this.book.leafNumToIndex = options.leafNumToIndex.bind(this);
|
235
220
|
|
236
221
|
/**
|
237
222
|
* @private Components are 'subchunks' of bookreader functionality, usually UI related
|
@@ -245,14 +230,14 @@ BookReader.prototype.setup = function(options) {
|
|
245
230
|
};
|
246
231
|
|
247
232
|
this._modes = {
|
248
|
-
mode1Up: new Mode1Up(this, this.
|
249
|
-
mode2Up: new Mode2Up(this, this.
|
250
|
-
modeThumb: new ModeThumb(this, this.
|
233
|
+
mode1Up: new Mode1Up(this, this.book),
|
234
|
+
mode2Up: new Mode2Up(this, this.book),
|
235
|
+
modeThumb: new ModeThumb(this, this.book),
|
251
236
|
};
|
252
237
|
|
253
238
|
/** Stores classes which we want to expose (selectively) some methods as overridable */
|
254
239
|
this._overrideable = {
|
255
|
-
'
|
240
|
+
'book': this.book,
|
256
241
|
'_components.navbar': this._components.navbar,
|
257
242
|
'_components.toolbar': this._components.toolbar,
|
258
243
|
'_modes.mode1Up': this._modes.mode1Up,
|
@@ -261,21 +246,54 @@ BookReader.prototype.setup = function(options) {
|
|
261
246
|
};
|
262
247
|
|
263
248
|
/** Image cache for general image fetching */
|
264
|
-
this.imageCache = new ImageCache(this.
|
249
|
+
this.imageCache = new ImageCache(this.book, {
|
265
250
|
useSrcSet: this.options.useSrcSet,
|
266
251
|
reduceSet: this.reduceSet,
|
267
252
|
});
|
253
|
+
|
254
|
+
/**
|
255
|
+
* Flag if BookReader has "focus" for keyboard shortcuts
|
256
|
+
* Initially true, set to false when:
|
257
|
+
* - BookReader scrolled out of view
|
258
|
+
* Set to true when:
|
259
|
+
* - BookReader scrolled into view
|
260
|
+
*/
|
261
|
+
this.hasKeyFocus = true;
|
268
262
|
};
|
269
263
|
|
270
|
-
/**
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
Object.
|
277
|
-
|
278
|
-
|
264
|
+
/**
|
265
|
+
* Get all the HTML Elements that are being/can be rendered.
|
266
|
+
* Includes cached elements which might be rendered again.
|
267
|
+
*/
|
268
|
+
BookReader.prototype.getActivePageContainerElements = function() {
|
269
|
+
let containerEls = Object.values(this._modes.mode2Up.pageContainers).map(pc => pc.$container[0])
|
270
|
+
.concat(Object.values(this._modes.mode1Up.mode1UpLit.pageContainerCache).map(pc => pc.$container[0]));
|
271
|
+
if (this.mode == this.constModeThumb) {
|
272
|
+
containerEls = containerEls.concat(this.$('.BRpagecontainer').toArray());
|
273
|
+
}
|
274
|
+
return containerEls;
|
275
|
+
};
|
276
|
+
|
277
|
+
/**
|
278
|
+
* Get the HTML Elements for the rendered page. Note there can be more than one, since
|
279
|
+
* (at least as of writing) different modes can maintain different caches.
|
280
|
+
* @param {PageIndex} pageIndex
|
281
|
+
*/
|
282
|
+
BookReader.prototype.getActivePageContainerElementsForIndex = function(pageIndex) {
|
283
|
+
return [
|
284
|
+
this._modes.mode2Up.pageContainers[pageIndex]?.$container?.[0],
|
285
|
+
this._modes.mode1Up.mode1UpLit.pageContainerCache[pageIndex]?.$container?.[0],
|
286
|
+
...(this.mode == this.constModeThumb ? this.$(`.pagediv${pageIndex}`).toArray() : [])
|
287
|
+
].filter(x => x);
|
288
|
+
};
|
289
|
+
|
290
|
+
Object.defineProperty(BookReader.prototype, 'activeMode', {
|
291
|
+
/** @return {Mode1Up | Mode2Up | ModeThumb} */
|
292
|
+
get() { return {
|
293
|
+
1: this._modes.mode1Up,
|
294
|
+
2: this._modes.mode2Up,
|
295
|
+
3: this._modes.modeThumb,
|
296
|
+
}[this.mode]; },
|
279
297
|
});
|
280
298
|
|
281
299
|
/**
|
@@ -290,15 +308,15 @@ BookReader.util = utils;
|
|
290
308
|
* @private
|
291
309
|
*/
|
292
310
|
BookReader.prototype.extendParams = function(params, newParams) {
|
293
|
-
|
311
|
+
const modifiedNewParams = $.extend({}, newParams);
|
294
312
|
if ('undefined' != typeof(modifiedNewParams.page)) {
|
295
|
-
|
313
|
+
const pageIndex = this.book.parsePageString(modifiedNewParams.page);
|
296
314
|
if (!isNaN(pageIndex))
|
297
315
|
modifiedNewParams.index = pageIndex;
|
298
316
|
delete modifiedNewParams.page;
|
299
317
|
}
|
300
318
|
$.extend(params, modifiedNewParams);
|
301
|
-
}
|
319
|
+
};
|
302
320
|
|
303
321
|
/**
|
304
322
|
* Parses params from from various initialization contexts (url, cookie, options)
|
@@ -306,7 +324,7 @@ BookReader.prototype.extendParams = function(params, newParams) {
|
|
306
324
|
* @return {object} the parsed params
|
307
325
|
*/
|
308
326
|
BookReader.prototype.initParams = function() {
|
309
|
-
|
327
|
+
const params = {};
|
310
328
|
// Flag initializing for updateFromParams()
|
311
329
|
params.init = true;
|
312
330
|
|
@@ -323,8 +341,8 @@ BookReader.prototype.initParams = function() {
|
|
323
341
|
|
324
342
|
// If we have a title leaf, use that as the default instead of index 0,
|
325
343
|
// but only use as default if book has a few pages
|
326
|
-
if ('undefined' != typeof(this.titleLeaf) && this.
|
327
|
-
params.index = this.
|
344
|
+
if ('undefined' != typeof(this.titleLeaf) && this.book.getNumLeafs() > 2) {
|
345
|
+
params.index = this.book.leafNumToIndex(this.titleLeaf);
|
328
346
|
} else {
|
329
347
|
params.index = 0;
|
330
348
|
}
|
@@ -355,7 +373,7 @@ BookReader.prototype.initParams = function() {
|
|
355
373
|
// Check for URL plugin
|
356
374
|
if (this.options.enableUrlPlugin) {
|
357
375
|
// Params explicitly set in URL take precedence over all other methods
|
358
|
-
|
376
|
+
let urlParams = this.paramsFromFragment(this.urlReadFragment());
|
359
377
|
|
360
378
|
// Get params if hash fragment available with 'history' urlMode
|
361
379
|
const hasHashURL = !Object.keys(urlParams).length && this.urlReadHashFragment();
|
@@ -377,7 +395,7 @@ BookReader.prototype.initParams = function() {
|
|
377
395
|
// Check for Search plugin
|
378
396
|
if (this.options.enableSearch) {
|
379
397
|
// Go to first result only if no default or URL page
|
380
|
-
this.goToFirstResult = !params.pageFound
|
398
|
+
this.options.goToFirstResult = !params.pageFound;
|
381
399
|
|
382
400
|
// If initialSearchTerm not set
|
383
401
|
if (!this.options.initialSearchTerm) {
|
@@ -389,7 +407,7 @@ BookReader.prototype.initParams = function() {
|
|
389
407
|
} else {
|
390
408
|
// If we have a query string: q=[term]
|
391
409
|
const searchParams = new URLSearchParams(this.readQueryString());
|
392
|
-
const searchTerm = searchParams.get('q')
|
410
|
+
const searchTerm = searchParams.get('q');
|
393
411
|
if (searchTerm) {
|
394
412
|
this.options.initialSearchTerm = utils.decodeURIComponentPlus(searchTerm);
|
395
413
|
}
|
@@ -401,21 +419,21 @@ BookReader.prototype.initParams = function() {
|
|
401
419
|
this.suppressFragmentChange = !params.fragmentChange;
|
402
420
|
|
403
421
|
return params;
|
404
|
-
}
|
422
|
+
};
|
405
423
|
|
406
424
|
/**
|
407
425
|
* Allow mocking of window.location.search
|
408
426
|
*/
|
409
427
|
BookReader.prototype.getLocationSearch = function () {
|
410
428
|
return window.location.search;
|
411
|
-
}
|
429
|
+
};
|
412
430
|
|
413
431
|
/**
|
414
432
|
* Allow mocking of window.location.hash
|
415
433
|
*/
|
416
434
|
BookReader.prototype.getLocationHash = function () {
|
417
435
|
return window.location.hash;
|
418
|
-
}
|
436
|
+
};
|
419
437
|
|
420
438
|
/**
|
421
439
|
* Return URL or fragment querystring
|
@@ -428,7 +446,7 @@ BookReader.prototype.readQueryString = function() {
|
|
428
446
|
const hash = this.getLocationHash();
|
429
447
|
const found = hash.search(/\?\w+=/);
|
430
448
|
return found > -1 ? hash.slice(found) : '';
|
431
|
-
}
|
449
|
+
};
|
432
450
|
|
433
451
|
/**
|
434
452
|
* Determines the initial mode for starting if a mode is not already
|
@@ -438,12 +456,11 @@ BookReader.prototype.readQueryString = function() {
|
|
438
456
|
*/
|
439
457
|
BookReader.prototype.getInitialMode = function(params) {
|
440
458
|
// Use params or browser width to set view mode
|
441
|
-
|
442
|
-
|
459
|
+
const windowWidth = $(window).width();
|
460
|
+
let nextMode;
|
443
461
|
if ('undefined' != typeof(params.mode)) {
|
444
462
|
nextMode = params.mode;
|
445
463
|
} else if (this.ui == 'full'
|
446
|
-
&& this.enableMobileNav
|
447
464
|
&& this.isFullscreenActive
|
448
465
|
&& windowWidth <= this.onePageMinBreakpoint
|
449
466
|
) {
|
@@ -467,7 +484,7 @@ BookReader.prototype.init = function() {
|
|
467
484
|
this.init.initComplete = false;
|
468
485
|
this.pageScale = this.reduce; // preserve current reduce
|
469
486
|
|
470
|
-
|
487
|
+
const params = this.initParams();
|
471
488
|
|
472
489
|
this.firstIndex = params.index ? params.index : 0;
|
473
490
|
|
@@ -497,19 +514,16 @@ BookReader.prototype.init = function() {
|
|
497
514
|
// Explicitly ensure this.mode exists for initNavbar() below
|
498
515
|
this.mode = params.mode;
|
499
516
|
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
if (this.options.showNavbar) {
|
507
|
-
this.initNavbar();
|
508
|
-
}
|
517
|
+
// Display Navigation
|
518
|
+
if (this.options.showToolbar) {
|
519
|
+
this.initToolbar(this.mode, this.ui); // Build inside of toolbar div
|
520
|
+
}
|
521
|
+
if (this.options.showNavbar) { // default navigation
|
522
|
+
this.initNavbar();
|
509
523
|
}
|
510
524
|
|
511
525
|
// Switch navbar controls on mobile/desktop
|
512
|
-
this.switchNavbarControls();
|
526
|
+
this._components.navbar.switchNavbarControls();
|
513
527
|
|
514
528
|
this.resizeBRcontainer();
|
515
529
|
this.updateFromParams(params);
|
@@ -521,17 +535,17 @@ BookReader.prototype.init = function() {
|
|
521
535
|
this.setupKeyListeners();
|
522
536
|
|
523
537
|
this.lastScroll = (new Date().getTime());
|
524
|
-
this.refs.$brContainer.
|
538
|
+
this.refs.$brContainer.on('scroll', this, function(e) {
|
525
539
|
// Note, this scroll event fires for both user, and js generated calls
|
526
540
|
// It is functioning in some cases as the primary triggerer for rendering
|
527
541
|
e.data.lastScroll = (new Date().getTime());
|
528
|
-
if (e.data.
|
542
|
+
if (e.data.constModeThumb == e.data.mode) {
|
529
543
|
e.data.drawLeafsThrottled();
|
530
544
|
}
|
531
545
|
});
|
532
546
|
|
533
547
|
if (this.options.autoResize) {
|
534
|
-
$(window).
|
548
|
+
$(window).on('resize', this, function(e) {
|
535
549
|
e.data.resize();
|
536
550
|
});
|
537
551
|
$(window).on("orientationchange", this, function(e) {
|
@@ -548,15 +562,17 @@ BookReader.prototype.init = function() {
|
|
548
562
|
this.suppressFragmentChange = false;
|
549
563
|
}
|
550
564
|
|
565
|
+
if (this.options.startFullscreen) {
|
566
|
+
this.enterFullscreen(true);
|
567
|
+
}
|
568
|
+
|
551
569
|
this.init.initComplete = true;
|
552
570
|
this.trigger(BookReader.eventNames.PostInit);
|
553
571
|
|
554
572
|
// Must be called after this.init.initComplete set to true to allow
|
555
573
|
// BookReader.prototype.resize to run.
|
556
|
-
|
557
|
-
|
558
|
-
}
|
559
|
-
}
|
574
|
+
|
575
|
+
};
|
560
576
|
|
561
577
|
/**
|
562
578
|
* @param {EVENTS} name
|
@@ -564,7 +580,6 @@ BookReader.prototype.init = function() {
|
|
564
580
|
*/
|
565
581
|
BookReader.prototype.trigger = function(name, props = this) {
|
566
582
|
const eventName = 'BookReader:' + name;
|
567
|
-
$(document).trigger(eventName, props);
|
568
583
|
|
569
584
|
utils.polyfillCustomEvent(window);
|
570
585
|
window.dispatchEvent(new CustomEvent(eventName, {
|
@@ -572,14 +587,15 @@ BookReader.prototype.trigger = function(name, props = this) {
|
|
572
587
|
composed: true,
|
573
588
|
detail: { props },
|
574
589
|
}));
|
590
|
+
$(document).trigger(eventName, props);
|
575
591
|
};
|
576
592
|
|
577
593
|
BookReader.prototype.bind = function(name, callback) {
|
578
|
-
$(document).
|
594
|
+
$(document).on('BookReader:' + name, callback);
|
579
595
|
};
|
580
596
|
|
581
597
|
BookReader.prototype.unbind = function(name, callback) {
|
582
|
-
$(document).
|
598
|
+
$(document).off('BookReader:' + name, callback);
|
583
599
|
};
|
584
600
|
|
585
601
|
/**
|
@@ -591,31 +607,29 @@ BookReader.prototype.resize = function() {
|
|
591
607
|
this.resizeBRcontainer();
|
592
608
|
|
593
609
|
// Switch navbar controls on mobile/desktop
|
594
|
-
this.switchNavbarControls();
|
610
|
+
this._components.navbar.switchNavbarControls();
|
595
611
|
|
596
612
|
if (this.constMode1up == this.mode) {
|
597
613
|
if (this.onePage.autofit != 'none') {
|
598
|
-
this.
|
614
|
+
this._modes.mode1Up.resizePageView();
|
599
615
|
this.centerPageView();
|
600
|
-
if (this.enableSearch) this.updateSearchHilites(); //deletes highlights but does not call remove()
|
601
616
|
} else {
|
602
617
|
this.centerPageView();
|
603
618
|
this.displayedIndices = [];
|
604
|
-
if (this.enableSearch) this.updateSearchHilites(); //deletes highlights but does not call remove()
|
605
619
|
this.drawLeafsThrottled();
|
606
620
|
}
|
607
621
|
} else if (this.constModeThumb == this.mode) {
|
608
|
-
this.
|
622
|
+
this._modes.modeThumb.prepare();
|
609
623
|
} else {
|
610
624
|
// We only need to prepare again in autofit (size of spread changes)
|
611
625
|
if (this.twoPage.autofit) {
|
612
626
|
// most common path, esp. for archive.org books
|
613
|
-
this.
|
627
|
+
this._modes.mode2Up.prepare();
|
614
628
|
} else {
|
615
629
|
// used when zoomed in
|
616
630
|
// Re-center if the scrollbars have disappeared
|
617
|
-
|
618
|
-
|
631
|
+
const center = this.twoPageGetViewCenter();
|
632
|
+
let doRecenter = false;
|
619
633
|
if (this.twoPage.totalWidth < this.refs.$brContainer.prop('clientWidth')) {
|
620
634
|
center.percentageX = 0.5;
|
621
635
|
doRecenter = true;
|
@@ -625,7 +639,7 @@ BookReader.prototype.resize = function() {
|
|
625
639
|
doRecenter = true;
|
626
640
|
}
|
627
641
|
if (doRecenter) {
|
628
|
-
this.
|
642
|
+
this._modes.mode2Up.centerView(center.percentageX, center.percentageY);
|
629
643
|
}
|
630
644
|
}
|
631
645
|
}
|
@@ -633,93 +647,127 @@ BookReader.prototype.resize = function() {
|
|
633
647
|
};
|
634
648
|
|
635
649
|
/**
|
636
|
-
* Binds keyboard event listeners
|
650
|
+
* Binds keyboard and keyboard focus event listeners
|
637
651
|
*/
|
638
|
-
BookReader.prototype.setupKeyListeners = function() {
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
var KEY_MINUS = 189; // Chrome
|
652
|
-
var KEY_MINUS_F = 173; // Firefox
|
653
|
-
var KEY_NUMPAD_SUBTRACT = 109;
|
654
|
-
var KEY_EQUAL = 187; // Chrome
|
655
|
-
var KEY_EQUAL_F = 61; // Firefox
|
656
|
-
var KEY_NUMPAD_ADD = 107;
|
657
|
-
|
658
|
-
// We use document here instead of window to avoid a bug in jQuery on IE7
|
659
|
-
$(document).keydown(function(e) {
|
660
|
-
|
661
|
-
// Keyboard navigation
|
662
|
-
if (!self.keyboardNavigationIsDisabled(e)) {
|
663
|
-
switch (e.keyCode) {
|
664
|
-
case KEY_PGUP:
|
665
|
-
case KEY_UP:
|
666
|
-
// In 1up mode page scrolling is handled by browser
|
667
|
-
if (self.constMode2up == self.mode) {
|
668
|
-
e.preventDefault();
|
669
|
-
self.prev();
|
670
|
-
}
|
671
|
-
break;
|
672
|
-
case KEY_DOWN:
|
673
|
-
case KEY_PGDOWN:
|
674
|
-
if (self.constMode2up == self.mode) {
|
675
|
-
e.preventDefault();
|
676
|
-
self.next();
|
652
|
+
BookReader.prototype.setupKeyListeners = function () {
|
653
|
+
|
654
|
+
// Keyboard focus by BookReader in viewport
|
655
|
+
//
|
656
|
+
// Intersection observer and callback sets BookReader keyboard
|
657
|
+
// "focus" flag off when the BookReader is not in the viewport.
|
658
|
+
if (window.IntersectionObserver) {
|
659
|
+
const observer = new IntersectionObserver((entries) => {
|
660
|
+
entries.forEach((entry) => {
|
661
|
+
if (entry.intersectionRatio === 0) {
|
662
|
+
this.hasKeyFocus = false;
|
663
|
+
} else {
|
664
|
+
this.hasKeyFocus = true;
|
677
665
|
}
|
678
|
-
|
679
|
-
|
666
|
+
});
|
667
|
+
}, {
|
668
|
+
root: null,
|
669
|
+
rootMargin: '0px',
|
670
|
+
threshold: [0, 0.05, 1],
|
671
|
+
});
|
672
|
+
observer.observe(this.refs.$br[0]);
|
673
|
+
}
|
674
|
+
|
675
|
+
// Keyboard listeners
|
676
|
+
document.addEventListener('keydown', (e) => {
|
677
|
+
|
678
|
+
// Ignore if BookReader "focus" flag not set
|
679
|
+
if (!this.hasKeyFocus) {
|
680
|
+
return;
|
681
|
+
}
|
682
|
+
|
683
|
+
// Ignore if modifiers are active.
|
684
|
+
if (e.getModifierState('Control') ||
|
685
|
+
e.getModifierState('Alt') ||
|
686
|
+
e.getModifierState('Meta') ||
|
687
|
+
e.getModifierState('Win') /* hack for IE */) {
|
688
|
+
return;
|
689
|
+
}
|
690
|
+
|
691
|
+
// Ignore in input elements
|
692
|
+
if (utils.isInputActive()) {
|
693
|
+
return;
|
694
|
+
}
|
695
|
+
|
696
|
+
// KeyboardEvent code values:
|
697
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values
|
698
|
+
switch (e.key) {
|
699
|
+
|
700
|
+
// Page navigation
|
701
|
+
case "Home":
|
702
|
+
e.preventDefault();
|
703
|
+
this.first();
|
704
|
+
break;
|
705
|
+
case "End":
|
706
|
+
e.preventDefault();
|
707
|
+
this.last();
|
708
|
+
break;
|
709
|
+
case "ArrowDown":
|
710
|
+
case "PageDown":
|
711
|
+
case "Down": // hack for IE and old Gecko
|
712
|
+
// In 1up and thumb mode page scrolling handled by browser
|
713
|
+
if (this.constMode2up === this.mode) {
|
680
714
|
e.preventDefault();
|
681
|
-
|
682
|
-
|
683
|
-
|
715
|
+
this.next();
|
716
|
+
}
|
717
|
+
break;
|
718
|
+
case "ArrowUp":
|
719
|
+
case "PageUp":
|
720
|
+
case "Up": // hack for IE and old Gecko
|
721
|
+
// In 1up and thumb mode page scrolling handled by browser
|
722
|
+
if (this.constMode2up === this.mode) {
|
684
723
|
e.preventDefault();
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
break;
|
693
|
-
case KEY_RIGHT:
|
694
|
-
if (self.constModeThumb != self.mode) {
|
695
|
-
e.preventDefault();
|
696
|
-
self.right();
|
697
|
-
}
|
698
|
-
break;
|
699
|
-
case KEY_MINUS:
|
700
|
-
case KEY_MINUS_F:
|
701
|
-
case KEY_NUMPAD_SUBTRACT:
|
724
|
+
this.prev();
|
725
|
+
}
|
726
|
+
break;
|
727
|
+
case "ArrowLeft":
|
728
|
+
case "Left": // hack for IE and old Gecko
|
729
|
+
// No y-scrolling in thumb mode
|
730
|
+
if (this.constModeThumb != this.mode) {
|
702
731
|
e.preventDefault();
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
732
|
+
this.left();
|
733
|
+
}
|
734
|
+
break;
|
735
|
+
case "ArrowRight":
|
736
|
+
case "Right": // hack for IE and old Gecko
|
737
|
+
// No y-scrolling in thumb mode
|
738
|
+
if (this.constModeThumb != this.mode) {
|
708
739
|
e.preventDefault();
|
709
|
-
|
710
|
-
break;
|
740
|
+
this.right();
|
711
741
|
}
|
742
|
+
break;
|
743
|
+
// Zoom
|
744
|
+
case '-':
|
745
|
+
case 'Subtract':
|
746
|
+
e.preventDefault();
|
747
|
+
this.zoom(-1);
|
748
|
+
break;
|
749
|
+
case '+':
|
750
|
+
case '=':
|
751
|
+
case 'Add':
|
752
|
+
e.preventDefault();
|
753
|
+
this.zoom(1);
|
754
|
+
break;
|
755
|
+
// Fullscreen
|
756
|
+
case 'F':
|
757
|
+
case 'f':
|
758
|
+
e.preventDefault();
|
759
|
+
this.toggleFullscreen();
|
760
|
+
break;
|
712
761
|
}
|
713
762
|
});
|
714
763
|
};
|
715
764
|
|
716
765
|
BookReader.prototype.drawLeafs = function() {
|
717
766
|
if (this.constMode1up == this.mode) {
|
718
|
-
|
719
|
-
|
720
|
-
this.drawLeafsThumbnail();
|
767
|
+
// Not needed for Mode1Up anymore
|
768
|
+
return;
|
721
769
|
} else {
|
722
|
-
this.
|
770
|
+
this.activeMode.drawLeafs();
|
723
771
|
}
|
724
772
|
};
|
725
773
|
|
@@ -728,7 +776,7 @@ BookReader.prototype.drawLeafs = function() {
|
|
728
776
|
* @param {PageIndex} index
|
729
777
|
*/
|
730
778
|
BookReader.prototype._createPageContainer = function(index) {
|
731
|
-
return new PageContainer(this.
|
779
|
+
return new PageContainer(this.book.getPage(index, false), {
|
732
780
|
isProtected: this.protected,
|
733
781
|
imageCache: this.imageCache,
|
734
782
|
loadingImage: this.imagesBaseURL + 'loading.gif',
|
@@ -742,8 +790,8 @@ BookReader.prototype.bindGestures = function(jElement) {
|
|
742
790
|
// when you move the book with one finger and then add another
|
743
791
|
// finger to pinch. Gestures are aware of scroll state.
|
744
792
|
|
745
|
-
|
746
|
-
|
793
|
+
const self = this;
|
794
|
+
let numTouches = 1;
|
747
795
|
|
748
796
|
jElement.unbind('touchmove').bind('touchmove', function(e) {
|
749
797
|
if (e.originalEvent.cancelable) numTouches = e.originalEvent.touches.length;
|
@@ -764,24 +812,6 @@ BookReader.prototype.bindGestures = function(jElement) {
|
|
764
812
|
});
|
765
813
|
};
|
766
814
|
|
767
|
-
/** @deprecated Not used outside ModeThumb */
|
768
|
-
BookReader.prototype.drawLeafsThumbnail = ModeThumb.prototype.drawLeafs;
|
769
|
-
exposeOverrideableMethod(ModeThumb, '_modes.modeThumb', 'drawLeafs', 'drawLeafsThumbnail');
|
770
|
-
/** @deprecated Not used outside ModeThumb */
|
771
|
-
BookReader.prototype.lazyLoadThumbnails = ModeThumb.prototype.lazyLoadThumbnails;
|
772
|
-
exposeOverrideableMethod(ModeThumb, '_modes.modeThumb', 'lazyLoadThumbnails', 'lazyLoadThumbnails');
|
773
|
-
BookReader.prototype.lazyLoadImage = ModeThumb.prototype.lazyLoadImage;
|
774
|
-
exposeOverrideableMethod(ModeThumb, '_modes.modeThumb', 'lazyLoadImage', 'lazyLoadImage');
|
775
|
-
/** @deprecated Internal use only */
|
776
|
-
BookReader.prototype.zoomThumb = ModeThumb.prototype.zoom;
|
777
|
-
exposeOverrideableMethod(ModeThumb, '_modes.modeThumb', 'zoom', 'zoomThumb');
|
778
|
-
/** @deprecated Not used outside ModeThumb */
|
779
|
-
BookReader.prototype.getThumbnailWidth = ModeThumb.prototype.getThumbnailWidth;
|
780
|
-
exposeOverrideableMethod(ModeThumb, '_modes.modeThumb', 'getThumbnailWidth', 'getThumbnailWidth');
|
781
|
-
/** @deprecated Not used outside ModeThumb */
|
782
|
-
BookReader.prototype.prepareThumbnailView = ModeThumb.prototype.prepare;
|
783
|
-
exposeOverrideableMethod(ModeThumb, '_modes.modeThumb', 'prepare', 'prepareThumbnailView');
|
784
|
-
|
785
815
|
/**
|
786
816
|
* A throttled version of drawLeafs
|
787
817
|
*/
|
@@ -794,29 +824,11 @@ BookReader.prototype.drawLeafsThrottled = utils.throttle(
|
|
794
824
|
* @param {number} direction Pass 1 to zoom in, anything else to zoom out
|
795
825
|
*/
|
796
826
|
BookReader.prototype.zoom = function(direction) {
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
this.zoom1up('in');
|
802
|
-
} else {
|
803
|
-
this.zoom1up('out');
|
804
|
-
}
|
805
|
-
break
|
806
|
-
case this.constMode2up:
|
807
|
-
if (direction == 1) {
|
808
|
-
// XXX other cases
|
809
|
-
this.zoom2up('in');
|
810
|
-
} else {
|
811
|
-
this.zoom2up('out');
|
812
|
-
}
|
813
|
-
break
|
814
|
-
case this.constModeThumb:
|
815
|
-
// XXX update zoomThumb for named directions
|
816
|
-
this.zoomThumb(direction);
|
817
|
-
break
|
827
|
+
if (direction == 1) {
|
828
|
+
this.activeMode.zoom('in');
|
829
|
+
} else {
|
830
|
+
this.activeMode.zoom('out');
|
818
831
|
}
|
819
|
-
|
820
832
|
this.textSelectionPlugin?.stopPageFlip(this.refs.$brContainer);
|
821
833
|
return;
|
822
834
|
};
|
@@ -842,11 +854,11 @@ BookReader.prototype.resizeBRcontainer = function(animate) {
|
|
842
854
|
bottom: this.getFooterHeight()
|
843
855
|
});
|
844
856
|
}
|
845
|
-
}
|
857
|
+
};
|
846
858
|
|
847
859
|
BookReader.prototype.centerPageView = function() {
|
848
|
-
|
849
|
-
|
860
|
+
const scrollWidth = this.refs.$brContainer.prop('scrollWidth');
|
861
|
+
const clientWidth = this.refs.$brContainer.prop('clientWidth');
|
850
862
|
if (scrollWidth > clientWidth) {
|
851
863
|
this.refs.$brContainer.prop('scrollLeft', (scrollWidth - clientWidth) / 2);
|
852
864
|
}
|
@@ -934,7 +946,7 @@ BookReader.prototype._reduceSort = (a, b) => a.reduce - b.reduce;
|
|
934
946
|
* @return {boolean} Returns true if page could be found, false otherwise.
|
935
947
|
*/
|
936
948
|
BookReader.prototype.jumpToPage = function(pageNum) {
|
937
|
-
|
949
|
+
const pageIndex = this.book.parsePageString(pageNum);
|
938
950
|
|
939
951
|
if ('undefined' != typeof(pageIndex)) {
|
940
952
|
this.jumpToIndex(pageIndex);
|
@@ -950,11 +962,9 @@ BookReader.prototype.jumpToPage = function(pageNum) {
|
|
950
962
|
* @param {PageIndex} index
|
951
963
|
*/
|
952
964
|
BookReader.prototype._isIndexDisplayed = function(index) {
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
this.currentIndex() == index;
|
957
|
-
}
|
965
|
+
return this.displayedIndices ? this.displayedIndices.includes(index) :
|
966
|
+
this.currentIndex() == index;
|
967
|
+
};
|
958
968
|
|
959
969
|
/**
|
960
970
|
* Changes the current page
|
@@ -965,7 +975,7 @@ BookReader.prototype._isIndexDisplayed = function(index) {
|
|
965
975
|
*/
|
966
976
|
BookReader.prototype.jumpToIndex = function(index, pageX, pageY, noAnimate) {
|
967
977
|
// Don't jump into specific unviewable page
|
968
|
-
const page = this.
|
978
|
+
const page = this.book.getPage(index);
|
969
979
|
if (!page.isViewable && page.unviewablesStart != page.index) {
|
970
980
|
// If already in unviewable range, jump to end of that range
|
971
981
|
const alreadyInPreview = this._isIndexDisplayed(page.unviewablesStart);
|
@@ -987,7 +997,6 @@ BookReader.prototype.jumpToIndex = function(index, pageX, pageY, noAnimate) {
|
|
987
997
|
/**
|
988
998
|
* Return mode or 1up if initial thumb
|
989
999
|
* @param {number}
|
990
|
-
* @see BookReader.prototype.drawLeafsThumbnail
|
991
1000
|
*/
|
992
1001
|
BookReader.prototype.getPrevReadMode = function(mode) {
|
993
1002
|
if (mode === BookReader.constMode1up || mode === BookReader.constMode2up) {
|
@@ -996,7 +1005,7 @@ BookReader.prototype.getPrevReadMode = function(mode) {
|
|
996
1005
|
// Initial thumb, return 1up
|
997
1006
|
return BookReader.constMode1up;
|
998
1007
|
}
|
999
|
-
}
|
1008
|
+
};
|
1000
1009
|
|
1001
1010
|
/**
|
1002
1011
|
* Switches the mode (eg 1up 2up thumb)
|
@@ -1024,10 +1033,13 @@ BookReader.prototype.switchMode = function(
|
|
1024
1033
|
}
|
1025
1034
|
|
1026
1035
|
this.trigger(BookReader.eventNames.stop);
|
1027
|
-
if (this.enableSearch) this.removeSearchHilites();
|
1028
1036
|
|
1029
1037
|
this.prevReadMode = this.getPrevReadMode(this.mode);
|
1030
1038
|
|
1039
|
+
if (this.mode != mode) {
|
1040
|
+
this.activeMode.unprepare?.();
|
1041
|
+
}
|
1042
|
+
|
1031
1043
|
this.mode = mode;
|
1032
1044
|
|
1033
1045
|
// reinstate scale if moving from thumbnail view
|
@@ -1040,36 +1052,34 @@ BookReader.prototype.switchMode = function(
|
|
1040
1052
|
|
1041
1053
|
// XXX maybe better to preserve zoom in each mode
|
1042
1054
|
if (this.constMode1up == mode) {
|
1043
|
-
this.
|
1044
|
-
this.reduce = this.quantizeReduce(this.reduce, this.onePage.reductionFactors);
|
1045
|
-
this.prepareOnePageView();
|
1055
|
+
this._modes.mode1Up.prepare();
|
1046
1056
|
} else if (this.constModeThumb == mode) {
|
1047
1057
|
this.reduce = this.quantizeReduce(this.reduce, this.reductionFactors);
|
1048
|
-
this.
|
1058
|
+
this._modes.modeThumb.prepare();
|
1049
1059
|
} else {
|
1050
1060
|
// $$$ why don't we save autofit?
|
1051
1061
|
// this.twoPage.autofit = null; // Take zoom level from other mode
|
1052
1062
|
// spread indices not set, so let's set them
|
1053
1063
|
if (init || !pageFound) {
|
1054
|
-
this.setSpreadIndices();
|
1064
|
+
this._modes.mode2Up.setSpreadIndices();
|
1055
1065
|
}
|
1056
1066
|
|
1057
|
-
this.
|
1058
|
-
this.
|
1059
|
-
this.
|
1067
|
+
this._modes.mode2Up.calculateReductionFactors(); // this sets this.twoPage && this.reduce
|
1068
|
+
this._modes.mode2Up.prepare();
|
1069
|
+
this._modes.mode2Up.centerView(0.5, 0.5); // $$$ TODO preserve center
|
1060
1070
|
}
|
1061
1071
|
|
1062
1072
|
if (!(this.suppressFragmentChange || suppressFragmentChange)) {
|
1063
1073
|
this.trigger(BookReader.eventNames.fragmentChange);
|
1064
1074
|
}
|
1065
|
-
|
1075
|
+
const eventName = mode + 'PageViewSelected';
|
1066
1076
|
this.trigger(BookReader.eventNames[eventName]);
|
1067
1077
|
|
1068
1078
|
this.textSelectionPlugin?.stopPageFlip(this.refs.$brContainer);
|
1069
1079
|
};
|
1070
1080
|
|
1071
1081
|
BookReader.prototype.updateBrClasses = function() {
|
1072
|
-
|
1082
|
+
const modeToClass = {};
|
1073
1083
|
modeToClass[this.constMode1up] = 'BRmode1up';
|
1074
1084
|
modeToClass[this.constMode2up] = 'BRmode2Up';
|
1075
1085
|
modeToClass[this.constModeThumb] = 'BRmodeThumb';
|
@@ -1095,11 +1105,11 @@ BookReader.prototype.isFullscreen = function() {
|
|
1095
1105
|
* Toggles fullscreen
|
1096
1106
|
* @param { boolean } bindKeyboardControls
|
1097
1107
|
*/
|
1098
|
-
BookReader.prototype.toggleFullscreen = function(bindKeyboardControls = true) {
|
1108
|
+
BookReader.prototype.toggleFullscreen = async function(bindKeyboardControls = true) {
|
1099
1109
|
if (this.isFullscreen()) {
|
1100
|
-
this.exitFullScreen();
|
1110
|
+
await this.exitFullScreen();
|
1101
1111
|
} else {
|
1102
|
-
this.enterFullscreen(bindKeyboardControls);
|
1112
|
+
await this.enterFullscreen(bindKeyboardControls);
|
1103
1113
|
}
|
1104
1114
|
};
|
1105
1115
|
|
@@ -1111,7 +1121,7 @@ BookReader.prototype.toggleFullscreen = function(bindKeyboardControls = true) {
|
|
1111
1121
|
* - fires custom event
|
1112
1122
|
* @param { boolean } bindKeyboardControls
|
1113
1123
|
*/
|
1114
|
-
BookReader.prototype.enterFullscreen = function(bindKeyboardControls = true) {
|
1124
|
+
BookReader.prototype.enterFullscreen = async function(bindKeyboardControls = true) {
|
1115
1125
|
const currentIndex = this.currentIndex();
|
1116
1126
|
this.refs.$brContainer.css('opacity', 0);
|
1117
1127
|
|
@@ -1119,7 +1129,7 @@ BookReader.prototype.enterFullscreen = function(bindKeyboardControls = true) {
|
|
1119
1129
|
this._fullscreenCloseHandler = (e) => {
|
1120
1130
|
if (e.keyCode === 27) this.toggleFullscreen();
|
1121
1131
|
};
|
1122
|
-
$(document).keyup
|
1132
|
+
$(document).on("keyup", this._fullscreenCloseHandler);
|
1123
1133
|
}
|
1124
1134
|
|
1125
1135
|
const windowWidth = $(window).width();
|
@@ -1128,14 +1138,30 @@ BookReader.prototype.enterFullscreen = function(bindKeyboardControls = true) {
|
|
1128
1138
|
}
|
1129
1139
|
|
1130
1140
|
this.isFullscreenActive = true;
|
1131
|
-
|
1132
|
-
this.
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1141
|
+
// prioritize class updates so CSS can propagate
|
1142
|
+
this.updateBrClasses();
|
1143
|
+
this.animating = true;
|
1144
|
+
await new Promise(res => this.refs.$brContainer.animate({opacity: 1}, 'fast', 'linear', res));
|
1145
|
+
if (this.activeMode instanceof Mode1Up) {
|
1146
|
+
this.activeMode.mode1UpLit.scale = this.activeMode.mode1UpLit.computeDefaultScale(this.book.getPage(currentIndex));
|
1147
|
+
// Need the new scale to be applied before calling jumpToIndex
|
1148
|
+
this.activeMode.mode1UpLit.requestUpdate();
|
1149
|
+
await this.activeMode.mode1UpLit.updateComplete;
|
1150
|
+
}
|
1151
|
+
this.jumpToIndex(currentIndex);
|
1152
|
+
this.animating = false;
|
1136
1153
|
|
1137
1154
|
this.textSelectionPlugin?.stopPageFlip(this.refs.$brContainer);
|
1155
|
+
// Add "?view=theater"
|
1156
|
+
this.trigger(BookReader.eventNames.fragmentChange);
|
1157
|
+
// trigger event here, so that animations,
|
1158
|
+
// class updates happen before book-nav relays to web components
|
1138
1159
|
this.trigger(BookReader.eventNames.fullscreenToggled);
|
1160
|
+
|
1161
|
+
setTimeout(() => {
|
1162
|
+
// resize book after all events & css updates
|
1163
|
+
this.resize();
|
1164
|
+
}, 0);
|
1139
1165
|
};
|
1140
1166
|
|
1141
1167
|
/**
|
@@ -1145,12 +1171,12 @@ BookReader.prototype.enterFullscreen = function(bindKeyboardControls = true) {
|
|
1145
1171
|
* - fires custom event
|
1146
1172
|
* @param { boolean } bindKeyboardControls
|
1147
1173
|
*/
|
1148
|
-
BookReader.prototype.exitFullScreen = function() {
|
1174
|
+
BookReader.prototype.exitFullScreen = async function () {
|
1149
1175
|
this.refs.$brContainer.css('opacity', 0);
|
1150
1176
|
|
1151
|
-
$(document).
|
1177
|
+
$(document).off('keyup', this._fullscreenCloseHandler);
|
1152
1178
|
|
1153
|
-
|
1179
|
+
const windowWidth = $(window).width();
|
1154
1180
|
|
1155
1181
|
const canShow2up = this.options.controls.twoPage.visible;
|
1156
1182
|
if (canShow2up && (windowWidth <= this.onePageMinBreakpoint)) {
|
@@ -1158,13 +1184,26 @@ BookReader.prototype.exitFullScreen = function() {
|
|
1158
1184
|
}
|
1159
1185
|
|
1160
1186
|
this.isFullscreenActive = false;
|
1187
|
+
// Trigger fullscreen event immediately
|
1188
|
+
// so that book-nav can relay to web components
|
1189
|
+
this.trigger(BookReader.eventNames.fullscreenToggled);
|
1190
|
+
|
1161
1191
|
this.updateBrClasses();
|
1192
|
+
this.animating = true;
|
1193
|
+
await new Promise((res => this.refs.$brContainer.animate({opacity: 1}, 'fast', 'linear', res)));
|
1194
|
+
this.resize();
|
1195
|
+
|
1196
|
+
if (this.activeMode instanceof Mode1Up) {
|
1197
|
+
this.activeMode.mode1UpLit.scale = this.activeMode.mode1UpLit.computeDefaultScale(this.book.getPage(this.currentIndex()));
|
1198
|
+
this.activeMode.mode1UpLit.requestUpdate();
|
1199
|
+
await this.activeMode.mode1UpLit.updateComplete;
|
1200
|
+
}
|
1201
|
+
|
1202
|
+
this.animating = false;
|
1162
1203
|
|
1163
|
-
this.refs.$brContainer.animate({opacity: 1}, 'fast', 'linear', () => {
|
1164
|
-
this.resize();
|
1165
|
-
});
|
1166
1204
|
this.textSelectionPlugin?.stopPageFlip(this.refs.$brContainer);
|
1167
|
-
|
1205
|
+
// Remove "?view=theater"
|
1206
|
+
this.trigger(BookReader.eventNames.fragmentChange);
|
1168
1207
|
};
|
1169
1208
|
|
1170
1209
|
/**
|
@@ -1178,7 +1217,7 @@ BookReader.prototype.currentIndex = function() {
|
|
1178
1217
|
return this.firstIndex; // $$$ TODO page in center of view would be better
|
1179
1218
|
} else if (this.mode == this.constMode2up) {
|
1180
1219
|
// Only allow indices that are actually present in book
|
1181
|
-
return utils.clamp(this.firstIndex, 0, this.
|
1220
|
+
return utils.clamp(this.firstIndex, 0, this.book.getNumLeafs() - 1);
|
1182
1221
|
} else {
|
1183
1222
|
throw 'currentIndex called for unimplemented mode ' + this.mode;
|
1184
1223
|
}
|
@@ -1195,11 +1234,9 @@ BookReader.prototype.updateFirstIndex = function(
|
|
1195
1234
|
index,
|
1196
1235
|
{ suppressFragmentChange = false } = {}
|
1197
1236
|
) {
|
1198
|
-
//
|
1199
|
-
|
1200
|
-
|
1201
|
-
suppressFragmentChange = true;
|
1202
|
-
}
|
1237
|
+
// If there's no change, do nothing
|
1238
|
+
if (this.firstIndex === index) return;
|
1239
|
+
|
1203
1240
|
this.firstIndex = index;
|
1204
1241
|
if (!(this.suppressFragmentChange || suppressFragmentChange)) {
|
1205
1242
|
this.trigger(BookReader.eventNames.fragmentChange);
|
@@ -1211,7 +1248,7 @@ BookReader.prototype.updateFirstIndex = function(
|
|
1211
1248
|
this.suppressFragmentChange = false;
|
1212
1249
|
}
|
1213
1250
|
this.trigger('pageChanged');
|
1214
|
-
this.updateNavIndexThrottled(index);
|
1251
|
+
this._components.navbar.updateNavIndexThrottled(index);
|
1215
1252
|
};
|
1216
1253
|
|
1217
1254
|
/**
|
@@ -1258,10 +1295,10 @@ BookReader.prototype.leftmost = function() {
|
|
1258
1295
|
}
|
1259
1296
|
};
|
1260
1297
|
|
1261
|
-
BookReader.prototype.next = function() {
|
1298
|
+
BookReader.prototype.next = function({triggerStop = true} = {}) {
|
1262
1299
|
if (this.constMode2up == this.mode) {
|
1263
|
-
this.trigger(BookReader.eventNames.stop);
|
1264
|
-
this.flipFwdToIndex(null);
|
1300
|
+
if (triggerStop) this.trigger(BookReader.eventNames.stop);
|
1301
|
+
this._modes.mode2Up.flipFwdToIndex(null);
|
1265
1302
|
} else {
|
1266
1303
|
if (this.firstIndex < this.lastDisplayableIndex()) {
|
1267
1304
|
this.jumpToIndex(this.firstIndex + 1);
|
@@ -1269,13 +1306,13 @@ BookReader.prototype.next = function() {
|
|
1269
1306
|
}
|
1270
1307
|
};
|
1271
1308
|
|
1272
|
-
BookReader.prototype.prev = function() {
|
1309
|
+
BookReader.prototype.prev = function({triggerStop = true} = {}) {
|
1273
1310
|
const isOnFrontPage = this.firstIndex < 1;
|
1274
1311
|
if (isOnFrontPage) return;
|
1275
1312
|
|
1276
1313
|
if (this.constMode2up == this.mode) {
|
1277
|
-
this.trigger(BookReader.eventNames.stop);
|
1278
|
-
this.flipBackToIndex(null);
|
1314
|
+
if (triggerStop) this.trigger(BookReader.eventNames.stop);
|
1315
|
+
this._modes.mode2Up.flipBackToIndex(null);
|
1279
1316
|
} else {
|
1280
1317
|
if (this.firstIndex >= 1) {
|
1281
1318
|
this.jumpToIndex(this.firstIndex - 1);
|
@@ -1337,173 +1374,12 @@ BookReader.prototype.scrollUp = function() {
|
|
1337
1374
|
BookReader.prototype._scrollAmount = function() {
|
1338
1375
|
if (this.constMode1up == this.mode) {
|
1339
1376
|
// Overlap by % of page size
|
1340
|
-
return parseInt(this.refs.$brContainer.prop('clientHeight') - this.
|
1377
|
+
return parseInt(this.refs.$brContainer.prop('clientHeight') - this.book.getPageHeight(this.currentIndex()) / this.reduce * 0.03);
|
1341
1378
|
}
|
1342
1379
|
|
1343
1380
|
return parseInt(0.9 * this.refs.$brContainer.prop('clientHeight'));
|
1344
1381
|
};
|
1345
1382
|
|
1346
|
-
/**
|
1347
|
-
* @deprecated No longer used; will be remove in v5
|
1348
|
-
*/
|
1349
|
-
BookReader.prototype.prefetchImg = async function(index, fetchNow = false) {
|
1350
|
-
console.warn('Call to deprecated function: BookReader.prefetchImg. No-op.');
|
1351
|
-
};
|
1352
|
-
|
1353
|
-
/**
|
1354
|
-
* @deprecated No longer used; will be remove in v5
|
1355
|
-
*/
|
1356
|
-
BookReader.prototype.pruneUnusedImgs = function() {
|
1357
|
-
console.warn('Call to deprecated function: BookReader.pruneUnused. No-op.');
|
1358
|
-
};
|
1359
|
-
|
1360
|
-
/************************/
|
1361
|
-
/** Mode1Up extensions **/
|
1362
|
-
/************************/
|
1363
|
-
/** @deprecated not used outside BookReader */
|
1364
|
-
BookReader.prototype.prepareOnePageView = Mode1Up.prototype.prepare;
|
1365
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'prepare', 'prepareOnePageView');
|
1366
|
-
/** @deprecated not used outside BookReader */
|
1367
|
-
BookReader.prototype.drawLeafsOnePage = Mode1Up.prototype.drawLeafs;
|
1368
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'drawLeafs', 'drawLeafsOnePage');
|
1369
|
-
/** @deprecated not used outside BookReader */
|
1370
|
-
BookReader.prototype.zoom1up = Mode1Up.prototype.zoom;
|
1371
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'zoom', 'zoom1up');
|
1372
|
-
/** @deprecated not used outside Mode1Up */
|
1373
|
-
BookReader.prototype.onePageGetAutofitWidth = Mode1Up.prototype.getAutofitWidth;
|
1374
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'getAutofitWidth', 'onePageGetAutofitWidth');
|
1375
|
-
/** @deprecated not used outside Mode1Up, BookReader */
|
1376
|
-
BookReader.prototype.onePageGetAutofitHeight = Mode1Up.prototype.getAutofitHeight;
|
1377
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'getAutofitHeight', 'onePageGetAutofitHeight');
|
1378
|
-
/** @deprecated not used outside Mode1Up, BookReader */
|
1379
|
-
BookReader.prototype.onePageGetPageTop = Mode1Up.prototype.getPageTop;
|
1380
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'getPageTop', 'onePageGetPageTop');
|
1381
|
-
/** @deprecated not used outside Mode1Up, BookReader */
|
1382
|
-
BookReader.prototype.onePageCalculateReductionFactors = Mode1Up.prototype.calculateReductionFactors;
|
1383
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'calculateReductionFactors', 'onePageCalculateReductionFactors');
|
1384
|
-
/** @deprecated not used outside Mode1Up, BookReader */
|
1385
|
-
BookReader.prototype.resizePageView1up = Mode1Up.prototype.resizePageView;
|
1386
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'resizePageView', 'resizePageView1up');
|
1387
|
-
/** @deprecated not used outside Mode1Up */
|
1388
|
-
BookReader.prototype.onePageCalculateViewDimensions = Mode1Up.prototype.calculateViewDimensions;
|
1389
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'calculateViewDimensions', 'onePageCalculateViewDimensions');
|
1390
|
-
/** @deprecated not used outside Mode1Up */
|
1391
|
-
BookReader.prototype.centerX1up = Mode1Up.prototype.centerX;
|
1392
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'centerX', 'centerX1up');
|
1393
|
-
/** @deprecated not used outside Mode1Up */
|
1394
|
-
BookReader.prototype.centerY1up = Mode1Up.prototype.centerY;
|
1395
|
-
exposeOverrideableMethod(Mode1Up, '_modes.mode1Up', 'centerY', 'centerY1up');
|
1396
|
-
|
1397
|
-
/************************/
|
1398
|
-
/** Mode2Up extensions **/
|
1399
|
-
/************************/
|
1400
|
-
/** @deprecated not used outside Mode2Up */
|
1401
|
-
BookReader.prototype.zoom2up = Mode2Up.prototype.zoom;
|
1402
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'zoom', 'zoom2up');
|
1403
|
-
BookReader.prototype.twoPageGetAutofitReduce = Mode2Up.prototype.getAutofitReduce;
|
1404
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'getAutofitReduce', 'twoPageGetAutofitReduce');
|
1405
|
-
BookReader.prototype.flipBackToIndex = Mode2Up.prototype.flipBackToIndex;
|
1406
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'flipBackToIndex', 'flipBackToIndex');
|
1407
|
-
BookReader.prototype.flipFwdToIndex = Mode2Up.prototype.flipFwdToIndex;
|
1408
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'flipFwdToIndex', 'flipFwdToIndex');
|
1409
|
-
BookReader.prototype.setHilightCss2UP = Mode2Up.prototype.setHilightCss;
|
1410
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'setHilightCss', 'setHilightCss2UP');
|
1411
|
-
/** @deprecated not used outside Mode2Up */
|
1412
|
-
BookReader.prototype.setClickHandler2UP = Mode2Up.prototype.setClickHandler;
|
1413
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'setClickHandler', 'setClickHandler2UP');
|
1414
|
-
/** @deprecated not used outside Mode2Up */
|
1415
|
-
BookReader.prototype.drawLeafsTwoPage = Mode2Up.prototype.drawLeafs;
|
1416
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'drawLeafs', 'drawLeafsTwoPage');
|
1417
|
-
/** @deprecated not used outside BookReader */
|
1418
|
-
BookReader.prototype.prepareTwoPageView = Mode2Up.prototype.prepareTwoPageView;
|
1419
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'prepareTwoPageView', 'prepareTwoPageView');
|
1420
|
-
/** @deprecated not used outside Mode2Up */
|
1421
|
-
BookReader.prototype.prepareTwoPagePopUp = Mode2Up.prototype.preparePopUp;
|
1422
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'preparePopUp', 'prepareTwoPagePopUp');
|
1423
|
-
/** @deprecated not used outside BookReader, Mode2Up */
|
1424
|
-
BookReader.prototype.calculateSpreadSize = Mode2Up.prototype.calculateSpreadSize;
|
1425
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'calculateSpreadSize', 'calculateSpreadSize');
|
1426
|
-
/** @deprecated not used outside BookReader, Mode2Up */
|
1427
|
-
BookReader.prototype.getIdealSpreadSize = Mode2Up.prototype.getIdealSpreadSize;
|
1428
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'getIdealSpreadSize', 'getIdealSpreadSize');
|
1429
|
-
/** @deprecated not used outside BookReader, Mode2Up */
|
1430
|
-
BookReader.prototype.getSpreadSizeFromReduce = Mode2Up.prototype.getSpreadSizeFromReduce;
|
1431
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'getSpreadSizeFromReduce', 'getSpreadSizeFromReduce');
|
1432
|
-
/** @deprecated unused */
|
1433
|
-
BookReader.prototype.twoPageIsZoomedIn = Mode2Up.prototype.isZoomedIn;
|
1434
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'isZoomedIn', 'twoPageIsZoomedIn');
|
1435
|
-
/** @deprecated not used outside BookReader */
|
1436
|
-
BookReader.prototype.twoPageCalculateReductionFactors = Mode2Up.prototype.calculateReductionFactors;
|
1437
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'calculateReductionFactors', 'twoPageCalculateReductionFactors');
|
1438
|
-
/** @deprecated unused */
|
1439
|
-
BookReader.prototype.twoPageSetCursor = Mode2Up.prototype.setCursor;
|
1440
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'setCursor', 'twoPageSetCursor');
|
1441
|
-
/** @deprecated unused outside BookReader, Mode2Up */
|
1442
|
-
BookReader.prototype.flipLeftToRight = Mode2Up.prototype.flipLeftToRight;
|
1443
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'flipLeftToRight', 'flipLeftToRight');
|
1444
|
-
/** @deprecated unused outside BookReader, Mode2Up */
|
1445
|
-
BookReader.prototype.flipRightToLeft = Mode2Up.prototype.flipRightToLeft;
|
1446
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'flipRightToLeft', 'flipRightToLeft');
|
1447
|
-
/** @deprecated unused outside Mode2Up */
|
1448
|
-
BookReader.prototype.setMouseHandlers2UP = Mode2Up.prototype.setMouseHandlers;
|
1449
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'setMouseHandlers', 'setMouseHandlers2UP');
|
1450
|
-
/** @deprecated unused outside BookReader, Mode2Up */
|
1451
|
-
BookReader.prototype.prepareFlipLeftToRight = Mode2Up.prototype.prepareFlipLeftToRight;
|
1452
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'prepareFlipLeftToRight', 'prepareFlipLeftToRight');
|
1453
|
-
/** @deprecated unused outside BookReader, Mode2Up */
|
1454
|
-
BookReader.prototype.prepareFlipRightToLeft = Mode2Up.prototype.prepareFlipRightToLeft;
|
1455
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'prepareFlipRightToLeft', 'prepareFlipRightToLeft');
|
1456
|
-
/** @deprecated unused outside Mode2Up */
|
1457
|
-
BookReader.prototype.getPageWidth2UP = Mode2Up.prototype.getPageWidth;
|
1458
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'getPageWidth', 'getPageWidth2UP');
|
1459
|
-
/** @deprecated unused outside Mode2Up */
|
1460
|
-
BookReader.prototype.twoPageGutter = Mode2Up.prototype.gutter;
|
1461
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'gutter', 'twoPageGutter');
|
1462
|
-
/** @deprecated unused outside Mode2Up */
|
1463
|
-
BookReader.prototype.twoPageTop = Mode2Up.prototype.top;
|
1464
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'top', 'twoPageTop');
|
1465
|
-
/** @deprecated unused outside Mode2Up */
|
1466
|
-
BookReader.prototype.twoPageCoverWidth = Mode2Up.prototype.coverWidth;
|
1467
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'coverWidth', 'twoPageCoverWidth');
|
1468
|
-
/** @deprecated unused outside Mode2Up */
|
1469
|
-
BookReader.prototype.twoPageGetViewCenter = Mode2Up.prototype.getViewCenter;
|
1470
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'getViewCenter', 'twoPageGetViewCenter');
|
1471
|
-
/** @deprecated unused outside BookReader, Mode2Up */
|
1472
|
-
BookReader.prototype.twoPageCenterView = Mode2Up.prototype.centerView;
|
1473
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'centerView', 'twoPageCenterView');
|
1474
|
-
/** @deprecated unused outside Mode2Up */
|
1475
|
-
BookReader.prototype.twoPageFlipAreaHeight = Mode2Up.prototype.flipAreaHeight;
|
1476
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'flipAreaHeight', 'twoPageFlipAreaHeight');
|
1477
|
-
/** @deprecated unused outside Mode2Up */
|
1478
|
-
BookReader.prototype.twoPageFlipAreaWidth = Mode2Up.prototype.flipAreaWidth;
|
1479
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'flipAreaWidth', 'twoPageFlipAreaWidth');
|
1480
|
-
/** @deprecated unused outside BookReader, Mode2Up */
|
1481
|
-
BookReader.prototype.twoPageFlipAreaTop = Mode2Up.prototype.flipAreaTop;
|
1482
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'flipAreaTop', 'twoPageFlipAreaTop');
|
1483
|
-
/** @deprecated unused outside Mode2Up */
|
1484
|
-
BookReader.prototype.twoPageLeftFlipAreaLeft = Mode2Up.prototype.leftFlipAreaLeft;
|
1485
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'leftFlipAreaLeft', 'twoPageLeftFlipAreaLeft');
|
1486
|
-
/** @deprecated unused outside Mode2Up */
|
1487
|
-
BookReader.prototype.twoPageRightFlipAreaLeft = Mode2Up.prototype.rightFlipAreaLeft;
|
1488
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'rightFlipAreaLeft', 'twoPageRightFlipAreaLeft');
|
1489
|
-
/** @deprecated unused outside BookReader, Mode2Up */
|
1490
|
-
BookReader.prototype.gutterOffsetForIndex = Mode2Up.prototype.gutterOffsetForIndex;
|
1491
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'gutterOffsetForIndex', 'gutterOffsetForIndex');
|
1492
|
-
/** @deprecated unused outside BookReader, Mode2Up */
|
1493
|
-
BookReader.prototype.leafEdgeWidth = Mode2Up.prototype.leafEdgeWidth;
|
1494
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'leafEdgeWidth', 'leafEdgeWidth');
|
1495
|
-
/** @deprecated unused outside BookReader, Mode2Up */
|
1496
|
-
BookReader.prototype.jumpIndexForLeftEdgePageX = Mode2Up.prototype.jumpIndexForLeftEdgePageX;
|
1497
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'jumpIndexForLeftEdgePageX', 'jumpIndexForLeftEdgePageX');
|
1498
|
-
/** @deprecated unused outside BookReader, Mode2Up */
|
1499
|
-
BookReader.prototype.jumpIndexForRightEdgePageX = Mode2Up.prototype.jumpIndexForRightEdgePageX;
|
1500
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'jumpIndexForRightEdgePageX', 'jumpIndexForRightEdgePageX');
|
1501
|
-
/** @deprecated unused outside Mode2Up */
|
1502
|
-
BookReader.prototype.prefetch = Mode2Up.prototype.prefetch;
|
1503
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'prefetch', 'prefetch');
|
1504
|
-
/** @deprecated unused outside Mode2Up */
|
1505
|
-
BookReader.prototype.setSpreadIndices = Mode2Up.prototype.setSpreadIndices;
|
1506
|
-
exposeOverrideableMethod(Mode2Up, '_modes.mode2Up', 'setSpreadIndices', 'setSpreadIndices');
|
1507
1383
|
/**
|
1508
1384
|
* Immediately stop flip animations. Callbacks are triggered.
|
1509
1385
|
*/
|
@@ -1527,15 +1403,6 @@ BookReader.prototype.stopFlipAnimations = function() {
|
|
1527
1403
|
});
|
1528
1404
|
};
|
1529
1405
|
|
1530
|
-
/**
|
1531
|
-
* Returns true if keyboard navigation should be disabled for the event
|
1532
|
-
* @param {Event}
|
1533
|
-
* @return {boolean}
|
1534
|
-
*/
|
1535
|
-
BookReader.prototype.keyboardNavigationIsDisabled = function(event) {
|
1536
|
-
return event.target.tagName == "INPUT";
|
1537
|
-
};
|
1538
|
-
|
1539
1406
|
/**
|
1540
1407
|
* @template TClass extends { br: BookReader }
|
1541
1408
|
* Helper method to expose a method onto BookReader from a composed class.
|
@@ -1558,30 +1425,9 @@ function exposeOverrideableMethod(Class, classKey, method, brMethod = method) {
|
|
1558
1425
|
/***********************/
|
1559
1426
|
/** Navbar extensions **/
|
1560
1427
|
/***********************/
|
1428
|
+
/** This cannot be removed yet because plugin.tts.js overrides it */
|
1561
1429
|
BookReader.prototype.initNavbar = Navbar.prototype.init;
|
1562
1430
|
exposeOverrideableMethod(Navbar, '_components.navbar', 'init', 'initNavbar');
|
1563
|
-
BookReader.prototype.switchNavbarControls = Navbar.prototype.switchNavbarControls;
|
1564
|
-
exposeOverrideableMethod(Navbar, '_components.navbar', 'switchNavbarControls');
|
1565
|
-
BookReader.prototype.updateViewModeButton = Navbar.prototype.updateViewModeButton;
|
1566
|
-
exposeOverrideableMethod(Navbar, '_components.navbar', 'updateViewModeButton');
|
1567
|
-
BookReader.prototype.getNavPageNumString = Navbar.prototype.getNavPageNumString;
|
1568
|
-
exposeOverrideableMethod(Navbar, '_components.navbar', 'getNavPageNumString');
|
1569
|
-
/** @deprecated */
|
1570
|
-
BookReader.prototype.initEmbedNavbar = Navbar.prototype.initEmbed;
|
1571
|
-
exposeOverrideableMethod(Navbar, '_components.navbar', 'initEmbed', 'initEmbedNavbar');
|
1572
|
-
/** @deprecated unused */
|
1573
|
-
BookReader.prototype.getNavPageNumHtml = getNavPageNumHtml;
|
1574
|
-
/** @deprecated unused outside this file */
|
1575
|
-
BookReader.prototype.updateNavPageNum = Navbar.prototype.updateNavPageNum;
|
1576
|
-
exposeOverrideableMethod(Navbar, '_components.navbar', 'updateNavPageNum');
|
1577
|
-
/** @deprecated unused outside this file */
|
1578
|
-
BookReader.prototype.updateNavIndex = Navbar.prototype.updateNavIndex;
|
1579
|
-
exposeOverrideableMethod(Navbar, '_components.navbar', 'updateNavIndex');
|
1580
|
-
/** @deprecated unused outside this file */
|
1581
|
-
BookReader.prototype.updateNavIndexThrottled = utils.throttle(BookReader.prototype.updateNavIndex, 250, false);
|
1582
|
-
/** @deprecated unused */
|
1583
|
-
BookReader.prototype.updateNavIndexDebounced = utils.debounce(BookReader.prototype.updateNavIndex, 500, false);
|
1584
|
-
|
1585
1431
|
|
1586
1432
|
/************************/
|
1587
1433
|
/** Toolbar extensions **/
|
@@ -1596,15 +1442,6 @@ BookReader.prototype.buildInfoDiv = Toolbar.prototype.buildInfoDiv;
|
|
1596
1442
|
exposeOverrideableMethod(Toolbar, '_components.toolbar', 'buildInfoDiv');
|
1597
1443
|
BookReader.prototype.getToolBarHeight = Toolbar.prototype.getToolBarHeight;
|
1598
1444
|
exposeOverrideableMethod(Toolbar, '_components.toolbar', 'getToolBarHeight');
|
1599
|
-
/** @deprecated zoom no longer in toolbar */
|
1600
|
-
BookReader.prototype.updateToolbarZoom = Toolbar.prototype.updateToolbarZoom;
|
1601
|
-
exposeOverrideableMethod(Toolbar, '_components.toolbar', 'updateToolbarZoom');
|
1602
|
-
/** @deprecated unused */
|
1603
|
-
BookReader.prototype.blankInfoDiv = blankInfoDiv;
|
1604
|
-
/** @deprecated unused */
|
1605
|
-
BookReader.prototype.blankShareDiv = blankShareDiv;
|
1606
|
-
/** @deprecated unused */
|
1607
|
-
BookReader.prototype.createPopup = createPopup;
|
1608
1445
|
|
1609
1446
|
/**
|
1610
1447
|
* Bind navigation handlers
|
@@ -1663,7 +1500,7 @@ BookReader.prototype.bindNavigationHandlers = function() {
|
|
1663
1500
|
},
|
1664
1501
|
full: () => {
|
1665
1502
|
if (this.ui == 'embed') {
|
1666
|
-
|
1503
|
+
const url = this.$('.BRembedreturn a').attr('href');
|
1667
1504
|
window.open(url);
|
1668
1505
|
} else {
|
1669
1506
|
this.toggleFullscreen();
|
@@ -1677,17 +1514,17 @@ BookReader.prototype.bindNavigationHandlers = function() {
|
|
1677
1514
|
|
1678
1515
|
for (const control in navigationControls) {
|
1679
1516
|
jIcons.filter(`.${control}`).on('click.bindNavigationHandlers', () => {
|
1680
|
-
navigationControls[control]()
|
1517
|
+
navigationControls[control]();
|
1681
1518
|
return false;
|
1682
1519
|
});
|
1683
1520
|
}
|
1684
1521
|
|
1685
|
-
|
1686
|
-
|
1522
|
+
const $brNavCntlBtmEl = this.$('.BRnavCntlBtm');
|
1523
|
+
const $brNavCntlTopEl = this.$('.BRnavCntlTop');
|
1687
1524
|
|
1688
1525
|
this.$('.BRnavCntl').click(
|
1689
1526
|
function() {
|
1690
|
-
|
1527
|
+
const promises = [];
|
1691
1528
|
// TODO don't use magic constants
|
1692
1529
|
// TODO move this to a function
|
1693
1530
|
if ($brNavCntlBtmEl.hasClass('BRdn')) {
|
@@ -1707,7 +1544,7 @@ BookReader.prototype.bindNavigationHandlers = function() {
|
|
1707
1544
|
$brNavCntlBtmEl.addClass('BRdn').removeClass('BRup');
|
1708
1545
|
$brNavCntlTopEl.addClass('BRup').removeClass('BRdn');
|
1709
1546
|
self.$('.BRnavCntlBtm.BRnavCntl').animate({height:'30px'});
|
1710
|
-
self.$('.BRvavCntl').animate({opacity:1})
|
1547
|
+
self.$('.BRvavCntl').animate({opacity:1});
|
1711
1548
|
}
|
1712
1549
|
$.when.apply($, promises).done(function() {
|
1713
1550
|
// Only do full resize in auto mode and need to recalc. size
|
@@ -1725,24 +1562,28 @@ BookReader.prototype.bindNavigationHandlers = function() {
|
|
1725
1562
|
});
|
1726
1563
|
}
|
1727
1564
|
);
|
1728
|
-
$brNavCntlBtmEl
|
1729
|
-
|
1730
|
-
|
1731
|
-
|
1732
|
-
|
1733
|
-
|
1734
|
-
|
1735
|
-
|
1736
|
-
|
1737
|
-
|
1738
|
-
|
1739
|
-
|
1740
|
-
|
1741
|
-
|
1742
|
-
|
1743
|
-
|
1744
|
-
}
|
1745
|
-
|
1565
|
+
$brNavCntlBtmEl
|
1566
|
+
.on("mouseover", function() {
|
1567
|
+
if ($(this).hasClass('BRup')) {
|
1568
|
+
self.$('.BRnavCntl').animate({opacity:1},250);
|
1569
|
+
}
|
1570
|
+
})
|
1571
|
+
.on("mouseleave", function() {
|
1572
|
+
if ($(this).hasClass('BRup')) {
|
1573
|
+
self.$('.BRnavCntl').animate({opacity:.75},250);
|
1574
|
+
}
|
1575
|
+
});
|
1576
|
+
$brNavCntlTopEl
|
1577
|
+
.on("mouseover", function() {
|
1578
|
+
if ($(this).hasClass('BRdn')) {
|
1579
|
+
self.$('.BRnavCntl').animate({opacity:1},250);
|
1580
|
+
}
|
1581
|
+
})
|
1582
|
+
.on("mouseleave", function() {
|
1583
|
+
if ($(this).hasClass('BRdn')) {
|
1584
|
+
self.$('.BRnavCntl').animate({opacity:.75},250);
|
1585
|
+
}
|
1586
|
+
});
|
1746
1587
|
|
1747
1588
|
this.initSwipeData();
|
1748
1589
|
|
@@ -1780,7 +1621,7 @@ BookReader.prototype.navigationMousemoveHandler = function(event) {
|
|
1780
1621
|
if (event.data['br'].uiAutoHide) {
|
1781
1622
|
// 77px is an approximate height of the Internet Archive Top Nav
|
1782
1623
|
// 75 & 76 (pixels) provide used in this context is checked against the IA top nav height
|
1783
|
-
|
1624
|
+
const navkey = $(document).height() - 75;
|
1784
1625
|
if ((event.pageY < 76) || (event.pageY > navkey)) {
|
1785
1626
|
// inside or near navigation elements
|
1786
1627
|
event.data['br'].hideNavigation();
|
@@ -1807,11 +1648,11 @@ BookReader.prototype.initSwipeData = function(clientX, clientY) {
|
|
1807
1648
|
deltaX: 0,
|
1808
1649
|
deltaY: 0,
|
1809
1650
|
deltaT: 0
|
1810
|
-
}
|
1651
|
+
};
|
1811
1652
|
};
|
1812
1653
|
|
1813
1654
|
BookReader.prototype.swipeMousedownHandler = function(event) {
|
1814
|
-
|
1655
|
+
const self = event.data['br'];
|
1815
1656
|
|
1816
1657
|
// We should be the last bubble point for the page images
|
1817
1658
|
// Disable image drag and select, but keep right-click
|
@@ -1819,13 +1660,13 @@ BookReader.prototype.swipeMousedownHandler = function(event) {
|
|
1819
1660
|
return !self.protected;
|
1820
1661
|
}
|
1821
1662
|
|
1822
|
-
$(event.target).
|
1663
|
+
$(event.target).on('mouseout.swipe',
|
1823
1664
|
{ 'br': self},
|
1824
1665
|
self.swipeMouseupHandler
|
1825
|
-
).
|
1666
|
+
).on('mouseup.swipe',
|
1826
1667
|
{ 'br': self},
|
1827
1668
|
self.swipeMouseupHandler
|
1828
|
-
).
|
1669
|
+
).on('mousemove.swipe',
|
1829
1670
|
{ 'br': self },
|
1830
1671
|
self.swipeMousemoveHandler
|
1831
1672
|
);
|
@@ -1841,8 +1682,8 @@ BookReader.prototype.swipeMousedownHandler = function(event) {
|
|
1841
1682
|
};
|
1842
1683
|
|
1843
1684
|
BookReader.prototype.swipeMousemoveHandler = function(event) {
|
1844
|
-
|
1845
|
-
|
1685
|
+
const self = event.data['br'];
|
1686
|
+
const _swipe = self._swipe;
|
1846
1687
|
if (! _swipe.mightBeSwiping) {
|
1847
1688
|
return;
|
1848
1689
|
}
|
@@ -1852,12 +1693,12 @@ BookReader.prototype.swipeMousemoveHandler = function(event) {
|
|
1852
1693
|
_swipe.deltaY = event.clientY - _swipe.startY;
|
1853
1694
|
_swipe.deltaT = (new Date).getTime() - _swipe.startTime;
|
1854
1695
|
|
1855
|
-
|
1856
|
-
|
1696
|
+
const absX = Math.abs(_swipe.deltaX);
|
1697
|
+
const absY = Math.abs(_swipe.deltaY);
|
1857
1698
|
|
1858
1699
|
// Minimum distance in the amount of tim to trigger the swipe
|
1859
|
-
|
1860
|
-
|
1700
|
+
const minSwipeLength = Math.min(self.refs.$br.width() / 5, 80);
|
1701
|
+
const maxSwipeTime = 400;
|
1861
1702
|
|
1862
1703
|
// Check for horizontal swipe
|
1863
1704
|
if (absX > absY && (absX > minSwipeLength) && _swipe.deltaT < maxSwipeTime) {
|
@@ -1891,11 +1732,11 @@ BookReader.prototype.swipeMousemoveHandler = function(event) {
|
|
1891
1732
|
};
|
1892
1733
|
|
1893
1734
|
BookReader.prototype.swipeMouseupHandler = function(event) {
|
1894
|
-
|
1735
|
+
const _swipe = event.data['br']._swipe;
|
1895
1736
|
_swipe.mightBeSwiping = false;
|
1896
1737
|
_swipe.mightBeDragging = false;
|
1897
1738
|
|
1898
|
-
$(event.target).
|
1739
|
+
$(event.target).off('mouseout.swipe').off('mouseup.swipe').off('mousemove.swipe');
|
1899
1740
|
|
1900
1741
|
if (_swipe.didSwipe || _swipe.didDrag) {
|
1901
1742
|
// Swallow event if completed swipe gesture
|
@@ -1908,20 +1749,21 @@ BookReader.prototype.swipeMouseupHandler = function(event) {
|
|
1908
1749
|
};
|
1909
1750
|
|
1910
1751
|
BookReader.prototype.bindMozTouchHandlers = function() {
|
1911
|
-
|
1752
|
+
const self = this;
|
1912
1753
|
|
1913
1754
|
// Currently only want touch handlers in 2up
|
1914
|
-
this.refs.$br
|
1915
|
-
|
1916
|
-
|
1917
|
-
|
1918
|
-
|
1919
|
-
|
1755
|
+
this.refs.$br
|
1756
|
+
.on('MozTouchDown', function(event) {
|
1757
|
+
if (this.mode == self.constMode2up) {
|
1758
|
+
event.preventDefault();
|
1759
|
+
}
|
1760
|
+
})
|
1761
|
+
.on('MozTouchMove', function(event) {
|
1920
1762
|
if (this.mode == self.constMode2up) {
|
1921
1763
|
event.preventDefault();
|
1922
1764
|
}
|
1923
1765
|
})
|
1924
|
-
.
|
1766
|
+
.on('MozTouchUp', function(event) {
|
1925
1767
|
if (this.mode == self.constMode2up) {
|
1926
1768
|
event.preventDefault();
|
1927
1769
|
}
|
@@ -1934,8 +1776,8 @@ BookReader.prototype.bindMozTouchHandlers = function() {
|
|
1934
1776
|
*/
|
1935
1777
|
BookReader.prototype.navigationIsVisible = function() {
|
1936
1778
|
// $$$ doesn't account for transitioning states, nav must be fully visible to return true
|
1937
|
-
|
1938
|
-
|
1779
|
+
const toolpos = this.refs.$BRtoolbar.position();
|
1780
|
+
const tooltop = toolpos.top;
|
1939
1781
|
return tooltop == 0;
|
1940
1782
|
};
|
1941
1783
|
|
@@ -1944,19 +1786,19 @@ BookReader.prototype.navigationIsVisible = function() {
|
|
1944
1786
|
* Defaults to SHOW the navigation chrome
|
1945
1787
|
*/
|
1946
1788
|
BookReader.prototype.setNavigationView = function brSetNavigationView(hide) {
|
1947
|
-
|
1948
|
-
|
1949
|
-
|
1789
|
+
const animationLength = this.constNavAnimationDuration;
|
1790
|
+
const animationType = 'linear';
|
1791
|
+
const resizePageContainer = function resizePageContainer () {
|
1950
1792
|
/* main page container fills whole container */
|
1951
1793
|
if (this.constMode2up !== this.mode) {
|
1952
|
-
|
1794
|
+
const animate = true;
|
1953
1795
|
this.resizeBRcontainer(animate);
|
1954
1796
|
}
|
1955
1797
|
this.trigger(BookReader.eventNames.navToggled);
|
1956
1798
|
}.bind(this);
|
1957
1799
|
|
1958
|
-
|
1959
|
-
|
1800
|
+
let toolbarHeight = 0;
|
1801
|
+
let navbarHeight = 0;
|
1960
1802
|
if (hide) {
|
1961
1803
|
toolbarHeight = this.getToolBarHeight() * -1;
|
1962
1804
|
navbarHeight = this.getFooterHeight() * -1;
|
@@ -1987,7 +1829,7 @@ BookReader.prototype.setNavigationView = function brSetNavigationView(hide) {
|
|
1987
1829
|
BookReader.prototype.hideNavigation = function() {
|
1988
1830
|
// Check if navigation is showing
|
1989
1831
|
if (this.navigationIsVisible()) {
|
1990
|
-
|
1832
|
+
const hide = true;
|
1991
1833
|
this.setNavigationView(hide);
|
1992
1834
|
}
|
1993
1835
|
};
|
@@ -2015,14 +1857,14 @@ BookReader.prototype.firstDisplayableIndex = function() {
|
|
2015
1857
|
|
2016
1858
|
if ('rl' != this.pageProgression) {
|
2017
1859
|
// LTR
|
2018
|
-
if (this.
|
1860
|
+
if (this.book.getPageSide(0) == 'L') {
|
2019
1861
|
return 0;
|
2020
1862
|
} else {
|
2021
1863
|
return -1;
|
2022
1864
|
}
|
2023
1865
|
} else {
|
2024
1866
|
// RTL
|
2025
|
-
if (this.
|
1867
|
+
if (this.book.getPageSide(0) == 'R') {
|
2026
1868
|
return 0;
|
2027
1869
|
} else {
|
2028
1870
|
return -1;
|
@@ -2038,7 +1880,7 @@ BookReader.prototype.firstDisplayableIndex = function() {
|
|
2038
1880
|
*/
|
2039
1881
|
BookReader.prototype.lastDisplayableIndex = function() {
|
2040
1882
|
|
2041
|
-
|
1883
|
+
const lastIndex = this.book.getNumLeafs() - 1;
|
2042
1884
|
|
2043
1885
|
if (this.mode != this.constMode2up) {
|
2044
1886
|
return lastIndex;
|
@@ -2046,14 +1888,14 @@ BookReader.prototype.lastDisplayableIndex = function() {
|
|
2046
1888
|
|
2047
1889
|
if ('rl' != this.pageProgression) {
|
2048
1890
|
// LTR
|
2049
|
-
if (this.
|
1891
|
+
if (this.book.getPageSide(lastIndex) == 'R') {
|
2050
1892
|
return lastIndex;
|
2051
1893
|
} else {
|
2052
1894
|
return lastIndex + 1;
|
2053
1895
|
}
|
2054
1896
|
} else {
|
2055
1897
|
// RTL
|
2056
|
-
if (this.
|
1898
|
+
if (this.book.getPageSide(lastIndex) == 'L') {
|
2057
1899
|
return lastIndex;
|
2058
1900
|
} else {
|
2059
1901
|
return lastIndex + 1;
|
@@ -2065,46 +1907,11 @@ BookReader.prototype.lastDisplayableIndex = function() {
|
|
2065
1907
|
/**************************/
|
2066
1908
|
/** BookModel extensions **/
|
2067
1909
|
/**************************/
|
2068
|
-
|
2069
|
-
|
2070
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getMedianPageSize');
|
2071
|
-
BookReader.prototype._getPageWidth = BookModel.prototype._getPageWidth;
|
2072
|
-
exposeOverrideableMethod(BookModel, '_models.book', '_getPageWidth');
|
2073
|
-
BookReader.prototype._getPageHeight = BookModel.prototype._getPageHeight;
|
2074
|
-
exposeOverrideableMethod(BookModel, '_models.book', '_getPageHeight');
|
2075
|
-
BookReader.prototype.getPageIndex = BookModel.prototype.getPageIndex;
|
2076
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getPageIndex');
|
2077
|
-
/** @deprecated not used outside */
|
2078
|
-
BookReader.prototype.getPageIndices = BookModel.prototype.getPageIndices;
|
2079
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getPageIndices');
|
2080
|
-
BookReader.prototype.getPageName = BookModel.prototype.getPageName;
|
2081
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getPageName');
|
2082
|
-
BookReader.prototype.getNumLeafs = BookModel.prototype.getNumLeafs;
|
2083
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getNumLeafs');
|
2084
|
-
BookReader.prototype.getPageWidth = BookModel.prototype.getPageWidth;
|
2085
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getPageWidth');
|
2086
|
-
BookReader.prototype.getPageHeight = BookModel.prototype.getPageHeight;
|
2087
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getPageHeight');
|
1910
|
+
// Must modify petabox extension, which expects this on the prototype
|
1911
|
+
// before removing.
|
2088
1912
|
BookReader.prototype.getPageURI = BookModel.prototype.getPageURI;
|
2089
|
-
exposeOverrideableMethod(BookModel, '
|
2090
|
-
|
2091
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getPageSide');
|
2092
|
-
BookReader.prototype.getPageNum = BookModel.prototype.getPageNum;
|
2093
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getPageNum');
|
2094
|
-
BookReader.prototype.getPageProp = BookModel.prototype.getPageProp;
|
2095
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getPageProp');
|
2096
|
-
BookReader.prototype.getSpreadIndices = BookModel.prototype.getSpreadIndices;
|
2097
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'getSpreadIndices');
|
2098
|
-
BookReader.prototype.leafNumToIndex = BookModel.prototype.leafNumToIndex;
|
2099
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'leafNumToIndex');
|
2100
|
-
BookReader.prototype.parsePageString = BookModel.prototype.parsePageString;
|
2101
|
-
exposeOverrideableMethod(BookModel, '_models.book', 'parsePageString');
|
2102
|
-
/** @deprecated unused */
|
2103
|
-
BookReader.prototype._getDataFlattened = BookModel.prototype._getDataFlattened;
|
2104
|
-
exposeOverrideableMethod(BookModel, '_models.book', '_getDataFlattened');
|
2105
|
-
/** @deprecated unused */
|
2106
|
-
BookReader.prototype._getDataProp = BookModel.prototype._getDataProp;
|
2107
|
-
exposeOverrideableMethod(BookModel, '_models.book', '_getDataProp');
|
1913
|
+
exposeOverrideableMethod(BookModel, 'book', 'getPageURI');
|
1914
|
+
|
2108
1915
|
|
2109
1916
|
// Parameter related functions
|
2110
1917
|
|
@@ -2135,7 +1942,7 @@ BookReader.prototype.updateFromParams = function(params) {
|
|
2135
1942
|
}
|
2136
1943
|
} else if ('undefined' != typeof(params.page)) {
|
2137
1944
|
// $$$ this assumes page numbers are unique
|
2138
|
-
if (params.page != this.
|
1945
|
+
if (params.page != this.book.getPageNum(this.currentIndex())) {
|
2139
1946
|
this.jumpToPage(params.page);
|
2140
1947
|
}
|
2141
1948
|
}
|
@@ -2169,7 +1976,7 @@ BookReader.prototype.canSwitchToMode = function(mode) {
|
|
2169
1976
|
// check there are enough pages to display
|
2170
1977
|
// $$$ this is a workaround for the mis-feature that we can't display
|
2171
1978
|
// short books in 2up mode
|
2172
|
-
if (this.
|
1979
|
+
if (this.book.getNumLeafs() < 2) {
|
2173
1980
|
return false;
|
2174
1981
|
}
|
2175
1982
|
}
|
@@ -2177,31 +1984,6 @@ BookReader.prototype.canSwitchToMode = function(mode) {
|
|
2177
1984
|
return true;
|
2178
1985
|
};
|
2179
1986
|
|
2180
|
-
|
2181
|
-
/**
|
2182
|
-
* @deprecated. Use PageModel.getURISrcSet. Slated for removal in v5.
|
2183
|
-
* Returns the srcset with correct URIs or void string if out of range
|
2184
|
-
* Also makes the reduce argument optional
|
2185
|
-
* @param {number} index
|
2186
|
-
* @param {number} [reduce]
|
2187
|
-
* @param {number} [rotate]
|
2188
|
-
* @return {string}
|
2189
|
-
*/
|
2190
|
-
BookReader.prototype._getPageURISrcset = function(index, reduce, rotate) {
|
2191
|
-
const page = this._models.book.getPage(index, false);
|
2192
|
-
// Synthesize page
|
2193
|
-
if (!page) return "";
|
2194
|
-
|
2195
|
-
// reduce not passed in
|
2196
|
-
// $$$ this probably won't work for thumbnail mode
|
2197
|
-
if ('undefined' == typeof(reduce)) {
|
2198
|
-
reduce = page.height / this.twoPage.height;
|
2199
|
-
}
|
2200
|
-
|
2201
|
-
return page.getURISrcSet(reduce, rotate);
|
2202
|
-
}
|
2203
|
-
|
2204
|
-
|
2205
1987
|
/**
|
2206
1988
|
* Returns the page URI or transparent image if out of range
|
2207
1989
|
* Also makes the reduce argument optional
|
@@ -2211,7 +1993,7 @@ BookReader.prototype._getPageURISrcset = function(index, reduce, rotate) {
|
|
2211
1993
|
* @return {string}
|
2212
1994
|
*/
|
2213
1995
|
BookReader.prototype._getPageURI = function(index, reduce, rotate) {
|
2214
|
-
const page = this.
|
1996
|
+
const page = this.book.getPage(index, false);
|
2215
1997
|
// Synthesize page
|
2216
1998
|
if (!page) return this.imagesBaseURL + "transparent.png";
|
2217
1999
|
|
@@ -2225,21 +2007,37 @@ BookReader.prototype._getPageURI = function(index, reduce, rotate) {
|
|
2225
2007
|
};
|
2226
2008
|
|
2227
2009
|
/**
|
2228
|
-
* @param {string}
|
2010
|
+
* @param {string} msg
|
2011
|
+
* @param {function|undefined} onCloseCallback
|
2229
2012
|
*/
|
2230
|
-
BookReader.prototype.showProgressPopup = function(msg) {
|
2013
|
+
BookReader.prototype.showProgressPopup = function(msg, onCloseCallback) {
|
2231
2014
|
if (this.popup) return;
|
2232
2015
|
|
2233
2016
|
this.popup = document.createElement("div");
|
2234
2017
|
$(this.popup).prop('className', 'BRprogresspopup');
|
2235
|
-
|
2018
|
+
|
2019
|
+
if (typeof(onCloseCallback) === 'function') {
|
2020
|
+
const closeButton = document.createElement('button');
|
2021
|
+
closeButton.setAttribute('title', 'close');
|
2022
|
+
closeButton.setAttribute('class', 'close-popup');
|
2023
|
+
const icon = document.createElement('span');
|
2024
|
+
icon.setAttribute('class', 'icon icon-close-dark');
|
2025
|
+
$(closeButton).append(icon);
|
2026
|
+
closeButton.addEventListener('click', () => {
|
2027
|
+
onCloseCallback();
|
2028
|
+
this.removeProgressPopup();
|
2029
|
+
});
|
2030
|
+
$(this.popup).append(closeButton);
|
2031
|
+
}
|
2032
|
+
|
2033
|
+
const bar = document.createElement("div");
|
2236
2034
|
$(bar).css({
|
2237
2035
|
height: '20px'
|
2238
2036
|
}).prop('className', 'BRprogressbar');
|
2239
2037
|
$(this.popup).append(bar);
|
2240
2038
|
|
2241
2039
|
if (msg) {
|
2242
|
-
|
2040
|
+
const msgdiv = document.createElement("div");
|
2243
2041
|
msgdiv.innerHTML = msg;
|
2244
2042
|
$(this.popup).append(msgdiv);
|
2245
2043
|
}
|
@@ -2261,7 +2059,7 @@ BookReader.prototype.initUIStrings = function() {
|
|
2261
2059
|
// the toolbar and nav bar easier
|
2262
2060
|
|
2263
2061
|
// Setup tooltips -- later we could load these from a file for i18n
|
2264
|
-
|
2062
|
+
const titles = {
|
2265
2063
|
'.logo': 'Go to Archive.org', // $$$ update after getting OL record
|
2266
2064
|
'.zoom_in': 'Zoom in',
|
2267
2065
|
'.zoom_out': 'Zoom out',
|
@@ -2293,10 +2091,10 @@ BookReader.prototype.initUIStrings = function() {
|
|
2293
2091
|
titles['.book_rightmost'] = 'First page';
|
2294
2092
|
}
|
2295
2093
|
|
2296
|
-
for (
|
2094
|
+
for (const icon in titles) {
|
2297
2095
|
this.$(icon).prop('title', titles[icon]);
|
2298
2096
|
}
|
2299
|
-
}
|
2097
|
+
};
|
2300
2098
|
|
2301
2099
|
/**
|
2302
2100
|
* Reloads images. Useful when some images might have failed.
|
@@ -2304,7 +2102,7 @@ BookReader.prototype.initUIStrings = function() {
|
|
2304
2102
|
BookReader.prototype.reloadImages = function() {
|
2305
2103
|
this.refs.$brContainer.find('img').each(function(index, elem) {
|
2306
2104
|
if (!elem.complete || elem.naturalHeight === 0) {
|
2307
|
-
|
2105
|
+
const src = elem.src;
|
2308
2106
|
elem.src = '';
|
2309
2107
|
setTimeout(function() {
|
2310
2108
|
elem.src = src;
|
@@ -2318,16 +2116,16 @@ BookReader.prototype.reloadImages = function() {
|
|
2318
2116
|
* @return {number}
|
2319
2117
|
*/
|
2320
2118
|
BookReader.prototype.getFooterHeight = function() {
|
2321
|
-
|
2119
|
+
const $heightEl = this.mode == this.constMode2up ? this.refs.$BRfooter : this.refs.$BRnav;
|
2322
2120
|
if ($heightEl && this.refs.$BRfooter) {
|
2323
|
-
|
2324
|
-
|
2121
|
+
const outerHeight = $heightEl.outerHeight();
|
2122
|
+
const bottom = parseInt(this.refs.$BRfooter.css('bottom'));
|
2325
2123
|
if (!isNaN(outerHeight) && !isNaN(bottom)) {
|
2326
2124
|
return outerHeight + bottom;
|
2327
2125
|
}
|
2328
2126
|
}
|
2329
2127
|
return 0;
|
2330
|
-
}
|
2128
|
+
};
|
2331
2129
|
|
2332
2130
|
// Basic Usage built-in Methods (can be overridden through options)
|
2333
2131
|
// This implementation uses options.data value for populating BookReader
|
@@ -2337,10 +2135,11 @@ BookReader.prototype.getFooterHeight = function() {
|
|
2337
2135
|
* @return {Object}
|
2338
2136
|
*/
|
2339
2137
|
BookReader.prototype.paramsFromCurrent = function() {
|
2340
|
-
|
2138
|
+
const params = {};
|
2341
2139
|
|
2342
|
-
|
2343
|
-
|
2140
|
+
// Path params
|
2141
|
+
const index = this.currentIndex();
|
2142
|
+
const pageNum = this.book.getPageNum(index);
|
2344
2143
|
if ((pageNum === 0) || pageNum) {
|
2345
2144
|
params.page = pageNum;
|
2346
2145
|
}
|
@@ -2348,10 +2147,17 @@ BookReader.prototype.paramsFromCurrent = function() {
|
|
2348
2147
|
params.index = index;
|
2349
2148
|
params.mode = this.mode;
|
2350
2149
|
|
2150
|
+
// Unused params
|
2351
2151
|
// $$$ highlight
|
2352
2152
|
// $$$ region
|
2353
2153
|
|
2354
|
-
//
|
2154
|
+
// Querystring params
|
2155
|
+
// View
|
2156
|
+
const fullscreenView = 'theater';
|
2157
|
+
if (this.isFullscreenActive) {
|
2158
|
+
params.view = fullscreenView;
|
2159
|
+
}
|
2160
|
+
// Search
|
2355
2161
|
if (this.enableSearch) {
|
2356
2162
|
params.search = this.searchTerm;
|
2357
2163
|
}
|
@@ -2372,7 +2178,7 @@ BookReader.prototype.paramsFromCurrent = function() {
|
|
2372
2178
|
* @return {Object}
|
2373
2179
|
*/
|
2374
2180
|
BookReader.prototype.paramsFromFragment = function(fragment) {
|
2375
|
-
|
2181
|
+
const params = {};
|
2376
2182
|
|
2377
2183
|
// For backwards compatibility we allow an initial # character
|
2378
2184
|
// (as from window.location.hash) but don't require it
|
@@ -2381,7 +2187,7 @@ BookReader.prototype.paramsFromFragment = function(fragment) {
|
|
2381
2187
|
}
|
2382
2188
|
|
2383
2189
|
// Simple #nn syntax
|
2384
|
-
|
2190
|
+
const oldStyleLeafNum = parseInt( /^\d+$/.exec(fragment) );
|
2385
2191
|
if ( !isNaN(oldStyleLeafNum) ) {
|
2386
2192
|
params.index = oldStyleLeafNum;
|
2387
2193
|
|
@@ -2390,9 +2196,9 @@ BookReader.prototype.paramsFromFragment = function(fragment) {
|
|
2390
2196
|
}
|
2391
2197
|
|
2392
2198
|
// Split into key-value pairs
|
2393
|
-
|
2394
|
-
|
2395
|
-
for (
|
2199
|
+
const urlArray = fragment.split('/');
|
2200
|
+
const urlHash = {};
|
2201
|
+
for (let i = 0; i < urlArray.length; i += 2) {
|
2396
2202
|
urlHash[urlArray[i]] = urlArray[i + 1];
|
2397
2203
|
}
|
2398
2204
|
|
@@ -2422,7 +2228,7 @@ BookReader.prototype.paramsFromFragment = function(fragment) {
|
|
2422
2228
|
|
2423
2229
|
// $$$ process /theme
|
2424
2230
|
if (urlHash['theme'] != undefined) {
|
2425
|
-
params.theme = urlHash['theme']
|
2231
|
+
params.theme = urlHash['theme'];
|
2426
2232
|
}
|
2427
2233
|
return params;
|
2428
2234
|
};
|
@@ -2479,6 +2285,9 @@ BookReader.prototype.fragmentFromParams = function(params, urlMode = 'hash') {
|
|
2479
2285
|
/**
|
2480
2286
|
* Create, update querystring from the params object
|
2481
2287
|
*
|
2288
|
+
* Handles:
|
2289
|
+
* view=
|
2290
|
+
* q=
|
2482
2291
|
* @param {Object} params
|
2483
2292
|
* @param {string} currQueryString
|
2484
2293
|
* @param {string} [urlMode]
|
@@ -2490,27 +2299,29 @@ BookReader.prototype.queryStringFromParams = function(
|
|
2490
2299
|
urlMode = 'hash'
|
2491
2300
|
) {
|
2492
2301
|
const newParams = new URLSearchParams(currQueryString);
|
2302
|
+
|
2303
|
+
if (params.view) {
|
2304
|
+
// Set ?view=theater when fullscreen
|
2305
|
+
newParams.set('view', params.view);
|
2306
|
+
} else {
|
2307
|
+
// Remove
|
2308
|
+
newParams.delete('view');
|
2309
|
+
}
|
2310
|
+
|
2493
2311
|
if (params.search && urlMode === 'history') {
|
2494
|
-
newParams.set('q', params.search)
|
2312
|
+
newParams.set('q', params.search);
|
2495
2313
|
}
|
2496
2314
|
// https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/toString
|
2497
2315
|
// Note: This method returns the query string without the question mark.
|
2498
2316
|
const result = newParams.toString();
|
2499
2317
|
return result ? '?' + result : '';
|
2500
|
-
}
|
2318
|
+
};
|
2501
2319
|
|
2502
2320
|
/**
|
2503
2321
|
* Helper to select within instance's elements
|
2504
2322
|
*/
|
2505
2323
|
BookReader.prototype.$ = function(selector) {
|
2506
2324
|
return this.refs.$br.find(selector);
|
2507
|
-
}
|
2508
|
-
|
2509
|
-
/**
|
2510
|
-
* Polyfill for deprecated method
|
2511
|
-
*/
|
2512
|
-
jQuery.curCSS = function(element, prop, val) {
|
2513
|
-
return jQuery(element).css(prop, val);
|
2514
2325
|
};
|
2515
2326
|
|
2516
2327
|
window.BookReader = BookReader;
|