@internetarchive/bookreader 5.0.0-94 → 5.0.0-95

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 (181) hide show
  1. package/.github/workflows/npm-publish.yml +2 -12
  2. package/CHANGELOG.md +7 -0
  3. package/README.md +0 -2
  4. package/package.json +1 -1
  5. package/scripts/version.js +0 -3
  6. package/BookReader/BookReader.css +0 -2251
  7. package/BookReader/BookReader.js +0 -3
  8. package/BookReader/BookReader.js.LICENSE.txt +0 -72
  9. package/BookReader/BookReader.js.map +0 -1
  10. package/BookReader/ia-bookreader-bundle.js +0 -1782
  11. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +0 -7
  12. package/BookReader/ia-bookreader-bundle.js.map +0 -1
  13. package/BookReader/icons/1up.svg +0 -1
  14. package/BookReader/icons/2up.svg +0 -1
  15. package/BookReader/icons/advance.svg +0 -3
  16. package/BookReader/icons/chevron-right.svg +0 -1
  17. package/BookReader/icons/close-circle-dark.svg +0 -1
  18. package/BookReader/icons/close-circle.svg +0 -1
  19. package/BookReader/icons/fullscreen.svg +0 -1
  20. package/BookReader/icons/fullscreen_exit.svg +0 -1
  21. package/BookReader/icons/hamburger.svg +0 -1
  22. package/BookReader/icons/left-arrow.svg +0 -1
  23. package/BookReader/icons/magnify-minus.svg +0 -1
  24. package/BookReader/icons/magnify-plus.svg +0 -1
  25. package/BookReader/icons/magnify.svg +0 -1
  26. package/BookReader/icons/pause.svg +0 -1
  27. package/BookReader/icons/play.svg +0 -1
  28. package/BookReader/icons/playback-speed.svg +0 -1
  29. package/BookReader/icons/read-aloud.svg +0 -1
  30. package/BookReader/icons/review.svg +0 -3
  31. package/BookReader/icons/thumbnails.svg +0 -1
  32. package/BookReader/icons/voice.svg +0 -1
  33. package/BookReader/icons/volume-full.svg +0 -1
  34. package/BookReader/images/BRicons.png +0 -0
  35. package/BookReader/images/BRicons.svg +0 -5
  36. package/BookReader/images/BRicons_ia.png +0 -0
  37. package/BookReader/images/back_pages.png +0 -0
  38. package/BookReader/images/book_bottom_icon.png +0 -0
  39. package/BookReader/images/book_down_icon.png +0 -0
  40. package/BookReader/images/book_left_icon.png +0 -0
  41. package/BookReader/images/book_leftmost_icon.png +0 -0
  42. package/BookReader/images/book_right_icon.png +0 -0
  43. package/BookReader/images/book_rightmost_icon.png +0 -0
  44. package/BookReader/images/book_top_icon.png +0 -0
  45. package/BookReader/images/book_up_icon.png +0 -0
  46. package/BookReader/images/books_graphic.svg +0 -1
  47. package/BookReader/images/booksplit.png +0 -0
  48. package/BookReader/images/control_pause_icon.png +0 -0
  49. package/BookReader/images/control_play_icon.png +0 -0
  50. package/BookReader/images/embed_icon.png +0 -0
  51. package/BookReader/images/hypothesis.ico +0 -0
  52. package/BookReader/images/icon-home-ia.png +0 -0
  53. package/BookReader/images/icon_OL-logo-xs.png +0 -0
  54. package/BookReader/images/icon_alert-xs.png +0 -0
  55. package/BookReader/images/icon_book.svg +0 -1
  56. package/BookReader/images/icon_bookmark.svg +0 -1
  57. package/BookReader/images/icon_close-pop.png +0 -0
  58. package/BookReader/images/icon_download.png +0 -0
  59. package/BookReader/images/icon_gear.svg +0 -1
  60. package/BookReader/images/icon_hamburger.svg +0 -1
  61. package/BookReader/images/icon_home.png +0 -0
  62. package/BookReader/images/icon_home.svg +0 -1
  63. package/BookReader/images/icon_home_ia.png +0 -0
  64. package/BookReader/images/icon_indicator.png +0 -0
  65. package/BookReader/images/icon_info.svg +0 -1
  66. package/BookReader/images/icon_one_page.svg +0 -1
  67. package/BookReader/images/icon_pause.svg +0 -1
  68. package/BookReader/images/icon_play.svg +0 -1
  69. package/BookReader/images/icon_playback-rate.svg +0 -1
  70. package/BookReader/images/icon_return.png +0 -0
  71. package/BookReader/images/icon_search_button.svg +0 -1
  72. package/BookReader/images/icon_share.svg +0 -1
  73. package/BookReader/images/icon_skip-ahead.svg +0 -1
  74. package/BookReader/images/icon_skip-back.svg +0 -2
  75. package/BookReader/images/icon_speaker.svg +0 -1
  76. package/BookReader/images/icon_speaker_open.svg +0 -1
  77. package/BookReader/images/icon_thumbnails.svg +0 -1
  78. package/BookReader/images/icon_toc.svg +0 -1
  79. package/BookReader/images/icon_two_pages.svg +0 -1
  80. package/BookReader/images/icon_zoomer.png +0 -0
  81. package/BookReader/images/loading.gif +0 -0
  82. package/BookReader/images/logo_icon.png +0 -0
  83. package/BookReader/images/marker_chap-off.png +0 -0
  84. package/BookReader/images/marker_chap-off.svg +0 -1
  85. package/BookReader/images/marker_chap-off_ia.png +0 -0
  86. package/BookReader/images/marker_chap-on.png +0 -0
  87. package/BookReader/images/marker_chap-on.svg +0 -1
  88. package/BookReader/images/marker_srch-on.svg +0 -1
  89. package/BookReader/images/marker_srchchap-off.png +0 -0
  90. package/BookReader/images/marker_srchchap-on.png +0 -0
  91. package/BookReader/images/nav_control-dn.png +0 -0
  92. package/BookReader/images/nav_control-dn_ia.png +0 -0
  93. package/BookReader/images/nav_control-up.png +0 -0
  94. package/BookReader/images/nav_control-up_ia.png +0 -0
  95. package/BookReader/images/nav_control.png +0 -0
  96. package/BookReader/images/one_page_mode_icon.png +0 -0
  97. package/BookReader/images/paper-badge.png +0 -0
  98. package/BookReader/images/print_icon.png +0 -0
  99. package/BookReader/images/progressbar.gif +0 -0
  100. package/BookReader/images/right_edges.png +0 -0
  101. package/BookReader/images/slider.png +0 -0
  102. package/BookReader/images/slider_ia.png +0 -0
  103. package/BookReader/images/thumbnail_mode_icon.png +0 -0
  104. package/BookReader/images/transparent.png +0 -0
  105. package/BookReader/images/two_page_mode_icon.png +0 -0
  106. package/BookReader/images/unviewable_page.png +0 -0
  107. package/BookReader/images/zoom_in_icon.png +0 -0
  108. package/BookReader/images/zoom_out_icon.png +0 -0
  109. package/BookReader/jquery-3.js +0 -2
  110. package/BookReader/jquery-3.js.LICENSE.txt +0 -24
  111. package/BookReader/plugins/plugin.archive_analytics.js +0 -2
  112. package/BookReader/plugins/plugin.archive_analytics.js.map +0 -1
  113. package/BookReader/plugins/plugin.autoplay.js +0 -2
  114. package/BookReader/plugins/plugin.autoplay.js.map +0 -1
  115. package/BookReader/plugins/plugin.chapters.js +0 -26
  116. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +0 -1
  117. package/BookReader/plugins/plugin.chapters.js.map +0 -1
  118. package/BookReader/plugins/plugin.experiments.js +0 -3
  119. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +0 -1
  120. package/BookReader/plugins/plugin.experiments.js.map +0 -1
  121. package/BookReader/plugins/plugin.iframe.js +0 -2
  122. package/BookReader/plugins/plugin.iframe.js.map +0 -1
  123. package/BookReader/plugins/plugin.iiif.js +0 -2
  124. package/BookReader/plugins/plugin.iiif.js.map +0 -1
  125. package/BookReader/plugins/plugin.resume.js +0 -2
  126. package/BookReader/plugins/plugin.resume.js.map +0 -1
  127. package/BookReader/plugins/plugin.search.js +0 -3
  128. package/BookReader/plugins/plugin.search.js.LICENSE.txt +0 -1
  129. package/BookReader/plugins/plugin.search.js.map +0 -1
  130. package/BookReader/plugins/plugin.text_selection.js +0 -3
  131. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +0 -1
  132. package/BookReader/plugins/plugin.text_selection.js.map +0 -1
  133. package/BookReader/plugins/plugin.tts.js +0 -3
  134. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +0 -29
  135. package/BookReader/plugins/plugin.tts.js.map +0 -1
  136. package/BookReader/plugins/plugin.url.js +0 -2
  137. package/BookReader/plugins/plugin.url.js.map +0 -1
  138. package/BookReader/plugins/plugin.vendor-fullscreen.js +0 -2
  139. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +0 -1
  140. package/BookReader/webcomponents-bundle.js +0 -3
  141. package/BookReader/webcomponents-bundle.js.LICENSE.txt +0 -9
  142. package/BookReader/webcomponents-bundle.js.map +0 -1
  143. package/src/BookReader/BookModel.js +0 -564
  144. package/src/BookReader/DragScrollable.js +0 -233
  145. package/src/BookReader/ImageCache.js +0 -149
  146. package/src/BookReader/Mode1Up.js +0 -110
  147. package/src/BookReader/Mode1UpLit.js +0 -388
  148. package/src/BookReader/Mode2Up.js +0 -107
  149. package/src/BookReader/Mode2UpLit.js +0 -777
  150. package/src/BookReader/ModeCoordinateSpace.js +0 -29
  151. package/src/BookReader/ModeSmoothZoom.js +0 -312
  152. package/src/BookReader/ModeThumb.js +0 -344
  153. package/src/BookReader/Navbar/Navbar.js +0 -355
  154. package/src/BookReader/PageContainer.js +0 -172
  155. package/src/BookReader/ReduceSet.js +0 -26
  156. package/src/BookReader/Toolbar/Toolbar.js +0 -362
  157. package/src/BookReader/events.js +0 -19
  158. package/src/BookReader/options.js +0 -387
  159. package/src/BookReader/utils/HTMLDimensionsCacher.js +0 -44
  160. package/src/BookReader/utils/ScrollClassAdder.js +0 -31
  161. package/src/BookReader/utils/SelectionObserver.js +0 -45
  162. package/src/BookReader/utils/classes.js +0 -36
  163. package/src/BookReader/utils.js +0 -313
  164. package/tests/jest/BookReader/BookModel.test.js +0 -372
  165. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +0 -263
  166. package/tests/jest/BookReader/ImageCache.test.js +0 -150
  167. package/tests/jest/BookReader/Mode1UpLit.test.js +0 -73
  168. package/tests/jest/BookReader/Mode2Up.test.js +0 -98
  169. package/tests/jest/BookReader/Mode2UpLit.test.js +0 -190
  170. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +0 -16
  171. package/tests/jest/BookReader/ModeSmoothZoom.test.js +0 -218
  172. package/tests/jest/BookReader/ModeThumb.test.js +0 -71
  173. package/tests/jest/BookReader/Navbar/Navbar.test.js +0 -182
  174. package/tests/jest/BookReader/PageContainer.test.js +0 -249
  175. package/tests/jest/BookReader/ReduceSet.test.js +0 -38
  176. package/tests/jest/BookReader/Toolbar/Toolbar.test.js +0 -26
  177. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +0 -59
  178. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +0 -49
  179. package/tests/jest/BookReader/utils/SelectionObserver.test.js +0 -57
  180. package/tests/jest/BookReader/utils/classes.test.js +0 -88
  181. package/tests/jest/BookReader/utils.test.js +0 -250
