@internetarchive/bookreader 5.0.0-88-alpha.11 → 5.0.0-89

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 (243) hide show
  1. package/BookReader/BookReader.css +17 -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.autoplay.js +1 -1
  9. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  10. package/BookReader/plugins/plugin.iiif.js +1 -1
  11. package/BookReader/plugins/plugin.iiif.js.map +1 -1
  12. package/BookReader/plugins/plugin.resume.js +1 -1
  13. package/BookReader/plugins/plugin.resume.js.map +1 -1
  14. package/BookReader/plugins/plugin.search.js +1 -1
  15. package/BookReader/plugins/plugin.search.js.map +1 -1
  16. package/BookReader/plugins/plugin.text_selection.js +1 -1
  17. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  18. package/BookReader/plugins/plugin.tts.js +1 -1
  19. package/BookReader/plugins/plugin.tts.js.map +1 -1
  20. package/BookReader/plugins/plugin.url.js +1 -1
  21. package/BookReader/plugins/plugin.url.js.map +1 -1
  22. package/CHANGELOG.md +14 -0
  23. package/babel.config.js +12 -30
  24. package/codecov.yml +1 -1
  25. package/jsconfig.json +1 -3
  26. package/package.json +14 -16
  27. package/src/BookNavigator/search/search-results.js +1 -1
  28. package/src/BookReader/ImageCache.js +48 -15
  29. package/src/BookReader/Mode1UpLit.js +56 -86
  30. package/src/BookReader/Mode2UpLit.js +5 -5
  31. package/src/BookReader/Navbar/Navbar.js +53 -11
  32. package/src/BookReader/PageContainer.js +41 -22
  33. package/src/BookReader/options.js +27 -3
  34. package/src/BookReader/utils.js +10 -0
  35. package/src/BookReader.js +120 -21
  36. package/src/BookReaderPlugin.js +44 -0
  37. package/src/css/_BRnav.scss +0 -3
  38. package/src/css/_BRpages.scss +21 -2
  39. package/src/css/_controls.scss +4 -0
  40. package/src/plugins/plugin.archive_analytics.js +84 -78
  41. package/src/plugins/plugin.autoplay.js +98 -102
  42. package/src/plugins/plugin.chapters.js +17 -22
  43. package/src/plugins/plugin.iiif.js +16 -30
  44. package/src/plugins/plugin.resume.js +54 -51
  45. package/src/plugins/plugin.text_selection.js +68 -76
  46. package/src/plugins/tts/AbstractTTSEngine.js +2 -4
  47. package/src/plugins/tts/PageChunk.js +5 -9
  48. package/src/plugins/tts/PageChunkIterator.js +3 -5
  49. package/src/plugins/tts/plugin.tts.js +309 -329
  50. package/src/plugins/url/plugin.url.js +1 -1
  51. package/src/util/strings.js +1 -0
  52. package/tests/e2e/autoplay.test.js +8 -5
  53. package/tests/e2e/helpers/base.js +2 -2
  54. package/tests/e2e/helpers/mockSearch.js +6 -9
  55. package/tests/jest/BookReader/Navbar/Navbar.test.js +16 -3
  56. package/tests/jest/BookReader/PageContainer.test.js +96 -55
  57. package/tests/jest/BookReader/utils.test.js +21 -0
  58. package/tests/jest/BookReader.test.js +13 -12
  59. package/tests/jest/plugins/plugin.archive_analytics.test.js +8 -11
  60. package/tests/jest/plugins/plugin.autoplay.test.js +9 -22
  61. package/tests/jest/plugins/plugin.resume.test.js +19 -32
  62. package/tests/jest/plugins/plugin.text_selection.test.js +23 -24
  63. package/dist/esm/BookNavigator/assets/bookmark-colors.js +0 -4
  64. package/dist/esm/BookNavigator/assets/button-base.js +0 -4
  65. package/dist/esm/BookNavigator/assets/ia-logo.js +0 -4
  66. package/dist/esm/BookNavigator/assets/icon_checkmark.js +0 -8
  67. package/dist/esm/BookNavigator/assets/icon_close.js +0 -4
  68. package/dist/esm/BookNavigator/book-navigator.js +0 -612
  69. package/dist/esm/BookNavigator/bookmarks/bookmark-button.js +0 -35
  70. package/dist/esm/BookNavigator/bookmarks/bookmark-edit.js +0 -78
  71. package/dist/esm/BookNavigator/bookmarks/bookmarks-list.js +0 -160
  72. package/dist/esm/BookNavigator/bookmarks/bookmarks-loginCTA.js +0 -24
  73. package/dist/esm/BookNavigator/bookmarks/bookmarks-provider.js +0 -55
  74. package/dist/esm/BookNavigator/bookmarks/ia-bookmarks.js +0 -521
  75. package/dist/esm/BookNavigator/delete-modal-actions.js +0 -29
  76. package/dist/esm/BookNavigator/downloads/downloads-provider.js +0 -84
  77. package/dist/esm/BookNavigator/downloads/downloads.js +0 -69
  78. package/dist/esm/BookNavigator/search/search-provider.js +0 -238
  79. package/dist/esm/BookNavigator/search/search-results.js +0 -161
  80. package/dist/esm/BookNavigator/sharing.js +0 -26
  81. package/dist/esm/BookNavigator/viewable-files.js +0 -94
  82. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments-provider.js +0 -83
  83. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments.js +0 -131
  84. package/dist/esm/BookReader/BookModel.js +0 -575
  85. package/dist/esm/BookReader/DragScrollable.js +0 -224
  86. package/dist/esm/BookReader/ImageCache.js +0 -122
  87. package/dist/esm/BookReader/Mode1Up.js +0 -114
  88. package/dist/esm/BookReader/Mode1UpLit.js +0 -579
  89. package/dist/esm/BookReader/Mode2Up.js +0 -106
  90. package/dist/esm/BookReader/Mode2UpLit.js +0 -1020
  91. package/dist/esm/BookReader/ModeCoordinateSpace.js +0 -28
  92. package/dist/esm/BookReader/ModeSmoothZoom.js +0 -318
  93. package/dist/esm/BookReader/ModeThumb.js +0 -366
  94. package/dist/esm/BookReader/Navbar/Navbar.js +0 -253
  95. package/dist/esm/BookReader/PageContainer.js +0 -165
  96. package/dist/esm/BookReader/ReduceSet.js +0 -27
  97. package/dist/esm/BookReader/Toolbar/Toolbar.js +0 -242
  98. package/dist/esm/BookReader/events.js +0 -20
  99. package/dist/esm/BookReader/options.js +0 -331
  100. package/dist/esm/BookReader/utils/HTMLDimensionsCacher.js +0 -48
  101. package/dist/esm/BookReader/utils/ScrollClassAdder.js +0 -31
  102. package/dist/esm/BookReader/utils/SelectionObserver.js +0 -42
  103. package/dist/esm/BookReader/utils/classes.js +0 -37
  104. package/dist/esm/BookReader/utils.js +0 -315
  105. package/dist/esm/BookReader.js +0 -1828
  106. package/dist/esm/assets/icons/1up.svg +0 -12
  107. package/dist/esm/assets/icons/2up.svg +0 -15
  108. package/dist/esm/assets/icons/advance.svg +0 -26
  109. package/dist/esm/assets/icons/chevron-right.svg +0 -1
  110. package/dist/esm/assets/icons/close-circle-dark.svg +0 -1
  111. package/dist/esm/assets/icons/close-circle.svg +0 -1
  112. package/dist/esm/assets/icons/fullscreen.svg +0 -17
  113. package/dist/esm/assets/icons/fullscreen_exit.svg +0 -17
  114. package/dist/esm/assets/icons/hamburger.svg +0 -15
  115. package/dist/esm/assets/icons/left-arrow.svg +0 -12
  116. package/dist/esm/assets/icons/magnify-minus.svg +0 -12
  117. package/dist/esm/assets/icons/magnify-plus.svg +0 -13
  118. package/dist/esm/assets/icons/magnify.svg +0 -15
  119. package/dist/esm/assets/icons/pause.svg +0 -23
  120. package/dist/esm/assets/icons/play.svg +0 -22
  121. package/dist/esm/assets/icons/playback-speed.svg +0 -34
  122. package/dist/esm/assets/icons/read-aloud.svg +0 -22
  123. package/dist/esm/assets/icons/review.svg +0 -22
  124. package/dist/esm/assets/icons/thumbnails.svg +0 -17
  125. package/dist/esm/assets/icons/voice.svg +0 -1
  126. package/dist/esm/assets/icons/volume-full.svg +0 -22
  127. package/dist/esm/assets/images/BRicons.png +0 -0
  128. package/dist/esm/assets/images/BRicons.svg +0 -94
  129. package/dist/esm/assets/images/BRicons_ia.png +0 -0
  130. package/dist/esm/assets/images/back_pages.png +0 -0
  131. package/dist/esm/assets/images/book_bottom_icon.png +0 -0
  132. package/dist/esm/assets/images/book_down_icon.png +0 -0
  133. package/dist/esm/assets/images/book_left_icon.png +0 -0
  134. package/dist/esm/assets/images/book_leftmost_icon.png +0 -0
  135. package/dist/esm/assets/images/book_right_icon.png +0 -0
  136. package/dist/esm/assets/images/book_rightmost_icon.png +0 -0
  137. package/dist/esm/assets/images/book_top_icon.png +0 -0
  138. package/dist/esm/assets/images/book_up_icon.png +0 -0
  139. package/dist/esm/assets/images/books_graphic.svg +0 -177
  140. package/dist/esm/assets/images/booksplit.png +0 -0
  141. package/dist/esm/assets/images/control_pause_icon.png +0 -0
  142. package/dist/esm/assets/images/control_play_icon.png +0 -0
  143. package/dist/esm/assets/images/embed_icon.png +0 -0
  144. package/dist/esm/assets/images/icon-home-ia.png +0 -0
  145. package/dist/esm/assets/images/icon_OL-logo-xs.png +0 -0
  146. package/dist/esm/assets/images/icon_alert-xs.png +0 -0
  147. package/dist/esm/assets/images/icon_book.svg +0 -12
  148. package/dist/esm/assets/images/icon_bookmark.svg +0 -12
  149. package/dist/esm/assets/images/icon_close-pop.png +0 -0
  150. package/dist/esm/assets/images/icon_download.png +0 -0
  151. package/dist/esm/assets/images/icon_gear.svg +0 -14
  152. package/dist/esm/assets/images/icon_hamburger.svg +0 -20
  153. package/dist/esm/assets/images/icon_home.png +0 -0
  154. package/dist/esm/assets/images/icon_home.svg +0 -21
  155. package/dist/esm/assets/images/icon_home_ia.png +0 -0
  156. package/dist/esm/assets/images/icon_indicator.png +0 -0
  157. package/dist/esm/assets/images/icon_info.svg +0 -11
  158. package/dist/esm/assets/images/icon_one_page.svg +0 -8
  159. package/dist/esm/assets/images/icon_pause.svg +0 -1
  160. package/dist/esm/assets/images/icon_play.svg +0 -1
  161. package/dist/esm/assets/images/icon_playback-rate.svg +0 -15
  162. package/dist/esm/assets/images/icon_return.png +0 -0
  163. package/dist/esm/assets/images/icon_search_button.svg +0 -8
  164. package/dist/esm/assets/images/icon_share.svg +0 -9
  165. package/dist/esm/assets/images/icon_skip-ahead.svg +0 -6
  166. package/dist/esm/assets/images/icon_skip-back.svg +0 -13
  167. package/dist/esm/assets/images/icon_speaker.svg +0 -18
  168. package/dist/esm/assets/images/icon_speaker_open.svg +0 -10
  169. package/dist/esm/assets/images/icon_thumbnails.svg +0 -12
  170. package/dist/esm/assets/images/icon_toc.svg +0 -5
  171. package/dist/esm/assets/images/icon_two_pages.svg +0 -9
  172. package/dist/esm/assets/images/icon_zoomer.png +0 -0
  173. package/dist/esm/assets/images/loading.gif +0 -0
  174. package/dist/esm/assets/images/logo_icon.png +0 -0
  175. package/dist/esm/assets/images/marker_chap-off.png +0 -0
  176. package/dist/esm/assets/images/marker_chap-off.svg +0 -11
  177. package/dist/esm/assets/images/marker_chap-off_ia.png +0 -0
  178. package/dist/esm/assets/images/marker_chap-on.png +0 -0
  179. package/dist/esm/assets/images/marker_chap-on.svg +0 -11
  180. package/dist/esm/assets/images/marker_srch-on.svg +0 -11
  181. package/dist/esm/assets/images/marker_srchchap-off.png +0 -0
  182. package/dist/esm/assets/images/marker_srchchap-on.png +0 -0
  183. package/dist/esm/assets/images/nav_control-dn.png +0 -0
  184. package/dist/esm/assets/images/nav_control-dn_ia.png +0 -0
  185. package/dist/esm/assets/images/nav_control-up.png +0 -0
  186. package/dist/esm/assets/images/nav_control-up_ia.png +0 -0
  187. package/dist/esm/assets/images/nav_control.png +0 -0
  188. package/dist/esm/assets/images/one_page_mode_icon.png +0 -0
  189. package/dist/esm/assets/images/paper-badge.png +0 -0
  190. package/dist/esm/assets/images/print_icon.png +0 -0
  191. package/dist/esm/assets/images/progressbar.gif +0 -0
  192. package/dist/esm/assets/images/right_edges.png +0 -0
  193. package/dist/esm/assets/images/slider.png +0 -0
  194. package/dist/esm/assets/images/slider_ia.png +0 -0
  195. package/dist/esm/assets/images/thumbnail_mode_icon.png +0 -0
  196. package/dist/esm/assets/images/transparent.png +0 -0
  197. package/dist/esm/assets/images/two_page_mode_icon.png +0 -0
  198. package/dist/esm/assets/images/unviewable_page.png +0 -0
  199. package/dist/esm/assets/images/zoom_in_icon.png +0 -0
  200. package/dist/esm/assets/images/zoom_out_icon.png +0 -0
  201. package/dist/esm/css/BookReader.scss +0 -85
  202. package/dist/esm/css/_BRBookmarks.scss +0 -29
  203. package/dist/esm/css/_BRComponent.scss +0 -13
  204. package/dist/esm/css/_BRfloat.scss +0 -197
  205. package/dist/esm/css/_BRicon.scss +0 -54
  206. package/dist/esm/css/_BRmain.scss +0 -262
  207. package/dist/esm/css/_BRnav.scss +0 -354
  208. package/dist/esm/css/_BRpages.scss +0 -213
  209. package/dist/esm/css/_BRsearch.scss +0 -268
  210. package/dist/esm/css/_BRtoolbar.scss +0 -84
  211. package/dist/esm/css/_BRvendor.scss +0 -5
  212. package/dist/esm/css/_TextSelection.scss +0 -108
  213. package/dist/esm/css/_colorbox.scss +0 -52
  214. package/dist/esm/css/_controls.scss +0 -257
  215. package/dist/esm/css/_icons.scss +0 -121
  216. package/dist/esm/ia-bookreader/ia-bookreader.js +0 -141
  217. package/dist/esm/jquery-wrapper.js +0 -3
  218. package/dist/esm/plugins/plugin.archive_analytics.js +0 -72
  219. package/dist/esm/plugins/plugin.autoplay.js +0 -119
  220. package/dist/esm/plugins/plugin.chapters.js +0 -288
  221. package/dist/esm/plugins/plugin.iframe.js +0 -44
  222. package/dist/esm/plugins/plugin.iiif.js +0 -146
  223. package/dist/esm/plugins/plugin.resume.js +0 -66
  224. package/dist/esm/plugins/plugin.text_selection.js +0 -621
  225. package/dist/esm/plugins/plugin.vendor-fullscreen.js +0 -227
  226. package/dist/esm/plugins/search/plugin.search.js +0 -499
  227. package/dist/esm/plugins/search/utils.js +0 -42
  228. package/dist/esm/plugins/search/view.js +0 -360
  229. package/dist/esm/plugins/tts/AbstractTTSEngine.js +0 -282
  230. package/dist/esm/plugins/tts/FestivalTTSEngine.js +0 -192
  231. package/dist/esm/plugins/tts/PageChunk.js +0 -105
  232. package/dist/esm/plugins/tts/PageChunkIterator.js +0 -155
  233. package/dist/esm/plugins/tts/WebTTSEngine.js +0 -364
  234. package/dist/esm/plugins/tts/plugin.tts.js +0 -315
  235. package/dist/esm/plugins/tts/tooltip_dict.js +0 -14
  236. package/dist/esm/plugins/tts/utils.js +0 -79
  237. package/dist/esm/plugins/url/UrlPlugin.js +0 -197
  238. package/dist/esm/plugins/url/plugin.url.js +0 -212
  239. package/dist/esm/util/browserSniffing.js +0 -56
  240. package/dist/esm/util/debouncer.js +0 -25
  241. package/dist/esm/util/docCookies.js +0 -75
  242. package/dist/esm/util/strings.js +0 -34
  243. package/index.js +0 -2
