@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
@@ -1,5 +1,6 @@
|
|
1
1
|
// @ts-check
|
2
|
-
import {
|
2
|
+
import { Mode1UpLit } from './Mode1UpLit.js';
|
3
|
+
import { DragScrollable } from './DragScrollable.js';
|
3
4
|
/** @typedef {import('../BookReader.js').default} BookReader */
|
4
5
|
/** @typedef {import('./BookModel.js').BookModel} BookModel */
|
5
6
|
/** @typedef {import('./BookModel.js').PageIndex} PageIndex */
|
@@ -12,392 +13,91 @@ export class Mode1Up {
|
|
12
13
|
constructor(br, bookModel) {
|
13
14
|
this.br = br;
|
14
15
|
this.book = bookModel;
|
16
|
+
this.mode1UpLit = new Mode1UpLit(bookModel, br);
|
15
17
|
|
16
18
|
/** @private */
|
17
|
-
this.$
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
this.$el = $(this.mode1UpLit)
|
20
|
+
// We CANNOT use `br-mode-1up` as a class, because it's the same
|
21
|
+
// as the name of the web component, and the webcomponents polyfill
|
22
|
+
// uses the name of component as a class for style scoping 😒
|
23
|
+
.addClass('br-mode-1up__root BRmode1up');
|
22
24
|
|
23
|
-
/**
|
24
|
-
|
25
|
-
*
|
26
|
-
* Mode1Up doesn't use the br.reduce because it is DPI aware. The reduction factor
|
27
|
-
* of a given leaf can change (since leaves can have different DPIs), but the real-world
|
28
|
-
* reduction is constant throughout.
|
29
|
-
*/
|
30
|
-
this.realWorldReduce = 1;
|
25
|
+
/** Has mode1up ever been rendered before? */
|
26
|
+
this.everShown = false;
|
31
27
|
}
|
32
28
|
|
29
|
+
// TODO: Might not need this anymore? Might want to delete.
|
33
30
|
/** @private */
|
34
|
-
get $
|
31
|
+
get $brContainer() { return this.br.refs.$brContainer; }
|
35
32
|
|
36
33
|
/**
|
37
34
|
* This is called when we switch to one page view
|
38
35
|
*/
|
39
36
|
prepare() {
|
40
37
|
const startLeaf = this.br.currentIndex();
|
41
|
-
|
42
|
-
this.$scrollContainer
|
38
|
+
this.$brContainer
|
43
39
|
.empty()
|
44
|
-
.css({
|
45
|
-
.append(this.$
|
46
|
-
|
47
|
-
//
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
**/
|
64
|
-
physicalInchesToDisplayPixels(inches, reduce = this.realWorldReduce, screenDPI = this.screenDPI) {
|
65
|
-
return inches * screenDPI / reduce;
|
66
|
-
}
|
67
|
-
|
68
|
-
/**
|
69
|
-
* Iterate over pages, augmented with their top/bottom bounds
|
70
|
-
* @param reduce Reduction factor currently at play
|
71
|
-
* @param pageSpacing Inches of space to place between pages
|
72
|
-
**/
|
73
|
-
* pagesWithBounds(reduce = this.realWorldReduce, pageSpacing = this.LEAF_SPACING_IN) {
|
74
|
-
let leafTop = 0;
|
75
|
-
let leafBottom = 0;
|
76
|
-
|
77
|
-
for (const page of this.book.pagesIterator({ combineConsecutiveUnviewables: true })) {
|
78
|
-
const height = this.physicalInchesToDisplayPixels(page.heightInches, reduce);
|
79
|
-
leafBottom += height;
|
80
|
-
yield { page, top: leafTop, bottom: leafBottom };
|
81
|
-
leafTop += height + this.physicalInchesToDisplayPixels(pageSpacing, reduce);
|
82
|
-
leafBottom += this.physicalInchesToDisplayPixels(pageSpacing, reduce);
|
83
|
-
}
|
84
|
-
}
|
85
|
-
|
86
|
-
/**
|
87
|
-
* How much do the two bounds intersection?
|
88
|
-
* @param {{ top: number; bottom: number; }} bound1
|
89
|
-
* @param {{ top: number; bottom: number; }} bound2
|
90
|
-
* @returns {number}
|
91
|
-
*/
|
92
|
-
static boundIntersection(bound1, bound2) {
|
93
|
-
const intersect = (bound1.bottom >= bound2.top) && (bound1.top <= bound2.bottom);
|
94
|
-
if (!intersect) return 0;
|
95
|
-
|
96
|
-
const boundingBox = {
|
97
|
-
top: Math.min(bound1.top, bound2.top),
|
98
|
-
bottom: Math.max(bound1.bottom, bound2.bottom),
|
99
|
-
};
|
100
|
-
const intersection = {
|
101
|
-
top: Math.max(bound1.top, bound2.top),
|
102
|
-
bottom: Math.min(bound1.bottom, bound2.bottom),
|
103
|
-
};
|
104
|
-
return (intersection.bottom - intersection.top) / (boundingBox.bottom - boundingBox.top);
|
105
|
-
}
|
106
|
-
|
107
|
-
/**
|
108
|
-
* Find the pages that intersect the current viewport, including 1 before/after
|
109
|
-
**/
|
110
|
-
* findIntersectingPages() {
|
111
|
-
// Rectangle of interest
|
112
|
-
const height = this.$scrollContainer.height();
|
113
|
-
const scrollTop = this.$scrollContainer.scrollTop();
|
114
|
-
const scrollBottom = scrollTop + height;
|
115
|
-
const scrollRegion = { top: scrollTop, bottom: scrollBottom };
|
116
|
-
|
117
|
-
let prev = null;
|
118
|
-
for (const {page, top, bottom} of this.pagesWithBounds()) {
|
119
|
-
const intersection = Mode1Up.boundIntersection({ top, bottom }, scrollRegion);
|
120
|
-
const cur = {page, top, bottom, intersection: intersection};
|
121
|
-
if (intersection) {
|
122
|
-
// Also yield the page just before the visible page
|
123
|
-
if (prev && !prev.intersection) yield prev;
|
124
|
-
yield cur;
|
125
|
-
}
|
126
|
-
// Also yield the page just after the last visible page
|
127
|
-
else if (!cur.intersection && prev?.intersection) {
|
128
|
-
yield cur;
|
129
|
-
break;
|
40
|
+
.css({ overflow: 'hidden' })
|
41
|
+
.append(this.$el);
|
42
|
+
|
43
|
+
// Need this in a setTimeout so that it happens after the browser has _actually_
|
44
|
+
// appended the element to the DOM
|
45
|
+
setTimeout(async () => {
|
46
|
+
if (!this.everShown) {
|
47
|
+
this.mode1UpLit.initFirstRender(startLeaf);
|
48
|
+
this.everShown = true;
|
49
|
+
this.mode1UpLit.requestUpdate();
|
50
|
+
await this.mode1UpLit.updateComplete;
|
51
|
+
new DragScrollable(this.mode1UpLit, {
|
52
|
+
preventDefault: true,
|
53
|
+
dragSelector: '.br-mode-1up__visible-world',
|
54
|
+
// Only handle mouse events; let browser/HammerJS handle touch
|
55
|
+
dragstart: 'mousedown',
|
56
|
+
dragcontinue: 'mousemove',
|
57
|
+
dragend: 'mouseup',
|
58
|
+
});
|
130
59
|
}
|
131
|
-
|
132
|
-
}
|
133
|
-
|
134
|
-
|
135
|
-
drawLeafs() {
|
136
|
-
const pagesToDisplay = Array.from(this.findIntersectingPages());
|
137
|
-
|
138
|
-
if (pagesToDisplay.length) {
|
139
|
-
const documentContainerWidth = this.$documentContainer.width();
|
140
|
-
|
141
|
-
// The first page that's reasonably in view we set to the current index
|
142
|
-
const firstProperPage = (
|
143
|
-
pagesToDisplay.find(({intersection}) => intersection > 0.33) ||
|
144
|
-
pagesToDisplay[0]
|
145
|
-
).page;
|
146
|
-
this.br.updateFirstIndex(firstProperPage.index);
|
147
|
-
|
148
|
-
for (const {page, top, bottom} of pagesToDisplay) {
|
149
|
-
if (!this.br.displayedIndices.includes(page.index)) {
|
150
|
-
const height = bottom - top;
|
151
|
-
const width = this.physicalInchesToDisplayPixels(page.widthInches);
|
152
|
-
const reduce = page.width / width;
|
153
|
-
|
154
|
-
const pageContainer = this.br._createPageContainer(page.index)
|
155
|
-
.update({
|
156
|
-
dimensions: {
|
157
|
-
width,
|
158
|
-
height,
|
159
|
-
top,
|
160
|
-
left: Math.floor((documentContainerWidth - width) / 2),
|
161
|
-
},
|
162
|
-
reduce,
|
163
|
-
});
|
164
|
-
pageContainer.$container.appendTo(this.$documentContainer);
|
165
|
-
}
|
166
|
-
}
|
167
|
-
}
|
168
|
-
|
169
|
-
// Remove any pages we no longer need
|
170
|
-
const displayedIndices = pagesToDisplay.map(({page}) => page.index);
|
171
|
-
for (const index of this.br.displayedIndices) {
|
172
|
-
if (notInArray(index, displayedIndices)) {
|
173
|
-
this.br.$(`.pagediv${index}`).remove();
|
174
|
-
}
|
175
|
-
}
|
176
|
-
|
177
|
-
this.br.displayedIndices = displayedIndices;
|
178
|
-
if (this.br.enableSearch) this.br.updateSearchHilites();
|
179
|
-
|
180
|
-
this.br.updateToolbarZoom(this.realWorldReduce);
|
181
|
-
|
182
|
-
// Update the slider
|
183
|
-
this.br.updateNavIndexThrottled();
|
60
|
+
this.mode1UpLit.jumpToIndex(startLeaf);
|
61
|
+
});
|
62
|
+
this.br.updateBrClasses();
|
184
63
|
}
|
185
64
|
|
186
65
|
/**
|
66
|
+
* BREAKING CHANGE: No longer supports pageX/pageY
|
187
67
|
* @param {PageIndex} index
|
188
68
|
* @param {number} [pageX] x position on the page (in pixels) to center on
|
189
69
|
* @param {number} [pageY] y position on the page (in pixels) to center on
|
190
70
|
* @param {boolean} [noAnimate]
|
191
71
|
*/
|
192
72
|
jumpToIndex(index, pageX, pageY, noAnimate) {
|
193
|
-
|
194
|
-
const
|
195
|
-
|
196
|
-
|
197
|
-
let leafLeft = 0;
|
198
|
-
|
199
|
-
if (pageY) {
|
200
|
-
const page = this.book.getPage(index);
|
201
|
-
const clientHeight = this.$scrollContainer.prop('clientHeight');
|
202
|
-
offset = this.physicalInchesToDisplayPixels((pageY / page.height) * page.heightInches) - (clientHeight / 2);
|
203
|
-
leafTop += offset;
|
204
|
-
} else {
|
205
|
-
// Show page just a little below the top
|
206
|
-
leafTop -= this.br.padding / 2;
|
207
|
-
}
|
208
|
-
|
209
|
-
if (pageX) {
|
210
|
-
const page = this.book.getPage(index);
|
211
|
-
const clientWidth = this.$scrollContainer.prop('clientWidth');
|
212
|
-
offset = this.physicalInchesToDisplayPixels((pageX / page.width) * page.widthInches) - (clientWidth / 2);
|
213
|
-
leafLeft += offset;
|
214
|
-
} else {
|
215
|
-
// Preserve left position
|
216
|
-
leafLeft = this.$scrollContainer.scrollLeft();
|
217
|
-
}
|
218
|
-
|
219
|
-
// Only animate for small distances
|
220
|
-
if (!noAnimate && abs(prevCurrentIndex - index) <= 4) {
|
221
|
-
this.animating = true;
|
222
|
-
this.$scrollContainer.stop(true).animate({
|
223
|
-
scrollTop: leafTop,
|
224
|
-
scrollLeft: leafLeft,
|
225
|
-
}, 'fast', () => { this.animating = false });
|
226
|
-
} else {
|
227
|
-
this.$scrollContainer.stop(true).prop('scrollTop', leafTop);
|
228
|
-
}
|
73
|
+
// Only smooth for small distances
|
74
|
+
const distance = Math.abs(this.br.currentIndex() - index);
|
75
|
+
const smooth = !noAnimate && distance <= 4;
|
76
|
+
this.mode1UpLit.jumpToIndex(index, { smooth });
|
229
77
|
}
|
230
78
|
|
231
79
|
/**
|
232
80
|
* @param {'in' | 'out'} direction
|
233
81
|
*/
|
234
82
|
zoom(direction) {
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
this.resizePageView();
|
246
|
-
this.br.updateToolbarZoom(this.realWorldReduce);
|
247
|
-
|
248
|
-
// Recalculate search hilites
|
249
|
-
if (this.br.enableSearch) {
|
250
|
-
this.br.removeSearchHilites();
|
251
|
-
this.br.updateSearchHilites();
|
83
|
+
switch (direction) {
|
84
|
+
case 'in':
|
85
|
+
this.mode1UpLit.zoomIn();
|
86
|
+
break;
|
87
|
+
case 'out':
|
88
|
+
this.mode1UpLit.zoomOut();
|
89
|
+
break;
|
90
|
+
default:
|
91
|
+
console.error(`Unsupported direction: ${direction}`);
|
252
92
|
}
|
253
93
|
}
|
254
94
|
|
255
|
-
/**
|
256
|
-
* Returns the reduce factor which has the pages fill the width of the viewport.
|
257
|
-
*/
|
258
|
-
getAutofitWidth() {
|
259
|
-
const widthPadding = 20;
|
260
|
-
const availableWidth = this.$scrollContainer.prop('clientWidth') - 2 * widthPadding;
|
261
|
-
|
262
|
-
const medianWidthInches = this.book.getMedianPageSizeInches().width;
|
263
|
-
const medianPageWidth = this.physicalInchesToDisplayPixels(medianWidthInches, 1);
|
264
|
-
return medianPageWidth / availableWidth;
|
265
|
-
}
|
266
|
-
|
267
|
-
getAutofitHeight() {
|
268
|
-
// make sure a little of adjacent pages show
|
269
|
-
const availableHeight = this.$scrollContainer.innerHeight() - 2 * this.br.padding;
|
270
|
-
const medianHeightInches = this.book.getMedianPageSizeInches().height;
|
271
|
-
const medianPageHeight = this.physicalInchesToDisplayPixels(medianHeightInches, 1);
|
272
|
-
|
273
|
-
return medianPageHeight / availableHeight;
|
274
|
-
}
|
275
|
-
|
276
|
-
/**
|
277
|
-
* Returns where the top of the page with given index should be in one page view
|
278
|
-
* @param {PageIndex} index
|
279
|
-
* @return {number}
|
280
|
-
*/
|
281
|
-
getPageTop(index) {
|
282
|
-
for (const {page, top} of this.pagesWithBounds()) {
|
283
|
-
if (page.index == index) return top;
|
284
|
-
}
|
285
|
-
}
|
286
|
-
|
287
|
-
/**
|
288
|
-
* Update the reduction factors for 1up mode given the available width and height.
|
289
|
-
* Recalculates the autofit reduction factors.
|
290
|
-
*/
|
291
|
-
calculateReductionFactors() {
|
292
|
-
this.br.onePage.reductionFactors = this.br.reductionFactors.concat(
|
293
|
-
[
|
294
|
-
{ reduce: this.getAutofitWidth(), autofit: 'width' },
|
295
|
-
{ reduce: this.getAutofitHeight(), autofit: 'height' },
|
296
|
-
]);
|
297
|
-
this.br.onePage.reductionFactors.sort(this.br._reduceSort);
|
298
|
-
}
|
299
|
-
|
300
95
|
/**
|
301
96
|
* Resize the current one page view
|
302
97
|
* Note this calls drawLeafs
|
303
98
|
*/
|
304
99
|
resizePageView() {
|
305
|
-
|
306
|
-
|
307
|
-
const oldPageViewHeight = this.$documentContainer.height();
|
308
|
-
const oldPageViewWidth = this.$documentContainer.width();
|
309
|
-
|
310
|
-
// May have come here after preparing the view, in which case the scrollTop and view height are not set
|
311
|
-
|
312
|
-
let scrollRatio = 0;
|
313
|
-
let oldCenterX;
|
314
|
-
if (oldScrollTop > 0) {
|
315
|
-
// We have scrolled - implies view has been set up
|
316
|
-
const oldCenterY = this.centerY();
|
317
|
-
oldCenterX = this.centerX();
|
318
|
-
scrollRatio = oldCenterY / oldPageViewHeight;
|
319
|
-
} else {
|
320
|
-
// Have not scrolled, e.g. because in new container
|
321
|
-
|
322
|
-
// We set the scroll ratio so that the current index will still be considered the
|
323
|
-
// current index in drawLeafsOnePage after we create the new view container
|
324
|
-
|
325
|
-
// Make sure this will count as current page after resize
|
326
|
-
const fudgeFactor = 0.6 * this.physicalInchesToDisplayPixels(this.book.getPage(this.br.currentIndex()).heightInches);
|
327
|
-
const oldLeafTop = this.getPageTop(this.br.currentIndex()) + fudgeFactor;
|
328
|
-
const oldViewDimensions = this.calculateViewDimensions();
|
329
|
-
scrollRatio = oldLeafTop / oldViewDimensions.height;
|
330
|
-
}
|
331
|
-
|
332
|
-
// Recalculate 1up reduction factors
|
333
|
-
this.calculateReductionFactors();
|
334
|
-
// Update current reduce (if in autofit)
|
335
|
-
if (this.br.onePage.autofit) {
|
336
|
-
const reductionFactor = this.br.nextReduce(this.realWorldReduce, this.br.onePage.autofit, this.br.onePage.reductionFactors);
|
337
|
-
this.realWorldReduce = reductionFactor.reduce;
|
338
|
-
}
|
339
|
-
|
340
|
-
const viewDimensions = this.calculateViewDimensions();
|
341
|
-
this.$documentContainer.height(viewDimensions.height);
|
342
|
-
this.$documentContainer.width(viewDimensions.width);
|
343
|
-
|
344
|
-
// Remove all pages
|
345
|
-
this.$documentContainer.empty();
|
346
|
-
this.br.displayedIndices = [];
|
347
|
-
|
348
|
-
// Scroll to the right spot
|
349
|
-
const newCenterX = oldCenterX * (viewWidth / oldPageViewWidth);
|
350
|
-
const newCenterY = scrollRatio * viewDimensions.height;
|
351
|
-
const sizeX = this.$scrollContainer.prop('clientWidth'); // Use clientWidth because of scroll bar
|
352
|
-
const sizeY = this.$scrollContainer.height();
|
353
|
-
this.$scrollContainer.prop({
|
354
|
-
scrollLeft: Math.max(0, newCenterX - sizeX / 2),
|
355
|
-
scrollTop: Math.max(0, newCenterY - sizeY / 2),
|
356
|
-
});
|
357
|
-
|
358
|
-
// Draw all visible pages
|
359
|
-
this.drawLeafs();
|
360
|
-
|
361
|
-
if (this.br.enableSearch) {
|
362
|
-
this.br.removeSearchHilites();
|
363
|
-
this.br.updateSearchHilites();
|
364
|
-
}
|
365
|
-
}
|
366
|
-
|
367
|
-
/**
|
368
|
-
* Calculate the total width/height in pixels of the document container
|
369
|
-
* @param {number} reduce
|
370
|
-
* @param {number} leafSpacing spacing between pages in inches
|
371
|
-
*/
|
372
|
-
calculateViewDimensions(reduce = this.realWorldReduce, leafSpacing = this.LEAF_SPACING_IN) {
|
373
|
-
let width = 0;
|
374
|
-
let height = 0;
|
375
|
-
for (const {page, bottom} of this.pagesWithBounds(reduce, leafSpacing)) {
|
376
|
-
const pageWidth = this.physicalInchesToDisplayPixels(page.widthInches, reduce);
|
377
|
-
width = Math.max(width, pageWidth);
|
378
|
-
height = bottom;
|
379
|
-
}
|
380
|
-
return { width, height };
|
381
|
-
}
|
382
|
-
|
383
|
-
/**
|
384
|
-
* Returns the current offset of the viewport center in scaled document coordinates.
|
385
|
-
*/
|
386
|
-
centerX($scrollContainer = this.$scrollContainer, $documentContainer = this.$documentContainer) {
|
387
|
-
let centerX;
|
388
|
-
if ($documentContainer.width() < $scrollContainer.prop('clientWidth')) { // fully shown
|
389
|
-
centerX = $documentContainer.width();
|
390
|
-
} else {
|
391
|
-
centerX = $scrollContainer.scrollLeft() + $scrollContainer.prop('clientWidth') / 2;
|
392
|
-
}
|
393
|
-
return Math.floor(centerX);
|
394
|
-
}
|
395
|
-
|
396
|
-
/**
|
397
|
-
* Returns the current offset of the viewport center in scaled document coordinates.
|
398
|
-
*/
|
399
|
-
centerY($scrollContainer = this.$scrollContainer) {
|
400
|
-
const centerY = $scrollContainer.scrollTop() + $scrollContainer.height() / 2;
|
401
|
-
return Math.floor(centerY);
|
100
|
+
this.mode1UpLit.htmlDimensionsCacher.updateClientSizes();
|
101
|
+
this.mode1UpLit.requestUpdate();
|
402
102
|
}
|
403
103
|
}
|