@internetarchive/bookreader 5.0.0-88-alpha.10 → 5.0.0-88

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 (215) hide show
  1. package/BookReader/BookReader.css +3 -3
  2. package/BookReader/BookReader.js +1 -1
  3. package/BookReader/BookReader.js.map +1 -1
  4. package/BookReader/ia-bookreader-bundle.js +87 -108
  5. package/BookReader/ia-bookreader-bundle.js.map +1 -1
  6. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  7. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  8. package/BookReader/plugins/plugin.search.js +1 -1
  9. package/BookReader/plugins/plugin.search.js.map +1 -1
  10. package/BookReader/plugins/plugin.text_selection.js +1 -1
  11. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  12. package/BookReader/plugins/plugin.tts.js +1 -1
  13. package/BookReader/plugins/plugin.tts.js.map +1 -1
  14. package/BookReader/plugins/plugin.url.js +1 -1
  15. package/BookReader/plugins/plugin.url.js.map +1 -1
  16. package/CHANGELOG.md +4 -0
  17. package/babel.config.js +12 -30
  18. package/jsconfig.json +1 -3
  19. package/package.json +14 -16
  20. package/src/BookNavigator/search/search-results.js +1 -1
  21. package/src/BookReader/Mode1UpLit.js +56 -86
  22. package/src/BookReader/Mode2UpLit.js +2 -3
  23. package/src/BookReader/Navbar/Navbar.js +53 -11
  24. package/src/BookReader/options.js +3 -0
  25. package/src/BookReader.js +49 -1
  26. package/src/BookReaderPlugin.js +28 -0
  27. package/src/css/_BRnav.scss +0 -3
  28. package/src/css/_controls.scss +4 -0
  29. package/src/plugins/plugin.archive_analytics.js +84 -78
  30. package/src/plugins/plugin.chapters.js +17 -22
  31. package/src/plugins/plugin.text_selection.js +1 -1
  32. package/src/plugins/tts/plugin.tts.js +2 -2
  33. package/tests/jest/BookReader/Navbar/Navbar.test.js +16 -3
  34. package/tests/jest/plugins/plugin.archive_analytics.test.js +8 -11
  35. package/dist/esm/BookNavigator/assets/bookmark-colors.js +0 -4
  36. package/dist/esm/BookNavigator/assets/button-base.js +0 -4
  37. package/dist/esm/BookNavigator/assets/ia-logo.js +0 -4
  38. package/dist/esm/BookNavigator/assets/icon_checkmark.js +0 -8
  39. package/dist/esm/BookNavigator/assets/icon_close.js +0 -4
  40. package/dist/esm/BookNavigator/book-navigator.js +0 -612
  41. package/dist/esm/BookNavigator/bookmarks/bookmark-button.js +0 -35
  42. package/dist/esm/BookNavigator/bookmarks/bookmark-edit.js +0 -78
  43. package/dist/esm/BookNavigator/bookmarks/bookmarks-list.js +0 -160
  44. package/dist/esm/BookNavigator/bookmarks/bookmarks-loginCTA.js +0 -24
  45. package/dist/esm/BookNavigator/bookmarks/bookmarks-provider.js +0 -55
  46. package/dist/esm/BookNavigator/bookmarks/ia-bookmarks.js +0 -521
  47. package/dist/esm/BookNavigator/delete-modal-actions.js +0 -29
  48. package/dist/esm/BookNavigator/downloads/downloads-provider.js +0 -84
  49. package/dist/esm/BookNavigator/downloads/downloads.js +0 -69
  50. package/dist/esm/BookNavigator/search/search-provider.js +0 -238
  51. package/dist/esm/BookNavigator/search/search-results.js +0 -161
  52. package/dist/esm/BookNavigator/sharing.js +0 -26
  53. package/dist/esm/BookNavigator/viewable-files.js +0 -94
  54. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments-provider.js +0 -83
  55. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments.js +0 -131
  56. package/dist/esm/BookReader/BookModel.js +0 -575
  57. package/dist/esm/BookReader/DragScrollable.js +0 -224
  58. package/dist/esm/BookReader/ImageCache.js +0 -122
  59. package/dist/esm/BookReader/Mode1Up.js +0 -114
  60. package/dist/esm/BookReader/Mode1UpLit.js +0 -579
  61. package/dist/esm/BookReader/Mode2Up.js +0 -106
  62. package/dist/esm/BookReader/Mode2UpLit.js +0 -1020
  63. package/dist/esm/BookReader/ModeCoordinateSpace.js +0 -28
  64. package/dist/esm/BookReader/ModeSmoothZoom.js +0 -318
  65. package/dist/esm/BookReader/ModeThumb.js +0 -366
  66. package/dist/esm/BookReader/Navbar/Navbar.js +0 -253
  67. package/dist/esm/BookReader/PageContainer.js +0 -165
  68. package/dist/esm/BookReader/ReduceSet.js +0 -27
  69. package/dist/esm/BookReader/Toolbar/Toolbar.js +0 -242
  70. package/dist/esm/BookReader/events.js +0 -20
  71. package/dist/esm/BookReader/options.js +0 -331
  72. package/dist/esm/BookReader/utils/HTMLDimensionsCacher.js +0 -48
  73. package/dist/esm/BookReader/utils/ScrollClassAdder.js +0 -31
  74. package/dist/esm/BookReader/utils/SelectionObserver.js +0 -42
  75. package/dist/esm/BookReader/utils/classes.js +0 -37
  76. package/dist/esm/BookReader/utils.js +0 -315
  77. package/dist/esm/BookReader.js +0 -1827
  78. package/dist/esm/assets/icons/1up.svg +0 -12
  79. package/dist/esm/assets/icons/2up.svg +0 -15
  80. package/dist/esm/assets/icons/advance.svg +0 -26
  81. package/dist/esm/assets/icons/chevron-right.svg +0 -1
  82. package/dist/esm/assets/icons/close-circle-dark.svg +0 -1
  83. package/dist/esm/assets/icons/close-circle.svg +0 -1
  84. package/dist/esm/assets/icons/fullscreen.svg +0 -17
  85. package/dist/esm/assets/icons/fullscreen_exit.svg +0 -17
  86. package/dist/esm/assets/icons/hamburger.svg +0 -15
  87. package/dist/esm/assets/icons/left-arrow.svg +0 -12
  88. package/dist/esm/assets/icons/magnify-minus.svg +0 -12
  89. package/dist/esm/assets/icons/magnify-plus.svg +0 -13
  90. package/dist/esm/assets/icons/magnify.svg +0 -15
  91. package/dist/esm/assets/icons/pause.svg +0 -23
  92. package/dist/esm/assets/icons/play.svg +0 -22
  93. package/dist/esm/assets/icons/playback-speed.svg +0 -34
  94. package/dist/esm/assets/icons/read-aloud.svg +0 -22
  95. package/dist/esm/assets/icons/review.svg +0 -22
  96. package/dist/esm/assets/icons/thumbnails.svg +0 -17
  97. package/dist/esm/assets/icons/voice.svg +0 -1
  98. package/dist/esm/assets/icons/volume-full.svg +0 -22
  99. package/dist/esm/assets/images/BRicons.png +0 -0
  100. package/dist/esm/assets/images/BRicons.svg +0 -94
  101. package/dist/esm/assets/images/BRicons_ia.png +0 -0
  102. package/dist/esm/assets/images/back_pages.png +0 -0
  103. package/dist/esm/assets/images/book_bottom_icon.png +0 -0
  104. package/dist/esm/assets/images/book_down_icon.png +0 -0
  105. package/dist/esm/assets/images/book_left_icon.png +0 -0
  106. package/dist/esm/assets/images/book_leftmost_icon.png +0 -0
  107. package/dist/esm/assets/images/book_right_icon.png +0 -0
  108. package/dist/esm/assets/images/book_rightmost_icon.png +0 -0
  109. package/dist/esm/assets/images/book_top_icon.png +0 -0
  110. package/dist/esm/assets/images/book_up_icon.png +0 -0
  111. package/dist/esm/assets/images/books_graphic.svg +0 -177
  112. package/dist/esm/assets/images/booksplit.png +0 -0
  113. package/dist/esm/assets/images/control_pause_icon.png +0 -0
  114. package/dist/esm/assets/images/control_play_icon.png +0 -0
  115. package/dist/esm/assets/images/embed_icon.png +0 -0
  116. package/dist/esm/assets/images/icon-home-ia.png +0 -0
  117. package/dist/esm/assets/images/icon_OL-logo-xs.png +0 -0
  118. package/dist/esm/assets/images/icon_alert-xs.png +0 -0
  119. package/dist/esm/assets/images/icon_book.svg +0 -12
  120. package/dist/esm/assets/images/icon_bookmark.svg +0 -12
  121. package/dist/esm/assets/images/icon_close-pop.png +0 -0
  122. package/dist/esm/assets/images/icon_download.png +0 -0
  123. package/dist/esm/assets/images/icon_gear.svg +0 -14
  124. package/dist/esm/assets/images/icon_hamburger.svg +0 -20
  125. package/dist/esm/assets/images/icon_home.png +0 -0
  126. package/dist/esm/assets/images/icon_home.svg +0 -21
  127. package/dist/esm/assets/images/icon_home_ia.png +0 -0
  128. package/dist/esm/assets/images/icon_indicator.png +0 -0
  129. package/dist/esm/assets/images/icon_info.svg +0 -11
  130. package/dist/esm/assets/images/icon_one_page.svg +0 -8
  131. package/dist/esm/assets/images/icon_pause.svg +0 -1
  132. package/dist/esm/assets/images/icon_play.svg +0 -1
  133. package/dist/esm/assets/images/icon_playback-rate.svg +0 -15
  134. package/dist/esm/assets/images/icon_return.png +0 -0
  135. package/dist/esm/assets/images/icon_search_button.svg +0 -8
  136. package/dist/esm/assets/images/icon_share.svg +0 -9
  137. package/dist/esm/assets/images/icon_skip-ahead.svg +0 -6
  138. package/dist/esm/assets/images/icon_skip-back.svg +0 -13
  139. package/dist/esm/assets/images/icon_speaker.svg +0 -18
  140. package/dist/esm/assets/images/icon_speaker_open.svg +0 -10
  141. package/dist/esm/assets/images/icon_thumbnails.svg +0 -12
  142. package/dist/esm/assets/images/icon_toc.svg +0 -5
  143. package/dist/esm/assets/images/icon_two_pages.svg +0 -9
  144. package/dist/esm/assets/images/icon_zoomer.png +0 -0
  145. package/dist/esm/assets/images/loading.gif +0 -0
  146. package/dist/esm/assets/images/logo_icon.png +0 -0
  147. package/dist/esm/assets/images/marker_chap-off.png +0 -0
  148. package/dist/esm/assets/images/marker_chap-off.svg +0 -11
  149. package/dist/esm/assets/images/marker_chap-off_ia.png +0 -0
  150. package/dist/esm/assets/images/marker_chap-on.png +0 -0
  151. package/dist/esm/assets/images/marker_chap-on.svg +0 -11
  152. package/dist/esm/assets/images/marker_srch-on.svg +0 -11
  153. package/dist/esm/assets/images/marker_srchchap-off.png +0 -0
  154. package/dist/esm/assets/images/marker_srchchap-on.png +0 -0
  155. package/dist/esm/assets/images/nav_control-dn.png +0 -0
  156. package/dist/esm/assets/images/nav_control-dn_ia.png +0 -0
  157. package/dist/esm/assets/images/nav_control-up.png +0 -0
  158. package/dist/esm/assets/images/nav_control-up_ia.png +0 -0
  159. package/dist/esm/assets/images/nav_control.png +0 -0
  160. package/dist/esm/assets/images/one_page_mode_icon.png +0 -0
  161. package/dist/esm/assets/images/paper-badge.png +0 -0
  162. package/dist/esm/assets/images/print_icon.png +0 -0
  163. package/dist/esm/assets/images/progressbar.gif +0 -0
  164. package/dist/esm/assets/images/right_edges.png +0 -0
  165. package/dist/esm/assets/images/slider.png +0 -0
  166. package/dist/esm/assets/images/slider_ia.png +0 -0
  167. package/dist/esm/assets/images/thumbnail_mode_icon.png +0 -0
  168. package/dist/esm/assets/images/transparent.png +0 -0
  169. package/dist/esm/assets/images/two_page_mode_icon.png +0 -0
  170. package/dist/esm/assets/images/unviewable_page.png +0 -0
  171. package/dist/esm/assets/images/zoom_in_icon.png +0 -0
  172. package/dist/esm/assets/images/zoom_out_icon.png +0 -0
  173. package/dist/esm/css/BookReader.scss +0 -85
  174. package/dist/esm/css/_BRBookmarks.scss +0 -29
  175. package/dist/esm/css/_BRComponent.scss +0 -13
  176. package/dist/esm/css/_BRfloat.scss +0 -197
  177. package/dist/esm/css/_BRicon.scss +0 -54
  178. package/dist/esm/css/_BRmain.scss +0 -262
  179. package/dist/esm/css/_BRnav.scss +0 -354
  180. package/dist/esm/css/_BRpages.scss +0 -213
  181. package/dist/esm/css/_BRsearch.scss +0 -268
  182. package/dist/esm/css/_BRtoolbar.scss +0 -84
  183. package/dist/esm/css/_BRvendor.scss +0 -5
  184. package/dist/esm/css/_TextSelection.scss +0 -108
  185. package/dist/esm/css/_colorbox.scss +0 -52
  186. package/dist/esm/css/_controls.scss +0 -257
  187. package/dist/esm/css/_icons.scss +0 -121
  188. package/dist/esm/ia-bookreader/ia-bookreader.js +0 -141
  189. package/dist/esm/jquery-wrapper.js +0 -3
  190. package/dist/esm/plugins/plugin.archive_analytics.js +0 -72
  191. package/dist/esm/plugins/plugin.autoplay.js +0 -119
  192. package/dist/esm/plugins/plugin.chapters.js +0 -288
  193. package/dist/esm/plugins/plugin.iframe.js +0 -44
  194. package/dist/esm/plugins/plugin.iiif.js +0 -146
  195. package/dist/esm/plugins/plugin.resume.js +0 -66
  196. package/dist/esm/plugins/plugin.text_selection.js +0 -621
  197. package/dist/esm/plugins/plugin.vendor-fullscreen.js +0 -227
  198. package/dist/esm/plugins/search/plugin.search.js +0 -499
  199. package/dist/esm/plugins/search/utils.js +0 -42
  200. package/dist/esm/plugins/search/view.js +0 -360
  201. package/dist/esm/plugins/tts/AbstractTTSEngine.js +0 -282
  202. package/dist/esm/plugins/tts/FestivalTTSEngine.js +0 -192
  203. package/dist/esm/plugins/tts/PageChunk.js +0 -105
  204. package/dist/esm/plugins/tts/PageChunkIterator.js +0 -155
  205. package/dist/esm/plugins/tts/WebTTSEngine.js +0 -364
  206. package/dist/esm/plugins/tts/plugin.tts.js +0 -315
  207. package/dist/esm/plugins/tts/tooltip_dict.js +0 -14
  208. package/dist/esm/plugins/tts/utils.js +0 -79
  209. package/dist/esm/plugins/url/UrlPlugin.js +0 -197
  210. package/dist/esm/plugins/url/plugin.url.js +0 -212
  211. package/dist/esm/util/browserSniffing.js +0 -56
  212. package/dist/esm/util/debouncer.js +0 -25
  213. package/dist/esm/util/docCookies.js +0 -75
  214. package/dist/esm/util/strings.js +0 -34
  215. package/index.js +0 -2
