@internetarchive/bookreader 5.0.0-88-alpha.8 → 5.0.0-88-alpha.10
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/dist/esm/BookNavigator/assets/bookmark-colors.js +4 -0
- package/dist/esm/BookNavigator/assets/button-base.js +4 -0
- package/dist/esm/BookNavigator/assets/ia-logo.js +4 -0
- package/dist/esm/BookNavigator/assets/icon_checkmark.js +8 -0
- package/dist/esm/BookNavigator/assets/icon_close.js +4 -0
- package/dist/esm/BookNavigator/book-navigator.js +612 -0
- package/dist/esm/BookNavigator/bookmarks/bookmark-button.js +35 -0
- package/dist/esm/BookNavigator/bookmarks/bookmark-edit.js +78 -0
- package/dist/esm/BookNavigator/bookmarks/bookmarks-list.js +160 -0
- package/dist/esm/BookNavigator/bookmarks/bookmarks-loginCTA.js +24 -0
- package/dist/esm/BookNavigator/bookmarks/bookmarks-provider.js +55 -0
- package/dist/esm/BookNavigator/bookmarks/ia-bookmarks.js +521 -0
- package/dist/esm/BookNavigator/delete-modal-actions.js +29 -0
- package/dist/esm/BookNavigator/downloads/downloads-provider.js +84 -0
- package/dist/esm/BookNavigator/downloads/downloads.js +69 -0
- package/dist/esm/BookNavigator/search/search-provider.js +238 -0
- package/dist/esm/BookNavigator/search/search-results.js +161 -0
- package/dist/esm/BookNavigator/sharing.js +26 -0
- package/dist/esm/BookNavigator/viewable-files.js +94 -0
- package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments-provider.js +83 -0
- package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments.js +131 -0
- package/dist/esm/BookReader/BookModel.js +575 -0
- package/dist/esm/BookReader/DragScrollable.js +224 -0
- package/dist/esm/BookReader/ImageCache.js +122 -0
- package/dist/esm/BookReader/Mode1Up.js +114 -0
- package/dist/esm/BookReader/Mode1UpLit.js +579 -0
- package/dist/esm/BookReader/Mode2Up.js +106 -0
- package/dist/esm/BookReader/Mode2UpLit.js +1020 -0
- package/dist/esm/BookReader/ModeCoordinateSpace.js +28 -0
- package/dist/esm/BookReader/ModeSmoothZoom.js +318 -0
- package/dist/esm/BookReader/ModeThumb.js +366 -0
- package/dist/esm/BookReader/Navbar/Navbar.js +253 -0
- package/dist/esm/BookReader/PageContainer.js +165 -0
- package/dist/esm/BookReader/ReduceSet.js +27 -0
- package/dist/esm/BookReader/Toolbar/Toolbar.js +242 -0
- package/dist/esm/BookReader/events.js +20 -0
- package/dist/esm/BookReader/options.js +331 -0
- package/dist/esm/BookReader/utils/HTMLDimensionsCacher.js +48 -0
- package/dist/esm/BookReader/utils/ScrollClassAdder.js +31 -0
- package/dist/esm/BookReader/utils/SelectionObserver.js +42 -0
- package/dist/esm/BookReader/utils/classes.js +37 -0
- package/dist/esm/BookReader/utils.js +315 -0
- package/dist/esm/BookReader.js +1827 -0
- package/dist/esm/assets/icons/1up.svg +12 -0
- package/dist/esm/assets/icons/2up.svg +15 -0
- package/dist/esm/assets/icons/advance.svg +26 -0
- package/dist/esm/assets/icons/chevron-right.svg +1 -0
- package/dist/esm/assets/icons/close-circle-dark.svg +1 -0
- package/dist/esm/assets/icons/close-circle.svg +1 -0
- package/dist/esm/assets/icons/fullscreen.svg +17 -0
- package/dist/esm/assets/icons/fullscreen_exit.svg +17 -0
- package/dist/esm/assets/icons/hamburger.svg +15 -0
- package/dist/esm/assets/icons/left-arrow.svg +12 -0
- package/dist/esm/assets/icons/magnify-minus.svg +12 -0
- package/dist/esm/assets/icons/magnify-plus.svg +13 -0
- package/dist/esm/assets/icons/magnify.svg +15 -0
- package/dist/esm/assets/icons/pause.svg +23 -0
- package/dist/esm/assets/icons/play.svg +22 -0
- package/dist/esm/assets/icons/playback-speed.svg +34 -0
- package/dist/esm/assets/icons/read-aloud.svg +22 -0
- package/dist/esm/assets/icons/review.svg +22 -0
- package/dist/esm/assets/icons/thumbnails.svg +17 -0
- package/dist/esm/assets/icons/voice.svg +1 -0
- package/dist/esm/assets/icons/volume-full.svg +22 -0
- package/dist/esm/assets/images/BRicons.png +0 -0
- package/dist/esm/assets/images/BRicons.svg +94 -0
- package/dist/esm/assets/images/BRicons_ia.png +0 -0
- package/dist/esm/assets/images/back_pages.png +0 -0
- package/dist/esm/assets/images/book_bottom_icon.png +0 -0
- package/dist/esm/assets/images/book_down_icon.png +0 -0
- package/dist/esm/assets/images/book_left_icon.png +0 -0
- package/dist/esm/assets/images/book_leftmost_icon.png +0 -0
- package/dist/esm/assets/images/book_right_icon.png +0 -0
- package/dist/esm/assets/images/book_rightmost_icon.png +0 -0
- package/dist/esm/assets/images/book_top_icon.png +0 -0
- package/dist/esm/assets/images/book_up_icon.png +0 -0
- package/dist/esm/assets/images/books_graphic.svg +177 -0
- package/dist/esm/assets/images/booksplit.png +0 -0
- package/dist/esm/assets/images/control_pause_icon.png +0 -0
- package/dist/esm/assets/images/control_play_icon.png +0 -0
- package/dist/esm/assets/images/embed_icon.png +0 -0
- package/dist/esm/assets/images/icon-home-ia.png +0 -0
- package/dist/esm/assets/images/icon_OL-logo-xs.png +0 -0
- package/dist/esm/assets/images/icon_alert-xs.png +0 -0
- package/dist/esm/assets/images/icon_book.svg +12 -0
- package/dist/esm/assets/images/icon_bookmark.svg +12 -0
- package/dist/esm/assets/images/icon_close-pop.png +0 -0
- package/dist/esm/assets/images/icon_download.png +0 -0
- package/dist/esm/assets/images/icon_gear.svg +14 -0
- package/dist/esm/assets/images/icon_hamburger.svg +20 -0
- package/dist/esm/assets/images/icon_home.png +0 -0
- package/dist/esm/assets/images/icon_home.svg +21 -0
- package/dist/esm/assets/images/icon_home_ia.png +0 -0
- package/dist/esm/assets/images/icon_indicator.png +0 -0
- package/dist/esm/assets/images/icon_info.svg +11 -0
- package/dist/esm/assets/images/icon_one_page.svg +8 -0
- package/dist/esm/assets/images/icon_pause.svg +1 -0
- package/dist/esm/assets/images/icon_play.svg +1 -0
- package/dist/esm/assets/images/icon_playback-rate.svg +15 -0
- package/dist/esm/assets/images/icon_return.png +0 -0
- package/dist/esm/assets/images/icon_search_button.svg +8 -0
- package/dist/esm/assets/images/icon_share.svg +9 -0
- package/dist/esm/assets/images/icon_skip-ahead.svg +6 -0
- package/dist/esm/assets/images/icon_skip-back.svg +13 -0
- package/dist/esm/assets/images/icon_speaker.svg +18 -0
- package/dist/esm/assets/images/icon_speaker_open.svg +10 -0
- package/dist/esm/assets/images/icon_thumbnails.svg +12 -0
- package/dist/esm/assets/images/icon_toc.svg +5 -0
- package/dist/esm/assets/images/icon_two_pages.svg +9 -0
- package/dist/esm/assets/images/icon_zoomer.png +0 -0
- package/dist/esm/assets/images/loading.gif +0 -0
- package/dist/esm/assets/images/logo_icon.png +0 -0
- package/dist/esm/assets/images/marker_chap-off.png +0 -0
- package/dist/esm/assets/images/marker_chap-off.svg +11 -0
- package/dist/esm/assets/images/marker_chap-off_ia.png +0 -0
- package/dist/esm/assets/images/marker_chap-on.png +0 -0
- package/dist/esm/assets/images/marker_chap-on.svg +11 -0
- package/dist/esm/assets/images/marker_srch-on.svg +11 -0
- package/dist/esm/assets/images/marker_srchchap-off.png +0 -0
- package/dist/esm/assets/images/marker_srchchap-on.png +0 -0
- package/dist/esm/assets/images/nav_control-dn.png +0 -0
- package/dist/esm/assets/images/nav_control-dn_ia.png +0 -0
- package/dist/esm/assets/images/nav_control-up.png +0 -0
- package/dist/esm/assets/images/nav_control-up_ia.png +0 -0
- package/dist/esm/assets/images/nav_control.png +0 -0
- package/dist/esm/assets/images/one_page_mode_icon.png +0 -0
- package/dist/esm/assets/images/paper-badge.png +0 -0
- package/dist/esm/assets/images/print_icon.png +0 -0
- package/dist/esm/assets/images/progressbar.gif +0 -0
- package/dist/esm/assets/images/right_edges.png +0 -0
- package/dist/esm/assets/images/slider.png +0 -0
- package/dist/esm/assets/images/slider_ia.png +0 -0
- package/dist/esm/assets/images/thumbnail_mode_icon.png +0 -0
- package/dist/esm/assets/images/transparent.png +0 -0
- package/dist/esm/assets/images/two_page_mode_icon.png +0 -0
- package/dist/esm/assets/images/unviewable_page.png +0 -0
- package/dist/esm/assets/images/zoom_in_icon.png +0 -0
- package/dist/esm/assets/images/zoom_out_icon.png +0 -0
- package/dist/esm/css/BookReader.scss +85 -0
- package/dist/esm/css/_BRBookmarks.scss +29 -0
- package/dist/esm/css/_BRComponent.scss +13 -0
- package/dist/esm/css/_BRfloat.scss +197 -0
- package/dist/esm/css/_BRicon.scss +54 -0
- package/dist/esm/css/_BRmain.scss +262 -0
- package/dist/esm/css/_BRnav.scss +354 -0
- package/dist/esm/css/_BRpages.scss +213 -0
- package/dist/esm/css/_BRsearch.scss +268 -0
- package/dist/esm/css/_BRtoolbar.scss +84 -0
- package/dist/esm/css/_BRvendor.scss +5 -0
- package/dist/esm/css/_TextSelection.scss +108 -0
- package/dist/esm/css/_colorbox.scss +52 -0
- package/dist/esm/css/_controls.scss +257 -0
- package/dist/esm/css/_icons.scss +121 -0
- package/dist/esm/ia-bookreader/ia-bookreader.js +141 -0
- package/dist/esm/jquery-wrapper.js +3 -0
- package/dist/esm/plugins/plugin.archive_analytics.js +72 -0
- package/dist/esm/plugins/plugin.autoplay.js +119 -0
- package/dist/esm/plugins/plugin.chapters.js +288 -0
- package/dist/esm/plugins/plugin.iframe.js +44 -0
- package/dist/esm/plugins/plugin.iiif.js +146 -0
- package/dist/esm/plugins/plugin.resume.js +66 -0
- package/dist/esm/plugins/plugin.text_selection.js +621 -0
- package/dist/esm/plugins/plugin.vendor-fullscreen.js +227 -0
- package/dist/esm/plugins/search/plugin.search.js +499 -0
- package/dist/esm/plugins/search/utils.js +42 -0
- package/dist/esm/plugins/search/view.js +360 -0
- package/dist/esm/plugins/tts/AbstractTTSEngine.js +282 -0
- package/dist/esm/plugins/tts/FestivalTTSEngine.js +192 -0
- package/dist/esm/plugins/tts/PageChunk.js +105 -0
- package/dist/esm/plugins/tts/PageChunkIterator.js +155 -0
- package/dist/esm/plugins/tts/WebTTSEngine.js +364 -0
- package/dist/esm/plugins/tts/plugin.tts.js +315 -0
- package/dist/esm/plugins/tts/tooltip_dict.js +14 -0
- package/dist/esm/plugins/tts/utils.js +79 -0
- package/dist/esm/plugins/url/UrlPlugin.js +197 -0
- package/dist/esm/plugins/url/plugin.url.js +212 -0
- package/dist/esm/util/browserSniffing.js +56 -0
- package/dist/esm/util/debouncer.js +25 -0
- package/dist/esm/util/docCookies.js +75 -0
- package/dist/esm/util/strings.js +34 -0
- package/jsconfig.json +1 -0
- package/package.json +1 -7
@@ -0,0 +1,224 @@
|
|
1
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
2
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
3
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
4
|
+
// @ts-check
|
5
|
+
/*
|
6
|
+
* jQuery dragscrollable Plugin
|
7
|
+
* Based off version: 1.0 (25-Jun-2009)
|
8
|
+
* Copyright (c) 2009 Miquel Herrera
|
9
|
+
*
|
10
|
+
* Portions Copyright (c) 2010 Reg Braithwaite
|
11
|
+
* Copyright (c) 2010 Internet Archive / Michael Ang
|
12
|
+
* Copyright (c) 2016 Internet Archive / Richard Caceres
|
13
|
+
*
|
14
|
+
* Dual licensed under the MIT and GPL licenses:
|
15
|
+
* http://www.opensource.org/licenses/mit-license.php
|
16
|
+
* http://www.gnu.org/licenses/gpl.html
|
17
|
+
*/
|
18
|
+
|
19
|
+
/**
|
20
|
+
* @param {string} string_of_events
|
21
|
+
* @param {string} ns
|
22
|
+
* @returns
|
23
|
+
*/
|
24
|
+
function append_namespace(string_of_events, ns) {
|
25
|
+
return string_of_events.split(' ').map(event_name => event_name + ns).join(' ');
|
26
|
+
}
|
27
|
+
function left_top(event) {
|
28
|
+
/** @type {number} */
|
29
|
+
var x;
|
30
|
+
/** @type {number} */
|
31
|
+
var y;
|
32
|
+
if (typeof event.clientX != 'undefined') {
|
33
|
+
x = event.clientX;
|
34
|
+
y = event.clientY;
|
35
|
+
} else if (typeof event.screenX != 'undefined') {
|
36
|
+
x = event.screenX;
|
37
|
+
y = event.screenY;
|
38
|
+
} else if (typeof event.targetTouches != 'undefined') {
|
39
|
+
x = event.targetTouches[0].pageX;
|
40
|
+
y = event.targetTouches[0].pageY;
|
41
|
+
} else if (typeof event.originalEvent == 'undefined') {
|
42
|
+
console.error("don't understand x and y for " + event.type, event);
|
43
|
+
} else if (typeof event.originalEvent.clientX != 'undefined') {
|
44
|
+
x = event.originalEvent.clientX;
|
45
|
+
y = event.originalEvent.clientY;
|
46
|
+
} else if (typeof event.originalEvent.screenX != 'undefined') {
|
47
|
+
x = event.originalEvent.screenX;
|
48
|
+
y = event.originalEvent.screenY;
|
49
|
+
} else if (typeof event.originalEvent.targetTouches != 'undefined') {
|
50
|
+
x = event.originalEvent.targetTouches[0].pageX;
|
51
|
+
y = event.originalEvent.targetTouches[0].pageY;
|
52
|
+
}
|
53
|
+
return {
|
54
|
+
left: x,
|
55
|
+
top: y
|
56
|
+
};
|
57
|
+
}
|
58
|
+
var DEFAULT_OPTIONS = {
|
59
|
+
/**
|
60
|
+
* @type {String|HTMLElement} jQuery selector to apply to each wrapped element to
|
61
|
+
* find which will be the dragging elements. Defaults to the first child of scrollable
|
62
|
+
* element
|
63
|
+
*/
|
64
|
+
dragSelector: '>:first',
|
65
|
+
/** Will the dragging element accept propagated events? default is yes, a propagated
|
66
|
+
* mouse event on a inner element will be accepted and processed. If set to false,
|
67
|
+
* only events originated on the draggable elements will be processed. */
|
68
|
+
acceptPropagatedEvent: true,
|
69
|
+
/**
|
70
|
+
* Prevents the event to propagate further effectively disabling other default actions
|
71
|
+
*/
|
72
|
+
preventDefault: true,
|
73
|
+
dragstart: 'mousedown touchstart',
|
74
|
+
dragcontinue: 'mousemove touchmove',
|
75
|
+
dragend: 'mouseup touchend',
|
76
|
+
// mouseleave
|
77
|
+
dragMinDistance: 5,
|
78
|
+
namespace: '.ds',
|
79
|
+
/** Scroll the window rather than the element */
|
80
|
+
scrollWindow: false
|
81
|
+
};
|
82
|
+
|
83
|
+
/**
|
84
|
+
* Adds the ability to manage elements scroll by dragging
|
85
|
+
* one or more of its descendant elements. Options parameter
|
86
|
+
* allow to specifically select which inner elements will
|
87
|
+
* respond to the drag events.
|
88
|
+
* usage examples:
|
89
|
+
*
|
90
|
+
* To add the scroll by drag to the element id=viewport when dragging its
|
91
|
+
* first child accepting any propagated events
|
92
|
+
* `new DragScrollable($('#viewport')[0]);`
|
93
|
+
*
|
94
|
+
* To add the scroll by drag ability to any element div of class viewport
|
95
|
+
* when dragging its first descendant of class dragMe responding only to
|
96
|
+
* evcents originated on the '.dragMe' elements.
|
97
|
+
* ```js
|
98
|
+
* new DragScrollable($('div.viewport')[0], {
|
99
|
+
* dragSelector: '.dragMe:first',
|
100
|
+
* acceptPropagatedEvent: false
|
101
|
+
* });
|
102
|
+
* ```
|
103
|
+
*
|
104
|
+
* Notice that some 'viewports' could be nested within others but events
|
105
|
+
* would not interfere as acceptPropagatedEvent is set to false.
|
106
|
+
*/
|
107
|
+
export class DragScrollable {
|
108
|
+
/**
|
109
|
+
* @param {HTMLElement} element
|
110
|
+
* @param {Partial<DEFAULT_OPTIONS>} options
|
111
|
+
*/
|
112
|
+
constructor(element) {
|
113
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
114
|
+
/** @param {MouseEvent} event */
|
115
|
+
_defineProperty(this, "_dragStartHandler", event => {
|
116
|
+
if (this._shouldAbort()) {
|
117
|
+
return true;
|
118
|
+
}
|
119
|
+
|
120
|
+
// mousedown, left click, check propagation
|
121
|
+
if (event.which > 1 || !this.settings.acceptPropagatedEvent && event.target != this.handling_element[0]) {
|
122
|
+
return false;
|
123
|
+
}
|
124
|
+
|
125
|
+
// Initial coordinates will be the last when dragging
|
126
|
+
this.lastCoord = this.firstCoord = left_top(event);
|
127
|
+
this.handling_element.on(this.settings.dragcontinue, this._dragContinueHandler)
|
128
|
+
//.on(this.settings.dragend, this._dragEndHandler)
|
129
|
+
;
|
130
|
+
|
131
|
+
// Note, we bind using addEventListener so we can use "capture" binding
|
132
|
+
// instead of "bubble" binding
|
133
|
+
this.settings.dragend.split(' ').forEach(event_name => {
|
134
|
+
this.handling_element[0].addEventListener(event_name, this._dragEndHandler, true);
|
135
|
+
});
|
136
|
+
if (this.settings.preventDefault) {
|
137
|
+
event.preventDefault();
|
138
|
+
return false;
|
139
|
+
}
|
140
|
+
});
|
141
|
+
/** @param {MouseEvent} event */
|
142
|
+
_defineProperty(this, "_dragContinueHandler", event => {
|
143
|
+
// User is dragging
|
144
|
+
// console.log('drag continue');
|
145
|
+
if (this._shouldAbort()) {
|
146
|
+
return true;
|
147
|
+
}
|
148
|
+
var lt = left_top(event);
|
149
|
+
|
150
|
+
// How much did the mouse move?
|
151
|
+
var delta = {
|
152
|
+
left: lt.left - this.lastCoord.left,
|
153
|
+
top: lt.top - this.lastCoord.top
|
154
|
+
};
|
155
|
+
var scrollTarget = this.settings.scrollWindow ? $(window) : this.handling_element;
|
156
|
+
|
157
|
+
// Set the scroll position relative to what ever the scroll is now
|
158
|
+
scrollTarget.scrollLeft(scrollTarget.scrollLeft() - delta.left);
|
159
|
+
scrollTarget.scrollTop(scrollTarget.scrollTop() - delta.top);
|
160
|
+
|
161
|
+
// Save where the cursor is
|
162
|
+
this.lastCoord = lt;
|
163
|
+
if (this.settings.preventDefault) {
|
164
|
+
event.preventDefault();
|
165
|
+
return false;
|
166
|
+
}
|
167
|
+
});
|
168
|
+
/** @param {MouseEvent} event */
|
169
|
+
_defineProperty(this, "_dragEndHandler", event => {
|
170
|
+
// Stop scrolling
|
171
|
+
//console.log('dragEndHandler');
|
172
|
+
|
173
|
+
if (this._shouldAbort()) {
|
174
|
+
return true;
|
175
|
+
}
|
176
|
+
this.handling_element.off(this.settings.dragcontinue)
|
177
|
+
// Note, for some reason, even though I removeEventListener below,
|
178
|
+
// this call to unbind is still necessary. I don't know why.
|
179
|
+
.off(this.settings.dragend);
|
180
|
+
|
181
|
+
// Note, we bind using addEventListener so we can use "capture" binding
|
182
|
+
// instead of "bubble" binding
|
183
|
+
this.settings.dragend.split(' ').forEach(event_name => {
|
184
|
+
this.handling_element[0].removeEventListener(event_name, this._dragEndHandler, true);
|
185
|
+
});
|
186
|
+
|
187
|
+
// How much did the mouse move total?
|
188
|
+
var delta = {
|
189
|
+
left: Math.abs(this.lastCoord.left - this.firstCoord.left),
|
190
|
+
top: Math.abs(this.lastCoord.top - this.firstCoord.top)
|
191
|
+
};
|
192
|
+
var distance = Math.max(delta.left, delta.top);
|
193
|
+
|
194
|
+
// Allow event to propagate if min distance was not achieved
|
195
|
+
if (this.settings.preventDefault && distance > this.settings.dragMinDistance) {
|
196
|
+
event.preventDefault();
|
197
|
+
event.stopImmediatePropagation();
|
198
|
+
event.stopPropagation();
|
199
|
+
return false;
|
200
|
+
}
|
201
|
+
});
|
202
|
+
this.handling_element = $(element);
|
203
|
+
/** @type {typeof DEFAULT_OPTIONS} */
|
204
|
+
this.settings = $.extend({}, DEFAULT_OPTIONS, options || {});
|
205
|
+
this.firstCoord = {
|
206
|
+
left: 0,
|
207
|
+
top: 0
|
208
|
+
};
|
209
|
+
this.lastCoord = {
|
210
|
+
left: 0,
|
211
|
+
top: 0
|
212
|
+
};
|
213
|
+
this.settings.dragstart = append_namespace(this.settings.dragstart, this.settings.namespace);
|
214
|
+
this.settings.dragcontinue = append_namespace(this.settings.dragcontinue, this.settings.namespace);
|
215
|
+
//settings.dragend = append_namespace(settings.dragend, settings.namespace);
|
216
|
+
|
217
|
+
// Set mouse initiating event on the desired descendant
|
218
|
+
this.handling_element.find(this.settings.dragSelector).on(this.settings.dragstart, this._dragStartHandler);
|
219
|
+
}
|
220
|
+
_shouldAbort() {
|
221
|
+
var isTouchDevice = !!('ontouchstart' in window) || !!('msmaxtouchpoints' in window.navigator);
|
222
|
+
return isTouchDevice;
|
223
|
+
}
|
224
|
+
}
|
@@ -0,0 +1,122 @@
|
|
1
|
+
// @ts-check
|
2
|
+
/**
|
3
|
+
* Creates an image cache dictionary
|
4
|
+
* storing images in `<img>` tags so that
|
5
|
+
* BookReader can leverage browser caching
|
6
|
+
*/
|
7
|
+
/** @typedef {import("./BookModel").BookModel} BookModel */
|
8
|
+
/** @typedef {import("./BookModel").PageIndex} PageIndex */
|
9
|
+
/** @typedef {import("./ReduceSet").ReduceSet} ReduceSet */
|
10
|
+
|
11
|
+
import { Pow2ReduceSet } from "./ReduceSet";
|
12
|
+
export class ImageCache {
|
13
|
+
/**
|
14
|
+
* @param {BookModel} book
|
15
|
+
* @param {object} opts
|
16
|
+
* @param {boolean} [opts.useSrcSet]
|
17
|
+
* @param {ReduceSet} [opts.reduceSet]
|
18
|
+
*/
|
19
|
+
constructor(book) {
|
20
|
+
var {
|
21
|
+
useSrcSet = false,
|
22
|
+
reduceSet = Pow2ReduceSet
|
23
|
+
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
24
|
+
this.book = book;
|
25
|
+
this.useSrcSet = useSrcSet;
|
26
|
+
this.reduceSet = reduceSet;
|
27
|
+
/** @type {{ [index: number]: { reduce: number, loaded: boolean }[] }} */
|
28
|
+
this.cache = {};
|
29
|
+
this.defaultScale = 8;
|
30
|
+
}
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Get an image
|
34
|
+
* Checks cache first if image is available & of equal/better scale,
|
35
|
+
* if not, a new image gets created
|
36
|
+
*
|
37
|
+
* @param {PageIndex} index
|
38
|
+
* @param {Number} reduce
|
39
|
+
*/
|
40
|
+
image(index, reduce) {
|
41
|
+
var cachedImages = this.cache[index] || [];
|
42
|
+
var sufficientImages = cachedImages.filter(x => x.loaded && x.reduce <= reduce);
|
43
|
+
if (sufficientImages.length) {
|
44
|
+
// Choose the largest reduction factor that meets our needs
|
45
|
+
var bestReduce = Math.max(...sufficientImages.map(e => e.reduce));
|
46
|
+
return this._serveImageElement(index, bestReduce);
|
47
|
+
} else {
|
48
|
+
// Don't use a cache entry; i.e. a fresh fetch will be made
|
49
|
+
// for this reduce
|
50
|
+
return this._serveImageElement(index, reduce);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Checks if an image of equal or greater quality has been loaded
|
56
|
+
* @param {PageIndex} index
|
57
|
+
* @param {Number} reduce
|
58
|
+
* @returns {Boolean}
|
59
|
+
*/
|
60
|
+
imageLoaded(index, reduce) {
|
61
|
+
var _this$cache$index, _cacheImg$loaded;
|
62
|
+
var cacheImg = (_this$cache$index = this.cache[index]) === null || _this$cache$index === void 0 ? void 0 : _this$cache$index.find(e => e.reduce <= reduce);
|
63
|
+
return (_cacheImg$loaded = cacheImg === null || cacheImg === void 0 ? void 0 : cacheImg.loaded) !== null && _cacheImg$loaded !== void 0 ? _cacheImg$loaded : false;
|
64
|
+
}
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Get the best image that's already loaded for the given index,
|
68
|
+
* trying to choose values less that the given reduce
|
69
|
+
* @param {PageIndex} index
|
70
|
+
* @param idealMaxReduce
|
71
|
+
* @returns {null | number}
|
72
|
+
*/
|
73
|
+
getBestLoadedReduce(index) {
|
74
|
+
var _this$cache$index2;
|
75
|
+
var idealMaxReduce = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;
|
76
|
+
var candidates = ((_this$cache$index2 = this.cache[index]) === null || _this$cache$index2 === void 0 ? void 0 : _this$cache$index2.filter(x => x.loaded)) || [];
|
77
|
+
if (!candidates.length) return null;
|
78
|
+
var lowerResImages = candidates.filter(e => e.reduce >= idealMaxReduce);
|
79
|
+
if (lowerResImages.length) {
|
80
|
+
// Choose the highest quality loaded lower res image
|
81
|
+
return Math.min(...lowerResImages.map(e => e.reduce));
|
82
|
+
}
|
83
|
+
// Otherwise choose whatever is closest to the reduce
|
84
|
+
var higherRestImages = candidates.filter(e => e.reduce < idealMaxReduce);
|
85
|
+
return Math.max(...higherRestImages.map(e => e.reduce));
|
86
|
+
}
|
87
|
+
|
88
|
+
/**
|
89
|
+
* @private
|
90
|
+
* Generates an image element on the fly from image info in cache
|
91
|
+
*
|
92
|
+
* @param {PageIndex} index
|
93
|
+
* @param {number} reduce
|
94
|
+
* @returns {JQuery<HTMLImageElement>} with base image classes
|
95
|
+
*/
|
96
|
+
_serveImageElement(index, reduce) {
|
97
|
+
var _this$cache$index3;
|
98
|
+
var validReduce = this.reduceSet.floor(reduce);
|
99
|
+
var cacheEntry = (_this$cache$index3 = this.cache[index]) === null || _this$cache$index3 === void 0 ? void 0 : _this$cache$index3.find(e => e.reduce == validReduce);
|
100
|
+
if (!cacheEntry) {
|
101
|
+
cacheEntry = {
|
102
|
+
reduce: validReduce,
|
103
|
+
loaded: false
|
104
|
+
};
|
105
|
+
var entries = this.cache[index] || (this.cache[index] = []);
|
106
|
+
entries.push(cacheEntry);
|
107
|
+
}
|
108
|
+
var page = this.book.getPage(index);
|
109
|
+
var $img = $('<img />', {
|
110
|
+
'class': 'BRpageimage',
|
111
|
+
'alt': 'Book page image',
|
112
|
+
src: page.getURI(validReduce, 0)
|
113
|
+
}).data('reduce', validReduce);
|
114
|
+
if (this.useSrcSet) {
|
115
|
+
$img.attr('srcset', page.getURISrcSet(validReduce));
|
116
|
+
}
|
117
|
+
if (!cacheEntry.loaded) {
|
118
|
+
$img.one('load', () => cacheEntry.loaded = true);
|
119
|
+
}
|
120
|
+
return $img;
|
121
|
+
}
|
122
|
+
}
|
@@ -0,0 +1,114 @@
|
|
1
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
2
|
+
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
3
|
+
// @ts-check
|
4
|
+
import { Mode1UpLit } from './Mode1UpLit.js';
|
5
|
+
import { DragScrollable } from './DragScrollable.js';
|
6
|
+
/** @typedef {import('../BookReader.js').default} BookReader */
|
7
|
+
/** @typedef {import('./BookModel.js').BookModel} BookModel */
|
8
|
+
/** @typedef {import('./BookModel.js').PageIndex} PageIndex */
|
9
|
+
|
10
|
+
export class Mode1Up {
|
11
|
+
/**
|
12
|
+
* @param {BookReader} br
|
13
|
+
* @param {BookModel} bookModel
|
14
|
+
*/
|
15
|
+
constructor(br, bookModel) {
|
16
|
+
this.br = br;
|
17
|
+
this.book = bookModel;
|
18
|
+
this.mode1UpLit = new Mode1UpLit(bookModel, br);
|
19
|
+
|
20
|
+
/** @private */
|
21
|
+
this.$el = $(this.mode1UpLit)
|
22
|
+
// We CANNOT use `br-mode-1up` as a class, because it's the same
|
23
|
+
// as the name of the web component, and the webcomponents polyfill
|
24
|
+
// uses the name of component as a class for style scoping 😒
|
25
|
+
.addClass('br-mode-1up__root BRmode1up');
|
26
|
+
|
27
|
+
/** Has mode1up ever been rendered before? */
|
28
|
+
this.everShown = false;
|
29
|
+
}
|
30
|
+
|
31
|
+
// TODO: Might not need this anymore? Might want to delete.
|
32
|
+
/** @private */
|
33
|
+
get $brContainer() {
|
34
|
+
return this.br.refs.$brContainer;
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
* This is called when we switch to one page view
|
39
|
+
*/
|
40
|
+
prepare() {
|
41
|
+
var _this = this;
|
42
|
+
var startLeaf = this.br.currentIndex();
|
43
|
+
this.$brContainer.empty().css({
|
44
|
+
overflow: 'hidden'
|
45
|
+
}).append(this.$el);
|
46
|
+
|
47
|
+
// Need this in a setTimeout so that it happens after the browser has _actually_
|
48
|
+
// appended the element to the DOM
|
49
|
+
setTimeout(/*#__PURE__*/_asyncToGenerator(function* () {
|
50
|
+
if (!_this.everShown) {
|
51
|
+
_this.mode1UpLit.initFirstRender(startLeaf);
|
52
|
+
_this.everShown = true;
|
53
|
+
_this.mode1UpLit.requestUpdate();
|
54
|
+
yield _this.mode1UpLit.updateComplete;
|
55
|
+
new DragScrollable(_this.mode1UpLit, {
|
56
|
+
preventDefault: true,
|
57
|
+
dragSelector: '.br-mode-1up__visible-world',
|
58
|
+
// Only handle mouse events; let browser/interact.js handle touch
|
59
|
+
dragstart: 'mousedown',
|
60
|
+
dragcontinue: 'mousemove',
|
61
|
+
dragend: 'mouseup'
|
62
|
+
});
|
63
|
+
}
|
64
|
+
_this.mode1UpLit.jumpToIndex(startLeaf);
|
65
|
+
setTimeout(() => {
|
66
|
+
// Must explicitly call updateVisibleRegion, since no
|
67
|
+
// scroll event seems to fire.
|
68
|
+
_this.mode1UpLit.updateVisibleRegion();
|
69
|
+
});
|
70
|
+
}));
|
71
|
+
this.br.updateBrClasses();
|
72
|
+
}
|
73
|
+
|
74
|
+
/**
|
75
|
+
* BREAKING CHANGE: No longer supports pageX/pageY
|
76
|
+
* @param {PageIndex} index
|
77
|
+
* @param {number} [pageX] x position on the page (in pixels) to center on
|
78
|
+
* @param {number} [pageY] y position on the page (in pixels) to center on
|
79
|
+
* @param {boolean} [noAnimate]
|
80
|
+
*/
|
81
|
+
jumpToIndex(index, pageX, pageY, noAnimate) {
|
82
|
+
// Only smooth for small distances
|
83
|
+
var distance = Math.abs(this.br.currentIndex() - index);
|
84
|
+
var smooth = !noAnimate && distance > 0 && distance <= 4;
|
85
|
+
this.mode1UpLit.jumpToIndex(index, {
|
86
|
+
smooth
|
87
|
+
});
|
88
|
+
}
|
89
|
+
|
90
|
+
/**
|
91
|
+
* @param {'in' | 'out'} direction
|
92
|
+
*/
|
93
|
+
zoom(direction) {
|
94
|
+
switch (direction) {
|
95
|
+
case 'in':
|
96
|
+
this.mode1UpLit.zoomIn();
|
97
|
+
break;
|
98
|
+
case 'out':
|
99
|
+
this.mode1UpLit.zoomOut();
|
100
|
+
break;
|
101
|
+
default:
|
102
|
+
console.error("Unsupported direction: ".concat(direction));
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Resize the current one page view
|
108
|
+
* Note this calls drawLeafs
|
109
|
+
*/
|
110
|
+
resizePageView() {
|
111
|
+
this.mode1UpLit.htmlDimensionsCacher.updateClientSizes();
|
112
|
+
this.mode1UpLit.requestUpdate();
|
113
|
+
}
|
114
|
+
}
|