@internetarchive/bookreader 5.0.0-38 → 5.0.0-39

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 (222) hide show
  1. package/BookReader/BookReader.css +8 -0
  2. package/BookReader/BookReader.js +1 -1
  3. package/BookReader/BookReader.js.map +1 -1
  4. package/BookReader/ia-bookreader-bundle.js +99 -75
  5. package/BookReader/ia-bookreader-bundle.js.map +1 -1
  6. package/BookReader/icons/magnify-minus.svg +1 -1
  7. package/BookReader/icons/magnify-plus.svg +1 -1
  8. package/BookReader/plugins/plugin.autoplay.js +1 -1
  9. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  10. package/BookReader/plugins/plugin.chapters.js +1 -1
  11. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  12. package/BookReader/plugins/plugin.mobile_nav.js +1 -1
  13. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  14. package/BookReader/plugins/plugin.resume.js +1 -1
  15. package/BookReader/plugins/plugin.resume.js.map +1 -1
  16. package/BookReader/plugins/plugin.search.js +1 -1
  17. package/BookReader/plugins/plugin.search.js.map +1 -1
  18. package/BookReader/plugins/plugin.text_selection.js +1 -1
  19. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  20. package/BookReader/plugins/plugin.tts.js +1 -1
  21. package/BookReader/plugins/plugin.tts.js.map +1 -1
  22. package/BookReader/plugins/plugin.url.js +1 -1
  23. package/BookReader/plugins/plugin.url.js.map +1 -1
  24. package/CHANGELOG.md +5 -0
  25. package/README.md +13 -0
  26. package/package.json +14 -14
  27. package/renovate.json +1 -1
  28. package/src/BookReader/Mode1UpLit.js +7 -1
  29. package/src/BookReader/Mode2Up.js +11 -0
  30. package/src/BookReader/ModeSmoothZoom.js +2 -0
  31. package/src/BookReader/PageContainer.js +10 -4
  32. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  33. package/src/assets/icons/magnify-minus.svg +3 -7
  34. package/src/assets/icons/magnify-plus.svg +3 -7
  35. package/src/css/_TextSelection.scss +13 -0
  36. package/tests/jest/BookReader/PageContainer.test.js +5 -4
  37. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  38. package/.husky/_/husky.sh +0 -30
  39. package/stat/BookNavigator/BookModel.js +0 -14
  40. package/stat/BookNavigator/BookNavigator.js +0 -524
  41. package/stat/BookNavigator/assets/bookmark-colors.js +0 -15
  42. package/stat/BookNavigator/assets/button-base.js +0 -61
  43. package/stat/BookNavigator/assets/ia-logo.js +0 -17
  44. package/stat/BookNavigator/assets/icon_checkmark.js +0 -6
  45. package/stat/BookNavigator/assets/icon_close.js +0 -3
  46. package/stat/BookNavigator/assets/icon_sort_asc.js +0 -5
  47. package/stat/BookNavigator/assets/icon_sort_desc.js +0 -5
  48. package/stat/BookNavigator/assets/icon_sort_neutral.js +0 -5
  49. package/stat/BookNavigator/assets/icon_volumes.js +0 -11
  50. package/stat/BookNavigator/bookmarks/bookmark-button.js +0 -64
  51. package/stat/BookNavigator/bookmarks/bookmark-edit.js +0 -215
  52. package/stat/BookNavigator/bookmarks/bookmarks-list.js +0 -285
  53. package/stat/BookNavigator/bookmarks/bookmarks-loginCTA.js +0 -28
  54. package/stat/BookNavigator/bookmarks/bookmarks-provider.js +0 -56
  55. package/stat/BookNavigator/bookmarks/ia-bookmarks.js +0 -523
  56. package/stat/BookNavigator/br-fullscreen-mgr.js +0 -82
  57. package/stat/BookNavigator/delete-modal-actions.js +0 -49
  58. package/stat/BookNavigator/downloads/downloads-provider.js +0 -72
  59. package/stat/BookNavigator/downloads/downloads.js +0 -139
  60. package/stat/BookNavigator/provider-config.js +0 -0
  61. package/stat/BookNavigator/search/a-search-result.js +0 -55
  62. package/stat/BookNavigator/search/search-provider.js +0 -180
  63. package/stat/BookNavigator/search/search-results.js +0 -360
  64. package/stat/BookNavigator/sharing.js +0 -31
  65. package/stat/BookNavigator/visual-adjustments/visual-adjustments-provider.js +0 -94
  66. package/stat/BookNavigator/visual-adjustments/visual-adjustments.js +0 -280
  67. package/stat/BookNavigator/volumes/volumes-provider.js +0 -83
  68. package/stat/BookNavigator/volumes/volumes.js +0 -178
  69. package/stat/BookReader/BookModel.js +0 -518
  70. package/stat/BookReader/DebugConsole.js +0 -54
  71. package/stat/BookReader/DragScrollable.js +0 -233
  72. package/stat/BookReader/ImageCache.js +0 -116
  73. package/stat/BookReader/Mode1Up.js +0 -102
  74. package/stat/BookReader/Mode1UpLit.js +0 -434
  75. package/stat/BookReader/Mode2Up.js +0 -1372
  76. package/stat/BookReader/ModeSmoothZoom.js +0 -177
  77. package/stat/BookReader/ModeThumb.js +0 -344
  78. package/stat/BookReader/Navbar/Navbar.js +0 -310
  79. package/stat/BookReader/PageContainer.js +0 -120
  80. package/stat/BookReader/ReduceSet.js +0 -26
  81. package/stat/BookReader/Toolbar/Toolbar.js +0 -384
  82. package/stat/BookReader/events.js +0 -20
  83. package/stat/BookReader/options.js +0 -324
  84. package/stat/BookReader/utils/HTMLDimensionsCacher.js +0 -44
  85. package/stat/BookReader/utils/classes.js +0 -36
  86. package/stat/BookReader/utils.js +0 -240
  87. package/stat/BookReader.js +0 -2550
  88. package/stat/BookReaderComponent/BookReaderComponent.js +0 -117
  89. package/stat/assets/icons/1up.svg +0 -12
  90. package/stat/assets/icons/2up.svg +0 -15
  91. package/stat/assets/icons/advance.svg +0 -26
  92. package/stat/assets/icons/chevron-right.svg +0 -1
  93. package/stat/assets/icons/close-circle-dark.svg +0 -1
  94. package/stat/assets/icons/close-circle.svg +0 -1
  95. package/stat/assets/icons/fullscreen.svg +0 -17
  96. package/stat/assets/icons/fullscreen_exit.svg +0 -17
  97. package/stat/assets/icons/hamburger.svg +0 -15
  98. package/stat/assets/icons/left-arrow.svg +0 -12
  99. package/stat/assets/icons/magnify-minus.svg +0 -16
  100. package/stat/assets/icons/magnify-plus.svg +0 -17
  101. package/stat/assets/icons/magnify.svg +0 -15
  102. package/stat/assets/icons/pause.svg +0 -23
  103. package/stat/assets/icons/play.svg +0 -22
  104. package/stat/assets/icons/playback-speed.svg +0 -34
  105. package/stat/assets/icons/read-aloud.svg +0 -22
  106. package/stat/assets/icons/review.svg +0 -22
  107. package/stat/assets/icons/thumbnails.svg +0 -17
  108. package/stat/assets/icons/voice.svg +0 -1
  109. package/stat/assets/icons/volume-full.svg +0 -22
  110. package/stat/assets/images/BRicons.png +0 -0
  111. package/stat/assets/images/BRicons.svg +0 -94
  112. package/stat/assets/images/BRicons_ia.png +0 -0
  113. package/stat/assets/images/back_pages.png +0 -0
  114. package/stat/assets/images/book_bottom_icon.png +0 -0
  115. package/stat/assets/images/book_down_icon.png +0 -0
  116. package/stat/assets/images/book_left_icon.png +0 -0
  117. package/stat/assets/images/book_leftmost_icon.png +0 -0
  118. package/stat/assets/images/book_right_icon.png +0 -0
  119. package/stat/assets/images/book_rightmost_icon.png +0 -0
  120. package/stat/assets/images/book_top_icon.png +0 -0
  121. package/stat/assets/images/book_up_icon.png +0 -0
  122. package/stat/assets/images/books_graphic.svg +0 -177
  123. package/stat/assets/images/booksplit.png +0 -0
  124. package/stat/assets/images/control_pause_icon.png +0 -0
  125. package/stat/assets/images/control_play_icon.png +0 -0
  126. package/stat/assets/images/embed_icon.png +0 -0
  127. package/stat/assets/images/icon-home-ia.png +0 -0
  128. package/stat/assets/images/icon_OL-logo-xs.png +0 -0
  129. package/stat/assets/images/icon_alert-xs.png +0 -0
  130. package/stat/assets/images/icon_book.svg +0 -12
  131. package/stat/assets/images/icon_bookmark.svg +0 -12
  132. package/stat/assets/images/icon_close-pop.png +0 -0
  133. package/stat/assets/images/icon_download.png +0 -0
  134. package/stat/assets/images/icon_gear.svg +0 -14
  135. package/stat/assets/images/icon_hamburger.svg +0 -20
  136. package/stat/assets/images/icon_home.png +0 -0
  137. package/stat/assets/images/icon_home.svg +0 -21
  138. package/stat/assets/images/icon_home_ia.png +0 -0
  139. package/stat/assets/images/icon_indicator.png +0 -0
  140. package/stat/assets/images/icon_info.svg +0 -11
  141. package/stat/assets/images/icon_one_page.svg +0 -8
  142. package/stat/assets/images/icon_pause.svg +0 -1
  143. package/stat/assets/images/icon_play.svg +0 -1
  144. package/stat/assets/images/icon_playback-rate.svg +0 -15
  145. package/stat/assets/images/icon_return.png +0 -0
  146. package/stat/assets/images/icon_search_button.svg +0 -8
  147. package/stat/assets/images/icon_share.svg +0 -9
  148. package/stat/assets/images/icon_skip-ahead.svg +0 -6
  149. package/stat/assets/images/icon_skip-back.svg +0 -13
  150. package/stat/assets/images/icon_speaker.svg +0 -18
  151. package/stat/assets/images/icon_speaker_open.svg +0 -10
  152. package/stat/assets/images/icon_thumbnails.svg +0 -12
  153. package/stat/assets/images/icon_toc.svg +0 -5
  154. package/stat/assets/images/icon_two_pages.svg +0 -9
  155. package/stat/assets/images/icon_zoomer.png +0 -0
  156. package/stat/assets/images/loading.gif +0 -0
  157. package/stat/assets/images/logo_icon.png +0 -0
  158. package/stat/assets/images/marker_chap-off.png +0 -0
  159. package/stat/assets/images/marker_chap-off.svg +0 -11
  160. package/stat/assets/images/marker_chap-off_ia.png +0 -0
  161. package/stat/assets/images/marker_chap-on.png +0 -0
  162. package/stat/assets/images/marker_chap-on.svg +0 -11
  163. package/stat/assets/images/marker_srch-on.svg +0 -11
  164. package/stat/assets/images/marker_srchchap-off.png +0 -0
  165. package/stat/assets/images/marker_srchchap-on.png +0 -0
  166. package/stat/assets/images/nav_control-dn.png +0 -0
  167. package/stat/assets/images/nav_control-dn_ia.png +0 -0
  168. package/stat/assets/images/nav_control-up.png +0 -0
  169. package/stat/assets/images/nav_control-up_ia.png +0 -0
  170. package/stat/assets/images/nav_control.png +0 -0
  171. package/stat/assets/images/one_page_mode_icon.png +0 -0
  172. package/stat/assets/images/paper-badge.png +0 -0
  173. package/stat/assets/images/print_icon.png +0 -0
  174. package/stat/assets/images/progressbar.gif +0 -0
  175. package/stat/assets/images/right_edges.png +0 -0
  176. package/stat/assets/images/slider.png +0 -0
  177. package/stat/assets/images/slider_ia.png +0 -0
  178. package/stat/assets/images/thumbnail_mode_icon.png +0 -0
  179. package/stat/assets/images/transparent.png +0 -0
  180. package/stat/assets/images/two_page_mode_icon.png +0 -0
  181. package/stat/assets/images/zoom_in_icon.png +0 -0
  182. package/stat/assets/images/zoom_out_icon.png +0 -0
  183. package/stat/css/BookReader.scss +0 -89
  184. package/stat/css/_BRBookmarks.scss +0 -29
  185. package/stat/css/_BRComponent.scss +0 -13
  186. package/stat/css/_BRfloat.scss +0 -197
  187. package/stat/css/_BRicon.scss +0 -48
  188. package/stat/css/_BRmain.scss +0 -251
  189. package/stat/css/_BRnav.scss +0 -359
  190. package/stat/css/_BRpages.scss +0 -139
  191. package/stat/css/_BRsearch.scss +0 -226
  192. package/stat/css/_BRtoolbar.scss +0 -84
  193. package/stat/css/_BRvendor.scss +0 -5
  194. package/stat/css/_MobileNav.scss +0 -194
  195. package/stat/css/_TextSelection.scss +0 -32
  196. package/stat/css/_colorbox.scss +0 -52
  197. package/stat/css/_controls.scss +0 -253
  198. package/stat/css/_icons.scss +0 -121
  199. package/stat/jquery-wrapper.js +0 -4
  200. package/stat/plugins/plugin.archive_analytics.js +0 -86
  201. package/stat/plugins/plugin.autoplay.js +0 -129
  202. package/stat/plugins/plugin.chapters.js +0 -248
  203. package/stat/plugins/plugin.iframe.js +0 -48
  204. package/stat/plugins/plugin.mobile_nav.js +0 -288
  205. package/stat/plugins/plugin.resume.js +0 -68
  206. package/stat/plugins/plugin.text_selection.js +0 -291
  207. package/stat/plugins/plugin.url.js +0 -198
  208. package/stat/plugins/plugin.vendor-fullscreen.js +0 -247
  209. package/stat/plugins/search/plugin.search.js +0 -439
  210. package/stat/plugins/search/view.js +0 -439
  211. package/stat/plugins/tts/AbstractTTSEngine.js +0 -249
  212. package/stat/plugins/tts/FestivalTTSEngine.js +0 -169
  213. package/stat/plugins/tts/PageChunk.js +0 -107
  214. package/stat/plugins/tts/PageChunkIterator.js +0 -163
  215. package/stat/plugins/tts/WebTTSEngine.js +0 -357
  216. package/stat/plugins/tts/plugin.tts.js +0 -357
  217. package/stat/plugins/tts/tooltip_dict.js +0 -15
  218. package/stat/plugins/tts/utils.js +0 -91
  219. package/stat/util/browserSniffing.js +0 -30
  220. package/stat/util/debouncer.js +0 -26
  221. package/stat/util/docCookies.js +0 -67
  222. package/stat/util/strings.js +0 -34