@@ -1,575 +0,0 @@
1
- // @ts-check
2
- import { DEFAULT_OPTIONS } from './options.js';
3
- import { clamp } from './utils.js';
4
- /** @typedef {import('./options.js').PageData} PageData */
5
- /** @typedef {import('../BookReader.js').default} BookReader */
6
-
7
- /**
8
- * Contains information about the Book/Document independent of the way it is
9
- * being rendering. Nothing here should reference e.g. the mode, zoom, etc.
10
- * It's just information about the book and its pages (usually as specified
11
- * in the BookReader data option.)
12
- */
13
- export class BookModel {
14
- /**
15
- * @param {BookReader} br
16
- */
17
- constructor(br) {
18
- var _br$options$ppi, _br$options, _br$options$pageProgr, _br$options2;
19
- this.br = br;
20
- this.reduceSet = br.reduceSet;
21
- this.ppi = (_br$options$ppi = (_br$options = br.options) === null || _br$options === void 0 ? void 0 : _br$options.ppi) !== null && _br$options$ppi !== void 0 ? _br$options$ppi : DEFAULT_OPTIONS.ppi;
22
- /** @type {'lr' | 'rl'} Page progression */
23
- this.pageProgression = (_br$options$pageProgr = (_br$options2 = br.options) === null || _br$options2 === void 0 ? void 0 : _br$options2.pageProgression) !== null && _br$options$pageProgr !== void 0 ? _br$options$pageProgr : DEFAULT_OPTIONS.pageProgression;
24
-
25
- /** @type {{width: number, height: number}} memoize storage */
26
- this._medianPageSize = null;
27
- /** @type {[PageData[], number]} */
28
- this._getDataFlattenedCached = null;
29
- }
30
-
31
- /** Get median width/height of page in inches. Memoized for performance. */
32
- getMedianPageSizeInches() {
33
- if (this._medianPageSize) {
34
- return this._medianPageSize;
35
- }
36
- var widths = [];
37
- var heights = [];
38
- for (var page of this.pagesIterator()) {
39
- widths.push(page.widthInches);
40
- heights.push(page.heightInches);
41
- }
42
- widths.sort((a, b) => a - b);
43
- heights.sort((a, b) => a - b);
44
- this._medianPageSize = {
45
- width: widths[Math.floor(widths.length / 2)],
46
- height: heights[Math.floor(heights.length / 2)]
47
- };
48
- return this._medianPageSize;
49
- }
50
-
51
- /**
52
- * Returns the page width for the given index, or first or last page if out of range
53
- * @deprecated see getPageWidth
54
- * @param {PageIndex} index
55
- */
56
- _getPageWidth(index) {
57
- // Synthesize a page width for pages not actually present in book.
58
- // May or may not be the best approach.
59
- // If index is out of range we return the width of first or last page
60
- index = clamp(index, 0, this.getNumLeafs() - 1);
61
- return this.getPageWidth(index);
62
- }
63
-
64
- /**
65
- * Returns the page height for the given index, or first or last page if out of range
66
- * @deprecated see getPageHeight
67
- * @param {PageIndex} index
68
- */
69
- _getPageHeight(index) {
70
- var clampedIndex = clamp(index, 0, this.getNumLeafs() - 1);
71
- return this.getPageHeight(clampedIndex);
72
- }
73
-
74
- /**
75
- * Returns the *highest* index the given page number, or undefined
76
- * @param {PageNumString} pageNum
77
- * @return {PageIndex|undefined}
78
- */
79
- getPageIndex(pageNum) {
80
- var pageIndices = this.getPageIndices(pageNum);
81
- return pageIndices.length ? pageIndices[pageIndices.length - 1] : undefined;
82
- }
83
-
84
- /**
85
- * Returns an array (possibly empty) of the indices with the given page number
86
- * @param {PageNumString} pageNum
87
- * @return {PageIndex[]}
88
- */
89
- getPageIndices(pageNum) {
90
- var indices = [];
91
-
92
- // Check for special "nXX" page number
93
- if (pageNum.slice(0, 1) == 'n') {
94
- try {
95
- var pageIntStr = pageNum.slice(1, pageNum.length);
96
- var pageIndex = parseInt(pageIntStr);
97
- indices.push(pageIndex);
98
- return indices;
99
- } catch (err) {
100
- // Do nothing... will run through page names and see if one matches
101
- }
102
- }
103
- for (var i = 0; i < this.getNumLeafs(); i++) {
104
- if (this.getPageNum(i) == pageNum) {
105
- indices.push(i);
106
- }
107
- }
108
- return indices;
109
- }
110
-
111
- /**
112
- * Returns the name of the page as it should be displayed in the user interface
113
- * @param {PageIndex} index
114
- * @return {string}
115
- */
116
- getPageName(index) {
117
- return 'Page ' + this.getPageNum(index);
118
- }
119
-
120
- /**
121
- * @return {number} the total number of leafs (like an array length)
122
- */
123
- getNumLeafs() {
124
- // For deprecated interface support, if numLeafs is set, use that.
125
- if (this.br.numLeafs !== undefined) return this.br.numLeafs;
126
- return this._getDataFlattened().length;
127
- }
128
-
129
- /**
130
- * @param {PageIndex} index
131
- * @return {Number|undefined}
132
- */
133
- getPageWidth(index) {
134
- return this.getPageProp(index, 'width');
135
- }
136
-
137
- /**
138
- * @param {PageIndex} index
139
- * @return {Number|undefined}
140
- */
141
- getPageHeight(index) {
142
- return this.getPageProp(index, 'height');
143
- }
144
-
145
- /**
146
- * @param {PageIndex} index
147
- * @param {number} reduce - not used in default implementation
148
- * @param {number} rotate - not used in default implementation
149
- * @return {string|undefined}
150
- */
151
- // eslint-disable-next-line no-unused-vars
152
- getPageURI(index, reduce, rotate) {
153
- if (!this.getPageProp(index, 'viewable', true)) {
154
- var uri = this.br.options.unviewablePageURI;
155
- if (uri.startsWith('.')) {
156
- // It's a relative path, so make it relative to the images path
157
- return this.br.options.imagesBaseURL + uri;
158
- } else {
159
- return uri;
160
- }
161
- } else {
162
- return this.getPageProp(index, 'uri');
163
- }
164
- }
165
-
166
- /**
167
- * @param {PageIndex} index
168
- * @return {'L' | 'R'}
169
- */
170
- getPageSide(index) {
171
- return this.getPageProp(index, 'pageSide') || (index % 2 === 0 ? 'R' : 'L');
172
- }
173
-
174
- /**
175
- * @param {PageIndex} index
176
- * @return {PageNumString}
177
- */
178
- getPageNum(index) {
179
- var pageNum = this.getPageProp(index, 'pageNum');
180
- return pageNum === undefined ? "n".concat(index) : pageNum;
181
- }
182
-
183
- /**
184
- * Generalized property accessor.
185
- * @param {PageIndex} index
186
- * @param {keyof PageData} propName
187
- * @param {*} [fallbackValue] return if undefined
188
- * @return {*|undefined}
189
- */
190
- getPageProp(index, propName) {
191
- var fallbackValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
192
- return this._getDataProp(index, propName, fallbackValue);
193
- }
194
-
195
- /**
196
- * This function returns the left and right indices for the user-visible
197
- * spread that contains the given index.
198
- * @note Can return indices out of range of what's in the book.
199
- * @param {PageIndex} pindex
200
- * @return {[PageIndex, PageIndex]} eg [0, 1]
201
- */
202
- getSpreadIndices(pindex) {
203
- if (this.pageProgression == 'rl') {
204
- return this.getPageSide(pindex) == 'R' ? [pindex + 1, pindex] : [pindex, pindex - 1];
205
- } else {
206
- return this.getPageSide(pindex) == 'L' ? [pindex, pindex + 1] : [pindex - 1, pindex];
207
- }
208
- }
209
-
210
- /**
211
- * Single images in the Internet Archive scandata.xml metadata are (somewhat incorrectly)
212
- * given a "leaf" number. Some of these images from the scanning process should not
213
- * be displayed in the BookReader (for example colour calibration cards). Since some
214
- * of the scanned images will not be displayed in the BookReader (those marked with
215
- * addToAccessFormats false in the scandata.xml) leaf numbers and BookReader page
216
- * indexes are generally not the same. This function returns the BookReader page
217
- * index given a scanned leaf number.
218
- *
219
- * This function is used, for example, to map between search results (that use the
220
- * leaf numbers) and the displayed pages in the BookReader.
221
- * @param {LeafNum} leafNum
222
- * @return {PageIndex}
223
- */
224
- leafNumToIndex(leafNum) {
225
- var index = this._getDataFlattened().findIndex(d => d.leafNum == leafNum);
226
- // If no match is found, fall back to the leafNum provide (leafNum == index)
227
- return index > -1 ? index : leafNum;
228
- }
229
-
230
- /**
231
- * Parses the pageString format
232
- * @param {PageString} pageString
233
- * @return {PageIndex|undefined}
234
- */
235
- parsePageString(pageString) {
236
- var pageIndex;
237
- // Check for special "leaf"
238
- var leafMatch = /^leaf(\d+)/.exec(pageString);
239
- if (leafMatch) {
240
- pageIndex = this.leafNumToIndex(parseInt(leafMatch[1], 10));
241
- if (pageIndex === null) {
242
- pageIndex = undefined; // to match return type of getPageIndex
243
- }
244
- } else {
245
- pageIndex = this.getPageIndex(pageString);
246
- }
247
- return pageIndex;
248
- }
249
-
250
- /**
251
- * @param {number} index use negatives to get page relative to end
252
- * @param loop whether to loop (i.e. -1 == last page)
253
- */
254
- getPage(index) {
255
- var loop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
256
- var numLeafs = this.getNumLeafs();
257
- if (!loop && (index < 0 || index >= numLeafs)) {
258
- return undefined;
259
- }
260
- if (index < 0 && index >= -numLeafs) {
261
- index += numLeafs;
262
- }
263
- index = index % numLeafs;
264
- return new PageModel(this, index);
265
- }
266
-
267
- /**
268
- * @param {object} [arg0]
269
- * @param {number} [arg0.start] inclusive
270
- * @param {number} [arg0.end] exclusive
271
- * @param {boolean} [arg0.combineConsecutiveUnviewables] Yield only first unviewable
272
- * of a chunk of unviewable pages instead of each page
273
- */
274
- pagesIterator() {
275
- var _this = this;
276
- var {
277
- start = 0,
278
- end = Infinity,
279
- combineConsecutiveUnviewables = false
280
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
281
- return function* () {
282
- start = Math.max(0, start);
283
- end = Math.min(end, _this.getNumLeafs());
284
- for (var i = start; i < end; i++) {
285
- var page = _this.getPage(i);
286
- if (combineConsecutiveUnviewables && page.isConsecutiveUnviewable) continue;
287
- yield page;
288
- }
289
- }();
290
- }
291
-
292
- /**
293
- * Flatten the nested structure (make 1d array), and also add pageSide prop
294
- * @return {PageData[]}
295
- */
296
- _getDataFlattened() {
297
- if (this._getDataFlattenedCached && this._getDataFlattenedCached[1] === this.br.data.length) return this._getDataFlattenedCached[0];
298
- var prevPageSide = null;
299
- /** @type {number|null} */
300
- var unviewablesChunkStart = null;
301
- var index = 0;
302
- // @ts-ignore TS doesn't know about flatMap for some reason
303
- var flattened = this.br.data.flatMap(spread => {
304
- return spread.map(page => {
305
- if (!page.pageSide) {
306
- if (prevPageSide === null) {
307
- page.pageSide = spread.length === 2 ? 'L' : 'R';
308
- } else {
309
- page.pageSide = prevPageSide === 'L' ? 'R' : 'L';
310
- }
311
- }
312
- prevPageSide = page.pageSide;
313
- if (page.viewable === false) {
314
- if (unviewablesChunkStart === null) {
315
- page.unviewablesStart = unviewablesChunkStart = index;
316
- } else {
317
- page.unviewablesStart = unviewablesChunkStart;
318
- }
319
- } else {
320
- unviewablesChunkStart = null;
321
- }
322
- index++;
323
- return page;
324
- });
325
- });
326
-
327
- // length is used as a cache breaker
328
- this._getDataFlattenedCached = [flattened, this.br.data.length];
329
- return flattened;
330
- }
331
-
332
- /**
333
- * Helper. Return a prop for a given index. Returns `fallbackValue` if index is invalid or
334
- * property not on page.
335
- * @param {PageIndex} index
336
- * @param {keyof PageData} prop
337
- * @param {*} fallbackValue return if property not on the record
338
- * @return {*}
339
- */
340
- _getDataProp(index, prop) {
341
- var fallbackValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
342
- var dataf = this._getDataFlattened();
343
- var invalidIndex = isNaN(index) || index < 0 || index >= dataf.length;
344
- if (invalidIndex || 'undefined' == typeof dataf[index][prop]) return fallbackValue;
345
- return dataf[index][prop];
346
- }
347
- }
348
-
349
- /**
350
- * A controlled schema for page data.
351
- */
352
- export class PageModel {
353
- /**
354
- * @param {BookModel} book
355
- * @param {PageIndex} index
356
- */
357
- constructor(book, index) {
358
- // Values less than 10 cause the UI to not work correctly
359
- var pagePPI = book._getDataProp(index, 'ppi', book.ppi);
360
- this.ppi = Math.max(pagePPI < 10 ? book.ppi : pagePPI, 10);
361
- this.book = book;
362
- this.index = index;
363
- this.width = book.getPageWidth(index);
364
- this.widthInches = this.width / this.ppi;
365
- this.height = book.getPageHeight(index);
366
- this.heightInches = this.height / this.ppi;
367
- this.pageSide = book.getPageSide(index);
368
- this.leafNum = book._getDataProp(index, 'leafNum', this.index);
369
-
370
- /** @type {boolean} */
371
- this.isViewable = book._getDataProp(index, 'viewable', true);
372
- /** @type {PageIndex} The first in the series of unviewable pages this is in. */
373
- this.unviewablesStart = book._getDataProp(index, 'unviewablesStart') || null;
374
- /**
375
- * Consecutive unviewable pages are pages in an unviewable "chunk" which are not the first
376
- * of that chunk.
377
- */
378
- this.isConsecutiveUnviewable = !this.isViewable && this.unviewablesStart != this.index;
379
- this._rawData = this.book._getDataFlattened()[this.index];
380
- }
381
-
382
- /**
383
- * Updates the page to no longer be unviewable. Assumes the
384
- * Page's URI is already set/correct.
385
- */
386
- makeViewable() {
387
- var newViewableState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
388
- if (this.isViewable == newViewableState) return;
389
- if (newViewableState) {
390
- this._rawData.viewable = true;
391
- delete this._rawData.unviewablesStart;
392
- // Update any subsequent page to now point to the right "start"
393
- for (var page of this.book.pagesIterator({
394
- start: this.index + 1
395
- })) {
396
- if (page.isViewable) break;
397
- page._rawData.unviewablesStart = this.index + 1;
398
- }
399
- } else {
400
- this._rawData.viewable = false;
401
- this._rawData.unviewablesStart = this.prev && !this.prev.isViewable ? this.prev.unviewablesStart : this.index;
402
- // Update any subsequent page to now point to the right "start"
403
- for (var _page of this.book.pagesIterator({
404
- start: this.index + 1
405
- })) {
406
- if (!_page.isViewable) break;
407
- _page._rawData.unviewablesStart = this._rawData.unviewablesStart;
408
- }
409
- }
410
- }
411
- get prev() {
412
- return this.findPrev();
413
- }
414
- get next() {
415
- return this.findNext();
416
- }
417
-
418
- /** @type {PageModel | null} */
419
- get left() {
420
- return this.book.pageProgression === 'lr' ? this.prev : this.next;
421
- }
422
-
423
- /** @type {PageModel | null} */
424
- get right() {
425
- return this.book.pageProgression === 'lr' ? this.next : this.prev;
426
- }
427
-
428
- /**
429
- * @type {{left: PageModel | null, right: PageModel | null}}
430
- */
431
- get spread() {
432
- return {
433
- left: this.pageSide === 'L' ? this : this.left,
434
- right: this.pageSide === 'R' ? this : this.right
435
- };
436
- }
437
-
438
- /**
439
- * @param {number} pages
440
- */
441
- goLeft(pages) {
442
- var newIndex = this.book.pageProgression === 'lr' ? this.index - pages : this.index + pages;
443
- return this.book.getPage(newIndex);
444
- }
445
-
446
- /**
447
- * @param {number} pages
448
- */
449
- goRight(pages) {
450
- var newIndex = this.book.pageProgression === 'lr' ? this.index + pages : this.index - pages;
451
- return this.book.getPage(newIndex);
452
- }
453
-
454
- /**
455
- * @param {number} reduce
456
- * @param {number} rotate
457
- */
458
- getURI(reduce, rotate) {
459
- return this.book.getPageURI(this.index, reduce, rotate);
460
- }
461
-
462
- /**
463
- * Returns the srcset with correct URIs or void string if out of range
464
- * @param {number} reduce
465
- * @param {number} [rotate]
466
- */
467
- getURISrcSet(reduce) {
468
- var rotate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
469
- var {
470
- reduceSet
471
- } = this.book;
472
- var initialReduce = reduceSet.floor(reduce);
473
- // We don't need to repeat the initial reduce in the srcset
474
- var topReduce = reduceSet.decr(initialReduce);
475
- var reduces = [];
476
- for (var r = topReduce; r >= 1; r = reduceSet.decr(r)) {
477
- reduces.push(r);
478
- }
479
- return reduces.map(r => "".concat(this.getURI(r, rotate), " ").concat(initialReduce / r, "x")).join(', ');
480
- }
481
-
482
- /**
483
- * @param {object} [arg0]
484
- * @param {boolean} [arg0.combineConsecutiveUnviewables] Whether to only yield the first page
485
- * of a series of unviewable pages instead of each page
486
- * @return {PageModel|void}
487
- */
488
- findNext() {
489
- var {
490
- combineConsecutiveUnviewables = false
491
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
492
- return this.book.pagesIterator({
493
- start: this.index + 1,
494
- combineConsecutiveUnviewables
495
- }).next().value;
496
- }
497
-
498
- /**
499
- * @param {object} [arg0]
500
- * @param {boolean} [arg0.combineConsecutiveUnviewables] Whether to only yield the first page
501
- * of a series of unviewable pages instead of each page
502
- * @return {PageModel|void}
503
- */
504
- findPrev() {
505
- var {
506
- combineConsecutiveUnviewables = false
507
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
508
- if (this.index == 0) return undefined;
509
- if (combineConsecutiveUnviewables) {
510
- if (this.isConsecutiveUnviewable) {
511
- return this.book.getPage(this.unviewablesStart);
512
- } else {
513
- // Recursively goes backward through the book
514
- // TODO make a reverse iterator to make it look identical to findNext
515
- var prev = new PageModel(this.book, this.index - 1);
516
- return prev.isViewable ? prev : prev.findPrev({
517
- combineConsecutiveUnviewables
518
- });
519
- }
520
- } else {
521
- return new PageModel(this.book, this.index - 1);
522
- }
523
- }
524
-
525
- /**
526
- * @param {object} [arg0]
527
- * @param {boolean} [arg0.combineConsecutiveUnviewables] Whether to only yield the first page
528
- * of a series of unviewable pages instead of each page
529
- * @return {PageModel|void}
530
- */
531
- findLeft() {
532
- var {
533
- combineConsecutiveUnviewables = false
534
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
535
- return this.book.pageProgression === 'lr' ? this.findPrev({
536
- combineConsecutiveUnviewables
537
- }) : this.findNext({
538
- combineConsecutiveUnviewables
539
- });
540
- }
541
-
542
- /**
543
- * @param {object} [arg0]
544
- * @param {boolean} [arg0.combineConsecutiveUnviewables] Whether to only yield the first page
545
- * of a series of unviewable pages instead of each page
546
- * @return {PageModel|void}
547
- */
548
- findRight() {
549
- var {
550
- combineConsecutiveUnviewables = false
551
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
552
- return this.book.pageProgression === 'lr' ? this.findNext({
553
- combineConsecutiveUnviewables
554
- }) : this.findPrev({
555
- combineConsecutiveUnviewables
556
- });
557
- }
558
- }
559
-
560
- // There are a few main ways we can reference a specific page in a book:
561
- /**
562
- * @typedef {string} PageNumString
563
- * Possible values: /^n?\d+$/. Example: 'n7', '18'
564
- * Not necessarily unique
565
- */
566
- /**
567
- * @typedef {number} LeafNum
568
- * No clue if 0 or 1 indexed or consecutive; generally from IA book info.
569
- */
570
- /**
571
- * @typedef {string} PageString
572
- * Possible values: /^(leaf)?\d+$/ Example: 'leaf7', '18'
573
- * If leaf-prefixed, then the number is a LeafNum. Otherwise it's a PageNumString
574
- */
575
- /** @typedef {number} PageIndex 0-based index of all the pages */