@@ -1,192 +0,0 @@
1
- function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
2
- function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
3
- import AbstractTTSEngine from './AbstractTTSEngine.js';
4
- import { sleep } from '../../BookReader/utils.js';
5
- /* global soundManager */
6
- import 'soundmanager2';
7
- import 'jquery.browser';
8
-
9
- /** @typedef {import("./AbstractTTSEngine.js").TTSEngineOptions} TTSEngineOptions */
10
- /** @typedef {import("./AbstractTTSEngine.js").AbstractTTSSound} AbstractTTSSound */
11
-
12
- /**
13
- * @extends AbstractTTSEngine
14
- * TTS using Festival endpoint
15
- **/
16
- export default class FestivalTTSEngine extends AbstractTTSEngine {
17
- /** @override */
18
- static isSupported() {
19
- return typeof soundManager !== 'undefined' && soundManager.supported();
20
- }
21
-
22
- /** @param {TTSEngineOptions} options */
23
- constructor(options) {
24
- var _$$browser;
25
- super(options);
26
- // $.browsers is sometimes undefined on some Android browsers :/
27
- // Likely related to when $.browser was moved to npm
28
- /** @type {'mp3' | 'ogg'} format of audio to get */
29
- this.audioFormat = (_$$browser = $.browser) !== null && _$$browser !== void 0 && _$$browser.mozilla ? 'ogg' : 'mp3'; //eslint-disable-line no-jquery/no-browser
30
- }
31
-
32
- /** @override */
33
- getVoices() {
34
- return [{
35
- default: true,
36
- lang: "en-US",
37
- localService: false,
38
- name: "Festival - English (US)",
39
- voiceURI: null
40
- }];
41
- }
42
-
43
- /** @override */
44
- init() {
45
- // setup sound manager
46
- soundManager.setup({
47
- debugMode: false,
48
- // Note, there's a bug in Chrome regarding range requests.
49
- // Flash is used as a workaround.
50
- // See https://bugs.chromium.org/p/chromium/issues/detail?id=505707
51
- preferFlash: true,
52
- url: '/bookreader/BookReader/soundmanager/swf',
53
- useHTML5Audio: true,
54
- //flash 8 version of swf is buggy when calling play() on a sound that is still loading
55
- flashVersion: 9
56
- });
57
- }
58
-
59
- /**
60
- * @override
61
- * @param {number} leafIndex
62
- * @param {number} numLeafs total number of leafs in the current book
63
- */
64
- start(leafIndex, numLeafs) {
65
- var promise = null;
66
-
67
- // Hack for iOS
68
- if (navigator.userAgent.match(/mobile/i)) {
69
- promise = this.iOSCaptureUserIntentHack();
70
- }
71
- promise = promise || Promise.resolve();
72
- promise.then(() => super.start(leafIndex, numLeafs));
73
- }
74
-
75
- /** @override */
76
- createSound(chunk) {
77
- return new FestivalTTSSound(this.getSoundUrl(chunk.text));
78
- }
79
-
80
- /**
81
- * @private
82
- * Get URL for audio that says this text
83
- * @param {String} dataString the thing to say
84
- * @return {String} url
85
- */
86
- getSoundUrl(dataString) {
87
- return 'https://' + this.opts.server + '/BookReader/BookReaderGetTTS.php?string=' + encodeURIComponent(dataString) + '&format=.' + this.audioFormat;
88
- }
89
-
90
- /**
91
- * @private
92
- * Security restrictions require playback to be triggered
93
- * by a user click/touch. This intention gets lost in the async calls
94
- * on iOS, but, for some reason, if we start the audio here, it works.
95
- * See https://stackoverflow.com/questions/12206631/html5-audio-cant-play-through-javascript-unless-triggered-manually-once
96
- * @return {PromiseLike}
97
- */
98
- iOSCaptureUserIntentHack() {
99
- var _this = this;
100
- return _asyncToGenerator(function* () {
101
- var sound = soundManager.createSound({
102
- url: SILENCE_1MS[_this.audioFormat]
103
- });
104
- yield new Promise(res => sound.play({
105
- onfinish: res
106
- }));
107
- sound.destruct();
108
- })();
109
- }
110
- }
111
-
112
- /** @extends AbstractTTSSound */
113
- class FestivalTTSSound {
114
- /** @param {string} soundUrl **/
115
- constructor(soundUrl) {
116
- this.soundUrl = soundUrl;
117
- /** @type {SMSound} */
118
- this.sound = null;
119
- this.rate = 1;
120
- /** @type {function} calling this resolves the "play" promise */
121
- this._finishResolver = null;
122
- }
123
- get loaded() {
124
- return this.sound && this.sound.loaded;
125
- }
126
- load(_onload) {
127
- var _this2 = this;
128
- this.sound = soundManager.createSound({
129
- url: this.soundUrl,
130
- // API recommended, but only fires once play started on safari
131
- onload: () => {
132
- if (this.rate != 1) this.sound.setPlaybackRate(this.rate);
133
- _onload();
134
- },
135
- onresume: function () {
136
- var _onresume = _asyncToGenerator(function* () {
137
- yield sleep(25);
138
- if (_this2.rate != 1) _this2.sound.setPlaybackRate(_this2.rate);
139
- });
140
- function onresume() {
141
- return _onresume.apply(this, arguments);
142
- }
143
- return onresume;
144
- }()
145
- });
146
- return this.sound.load();
147
- }
148
- play() {
149
- var _this3 = this;
150
- return _asyncToGenerator(function* () {
151
- yield new Promise(res => {
152
- _this3._finishResolver = res;
153
- _this3.sound.play({
154
- onfinish: res
155
- });
156
- });
157
- _this3.sound.destruct();
158
- })();
159
- }
160
-
161
- /** @override */
162
- stop() {
163
- this.sound.stop();
164
- return Promise.resolve();
165
- }
166
-
167
- /** @override */
168
- pause() {
169
- this.sound.pause();
170
- }
171
- /** @override */
172
- resume() {
173
- this.sound.resume();
174
- }
175
- /** @override */
176
- setPlaybackRate(rate) {
177
- this.rate = rate;
178
- this.sound.setPlaybackRate(rate);
179
- }
180
-
181
- /** @override */
182
- finish() {
183
- this.sound.stop();
184
- this._finishResolver();
185
- }
186
- }
187
-
188
- /** Needed to capture the audio context for iOS hack. Generated using Audacity. */
189
- var SILENCE_1MS = {
190
- mp3: 'data:audio/mp3;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAACcQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA//////////////////////////////////////////////////////////////////8AAAAeTEFNRTMuOTlyBJwAAAAAAAAAADUgJAaUQQABrgAAAnHIf8sZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sQxAADwlwBKGAAACAAAD/AAAAEAAAAH///////////////+UBAMExBTUUzLjk5LjOqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xDEIAPAAAGkAAAAIAAANIAAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==',
191
- ogg: 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAAAVEgAAAAAAAADSDf4BHgF2b3JiaXMAAAAAAUSsAAAAAAAAAHcBAAAAAAC4AU9nZ1MAAAAAAAAAAAAAFRIAAAEAAAB4VKTpEDv//////////////////8kDdm9yYmlzKwAAAFhpcGguT3JnIGxpYlZvcmJpcyBJIDIwMTIwMjAzIChPbW5pcHJlc2VudCkAAAAAAQV2b3JiaXMpQkNWAQAIAAAAMUwgxYDQkFUAABAAAGAkKQ6TZkkppZShKHmYlEhJKaWUxTCJmJSJxRhjjDHGGGOMMcYYY4wgNGQVAAAEAIAoCY6j5klqzjlnGCeOcqA5aU44pyAHilHgOQnC9SZjbqa0pmtuziklCA1ZBQAAAgBASCGFFFJIIYUUYoghhhhiiCGHHHLIIaeccgoqqKCCCjLIIINMMumkk0466aijjjrqKLTQQgsttNJKTDHVVmOuvQZdfHPOOeecc84555xzzglCQ1YBACAAAARCBhlkEEIIIYUUUogppphyCjLIgNCQVQAAIACAAAAAAEeRFEmxFMuxHM3RJE/yLFETNdEzRVNUTVVVVVV1XVd2Zdd2ddd2fVmYhVu4fVm4hVvYhV33hWEYhmEYhmEYhmH4fd/3fd/3fSA0ZBUAIAEAoCM5luMpoiIaouI5ogOEhqwCAGQAAAQAIAmSIimSo0mmZmquaZu2aKu2bcuyLMuyDISGrAIAAAEABAAAAAAAoGmapmmapmmapmmapmmapmmapmmaZlmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVlAaMgqAEACAEDHcRzHcSRFUiTHciwHCA1ZBQDIAAAIAEBSLMVyNEdzNMdzPMdzPEd0RMmUTM30TA8IDVkFAAACAAgAAAAAAEAxHMVxHMnRJE9SLdNyNVdzPddzTdd1XVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVgdCQVQAABAAAIZ1mlmqACDOQYSA0ZBUAgAAAABihCEMMCA1ZBQAABAAAiKHkIJrQmvPNOQ6a5aCpFJvTwYlUmye5qZibc84555xszhnjnHPOKcqZxaCZ0JpzzkkMmqWgmdCac855EpsHranSmnPOGeecDsYZYZxzzmnSmgep2Vibc85Z0JrmqLkUm3POiZSbJ7W5VJtzzjnnnHPOOeecc86pXpzOwTnhnHPOidqba7kJXZxzzvlknO7NCeGcc84555xzzjnnnHPOCUJDVgEAQAAABGHYGMadgiB9jgZiFCGmIZMedI8Ok6AxyCmkHo2ORkqpg1BSGSeldILQkFUAACAAAIQQUkghhRRSSCGFFFJIIYYYYoghp5xyCiqopJKKKsoos8wyyyyzzDLLrMPOOuuwwxBDDDG00kosNdVWY4215p5zrjlIa6W11lorpZRSSimlIDRkFQAAAgBAIGSQQQYZhRRSSCGGmHLKKaegggoIDVkFAAACAAgAAADwJM8RHdERHdERHdERHdERHc/xHFESJVESJdEyLVMzPVVUVVd2bVmXddu3hV3Ydd/Xfd/XjV8XhmVZlmVZlmVZlmVZlmVZlmUJQkNWAQAgAAAAQgghhBRSSCGFlGKMMcecg05CCYHQkFUAACAAgAAAAABHcRTHkRzJkSRLsiRN0izN8jRP8zTRE0VRNE1TFV3RFXXTFmVTNl3TNWXTVWXVdmXZtmVbt31Ztn3f933f933f933f933f13UgNGQVACABAKAjOZIiKZIiOY7jSJIEhIasAgBkAAAEAKAojuI4jiNJkiRZkiZ5lmeJmqmZnumpogqEhqwCAAABAAQAAAAAAKBoiqeYiqeIiueIjiiJlmmJmqq5omzKruu6ruu6ruu6ruu6ruu6ruu6ruu6ruu6ruu6ruu6ruu6ruu6QGjIKgBAAgBAR3IkR3IkRVIkRXIkBwgNWQUAyAAACADAMRxDUiTHsixN8zRP8zTREz3RMz1VdEUXCA1ZBQAAAgAIAAAAAADAkAxLsRzN0SRRUi3VUjXVUi1VVD1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVNE3TNIHQkJUAABkAACNBBhmEEIpykEJuPVgIMeYkBaE5BqHEGISnEDMMOQ0idJBBJz24kjnDDPPgUigVREyDjSU3jiANwqZcSeU4CEJDVgQAUQAAgDHIMcQYcs5JyaBEzjEJnZTIOSelk9JJKS2WGDMpJaYSY+Oco9JJyaSUGEuKnaQSY4mtAACAAAcAgAALodCQFQFAFAAAYgxSCimFlFLOKeaQUsox5RxSSjmnnFPOOQgdhMoxBp2DECmlHFPOKccchMxB5ZyD0EEoAAAgwAEAIMBCKDRkRQAQJwDgcCTPkzRLFCVLE0XPFGXXE03XlTTNNDVRVFXLE1XVVFXbFk1VtiVNE01N9FRVE0VVFVXTlk1VtW3PNGXZVFXdFlXVtmXbFn5XlnXfM01ZFlXV1k1VtXXXln1f1m1dmDTNNDVRVFVNFFXVVFXbNlXXtjVRdFVRVWVZVFVZdmVZ91VX1n1LFFXVU03ZFVVVtlXZ9W1Vln3hdFVdV2XZ91VZFn5b14Xh9n3hGFXV1k3X1XVVln1h1mVht3XfKGmaaWqiqKqaKKqqqaq2baqurVui6KqiqsqyZ6qurMqyr6uubOuaKKquqKqyLKqqLKuyrPuqLOu2qKq6rcqysJuuq+u27wvDLOu6cKqurquy7PuqLOu6revGceu6MHymKcumq+q6qbq6buu6ccy2bRyjquq+KsvCsMqy7+u6L7R1IVFVdd2UXeNXZVn3bV93nlv3hbJtO7+t+8px67rS+DnPbxy5tm0cs24bv637xvMrP2E4jqVnmrZtqqqtm6qr67JuK8Os60JRVX1dlWXfN11ZF27fN45b142iquq6Ksu+sMqyMdzGbxy7MBxd2zaOW9edsq0LfWPI9wnPa9vGcfs64/Z1o68MCcePAACAAQcAgAATykChISsCgDgBAAYh5xRTECrFIHQQUuogpFQxBiFzTkrFHJRQSmohlNQqxiBUjknInJMSSmgplNJSB6GlUEproZTWUmuxptRi7SCkFkppLZTSWmqpxtRajBFjEDLnpGTOSQmltBZKaS1zTkrnoKQOQkqlpBRLSi1WzEnJoKPSQUippBJTSam1UEprpaQWS0oxthRbbjHWHEppLaQSW0kpxhRTbS3GmiPGIGTOScmckxJKaS2U0lrlmJQOQkqZg5JKSq2VklLMnJPSQUipg45KSSm2kkpMoZTWSkqxhVJabDHWnFJsNZTSWkkpxpJKbC3GWltMtXUQWgultBZKaa21VmtqrcZQSmslpRhLSrG1FmtuMeYaSmmtpBJbSanFFluOLcaaU2s1ptZqbjHmGlttPdaac0qt1tRSjS3GmmNtvdWae+8gpBZKaS2U0mJqLcbWYq2hlNZKKrGVklpsMebaWow5lNJiSanFklKMLcaaW2y5ppZqbDHmmlKLtebac2w19tRarC3GmlNLtdZac4+59VYAAMCAAwBAgAlloNCQlQBAFAAAQYhSzklpEHLMOSoJQsw5J6lyTEIpKVXMQQgltc45KSnF1jkIJaUWSyotxVZrKSm1FmstAACgwAEAIMAGTYnFAQoNWQkARAEAIMYgxBiEBhmlGIPQGKQUYxAipRhzTkqlFGPOSckYcw5CKhljzkEoKYRQSiophRBKSSWlAgAAChwAAAJs0JRYHKDQkBUBQBQAAGAMYgwxhiB0VDIqEYRMSiepgRBaC6111lJrpcXMWmqttNhACK2F1jJLJcbUWmatxJhaKwAA7MABAOzAQig0ZCUAkAcAQBijFGPOOWcQYsw56Bw0CDHmHIQOKsacgw5CCBVjzkEIIYTMOQghhBBC5hyEEEIIoYMQQgillNJBCCGEUkrpIIQQQimldBBCCKGUUgoAACpwAAAIsFFkc4KRoEJDVgIAeQAAgDFKOQehlEYpxiCUklKjFGMQSkmpcgxCKSnFVjkHoZSUWuwglNJabDV2EEppLcZaQ0qtxVhrriGl1mKsNdfUWoy15pprSi3GWmvNuQAA3AUHALADG0U2JxgJKjRkJQCQBwCAIKQUY4wxhhRiijHnnEMIKcWYc84pphhzzjnnlGKMOeecc4wx55xzzjnGmHPOOeccc84555xzjjnnnHPOOeecc84555xzzjnnnHPOCQAAKnAAAAiwUWRzgpGgQkNWAgCpAAAAEVZijDHGGBsIMcYYY4wxRhJijDHGGGNsMcYYY4wxxphijDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYW2uttdZaa6211lprrbXWWmutAEC/CgcA/wcbVkc4KRoLLDRkJQAQDgAAGMOYc445Bh2EhinopIQOQgihQ0o5KCWEUEopKXNOSkqlpJRaSplzUlIqJaWWUuogpNRaSi211loHJaXWUmqttdY6CKW01FprrbXYQUgppdZaiy3GUEpKrbXYYow1hlJSaq3F2GKsMaTSUmwtxhhjrKGU1lprMcYYay0ptdZijLXGWmtJqbXWYos11loLAOBucACASLBxhpWks8LR4EJDVgIAIQEABEKMOeeccxBCCCFSijHnoIMQQgghREox5hx0EEIIIYSMMeeggxBCCCGEkDHmHHQQQgghhBA65xyEEEIIoYRSSuccdBBCCCGUUELpIIQQQgihhFJKKR2EEEIooYRSSiklhBBCCaWUUkoppYQQQgihhBJKKaWUEEIIpZRSSimllBJCCCGUUkoppZRSQgihlFBKKaWUUkoIIYRSSimllFJKCSGEUEoppZRSSikhhBJKKaWUUkoppQAAgAMHAIAAI+gko8oibDThwgNQaMhKAIAMAABx2GrrKdbIIMWchJZLhJByEGIuEVKKOUexZUgZxRjVlDGlFFNSa+icYoxRT51jSjHDrJRWSiiRgtJyrLV2zAEAACAIADAQITOBQAEUGMgAgAOEBCkAoLDA0DFcBATkEjIKDArHhHPSaQMAEITIDJGIWAwSE6qBomI6AFhcYMgHgAyNjbSLC+gywAVd3HUghCAEIYjFARSQgIMTbnjiDU+4wQk6RaUOAgAAAAAAAQAeAACSDSAiIpo5jg6PD5AQkRGSEpMTlAAAAAAA4AGADwCAJAWIiIhmjqPD4wMkRGSEpMTkBCUAAAAAAAAAAAAICAgAAAAAAAQAAAAICE9nZ1MABCwAAAAAAAAAFRIAAAIAAAAPBTD1AgEBAAo='
192
- };
@@ -1,105 +0,0 @@
1
- function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
2
- function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
3
- /**
4
- * Class to manage a 'chunk' (approximately a paragraph) of text on a page.
5
- */
6
- export default class PageChunk {
7
- /**
8
- * @param {number} leafIndex
9
- * @param {number} chunkIndex
10
- * @param {string} text
11
- * @param {DJVURect[]} lineRects
12
- */
13
- constructor(leafIndex, chunkIndex, text, lineRects) {
14
- this.leafIndex = leafIndex;
15
- this.chunkIndex = chunkIndex;
16
- this.text = text;
17
- this.lineRects = lineRects;
18
- }
19
-
20
- /**
21
- * @param {string} server
22
- * @param {string} bookPath
23
- * @param {number} leafIndex
24
- * @return {Promise<PageChunk[]>}
25
- */
26
- static fetch(server, bookPath, leafIndex) {
27
- return _asyncToGenerator(function* () {
28
- var chunks = yield $.ajax({
29
- type: 'GET',
30
- url: "https://".concat(server, "/BookReader/BookReaderGetTextWrapper.php"),
31
- cache: true,
32
- xhrFields: {
33
- withCredentials: window.br.protected
34
- },
35
- data: {
36
- path: "".concat(bookPath, "_djvu.xml"),
37
- page: leafIndex,
38
- callback: 'false'
39
- }
40
- });
41
- return PageChunk._fromTextWrapperResponse(leafIndex, chunks);
42
- })();
43
- }
44
-
45
- /**
46
- * Convert the response from BookReaderGetTextWrapper.php into a {@link PageChunk} instance
47
- * @param {number} leafIndex
48
- * @param {Array<[String, ...DJVURect[]]>} chunksResponse
49
- * @return {PageChunk[]}
50
- */
51
- static _fromTextWrapperResponse(leafIndex, chunksResponse) {
52
- return chunksResponse.map((c, i) => {
53
- var correctedLineRects = PageChunk._fixChunkRects(c.slice(1));
54
- var correctedText = PageChunk._removeDanglingHyphens(c[0]);
55
- return new PageChunk(leafIndex, i, correctedText, correctedLineRects);
56
- });
57
- }
58
-
59
- /**
60
- * @private
61
- * Sometimes the first rectangle will be ridiculously wide/tall. Find those and fix them
62
- * *NOTE*: Modifies the original array and returns it.
63
- * *NOTE*: This should probably be fixed on the petabox side, and then removed here
64
- * Has 2 problems:
65
- * - If the rect is the last rect on the page (and hence the only rect in the array),
66
- * the rect's size isn't fixed
67
- * - Because this relies on the second rect, there's a chance it won't be the right
68
- * width
69
- * @param {DJVURect[]} rects
70
- * @return {DJVURect[]}
71
- */
72
- static _fixChunkRects(rects) {
73
- if (rects.length < 2) return rects;
74
- var [firstRect, secondRect] = rects;
75
- var [left, bottom, right] = firstRect;
76
- var width = right - left;
77
- var secondHeight = secondRect[1] - secondRect[3];
78
- var secondWidth = secondRect[2] - secondRect[0];
79
- var secondRight = secondRect[2];
80
- if (width > secondWidth * 30) {
81
- // Set the end to be the same
82
- firstRect[2] = secondRight;
83
- // And the top to be the same height
84
- firstRect[3] = bottom - secondHeight;
85
- }
86
- return rects;
87
- }
88
-
89
- /**
90
- * Remove "dangling" hyphens from read aloud text to avoid TTS stuttering
91
- * @param {string} text
92
- * @return {string}
93
- */
94
- static _removeDanglingHyphens(text) {
95
- // Some books mis-OCR a dangling hyphen as a ¬ (mathematical not sign) . Since in math
96
- // the not sign should not appear followed by a space, we think we can safely assume
97
- // this should be replaced.
98
- return text.replace(/[-¬]\s+/g, '');
99
- }
100
- }
101
-
102
- /**
103
- * @typedef {[number, number, number, number]} DJVURect
104
- * coords are in l,b,r,t order
105
- */
@@ -1,155 +0,0 @@
1
- function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
2
- function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
3
- import PageChunk from './PageChunk.js';
4
-
5
- /**
6
- * Class that iterates over the page chunks of a book; caching/buffering
7
- * as much as possible to try to ensure a smooth experience.
8
- */
9
- export default class PageChunkIterator {
10
- /**
11
- * @param {number} pageCount total number of pages
12
- * @param {number} start page to start on
13
- * @param {PageChunkIteratorOptions} opts
14
- */
15
- constructor(pageCount, start, opts) {
16
- this.pageCount = pageCount;
17
- this.opts = Object.assign({}, DEFAULT_OPTS, opts);
18
- /** Position in the chunk sequence */
19
- this._cursor = {
20
- page: start,
21
- chunk: 0
22
- };
23
- /** @type {Object<number, PageChunk[]>} leaf index -> chunks*/
24
- this._bufferedPages = {};
25
- /** @type {Object<number, PromiseLike<PageChunk[]>} leaf index -> chunks*/
26
- this._bufferingPages = {};
27
- /**
28
- * @type {Promise} promise that manages cursor modifications so that they
29
- * happen in order triggered as opposed to order the server responds
30
- **/
31
- this._cursorLock = Promise.resolve();
32
- }
33
-
34
- /**
35
- * Get the next chunk
36
- * @return {PromiseLike<"__PageChunkIterator.AT_END__" | PageChunk>}
37
- */
38
- next() {
39
- return this._cursorLock = this._cursorLock.then(() => this._nextUncontrolled());
40
- }
41
-
42
- /**
43
- * Sends the cursor back 1
44
- * @return {Promise}
45
- **/
46
- decrement() {
47
- return this._cursorLock = this._cursorLock.then(() => this._decrementUncontrolled());
48
- }
49
-
50
- /**
51
- * Gets without ensuring synchronization. Since this iterator has a lot of async
52
- * code, calling e.g. "next" twice (before the first call to next has finished)
53
- * would cause the system to be in a weird state. To avoid that, we make sure calls
54
- * to next and decrement (functions that modify the cursor) are synchronized,
55
- * so that regardless how long it takes for one to respond, they'll always be executed
56
- * in the correct order.
57
- * @return {PromiseLike<"__PageChunkIterator.AT_END__" | PageChunk>}
58
- */
59
- _nextUncontrolled() {
60
- var _this = this;
61
- return _asyncToGenerator(function* () {
62
- if (_this._cursor.page == _this.pageCount) {
63
- return Promise.resolve(PageChunkIterator.AT_END);
64
- }
65
- _this._recenterBuffer(_this._cursor.page);
66
- var chunks = yield _this._fetchPageChunks(_this._cursor.page);
67
- if (_this._cursor.chunk == chunks.length) {
68
- _this._cursor.page++;
69
- _this._cursor.chunk = 0;
70
- return _this._nextUncontrolled();
71
- }
72
- return chunks[_this._cursor.chunk++];
73
- })();
74
- }
75
-
76
- /**
77
- * Decrements without ensuring synchronization. (See {@link PageChunkIterator._nextUncontrolled});
78
- * @return {Promise}
79
- */
80
- _decrementUncontrolled() {
81
- var cursorChangePromise = Promise.resolve();
82
- if (this._cursor.chunk > 0) {
83
- this._cursor.chunk--;
84
- } else if (this._cursor.page > 0) {
85
- this._cursor.page--;
86
- // Go back possibly multiple pages, because pages can be blank
87
- cursorChangePromise = this._fetchPageChunks(this._cursor.page).then(prevPageChunks => {
88
- if (prevPageChunks.length == 0) return this._decrementUncontrolled();else this._cursor.chunk = prevPageChunks.length - 1;
89
- });
90
- }
91
- return cursorChangePromise.then(() => this._fetchPageChunks(this._cursor.page));
92
- }
93
-
94
- /**
95
- * Recenter the buffer around the provided page index
96
- * @param {number} index
97
- */
98
- _recenterBuffer(index) {
99
- var start = Math.max(0, index - this.opts.pageBufferSize);
100
- var end = Math.min(this.pageCount, index + this.opts.pageBufferSize + 1);
101
- for (var i = start; i < end; i++) {
102
- this._fetchPageChunks(i);
103
- }
104
- this._removePageFromBuffer(start - 1);
105
- this._removePageFromBuffer(end + 1);
106
- }
107
-
108
- /**
109
- * @param {number} index
110
- */
111
- _removePageFromBuffer(index) {
112
- delete this._bufferingPages[index];
113
- delete this._bufferedPages[index];
114
- }
115
-
116
- /**
117
- * Fetches the chunks on a page; checks the buffer, so it won't make unnecessary
118
- * requests if it's called multiple times for the same index.
119
- * @param {number} index
120
- * @return {Promise<PageChunk[]>}
121
- */
122
- _fetchPageChunks(index) {
123
- if (index in this._bufferingPages) return this._bufferingPages[index];
124
- if (index in this._bufferedPages) return Promise.resolve(this._bufferedPages[index]);
125
- this._bufferingPages[index] = this._fetchPageChunksDirect(index).then(chunks => {
126
- delete this._bufferingPages[index];
127
- this._bufferedPages[index] = chunks;
128
- return chunks;
129
- });
130
- return this._bufferingPages[index];
131
- }
132
-
133
- /**
134
- * Fetches a page without checking buffer
135
- * @param {number} index
136
- */
137
- _fetchPageChunksDirect(index) {
138
- return PageChunk.fetch(this.opts.server, this.opts.bookPath, index);
139
- }
140
- }
141
- PageChunkIterator.AT_END = "__PageChunkIterator.AT_END__";
142
-
143
- /** @type {PageChunkIteratorOptions} */
144
- var DEFAULT_OPTS = {
145
- server: null,
146
- bookPath: null,
147
- pageBufferSize: 2
148
- };
149
-
150
- /**
151
- * @typedef {Object} PageChunkIteratorOptions
152
- * @property {string} server
153
- * @property {string} bookPath
154
- * @property {number} [pageBufferSize] number of pages to buffer before/after the current page
155
- */