@@ -1,310 +0,0 @@
1
- /** @typedef {import("../../BookReader.js").default} BookReader */
2
-
3
- import 'jquery-ui/ui/widget.js';
4
- import 'jquery-ui/ui/widgets/mouse.js';
5
- import 'jquery-ui/ui/widgets/slider.js';
6
- import { EVENTS } from '../events.js';
7
-
8
- export class Navbar {
9
- /**
10
- * @param {BookReader} br
11
- */
12
- constructor(br) {
13
- this.br = br;
14
-
15
- /** @type {JQuery} */
16
- this.$root = null;
17
- /** @type {JQuery} */
18
- this.$nav = null;
19
- /** @type {number} */
20
- this.maxPageNum = null;
21
-
22
- /** @type {Object} controls will be switch over "this.maximumControls" */
23
- this.minimumControls = [
24
- 'viewmode'
25
- ];
26
- /** @type {Object} controls will be switch over "this.minimumControls" */
27
- this.maximumControls = [
28
- 'book_left', 'book_right', 'zoom_in', 'zoom_out', 'onepg', 'twopg', 'thumb'
29
- ];
30
- }
31
-
32
- controlFor(controlName) {
33
- const option = this.br.options.controls[controlName];
34
- if (!option.visible) { return ''; }
35
- if (option.template) {
36
- return `<li>${option.template(this.br)}</li>`;
37
- }
38
- return `<li>
39
- <button class="BRicon ${option.className}" title="${option.label}">
40
- <div class="icon icon-${option.iconClassName}"></div>
41
- <span class="tooltip">${option.label}</span>
42
- </button>
43
- </li>`;
44
- }
45
-
46
- /** @private */
47
- _renderControls() {
48
- return [
49
- 'bookLeft',
50
- 'bookRight',
51
- 'onePage',
52
- 'twoPage',
53
- 'thumbnail',
54
- 'viewmode',
55
- 'zoomOut',
56
- 'zoomIn',
57
- 'fullScreen',
58
- ].map((mode) => (
59
- this.controlFor(mode)
60
- )).join('');
61
- }
62
-
63
- /** @private */
64
- _bindViewModeButton() {
65
- const { br } = this;
66
- const viewModeOptions = br.options.controls.viewmode;
67
- const viewModes = [{
68
- mode: br.constMode1up,
69
- className: 'onepg',
70
- title: 'One-page view',
71
- }, {
72
- mode: br.constMode2up,
73
- className: 'twopg',
74
- title: 'Two-page view',
75
- }, {
76
- mode: br.constModeThumb,
77
- className: 'thumb',
78
- title: 'Thumbnail view',
79
- }].filter((mode) => (
80
- !viewModeOptions.excludedModes.includes(mode.mode)
81
- ));
82
- const viewModeOrder = viewModes.map((m) => m.mode);
83
-
84
- if (viewModeOptions.excludedModes.includes(br.mode)) {
85
- br.switchMode(viewModeOrder[0]);
86
- }
87
-
88
- // Reorder the viewModeOrder so the current view mode is at the end
89
- const currentModeIndex = viewModeOrder.indexOf(br.mode);
90
- for (let i = 0; i <= currentModeIndex; i++) {
91
- viewModeOrder.push(viewModeOrder.shift());
92
- }
93
-
94
- if (viewModes.length < 2) {
95
- this.$nav.find(`.${viewModeOptions.className}`).remove();
96
- }
97
-
98
- this.br.bind(EVENTS.PostInit, () => {
99
- const $button = this.$nav.find(`.${viewModeOptions.className}`)
100
- .off('.bindNavigationHandlers')
101
- .on('click', (e) => {
102
- const nextModeID = viewModeOrder.shift();
103
- const newViewMode = viewModes.find((m) => m.mode === nextModeID);
104
- const nextViewMode = viewModes.find((m) => m.mode === viewModeOrder[0]);
105
-
106
- viewModeOrder.push(nextModeID);
107
- br.viewModeOrder = viewModeOrder;
108
- this.updateViewModeButton($(e.currentTarget), nextViewMode.className, nextViewMode.title);
109
- br.switchMode(newViewMode.mode);
110
- });
111
- const currentViewModeButton = viewModes.find((m) => m.mode === viewModeOrder[0]);
112
- this.updateViewModeButton(
113
- $button,
114
- currentViewModeButton.className,
115
- currentViewModeButton.title
116
- );
117
- });
118
- }
119
-
120
- /**
121
- * Toggle viewmode button to change page view
122
- */
123
- updateViewModeButton($button, iconClass, tooltipText) {
124
- $button
125
- .attr('title', tooltipText)
126
- .find('.icon')
127
- .removeClass()
128
- .addClass(`icon icon-${iconClass}`)
129
- .end()
130
- .find('.tooltip')
131
- .text(tooltipText);
132
- }
133
-
134
- /**
135
- * Switch navbar controls on mobile and desktop
136
- */
137
- switchNavbarControls() {
138
- // we don't want navbar controls switching with liner-notes
139
- if (this.br.options.bookType !== 'linerNotes') {
140
- if (this.br.refs.$brContainer.prop('clientWidth') < 640) {
141
- this.showMinimumNavbarControls();
142
- } else {
143
- this.showMaximumNavbarControls();
144
- }
145
- }
146
- }
147
-
148
- /**
149
- * Switch Book Navbar controls to minimised
150
- * NOTE: only `this.minimumControls` and `this.maximumControls` switch on resize
151
- */
152
- showMinimumNavbarControls() {
153
- this.minimumControls.forEach((control) => {
154
- const element = document.querySelector(`.controls .${control}`);
155
- if (element) element.classList.remove('hide');
156
- });
157
- this.maximumControls.forEach((control) => {
158
- const element = document.querySelector(`.controls .${control}`);
159
- if (element) element.classList.add('hide');
160
- });
161
- }
162
-
163
- /**
164
- * Switch Book Navbar controls to maximized
165
- * NOTE: only `this.minimumControls` and `this.maximumControls` switch on resize
166
- */
167
- showMaximumNavbarControls() {
168
- this.maximumControls.forEach((control) => {
169
- const element = document.querySelector(`.controls .${control}`);
170
- if (element) element.classList.remove('hide');
171
- });
172
- this.minimumControls.forEach((control) => {
173
- const element = document.querySelector(`.controls .${control}`);
174
- if (element) element.classList.add('hide');
175
- });
176
- }
177
-
178
- /**
179
- * Initialize the navigation bar (bottom)
180
- * @return {JQuery}
181
- */
182
- init() {
183
- const { br } = this;
184
- const { navbarTitle: title } = br.options;
185
- const isRTL = br.pageProgression === 'rl';
186
- const bookFlipLeft = isRTL ? 'book_flip_next' : 'book_flip_prev';
187
- const bookFlipRight = isRTL ? 'book_flip_prev' : 'book_flip_next';
188
-
189
- this.br.options.controls['bookLeft'].className = `book_left ${bookFlipLeft}`;
190
- this.br.options.controls['bookRight'].className = `book_right ${bookFlipRight}`;
191
-
192
- br.refs.$BRfooter = this.$root = $(`<div class="BRfooter"></div>`);
193
- br.refs.$BRnav = this.$nav = $(
194
- `<div class="BRnav BRnavDesktop">
195
- ${title ? `<div class="BRnavTitle">${title}</div>` : ''}
196
- <nav class="BRcontrols">
197
- <ul class="controls">
198
- <li class="scrubber">
199
- <div class="BRnavpos">
200
- <div class="BRpager"></div>
201
- <div class="BRnavline"></div>
202
- </div>
203
- <p><span class='BRcurrentpage'></span></p>
204
- </li>
205
- ${this._renderControls()}
206
- </ul>
207
- </nav>
208
- </div>`);
209
-
210
- this.$root.append(this.$nav);
211
- br.refs.$br.append(this.$root);
212
-
213
- const $slider = this.$root.find('.BRpager').slider({
214
- animate: true,
215
- min: 0,
216
- max: br.getNumLeafs() - 1,
217
- value: br.currentIndex(),
218
- range: "min"
219
- });
220
-
221
- $slider.on('slide', (event, ui) => {
222
- this.updateNavPageNum(ui.value);
223
- return true;
224
- });
225
-
226
- $slider.on('slidechange', (event, ui) => {
227
- this.updateNavPageNum(ui.value);
228
- // recursion prevention for jumpToIndex
229
- if ($slider.data('swallowchange')) {
230
- $slider.data('swallowchange', false);
231
- } else {
232
- br.jumpToIndex(ui.value);
233
- }
234
- return true;
235
- });
236
-
237
- br.options.controls.viewmode.visible && this._bindViewModeButton();
238
- this.updateNavPageNum(br.currentIndex());
239
-
240
- return this.$nav;
241
- }
242
-
243
- /**
244
- * Returns the textual representation of the current page for the navbar
245
- * @param {number} index
246
- * @return {string}
247
- */
248
- getNavPageNumString(index) {
249
- const { br } = this;
250
- // Accessible index starts at 0 (alas) so we add 1 to make human
251
- const pageNum = br.getPageNum(index);
252
- const pageType = br.getPageProp(index, 'pageType');
253
- const numLeafs = br.getNumLeafs();
254
-
255
- if (!this.maxPageNum) {
256
- // Calculate Max page num (used for pagination display)
257
- let maxPageNum = 0;
258
- let pageNumVal;
259
- for (let i = 0; i < numLeafs; i++) {
260
- pageNumVal = br.getPageNum(i);
261
- if (!isNaN(pageNumVal) && pageNumVal > maxPageNum) {
262
- maxPageNum = pageNumVal;
263
- }
264
- }
265
- this.maxPageNum = maxPageNum;
266
- }
267
-
268
- return getNavPageNumHtml(index, numLeafs, pageNum, pageType, this.maxPageNum);
269
- }
270
-
271
- /**
272
- * Renders the navbar string to the DOM
273
- * @param {number} index
274
- */
275
- updateNavPageNum(index) {
276
- this.$root.find('.BRcurrentpage').html(this.getNavPageNumString(index));
277
- }
278
-
279
- /**
280
- * Update the nav bar display - does not cause navigation.
281
- * @param {number} index
282
- */
283
- updateNavIndex(index) {
284
- // We want to update the value, but normally moving the slider
285
- // triggers jumpToIndex which triggers this method
286
- index = index !== undefined ? index : this.br.currentIndex();
287
- this.$root.find('.BRpager').data('swallowchange', true).slider('value', index);
288
- }
289
- }
290
-
291
- /**
292
- * Renders the html for the page string
293
- * @param {number} index
294
- * @param {number} numLeafs
295
- * @param {number|string} pageNum
296
- * @param {*} pageType @deprecated
297
- * @param {number} maxPageNum
298
- * @return {string}
299
- */
300
- export function getNavPageNumHtml(index, numLeafs, pageNum, pageType, maxPageNum) {
301
- const pageIsAsserted = pageNum[0] != 'n';
302
-
303
- if (!pageIsAsserted) {
304
- const pageIndex = index + 1;
305
- return `(${pageIndex} of ${numLeafs})`; // Page (8 of 10)
306
- }
307
-
308
- const bookLengthLabel = maxPageNum ? ` of ${maxPageNum}` : '';
309
- return `${pageNum}${bookLengthLabel}`;
310
- }
@@ -1,120 +0,0 @@
1
- // @ts-check
2
- /** @typedef {import('./BookModel.js').PageModel} PageModel */
3
- /** @typedef {import('./ImageCache.js').ImageCache} ImageCache */
4
-
5
-
6
- export class PageContainer {
7
- /**
8
- * @param {PageModel} page
9
- * @param {object} opts
10
- * @param {boolean} opts.isProtected Whether we're in a protected book
11
- * @param {ImageCache} opts.imageCache
12
- * @param {string} opts.loadingImage
13
- */
14
- constructor(page, {isProtected, imageCache, loadingImage}) {
15
- this.page = page;
16
- this.imageCache = imageCache;
17
- this.loadingImage = loadingImage;
18
- this.$container = $('<div />', {
19
- 'class': `BRpagecontainer ${page ? `pagediv${page.index}` : 'BRemptypage'}`,
20
- css: { position: 'absolute' },
21
- }).attr('data-side', page?.pageSide);
22
-
23
- if (isProtected) {
24
- this.$container.append($('<div class="BRscreen" />'));
25
- this.$container.addClass('protected');
26
- }
27
-
28
- /** @type {JQuery<HTMLImageElement>} The main book page image */
29
- this.$img = null;
30
- }
31
-
32
- /**
33
- * @param {object} param0
34
- * @param {{ width: number, height: number, top: number, left: number }} [param0.dimensions]
35
- * @param {number} param0.reduce
36
- */
37
- update({dimensions = null, reduce = null}) {
38
- if (dimensions) {
39
- this.$container.css(dimensions);
40
- }
41
-
42
- if (reduce == null || !this.page) {
43
- return;
44
- }
45
-
46
- const alreadyLoaded = this.imageCache.imageLoaded(this.page.index, reduce);
47
- const nextBestLoadedReduce = !alreadyLoaded && this.imageCache.getBestLoadedReduce(this.page.index, reduce);
48
-
49
- // Add the actual, highres image
50
- this.$img?.remove();
51
- this.$img = this.imageCache
52
- .image(this.page.index, reduce)
53
- .prependTo(this.$container);
54
-
55
- const backgroundLayers = [];
56
- if (!alreadyLoaded) {
57
- this.$container.addClass('BRpageloading');
58
- backgroundLayers.push(`url("${this.loadingImage}") center/20px no-repeat`);
59
- }
60
- if (nextBestLoadedReduce) {
61
- backgroundLayers.push(`url("${this.page.getURI(nextBestLoadedReduce, 0)}") center/100% 100% no-repeat`);
62
- }
63
-
64
- if (!alreadyLoaded) {
65
- this.$img
66
- .css('background', backgroundLayers.join(','))
67
- .one('loadend', async (ev) => {
68
- $(ev.target).css({ 'background': '' });
69
- $(ev.target).parent().removeClass('BRpageloading');
70
- });
71
- }
72
-
73
- return this;
74
- }
75
- }
76
-
77
-
78
- /**
79
- * @param {PageModel} page
80
- * @param {string} className
81
- */
82
- export function createSVGPageLayer(page, className) {
83
- const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
84
- svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
85
- svg.setAttribute("viewBox", `0 0 ${page.width} ${page.height}`);
86
- svg.setAttribute('class', `BRPageLayer ${className}`);
87
- svg.setAttribute('preserveAspectRatio', 'none');
88
- return svg;
89
- }
90
-
91
- /**
92
- * @param {{ l: number, r: number, b: number, t: number }} box
93
- */
94
- export function boxToSVGRect({ l: left, r: right, b: bottom, t: top }) {
95
- const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
96
- rect.setAttribute("x", left.toString());
97
- rect.setAttribute("y", top.toString());
98
- rect.setAttribute("width", (right - left).toString());
99
- rect.setAttribute("height", (bottom - top).toString());
100
- return rect;
101
- }
102
-
103
- /**
104
- * @param {string} layerClass
105
- * @param {Array<{ l: number, r: number, b: number, t: number }>} boxes
106
- * @param {PageModel} page
107
- * @param {HTMLElement} containerEl
108
- */
109
- export function renderBoxesInPageContainerLayer(layerClass, boxes, page, containerEl) {
110
- const mountedSvg = containerEl.querySelector(`.${layerClass}`);
111
- // Create the layer if it's not there
112
- const svg = mountedSvg || createSVGPageLayer(page, layerClass);
113
- if (!mountedSvg) {
114
- // Insert after the image if the image is already loaded.
115
- const imgEl = containerEl.querySelector('.BRpageimage');
116
- if (imgEl) $(svg).insertAfter(imgEl);
117
- else $(svg).prependTo(containerEl);
118
- }
119
- boxes.forEach(box => svg.appendChild(boxToSVGRect(box)));
120
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * @typedef {object} ReduceSet Set of valid numbers for a reduce variable.
3
- * @property {(n: number) => number} floor
4
- * @property {(n: number) => number} decr Return the predecessor of the given element
5
- */
6
-
7
- /** @type {ReduceSet} */
8
- export const IntegerReduceSet = {
9
- floor: Math.floor,
10
- decr(n) { return n - 1; }
11
- };
12
-
13
- /** @type {ReduceSet} */
14
- export const Pow2ReduceSet = {
15
- floor(n) {
16
- return 2 ** (Math.floor(Math.log2(Math.max(1, n))));
17
- },
18
- decr(n) {
19
- return 2 ** (Math.log2(n) - 1);
20
- }
21
- };
22
-
23
- export const NAMED_REDUCE_SETS = {
24
- pow2: Pow2ReduceSet,
25
- integer: IntegerReduceSet,
26
- };