@@ -1,250 +0,0 @@
1
- import sinon from 'sinon';
2
- import { afterEventLoop, eventTargetMixin } from '../utils.js';
3
- import {
4
- clamp,
5
- cssPercentage,
6
- debounce,
7
- decodeURIComponentPlus,
8
- encodeURIComponentPlus,
9
- escapeHTML,
10
- escapeRegExp,
11
- getActiveElement,
12
- isInputActive,
13
- parseAnimationSpeed,
14
- poll,
15
- polyfillCustomEvent,
16
- PolyfilledCustomEvent,
17
- promisifyEvent,
18
- sleep,
19
- } from '@/src/BookReader/utils.js';
20
-
21
- test('clamp function returns Math.min(Math.max(value, min), max)', () => {
22
- expect(clamp(2,1,3)).toEqual(2);
23
- });
24
-
25
- test('calculate a percentage suitable for CSS', () => {
26
- expect(cssPercentage(2,1)).toEqual('200%');
27
- });
28
-
29
- test('escapeHTML function which replaces the string', () => {
30
- expect(escapeHTML('Me & You')).toEqual('Me & You');
31
- expect(escapeHTML('Me > You')).toEqual('Me > You');
32
- expect(escapeHTML('Me < You')).toEqual('Me &lt; You');
33
- expect(escapeHTML('Me " You')).toEqual('Me &quot; You');
34
- });
35
-
36
- test('Decodes a URI component and converts + to emptyStr', () => {
37
- expect(decodeURIComponentPlus("https%3A%2F%2Farchive.org%2Fskr+")).toEqual("https://archive.org/skr ");
38
- expect(decodeURIComponentPlus("%3Fx%3D+test")).toEqual("?x= test");
39
- });
40
-
41
- test('Encodes a URI component and converts emptyStr to +', () => {
42
- expect(encodeURIComponentPlus("?x=test ")).toEqual("%3Fx%3Dtest+");
43
- expect(encodeURIComponentPlus("ABC abc 123")).toEqual("ABC+abc+123");
44
- });
45
-
46
- describe('getActiveElement', () => {
47
- test('Can ignore shadow DOM', () => {
48
- const doc = {activeElement: { shadowRoot: {activeElement: {}}}};
49
- expect(getActiveElement(doc, false)).toBe(doc.activeElement);
50
- });
51
-
52
- test('Can traverse shadow DOM', () => {
53
- const doc = {activeElement: { shadowRoot: {activeElement: {}}}};
54
- expect(getActiveElement(doc, true)).toBe(doc.activeElement.shadowRoot.activeElement);
55
- });
56
-
57
- test('Handles non-shadow elements', () => {
58
- const doc = {activeElement: {}};
59
- expect(getActiveElement(doc, true)).toBe(doc.activeElement);
60
- });
61
-
62
- test('Handles no active element', () => {
63
- const doc = {activeElement: null};
64
- expect(getActiveElement(doc, true)).toBe(null);
65
- });
66
- });
67
-
68
- describe('isInputActive', () => {
69
- test('Handles no activeElement', () => {
70
- expect(isInputActive({activeElement: null})).toBe(false);
71
- });
72
-
73
- test('Handles deep input activeElement', () => {
74
- const doc = {activeElement: { shadowRoot: {activeElement: { tagName: 'INPUT' }}}};
75
- expect(isInputActive(doc)).toBe(true);
76
- });
77
-
78
- test('Handles deep non-input activeElement', () => {
79
- const doc = {activeElement: { shadowRoot: {activeElement: { tagName: 'A' }}}};
80
- expect(isInputActive(doc)).toBe(false);
81
- });
82
-
83
- test('Handles textarea activeElement', () => {
84
- const doc = {activeElement: { tagName: 'TEXTAREA' }};
85
- expect(isInputActive(doc)).toBe(true);
86
- });
87
- });
88
-
89
- describe('debounce', () => {
90
- /** @type {sinon.SinonFakeTimers} */
91
- let clock;
92
- beforeEach(() => clock = sinon.useFakeTimers());
93
- afterEach(() => clock.restore());
94
-
95
- test('testing debounce', () => {
96
- const func = jest.fn();
97
- const debouncedFunc = debounce(func, 1000);
98
- // Call it immediately
99
- debouncedFunc();
100
- expect(func).toHaveBeenCalledTimes(0); // func not called
101
-
102
- // Call it several times with 500ms between each call
103
- for (let i = 0; i < 10; i++) {
104
- clock.tick(500);
105
- debouncedFunc();
106
- }
107
- expect(func).toHaveBeenCalledTimes(0); // func not called
108
-
109
- // wait 1000ms
110
- clock.tick(1000);
111
- expect(func).toHaveBeenCalledTimes(1); // func called
112
- });
113
- });
114
-
115
-
116
- describe('polyfillCustomEvent', () => {
117
- test('Overrides when missing', () => {
118
- const win = {};
119
- polyfillCustomEvent(win);
120
- expect(win).toHaveProperty('CustomEvent');
121
- });
122
-
123
- test('Overrides when not a function', () => {
124
- const win = { CustomEvent: {} };
125
- polyfillCustomEvent(win);
126
- expect(typeof win.CustomEvent).toBe('function');
127
- });
128
- });
129
-
130
- describe('PolyfilledCustomEvent', () => {
131
- test('Can be called as a constructor', () => {
132
- new PolyfilledCustomEvent('foo');
133
- });
134
-
135
- test('Calls deprecated browser methods', () => {
136
- const createEventSpy = sinon.spy(document, 'createEvent');
137
- const initCustomEventSpy = sinon.spy(CustomEvent.prototype, 'initCustomEvent');
138
- new PolyfilledCustomEvent('foo');
139
- expect(createEventSpy.callCount).toBe(1);
140
- expect(initCustomEventSpy.callCount).toBe(1);
141
- });
142
- });
143
-
144
- describe('poll', () => {
145
- beforeEach(() => jest.useFakeTimers());
146
- afterEach(() => jest.useRealTimers());
147
- test('polls until condition is true', async () => {
148
- const fakeSleep = sinon.spy((ms) => jest.advanceTimersByTime(ms));
149
-
150
- const returns = [null, null, 'foo'];
151
- const check = sinon.spy(() => returns.shift());
152
- const result = await poll(check, {_sleep: fakeSleep});
153
- expect(fakeSleep.callCount).toBe(2);
154
- expect(result).toBe('foo');
155
- expect(check.callCount).toBe(3);
156
- });
157
-
158
- test('times out eventually', async () => {
159
- const fakeSleep = sinon.spy((ms) => jest.advanceTimersByTime(ms));
160
-
161
- const check = sinon.stub().returns(null);
162
- const result = await poll(check, {_sleep: fakeSleep});
163
- expect(result).toBeUndefined();
164
- expect(check.callCount).toBe(10);
165
- });
166
- });
167
-
168
- describe('sleep', () => {
169
- test('Sleep 0 doest not called immediately', async () => {
170
- const spy = sinon.spy();
171
- sleep(0).then(spy);
172
- expect(spy.callCount).toBe(0);
173
- await afterEventLoop();
174
- expect(spy.callCount).toBe(1);
175
- });
176
-
177
- test('Waits the appropriate ms', async () => {
178
- const clock = sinon.useFakeTimers();
179
- const spy = sinon.spy();
180
- sleep(10).then(spy);
181
- expect(spy.callCount).toBe(0);
182
- clock.tick(10);
183
- expect(spy.callCount).toBe(0);
184
- clock.restore();
185
-
186
- await afterEventLoop();
187
- expect(spy.callCount).toBe(1);
188
- });
189
- });
190
-
191
- describe('promisifyEvent', () => {
192
- test('Resolves once event fires', async () => {
193
- const fakeTarget = eventTargetMixin();
194
- const resolveSpy = sinon.spy();
195
- promisifyEvent(fakeTarget, 'pause').then(resolveSpy);
196
-
197
- await afterEventLoop();
198
- expect(resolveSpy.callCount).toBe(0);
199
- fakeTarget.dispatchEvent('pause', {});
200
- await afterEventLoop();
201
- expect(resolveSpy.callCount).toBe(1);
202
- });
203
-
204
- test('Only resolves once', async () => {
205
- const fakeTarget = eventTargetMixin();
206
- const resolveSpy = sinon.spy();
207
- promisifyEvent(fakeTarget, 'pause').then(resolveSpy);
208
-
209
- await afterEventLoop();
210
- expect(resolveSpy.callCount).toBe(0);
211
- fakeTarget.dispatchEvent('pause', {});
212
- fakeTarget.dispatchEvent('pause', {});
213
- fakeTarget.dispatchEvent('pause', {});
214
- fakeTarget.dispatchEvent('pause', {});
215
-
216
- await afterEventLoop();
217
- expect(resolveSpy.callCount).toBe(1);
218
- });
219
- });
220
-
221
- describe('escapeRegex', () => {
222
- test('Escapes regex', () => {
223
- expect(escapeRegExp('.*')).toBe('\\.\\*');
224
- expect(escapeRegExp('foo')).toBe('foo');
225
- expect(escapeRegExp('foo.bar')).toBe('foo\\.bar');
226
- expect(escapeRegExp('{{{')).toBe('\\{\\{\\{');
227
- expect(escapeRegExp('')).toBe('');
228
- expect(escapeRegExp('https://example.com')).toBe('https://example\\.com');
229
- });
230
- });
231
-
232
- describe('parseAnimationSpeed', () => {
233
- test('Parses numbers', () => {
234
- expect(parseAnimationSpeed(100)).toBe(100);
235
- expect(parseAnimationSpeed(0)).toBe(0);
236
- expect(parseAnimationSpeed(1000)).toBe(1000);
237
- });
238
-
239
- test('Parses strings', () => {
240
- expect(parseAnimationSpeed('slow')).toBe(600);
241
- expect(parseAnimationSpeed('fast')).toBe(200);
242
- expect(parseAnimationSpeed('100')).toBe(100);
243
- });
244
-
245
- test('Handles invalid input', () => {
246
- expect(parseAnimationSpeed('foo')).toBeFalsy();
247
- expect(parseAnimationSpeed('')).toBeFalsy();
248
- expect(parseAnimationSpeed(null)).toBeFalsy();
249
- });
250
- });