@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.
Files changed (182) hide show
  1. package/dist/esm/BookNavigator/assets/bookmark-colors.js +4 -0
  2. package/dist/esm/BookNavigator/assets/button-base.js +4 -0
  3. package/dist/esm/BookNavigator/assets/ia-logo.js +4 -0
  4. package/dist/esm/BookNavigator/assets/icon_checkmark.js +8 -0
  5. package/dist/esm/BookNavigator/assets/icon_close.js +4 -0
  6. package/dist/esm/BookNavigator/book-navigator.js +612 -0
  7. package/dist/esm/BookNavigator/bookmarks/bookmark-button.js +35 -0
  8. package/dist/esm/BookNavigator/bookmarks/bookmark-edit.js +78 -0
  9. package/dist/esm/BookNavigator/bookmarks/bookmarks-list.js +160 -0
  10. package/dist/esm/BookNavigator/bookmarks/bookmarks-loginCTA.js +24 -0
  11. package/dist/esm/BookNavigator/bookmarks/bookmarks-provider.js +55 -0
  12. package/dist/esm/BookNavigator/bookmarks/ia-bookmarks.js +521 -0
  13. package/dist/esm/BookNavigator/delete-modal-actions.js +29 -0
  14. package/dist/esm/BookNavigator/downloads/downloads-provider.js +84 -0
  15. package/dist/esm/BookNavigator/downloads/downloads.js +69 -0
  16. package/dist/esm/BookNavigator/search/search-provider.js +238 -0
  17. package/dist/esm/BookNavigator/search/search-results.js +161 -0
  18. package/dist/esm/BookNavigator/sharing.js +26 -0
  19. package/dist/esm/BookNavigator/viewable-files.js +94 -0
  20. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments-provider.js +83 -0
  21. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments.js +131 -0
  22. package/dist/esm/BookReader/BookModel.js +575 -0
  23. package/dist/esm/BookReader/DragScrollable.js +224 -0
  24. package/dist/esm/BookReader/ImageCache.js +122 -0
  25. package/dist/esm/BookReader/Mode1Up.js +114 -0
  26. package/dist/esm/BookReader/Mode1UpLit.js +579 -0
  27. package/dist/esm/BookReader/Mode2Up.js +106 -0
  28. package/dist/esm/BookReader/Mode2UpLit.js +1020 -0
  29. package/dist/esm/BookReader/ModeCoordinateSpace.js +28 -0
  30. package/dist/esm/BookReader/ModeSmoothZoom.js +318 -0
  31. package/dist/esm/BookReader/ModeThumb.js +366 -0
  32. package/dist/esm/BookReader/Navbar/Navbar.js +253 -0
  33. package/dist/esm/BookReader/PageContainer.js +165 -0
  34. package/dist/esm/BookReader/ReduceSet.js +27 -0
  35. package/dist/esm/BookReader/Toolbar/Toolbar.js +242 -0
  36. package/dist/esm/BookReader/events.js +20 -0
  37. package/dist/esm/BookReader/options.js +331 -0
  38. package/dist/esm/BookReader/utils/HTMLDimensionsCacher.js +48 -0
  39. package/dist/esm/BookReader/utils/ScrollClassAdder.js +31 -0
  40. package/dist/esm/BookReader/utils/SelectionObserver.js +42 -0
  41. package/dist/esm/BookReader/utils/classes.js +37 -0
  42. package/dist/esm/BookReader/utils.js +315 -0
  43. package/dist/esm/BookReader.js +1827 -0
  44. package/dist/esm/assets/icons/1up.svg +12 -0
  45. package/dist/esm/assets/icons/2up.svg +15 -0
  46. package/dist/esm/assets/icons/advance.svg +26 -0
  47. package/dist/esm/assets/icons/chevron-right.svg +1 -0
  48. package/dist/esm/assets/icons/close-circle-dark.svg +1 -0
  49. package/dist/esm/assets/icons/close-circle.svg +1 -0
  50. package/dist/esm/assets/icons/fullscreen.svg +17 -0
  51. package/dist/esm/assets/icons/fullscreen_exit.svg +17 -0
  52. package/dist/esm/assets/icons/hamburger.svg +15 -0
  53. package/dist/esm/assets/icons/left-arrow.svg +12 -0
  54. package/dist/esm/assets/icons/magnify-minus.svg +12 -0
  55. package/dist/esm/assets/icons/magnify-plus.svg +13 -0
  56. package/dist/esm/assets/icons/magnify.svg +15 -0
  57. package/dist/esm/assets/icons/pause.svg +23 -0
  58. package/dist/esm/assets/icons/play.svg +22 -0
  59. package/dist/esm/assets/icons/playback-speed.svg +34 -0
  60. package/dist/esm/assets/icons/read-aloud.svg +22 -0
  61. package/dist/esm/assets/icons/review.svg +22 -0
  62. package/dist/esm/assets/icons/thumbnails.svg +17 -0
  63. package/dist/esm/assets/icons/voice.svg +1 -0
  64. package/dist/esm/assets/icons/volume-full.svg +22 -0
  65. package/dist/esm/assets/images/BRicons.png +0 -0
  66. package/dist/esm/assets/images/BRicons.svg +94 -0
  67. package/dist/esm/assets/images/BRicons_ia.png +0 -0
  68. package/dist/esm/assets/images/back_pages.png +0 -0
  69. package/dist/esm/assets/images/book_bottom_icon.png +0 -0
  70. package/dist/esm/assets/images/book_down_icon.png +0 -0
  71. package/dist/esm/assets/images/book_left_icon.png +0 -0
  72. package/dist/esm/assets/images/book_leftmost_icon.png +0 -0
  73. package/dist/esm/assets/images/book_right_icon.png +0 -0
  74. package/dist/esm/assets/images/book_rightmost_icon.png +0 -0
  75. package/dist/esm/assets/images/book_top_icon.png +0 -0
  76. package/dist/esm/assets/images/book_up_icon.png +0 -0
  77. package/dist/esm/assets/images/books_graphic.svg +177 -0
  78. package/dist/esm/assets/images/booksplit.png +0 -0
  79. package/dist/esm/assets/images/control_pause_icon.png +0 -0
  80. package/dist/esm/assets/images/control_play_icon.png +0 -0
  81. package/dist/esm/assets/images/embed_icon.png +0 -0
  82. package/dist/esm/assets/images/icon-home-ia.png +0 -0
  83. package/dist/esm/assets/images/icon_OL-logo-xs.png +0 -0
  84. package/dist/esm/assets/images/icon_alert-xs.png +0 -0
  85. package/dist/esm/assets/images/icon_book.svg +12 -0
  86. package/dist/esm/assets/images/icon_bookmark.svg +12 -0
  87. package/dist/esm/assets/images/icon_close-pop.png +0 -0
  88. package/dist/esm/assets/images/icon_download.png +0 -0
  89. package/dist/esm/assets/images/icon_gear.svg +14 -0
  90. package/dist/esm/assets/images/icon_hamburger.svg +20 -0
  91. package/dist/esm/assets/images/icon_home.png +0 -0
  92. package/dist/esm/assets/images/icon_home.svg +21 -0
  93. package/dist/esm/assets/images/icon_home_ia.png +0 -0
  94. package/dist/esm/assets/images/icon_indicator.png +0 -0
  95. package/dist/esm/assets/images/icon_info.svg +11 -0
  96. package/dist/esm/assets/images/icon_one_page.svg +8 -0
  97. package/dist/esm/assets/images/icon_pause.svg +1 -0
  98. package/dist/esm/assets/images/icon_play.svg +1 -0
  99. package/dist/esm/assets/images/icon_playback-rate.svg +15 -0
  100. package/dist/esm/assets/images/icon_return.png +0 -0
  101. package/dist/esm/assets/images/icon_search_button.svg +8 -0
  102. package/dist/esm/assets/images/icon_share.svg +9 -0
  103. package/dist/esm/assets/images/icon_skip-ahead.svg +6 -0
  104. package/dist/esm/assets/images/icon_skip-back.svg +13 -0
  105. package/dist/esm/assets/images/icon_speaker.svg +18 -0
  106. package/dist/esm/assets/images/icon_speaker_open.svg +10 -0
  107. package/dist/esm/assets/images/icon_thumbnails.svg +12 -0
  108. package/dist/esm/assets/images/icon_toc.svg +5 -0
  109. package/dist/esm/assets/images/icon_two_pages.svg +9 -0
  110. package/dist/esm/assets/images/icon_zoomer.png +0 -0
  111. package/dist/esm/assets/images/loading.gif +0 -0
  112. package/dist/esm/assets/images/logo_icon.png +0 -0
  113. package/dist/esm/assets/images/marker_chap-off.png +0 -0
  114. package/dist/esm/assets/images/marker_chap-off.svg +11 -0
  115. package/dist/esm/assets/images/marker_chap-off_ia.png +0 -0
  116. package/dist/esm/assets/images/marker_chap-on.png +0 -0
  117. package/dist/esm/assets/images/marker_chap-on.svg +11 -0
  118. package/dist/esm/assets/images/marker_srch-on.svg +11 -0
  119. package/dist/esm/assets/images/marker_srchchap-off.png +0 -0
  120. package/dist/esm/assets/images/marker_srchchap-on.png +0 -0
  121. package/dist/esm/assets/images/nav_control-dn.png +0 -0
  122. package/dist/esm/assets/images/nav_control-dn_ia.png +0 -0
  123. package/dist/esm/assets/images/nav_control-up.png +0 -0
  124. package/dist/esm/assets/images/nav_control-up_ia.png +0 -0
  125. package/dist/esm/assets/images/nav_control.png +0 -0
  126. package/dist/esm/assets/images/one_page_mode_icon.png +0 -0
  127. package/dist/esm/assets/images/paper-badge.png +0 -0
  128. package/dist/esm/assets/images/print_icon.png +0 -0
  129. package/dist/esm/assets/images/progressbar.gif +0 -0
  130. package/dist/esm/assets/images/right_edges.png +0 -0
  131. package/dist/esm/assets/images/slider.png +0 -0
  132. package/dist/esm/assets/images/slider_ia.png +0 -0
  133. package/dist/esm/assets/images/thumbnail_mode_icon.png +0 -0
  134. package/dist/esm/assets/images/transparent.png +0 -0
  135. package/dist/esm/assets/images/two_page_mode_icon.png +0 -0
  136. package/dist/esm/assets/images/unviewable_page.png +0 -0
  137. package/dist/esm/assets/images/zoom_in_icon.png +0 -0
  138. package/dist/esm/assets/images/zoom_out_icon.png +0 -0
  139. package/dist/esm/css/BookReader.scss +85 -0
  140. package/dist/esm/css/_BRBookmarks.scss +29 -0
  141. package/dist/esm/css/_BRComponent.scss +13 -0
  142. package/dist/esm/css/_BRfloat.scss +197 -0
  143. package/dist/esm/css/_BRicon.scss +54 -0
  144. package/dist/esm/css/_BRmain.scss +262 -0
  145. package/dist/esm/css/_BRnav.scss +354 -0
  146. package/dist/esm/css/_BRpages.scss +213 -0
  147. package/dist/esm/css/_BRsearch.scss +268 -0
  148. package/dist/esm/css/_BRtoolbar.scss +84 -0
  149. package/dist/esm/css/_BRvendor.scss +5 -0
  150. package/dist/esm/css/_TextSelection.scss +108 -0
  151. package/dist/esm/css/_colorbox.scss +52 -0
  152. package/dist/esm/css/_controls.scss +257 -0
  153. package/dist/esm/css/_icons.scss +121 -0
  154. package/dist/esm/ia-bookreader/ia-bookreader.js +141 -0
  155. package/dist/esm/jquery-wrapper.js +3 -0
  156. package/dist/esm/plugins/plugin.archive_analytics.js +72 -0
  157. package/dist/esm/plugins/plugin.autoplay.js +119 -0
  158. package/dist/esm/plugins/plugin.chapters.js +288 -0
  159. package/dist/esm/plugins/plugin.iframe.js +44 -0
  160. package/dist/esm/plugins/plugin.iiif.js +146 -0
  161. package/dist/esm/plugins/plugin.resume.js +66 -0
  162. package/dist/esm/plugins/plugin.text_selection.js +621 -0
  163. package/dist/esm/plugins/plugin.vendor-fullscreen.js +227 -0
  164. package/dist/esm/plugins/search/plugin.search.js +499 -0
  165. package/dist/esm/plugins/search/utils.js +42 -0
  166. package/dist/esm/plugins/search/view.js +360 -0
  167. package/dist/esm/plugins/tts/AbstractTTSEngine.js +282 -0
  168. package/dist/esm/plugins/tts/FestivalTTSEngine.js +192 -0
  169. package/dist/esm/plugins/tts/PageChunk.js +105 -0
  170. package/dist/esm/plugins/tts/PageChunkIterator.js +155 -0
  171. package/dist/esm/plugins/tts/WebTTSEngine.js +364 -0
  172. package/dist/esm/plugins/tts/plugin.tts.js +315 -0
  173. package/dist/esm/plugins/tts/tooltip_dict.js +14 -0
  174. package/dist/esm/plugins/tts/utils.js +79 -0
  175. package/dist/esm/plugins/url/UrlPlugin.js +197 -0
  176. package/dist/esm/plugins/url/plugin.url.js +212 -0
  177. package/dist/esm/util/browserSniffing.js +56 -0
  178. package/dist/esm/util/debouncer.js +25 -0
  179. package/dist/esm/util/docCookies.js +75 -0
  180. package/dist/esm/util/strings.js +34 -0
  181. package/jsconfig.json +1 -0
  182. 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
+ }