@internetarchive/bookreader 5.0.0-38 → 5.0.0-39

Sign up to get free protection for your applications and to get access to all the features.
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,324 +0,0 @@
1
- /** @typedef {import('./BookModel.js').PageNumString} PageNumString */
2
- /** @typedef {import('./BookModel.js').LeafNum} LeafNum */
3
-
4
- export const DEFAULT_OPTIONS = {
5
- /**
6
- * @type {string} A string, such as "mode/1up". See
7
- * http://openlibrary.org/dev/docs/bookurls for valid syntax
8
- */
9
- defaults: null,
10
-
11
- /** Padding in 1up */
12
- padding: 10,
13
-
14
- /** @type {'full' | 'embed' | 'responsive'} UI mode */
15
- ui: 'full',
16
-
17
- /** Controls whether nav/toolbar will autohide */
18
- uiAutoHide: false,
19
-
20
- /** thumbnail mode */
21
- /** number of rows to pre-cache out a view */
22
- thumbRowBuffer: 1,
23
- thumbColumns: 6,
24
- /** number of thumbnails to load at once */
25
- thumbMaxLoading: 4,
26
- /** spacing between thumbnails */
27
- thumbPadding: 10,
28
- /** min zoom in columns */
29
- thumbMinZoomColumns: 2,
30
- /** max zoom out columns */
31
- thumbMaxZoomColumns: 8,
32
-
33
- /** @type {number | 'fast' | 'slow'} speed for flip animation */
34
- flipSpeed: 'fast',
35
-
36
- showToolbar: true,
37
- showNavbar: true,
38
- navBarTitle: '',
39
-
40
- showLogo: true,
41
- /** Where the logo links to */
42
- logoURL: 'https://archive.org',
43
-
44
- /**
45
- * Base URL for UI images - should be overridden (before init) by
46
- * custom implementations.
47
- * $$$ This is the same directory as the images referenced by relative
48
- * path in the CSS. Would be better to automagically find that path.
49
- */
50
- imagesBaseURL: '/BookReader/images/',
51
-
52
- /** @type {'pow2' | 'integer'} What reduces are valid for getURI. */
53
- reduceSet: 'pow2',
54
-
55
- /**
56
- * Zoom levels
57
- * @type {ReductionFactor[]}
58
- * $$$ provide finer grained zooming, {reduce: 8, autofit: null}, {reduce: 16, autofit: null}
59
- * The autofit code ensures that fit to width and fit to height will be available
60
- */
61
- reductionFactors: [
62
- {reduce: 0.25, autofit: null},
63
- {reduce: 0.5, autofit: null},
64
- {reduce: 1, autofit: null},
65
- {reduce: 2, autofit: null},
66
- {reduce: 3, autofit: null},
67
- {reduce: 4, autofit: null},
68
- {reduce: 6, autofit: null}
69
- ],
70
-
71
- /** Object to hold parameters related to 1up mode */
72
- onePage: {
73
- /** @type {AutoFitValues} */
74
- autofit: 'auto',
75
- },
76
-
77
- /** Object to hold parameters related to 2up mode */
78
- twoPage: {
79
- /** Width of cover */
80
- coverInternalPadding: 0,
81
- /** Padding outside of cover */
82
- coverExternalPadding: 0,
83
- /** Width of book spine $$$ consider sizing based on book length */
84
- bookSpineDivWidth: 64,
85
- /** @type {AutoFitValues} */
86
- autofit: 'auto'
87
- },
88
-
89
- onePageMinBreakpoint: 800,
90
-
91
- bookTitle: '',
92
- /** @type {string} */
93
- bookUrl: null,
94
- /** @type {string} */
95
- bookUrlText: null,
96
- /** @type {string} */
97
- bookUrlTitle: null,
98
- enableBookTitleLink: true,
99
- /**
100
- * @type {string} language in ISO 639-1 (PRIVATE: Will also
101
- * handle language name in English, native name, 639-2/T, or 639-2/B . (archive.org books
102
- * appear to use 639-2/B ? But I don't think that's a guarantee). See
103
- * https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes ) */
104
- bookLanguage: null,
105
-
106
- /**
107
- * @type {Array<{label: string, value: *, extraValueClass: string?}>}
108
- * Fields used to populate the info window
109
- * @example [
110
- * {label: 'Title', value: 'Open Library BookReader Presentation'},
111
- * {label: 'Author', value: 'Internet Archive'},
112
- * {label: 'Demo Info', value: 'This demo shows how one could use BookReader with their own content.'},
113
- * ]
114
- **/
115
- metadata: [],
116
- /** @type {string} */
117
- thumbnail: null,
118
- /** @type {string} */
119
- bookUrlMoreInfo: null,
120
-
121
- /** Experimental Controls (eg b/w) */
122
- enableExperimentalControls: false,
123
-
124
- /** CSS selectors */
125
- /** Where BookReader mounts to */
126
- el: '#BookReader',
127
-
128
- /** @type {'lr' | 'rl'} Page progression */
129
- pageProgression: 'lr',
130
-
131
- /** The PPI the book is scanned at **/
132
- ppi: 500,
133
-
134
- /** Should image downloads be blocked */
135
- protected: false,
136
-
137
- /**
138
- * Settings for individual plugins. Note they have to be imported first.
139
- * WIP: Most plugins just put their options anywhere in this global options file,
140
- * but going forward we'll keep them here.
141
- **/
142
- plugins: {
143
- /** @type {import('../plugins/plugin.text_selection.js').TextSelectionPluginOptions} */
144
- textSelection: null,
145
- },
146
-
147
- /**
148
- * Any variables you want to define. If an option has a StringWithVars type, or
149
- * has something like `{{server}}/foo.com` in its value, these variables replace
150
- * the `{{foo}}`.
151
- * @type { {[var_name: string]: any } }
152
- */
153
- vars: {},
154
-
155
- /**
156
- * @type {Array<[PageData, PageData]|[PageData]>}
157
- * Data is a simple way to populate the bookreader
158
- *
159
- * Example:
160
- * ```
161
- * [
162
- * // Each child is a spread
163
- * [
164
- * {
165
- * width: 123,
166
- * height: 123,
167
- * // Optional: If not provided, include a getPageURI
168
- * uri: 'https://archive.org/image.jpg',
169
- * // Optional: Shown instead of leaf number if present.
170
- * pageNum: '1'
171
- * },
172
- * {width: 123, height: 123, uri: 'https://archive.org/image2.jpg', pageNum: '2'},
173
- * ]
174
- * ],
175
- * ```
176
- *
177
- * Note if URI is omitted, a custom getPageURI can be provided. This allows the page
178
- * URI to the result of a function, which allows for things such as dynamic
179
- * page scaling.
180
- */
181
- data: [],
182
-
183
- /** Advanced methods for page rendering */
184
- /** @type {() => number} */
185
- getNumLeafs: null,
186
- /** @type {(index: number) => number} */
187
- getPageWidth: null,
188
- /** @type {(index: number) => number} */
189
- getPageHeight: null,
190
- /** @type {(index: number, reduce: number, rotate: number) => *} */
191
- getPageURI: null,
192
-
193
- /**
194
- * @type {(index: number) => 'L' | 'R'}
195
- * Return which side, left or right, that a given page should be displayed on
196
- */
197
- getPageSide: null,
198
-
199
- /**
200
- * @type {(pindex: number) => [number, number]}
201
- * This function returns the left and right indices for the user-visible
202
- * spread that contains the given index. The return values may be
203
- * null if there is no facing page or the index is invalid.
204
- */
205
- getSpreadIndices: null,
206
-
207
- /** @type {(index: number) => string} */
208
- getPageNum: null,
209
- /** @type {(index: number) => *} */
210
- getPageProp: null,
211
- /** @type {(index: number) => number} */
212
- leafNumToIndex: null,
213
-
214
- /**
215
- * @type {(frameWidth: number|string, frameHeight: number|string, viewParams) => *}
216
- * Optional: if present, and embed code will be shown in the share dialog
217
- */
218
- getEmbedCode: null,
219
-
220
- controls: {
221
- bookLeft: {
222
- visible: true,
223
- label: 'Flip left',
224
- className: 'book_left',
225
- iconClassName: 'left-arrow'
226
- },
227
- bookRight: {
228
- visible: true,
229
- label: 'Flip right',
230
- className: 'book_right',
231
- iconClassName: 'left-arrow hflip'
232
- },
233
- onePage: {
234
- visible: true,
235
- label: 'One-page view',
236
- className: 'onepg',
237
- iconClassName: 'onepg'
238
- },
239
- twoPage: {
240
- visible: true,
241
- label: 'Two-page view',
242
- className: 'twopg',
243
- iconClassName: 'twopg'
244
- },
245
- thumbnail: {
246
- visible: true,
247
- label: 'Thumbnail view',
248
- className: 'thumb',
249
- iconClassName: 'thumb'
250
- },
251
- viewmode: {
252
- visible: true,
253
- className: 'viewmode',
254
- excludedModes: [],
255
- },
256
- zoomOut: {
257
- visible: true,
258
- label: 'Zoom out',
259
- className: 'zoom_out',
260
- iconClassName: 'magnify'
261
- },
262
- zoomIn: {
263
- visible: true,
264
- label: 'Zoom in',
265
- className: 'zoom_in',
266
- iconClassName: 'magnify plus'
267
- },
268
- fullScreen: {
269
- visible: true,
270
- label: 'Toggle fullscreen',
271
- className: 'full',
272
- iconClassName: 'fullscreen'
273
- },
274
- },
275
-
276
- /**
277
- * @type {Boolean}
278
- * Optional: if true, starts in fullscreen mode
279
- */
280
- startFullscreen: false,
281
-
282
- /**
283
- * @type {Boolean}
284
- * On init, by default, we want to handle resizing bookreader
285
- * when browser window changes size (inc. `orientationchange` event)
286
- * toggle off if you want to handle this outside of bookreader
287
- */
288
- autoResize: true,
289
-
290
- /**
291
- * @type {Boolean}
292
- * On init, by default, we want to use srcSet for images
293
- */
294
- useSrcSet: false,
295
- };
296
-
297
- /** @typedef {'width' | 'height' | 'auto' | 'none'} AutoFitValues */
298
-
299
- /**
300
- * @typedef {object} ReductionFactor
301
- * @property {number} reduce
302
- * @property {AutoFitValues} [autofit] If set, the corresponding reduction factors
303
- * are what will be used when the user tries to autofit by width/height.
304
- */
305
-
306
- /**
307
- * @typedef {Object} PageData
308
- * @property {number} width
309
- * @property {number} height
310
- * @property {string} [uri] If not provided, include a getPageURI
311
- * @property {PageNumString} [pageNum] Shown instead of leaf number if present
312
- * @property {LeafNum} [leafNum] Sometimes specified in Internet Archive books
313
- * @property {number} [ppi] The resolution of the page if different from {@see BookReaderOptions.ppi}
314
- * @property {'L' | 'R'} [pageSide] PRIVATE; computed automatically
315
- * @property {boolean} [viewable=true] Set false if page is not viewable. Displays a dummy preview image.
316
- * @property {number} [unviewablesStart] PRIVATE; index where the chunk of unviewable pages started
317
- *
318
- * Note if URI is omitted, a custom getPageURI can be provided. This allows the page
319
- * URI to the result of a function, which allows for things such as dynamic
320
- * page scaling.
321
- */
322
-
323
- /** @typedef {typeof DEFAULT_OPTIONS} BookReaderOptions */
324
-
@@ -1,44 +0,0 @@
1
- // @ts-check
2
- import { debounce } from '../utils';
3
-
4
- /**
5
- * Computing these things repeatedly is expensive (the browser needs to
6
- * do a lot of computations/redrawing to make sure these are correct),
7
- * so we store them here, and only recompute them when necessary:
8
- * - window resize could have cause the container to change size
9
- * - zoom could have cause scrollbars to appear/disappear, changing
10
- * the client size.
11
- */
12
- export class HTMLDimensionsCacher {
13
- clientWidth = 100;
14
- clientHeight = 100;
15
-
16
- boundingClientRect = { top: 0, left: 0 };
17
-
18
- /**
19
- * @param {HTMLElement} element
20
- */
21
- constructor(element) {
22
- /** @type {HTMLElement} */
23
- this.element = element;
24
- }
25
-
26
- updateClientSizes = () => {
27
- const bc = this.element.getBoundingClientRect();
28
- this.clientWidth = this.element.clientWidth;
29
- this.clientHeight = this.element.clientHeight;
30
- this.boundingClientRect.top = bc.top;
31
- this.boundingClientRect.left = bc.left;
32
- }
33
- debouncedUpdateClientSizes = debounce(this.updateClientSizes, 150, false);
34
-
35
- /** @param {EventTarget} win */
36
- attachResizeListener(win = window) {
37
- win.addEventListener('resize', this.debouncedUpdateClientSizes);
38
- }
39
-
40
- /** @param {EventTarget} win */
41
- detachResizeListener(win = window) {
42
- win.removeEventListener('resize', this.debouncedUpdateClientSizes);
43
- }
44
- }
@@ -1,36 +0,0 @@
1
- /**
2
- * Exposes a function from one class (FromClass) to another (ToClass), in such a way
3
- * that if the ToClass's method is overridden, the FromClass's method is also overridden.
4
- * WARNING: This modifies FromClass' prototype! So FromClasses cannot be shared between
5
- * different ToClasses.
6
- * @param {new () => TFrom} FromClass the class to get the method from
7
- * @param {keyof TFrom} fromMethod the method's name in FromClass
8
- * @param {function(TFrom): TTo} fromTransform how to get the TTo `this` to use when setting the method on TFrom
9
- * @param {new () => TTo} ToClass the class to add the method to
10
- * @param {string} toMethod the name of the method to add to TTo (likely will be equal to fromMethod)
11
- * @param {function(TTo): TFrom} toTransform how to get the TFrom this to use when calling the new method
12
- * @template TFrom type of FromClass for type-checking/autocomplete
13
- * @template TTo type of ToClass for type-checking/autocomplete
14
- */
15
- export function exposeOverrideable(FromClass, fromMethod, fromTransform, ToClass, toMethod, toTransform) {
16
- // Wrapper function needed to "capture" the current version of fromMethod
17
- let wrapper = (fn => {
18
- return function () {
19
- return fn.apply(toTransform(this), arguments);
20
- };
21
- })(FromClass.prototype[fromMethod]);
22
-
23
- Object.defineProperty(ToClass.prototype, toMethod, {
24
- get() { return wrapper; },
25
- set(overrideFn) {
26
- // overrideFn expects `this` to be ToClass, so ensure as such
27
- // But we can also call this method from FromClass; need to ensure
28
- // it's always called with a ToClass
29
- FromClass.prototype[fromMethod] = function () {
30
- const newThis = this instanceof FromClass ? fromTransform(this) : this;
31
- return overrideFn.apply(newThis, arguments);
32
- };
33
- wrapper = overrideFn;
34
- }
35
- });
36
- }
@@ -1,240 +0,0 @@
1
- /**
2
- * Bind mouse handlers
3
- * Disable mouse click to avoid selected/highlighted page images
4
- * @param {JQuery} jObject
5
- */
6
- export function disableSelect(jObject) {
7
- // $$$ check here for right-click and don't disable. Also use jQuery style
8
- // for stopping propagation. See https://bugs.edge.launchpad.net/gnubook/+bug/362626
9
- jObject.bind('mousedown', () => false);
10
- // Special hack for IE7
11
- jObject[0].onselectstart = () => false;
12
- }
13
-
14
- /**
15
- * @param {number} value
16
- * @param {number} min
17
- * @param {number} max
18
- * @return {number}
19
- */
20
- export function clamp(value, min, max) {
21
- return Math.min(Math.max(value, min), max);
22
- }
23
-
24
- /**
25
- * Given value and maximum, calculate a percentage suitable for CSS
26
- * @param {number} value
27
- * @param {number} max
28
- * @return {string}
29
- */
30
- export function cssPercentage(value, max) {
31
- return ((value / max) * 100) + '%';
32
- }
33
-
34
- /**
35
- * @param {*} value
36
- * @param {Array} array
37
- * @return {boolean}
38
- */
39
- export function notInArray(value, array) {
40
- return !array.includes(value);
41
- }
42
-
43
- /**
44
- * Determines the active element, going into shadow doms.
45
- * @return {Element}
46
- */
47
- export function getActiveElement(doc = document, recurseShadowDom = true) {
48
- const activeElement = doc.activeElement;
49
- if (recurseShadowDom && activeElement?.shadowRoot) {
50
- return getActiveElement(activeElement.shadowRoot, true);
51
- }
52
- return activeElement;
53
- }
54
-
55
- /** Check if an input field/textarea is active. Also checks shadow DOMs. */
56
- export function isInputActive(doc = document) {
57
- const activeEl = getActiveElement(doc);
58
- return activeEl?.tagName == "INPUT" || activeEl?.tagName == "TEXTAREA";
59
- }
60
-
61
- /**
62
- * @param {HTMLIFrameElement} iframe
63
- * @return {Document}
64
- */
65
- export function getIFrameDocument(iframe) {
66
- // Adapted from http://xkr.us/articles/dom/iframe-document/
67
- const outer = iframe.contentWindow || iframe.contentDocument;
68
- return outer.document || outer;
69
- }
70
-
71
- /**
72
- * @param {string} str
73
- * @return {string}
74
- */
75
- export function escapeHTML(str) {
76
- return str.replace(/&/g,'&amp;')
77
- .replace(/>/g,'&gt;')
78
- .replace(/</g,'&lt;')
79
- .replace(/"/g,'&quot;');
80
- }
81
-
82
- /**
83
- * Decodes a URI component and converts '+' to ' '
84
- * @param {string} value
85
- * @return {string}
86
- */
87
- export function decodeURIComponentPlus(value) {
88
- return decodeURIComponent(value).replace(/\+/g, ' ');
89
- }
90
-
91
- /**
92
- * Encodes a URI component and converts ' ' to '+'
93
- * @param {string|number|boolean} value
94
- * @return {string};
95
- */
96
- export function encodeURIComponentPlus(value) {
97
- return encodeURIComponent(value).replace(/%20/g, '+');
98
- }
99
-
100
- /**
101
- * @template {Function} T
102
- * Returns a function, that, as long as it continues to be invoked, will not
103
- * be triggered. The function will be called after it stops being called for
104
- * N milliseconds. If `immediate` is passed, trigger the function on the
105
- * leading edge, instead of the trailing.
106
- * @see https://davidwalsh.name/javascript-debounce-function
107
- *
108
- * @param {T} func
109
- * @param {number} wait
110
- * @param {boolean} immediate
111
- * @return {T}
112
- */
113
- export function debounce(func, wait, immediate) {
114
- let timeout;
115
- return function() {
116
- const context = this;
117
- const args = arguments;
118
- const later = () => {
119
- timeout = null;
120
- if (!immediate) func.apply(context, args);
121
- };
122
- const callNow = immediate && !timeout;
123
- clearTimeout(timeout);
124
- timeout = setTimeout(later, wait);
125
- if (callNow) func.apply(context, args);
126
- };
127
- }
128
-
129
- /**
130
- * @template T
131
- * Throttle function
132
- * @see https://remysharp.com/2010/07/21/throttling-function-calls
133
- * @param {T} fn
134
- * @param {number} threshold
135
- * @param {boolean} delay
136
- * @return {T}
137
- */
138
- export function throttle(fn, threshold, delay) {
139
- threshold || (threshold = 250);
140
- let last;
141
- let deferTimer;
142
- if (delay) last = +new Date;
143
- return function () {
144
- const context = this;
145
- const now = +new Date;
146
- const args = arguments;
147
- if (last && now < last + threshold) {
148
- // hold on to it
149
- clearTimeout(deferTimer);
150
- deferTimer = setTimeout(() => {
151
- last = now;
152
- fn.apply(context, args);
153
- }, threshold);
154
- } else {
155
- last = now;
156
- fn.apply(context, args);
157
- }
158
- };
159
- }
160
-
161
- /**
162
- * FIXME we need a better way to do this :/ This is not automatically poly-filled by
163
- * core-js https://github.com/zloirock/core-js/issues/354
164
- * @param {Window} window
165
- */
166
- export function polyfillCustomEvent(window) {
167
- if (typeof window.CustomEvent === "function") return false;
168
- window.CustomEvent = PolyfilledCustomEvent;
169
- }
170
-
171
- /**
172
- * https://caniuse.com/customevent has issues on older browsers where it can't be
173
- * called as a constructor, so we have to use older methods.
174
- * @param {String} eventName
175
- * @return {CustomEvent}
176
- */
177
- export function PolyfilledCustomEvent(eventName, {bubbles = false, cancelable = false, detail = null} = {}) {
178
- const event = document.createEvent('CustomEvent');
179
- event.initCustomEvent(eventName, bubbles, cancelable, detail);
180
- return event;
181
- }
182
-
183
- /*
184
- * Returns the number pixels something should be rendered at to be ~1n on the users
185
- * screen when measured with a ruler.
186
- */
187
- export function calcScreenDPI() {
188
- const el = document.createElement('div');
189
- el.style.width = '1in';
190
- document.body.appendChild(el);
191
- const dpi = el.offsetWidth;
192
- document.body.removeChild(el);
193
-
194
- // Do you believe in magic... numbers? We tested on some devices, and the displayed
195
- // size of `width: 1in` was less than desired. On @pezvi's mac, it was ~75% ; on
196
- // @cdrini's laptop it was ~85%. Since we want to avoid things appearing too small,
197
- // let's just use a multiplier of 1.25
198
- const screenDPI = dpi * 1.25;
199
- // This will return 0 in testing; never want it to be 0!
200
- return screenDPI == 0 ? 100 : screenDPI;
201
- }
202
-
203
- /**
204
- * @param {number[]} nums
205
- * @returns {number}
206
- */
207
- export function sum(nums) {
208
- return nums.reduce((cur, acc) => cur + acc, 0);
209
- }
210
-
211
- /**
212
- * @template T
213
- * @param {Generator<T>} gen
214
- * @returns {T[]}
215
- */
216
- export function genToArray(gen) {
217
- const result = [];
218
- for (const item of gen) {
219
- result.push(item);
220
- }
221
- return result;
222
- }
223
-
224
- /**
225
- * Check if arrays contain the same elements. Does reference comparison.
226
- * @param {Array} arr1
227
- * @param {Array} arr2
228
- */
229
- export function arrEquals(arr1, arr2) {
230
- return arr1.length == arr2.length && arr1.every((x, i) => x == arr2[i]);
231
- }
232
-
233
- /**
234
- * Check if array has changed; namely to be used with lit's property.hasChanged
235
- * @param {Array} [arr1]
236
- * @param {Array} [arr2]
237
- */
238
- export function arrChanged(arr1, arr2) {
239
- return arr1 && arr2 && !arrEquals(arr1, arr2);
240
- }