@internetarchive/bookreader 5.0.0-94 → 5.0.0-96
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.
- package/BookReader/BookReader.js +1 -1
- package/BookReader/hypothesis/LICENSE +50 -0
- package/BookReader/hypothesis/README.md +55 -0
- package/BookReader/hypothesis/build/boot.js +1 -0
- package/BookReader/hypothesis/build/manifest.json +20 -0
- package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
- package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
- package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
- package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
- package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/highlights.css +2 -0
- package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
- package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
- package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
- package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
- package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
- package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
- package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
- package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
- package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
- package/BookReader/hypothesis/package.json +126 -0
- package/README.md +0 -2
- package/package.json +6 -1
- package/.eslintrc.cjs +0 -51
- package/.gitattributes +0 -2
- package/.github/ISSUE_TEMPLATE/bug.md +0 -32
- package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
- package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
- package/.github/workflows/node.js.yml +0 -102
- package/.github/workflows/npm-publish.yml +0 -33
- package/.testcaferc.cjs +0 -10
- package/BookReaderDemo/BookReaderDemo.css +0 -40
- package/BookReaderDemo/BookReaderJSAdvanced.js +0 -112
- package/BookReaderDemo/BookReaderJSSimple.js +0 -56
- package/BookReaderDemo/IADemoBr.js +0 -149
- package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
- package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
- package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
- package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
- package/BookReaderDemo/demo-advanced.html +0 -33
- package/BookReaderDemo/demo-embed-iframe-src.html +0 -85
- package/BookReaderDemo/demo-embed.html +0 -26
- package/BookReaderDemo/demo-fullscreen-mobile.html +0 -34
- package/BookReaderDemo/demo-fullscreen.html +0 -31
- package/BookReaderDemo/demo-iiif.html +0 -121
- package/BookReaderDemo/demo-internetarchive.html +0 -271
- package/BookReaderDemo/demo-multiple.html +0 -44
- package/BookReaderDemo/demo-preview-pages.html +0 -1093
- package/BookReaderDemo/demo-simple.html +0 -35
- package/BookReaderDemo/demo-vendor-fullscreen.html +0 -34
- package/BookReaderDemo/ia-multiple-volumes-manifest.js +0 -169
- package/BookReaderDemo/immersion-1up.html +0 -64
- package/BookReaderDemo/immersion-mode.html +0 -33
- package/BookReaderDemo/toggle_controls.html +0 -54
- package/BookReaderDemo/view_mode.html +0 -40
- package/BookReaderDemo/viewmode-cycle.html +0 -40
- package/CHANGELOG.md +0 -1080
- package/CONTRIBUTING.md +0 -7
- package/babel.config.cjs +0 -20
- package/codecov.yml +0 -23
- package/index.html +0 -34
- package/netlify.toml +0 -9
- package/renovate.json +0 -52
- package/screenshot.png +0 -0
- package/scripts/postversion.js +0 -11
- package/scripts/preversion.js +0 -15
- package/scripts/version.js +0 -27
- package/tests/e2e/README.md +0 -112
- package/tests/e2e/autoplay.test.js +0 -16
- package/tests/e2e/base.test.js +0 -27
- package/tests/e2e/helpers/base.js +0 -263
- package/tests/e2e/helpers/debug.js +0 -13
- package/tests/e2e/helpers/mockSearch.js +0 -90
- package/tests/e2e/helpers/params.js +0 -17
- package/tests/e2e/helpers/rightToLeft.js +0 -23
- package/tests/e2e/helpers/search.js +0 -73
- package/tests/e2e/models/BookReader.js +0 -11
- package/tests/e2e/models/Navigation.js +0 -39
- package/tests/e2e/rightToLeft.test.js +0 -19
- package/tests/e2e/viewmode.test.js +0 -44
- package/tests/jest/BookNavigator/book-navigator.test.js +0 -653
- package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +0 -43
- package/tests/jest/BookNavigator/bookmarks/bookmark-edit.test.js +0 -132
- package/tests/jest/BookNavigator/bookmarks/bookmarks-list.test.js +0 -221
- package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +0 -45
- package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +0 -67
- package/tests/jest/BookNavigator/downloads/downloads.test.js +0 -53
- package/tests/jest/BookNavigator/search/search-provider.test.js +0 -179
- package/tests/jest/BookNavigator/search/search-results.test.js +0 -289
- package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +0 -49
- package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +0 -80
- package/tests/jest/BookNavigator/visual-adjustments.test.js +0 -200
- package/tests/jest/BookReader/BookModel.test.js +0 -372
- package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +0 -263
- package/tests/jest/BookReader/ImageCache.test.js +0 -150
- package/tests/jest/BookReader/Mode1UpLit.test.js +0 -73
- package/tests/jest/BookReader/Mode2Up.test.js +0 -98
- package/tests/jest/BookReader/Mode2UpLit.test.js +0 -190
- package/tests/jest/BookReader/ModeCoordinateSpace.test.js +0 -16
- package/tests/jest/BookReader/ModeSmoothZoom.test.js +0 -218
- package/tests/jest/BookReader/ModeThumb.test.js +0 -71
- package/tests/jest/BookReader/Navbar/Navbar.test.js +0 -182
- package/tests/jest/BookReader/PageContainer.test.js +0 -249
- package/tests/jest/BookReader/ReduceSet.test.js +0 -38
- package/tests/jest/BookReader/Toolbar/Toolbar.test.js +0 -26
- package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +0 -59
- package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +0 -49
- package/tests/jest/BookReader/utils/SelectionObserver.test.js +0 -57
- package/tests/jest/BookReader/utils/classes.test.js +0 -88
- package/tests/jest/BookReader/utils.test.js +0 -250
- package/tests/jest/BookReader.keyboard.test.js +0 -190
- package/tests/jest/BookReader.options.test.js +0 -47
- package/tests/jest/BookReader.test.js +0 -316
- package/tests/jest/plugins/plugin.archive_analytics.test.js +0 -20
- package/tests/jest/plugins/plugin.autoplay.test.js +0 -35
- package/tests/jest/plugins/plugin.chapters.test.js +0 -193
- package/tests/jest/plugins/plugin.iframe.test.js +0 -42
- package/tests/jest/plugins/plugin.resume.test.js +0 -85
- package/tests/jest/plugins/plugin.text_selection.test.js +0 -447
- package/tests/jest/plugins/plugin.vendor-fullscreen.test.js +0 -65
- package/tests/jest/plugins/search/plugin.search.test.js +0 -120
- package/tests/jest/plugins/search/plugin.search.view.test.js +0 -131
- package/tests/jest/plugins/search/utils.js +0 -25
- package/tests/jest/plugins/search/utils.test.js +0 -29
- package/tests/jest/plugins/tts/AbstractTTSEngine.test.js +0 -173
- package/tests/jest/plugins/tts/FestivalTTSEngine.test.js +0 -59
- package/tests/jest/plugins/tts/PageChunk.test.js +0 -57
- package/tests/jest/plugins/tts/PageChunkIterator.test.js +0 -179
- package/tests/jest/plugins/tts/WebTTSEngine.test.js +0 -178
- package/tests/jest/plugins/tts/utils.test.js +0 -74
- package/tests/jest/plugins/url/UrlPlugin.test.js +0 -198
- package/tests/jest/plugins/url/plugin.url.test.js +0 -168
- package/tests/jest/setup.js +0 -3
- package/tests/jest/util/browserSniffing.test.js +0 -62
- package/tests/jest/util/docCookies.test.js +0 -24
- package/tests/jest/util/strings.test.js +0 -63
- package/tests/jest/utils.js +0 -83
- package/webpack.config.js +0 -97
@@ -1,372 +0,0 @@
|
|
1
|
-
import sinon from 'sinon';
|
2
|
-
import { deepCopy } from '../utils.js';
|
3
|
-
import { BookModel } from '@/src/BookReader/BookModel.js';
|
4
|
-
import { NAMED_REDUCE_SETS } from '@/src/BookReader/ReduceSet.js';
|
5
|
-
/** @typedef {import('@/src/BookReader/options.js').BookReaderOptions} BookReaderOptions */
|
6
|
-
|
7
|
-
afterEach(() => {
|
8
|
-
sinon.restore();
|
9
|
-
});
|
10
|
-
|
11
|
-
/** @type {BookReaderOptions['data']} */
|
12
|
-
const SAMPLE_DATA = [
|
13
|
-
[
|
14
|
-
{ width: 123, height: 123, uri: 'https://archive.org/image0.jpg', pageNum: '1' },
|
15
|
-
],
|
16
|
-
[
|
17
|
-
{ width: 123, height: 123, uri: 'https://archive.org/image1.jpg', pageNum: '2' },
|
18
|
-
{ width: 123, height: 123, uri: 'https://archive.org/image2.jpg', pageNum: '3' },
|
19
|
-
],
|
20
|
-
[
|
21
|
-
{ width: 123, height: 123, uri: 'https://archive.org/image3.jpg', pageNum: '4' },
|
22
|
-
],
|
23
|
-
];
|
24
|
-
|
25
|
-
describe('getMedianPageSizeInches', () => {
|
26
|
-
test('handles single page data', () => {
|
27
|
-
const bm = new BookModel({ data: SAMPLE_DATA.slice(0, 1), options: {ppi: 10} });
|
28
|
-
expect(bm.getMedianPageSizeInches()).toEqual({ width: 12.3, height: 12.3 });
|
29
|
-
});
|
30
|
-
|
31
|
-
test('handles odd pages data', () => {
|
32
|
-
const sizes = [
|
33
|
-
{width: 300, height: 2200},
|
34
|
-
{width: 200, height: 2100},
|
35
|
-
{width: 100, height: 2300},
|
36
|
-
];
|
37
|
-
const data = deepCopy(SAMPLE_DATA);
|
38
|
-
delete data[2];
|
39
|
-
Object.assign(data[0][0], sizes[0]);
|
40
|
-
Object.assign(data[1][0], sizes[1]);
|
41
|
-
Object.assign(data[1][1], sizes[2]);
|
42
|
-
const bm = new BookModel({ data, options: {ppi: 10} });
|
43
|
-
expect(bm.getMedianPageSizeInches()).toEqual({ width: 20, height: 220 });
|
44
|
-
});
|
45
|
-
|
46
|
-
|
47
|
-
test('handles even pages data', () => {
|
48
|
-
const sizes = [
|
49
|
-
{width: 300, height: 2200},
|
50
|
-
{width: 200, height: 2100},
|
51
|
-
{width: 100, height: 2300},
|
52
|
-
{width: 400, height: 2400},
|
53
|
-
];
|
54
|
-
const data = deepCopy(SAMPLE_DATA);
|
55
|
-
Object.assign(data[0][0], sizes[0]);
|
56
|
-
Object.assign(data[1][0], sizes[1]);
|
57
|
-
Object.assign(data[1][1], sizes[2]);
|
58
|
-
Object.assign(data[2][0], sizes[3]);
|
59
|
-
const bm = new BookModel({ data, options: {ppi: 10} });
|
60
|
-
expect(bm.getMedianPageSizeInches()).toEqual({ width: 30, height: 230 });
|
61
|
-
});
|
62
|
-
|
63
|
-
test('does not lexicographic sort for median', () => {
|
64
|
-
const sizes = [
|
65
|
-
{width: 100, height: 100},
|
66
|
-
{width: 20, height: 20},
|
67
|
-
{width: 30, height: 30},
|
68
|
-
];
|
69
|
-
const data = deepCopy(SAMPLE_DATA);
|
70
|
-
delete data[2];
|
71
|
-
Object.assign(data[0][0], sizes[0]);
|
72
|
-
Object.assign(data[1][0], sizes[1]);
|
73
|
-
Object.assign(data[1][1], sizes[2]);
|
74
|
-
const bm = new BookModel({ data, options: {ppi: 10} });
|
75
|
-
expect(bm.getMedianPageSizeInches()).toEqual({ width: 3, height: 3 });
|
76
|
-
});
|
77
|
-
|
78
|
-
test('caches result', () => {
|
79
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
80
|
-
const firstResult = bm.getMedianPageSizeInches();
|
81
|
-
expect(bm.getMedianPageSizeInches()).toBe(firstResult);
|
82
|
-
expect(bm.getMedianPageSizeInches()).toBe(firstResult);
|
83
|
-
expect(bm.getMedianPageSizeInches()).toBe(firstResult);
|
84
|
-
});
|
85
|
-
});
|
86
|
-
|
87
|
-
describe('getPageIndices', () => {
|
88
|
-
test('handles unique indices', () => {
|
89
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
90
|
-
expect(bm.getPageIndices('1')).toEqual([0]);
|
91
|
-
});
|
92
|
-
|
93
|
-
test('handles invalid indices', () => {
|
94
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
95
|
-
expect(bm.getPageIndices('foo')).toEqual([]);
|
96
|
-
expect(bm.getPageIndices('123')).toEqual([]);
|
97
|
-
});
|
98
|
-
|
99
|
-
test('handles non-unique indices', () => {
|
100
|
-
const data = deepCopy(SAMPLE_DATA);
|
101
|
-
data[0][0].pageNum = '2';
|
102
|
-
const bm = new BookModel({ data });
|
103
|
-
expect(bm.getPageIndices('2')).toEqual([0, 1]);
|
104
|
-
});
|
105
|
-
|
106
|
-
test('handles n-prefixed pages', () => {
|
107
|
-
const data = deepCopy(SAMPLE_DATA);
|
108
|
-
data[0][0].pageNum = 'n0';
|
109
|
-
const bm = new BookModel({ data });
|
110
|
-
expect(bm.getPageIndices('n0')).toEqual([0]);
|
111
|
-
});
|
112
|
-
});
|
113
|
-
|
114
|
-
test('getPageName', () => {
|
115
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
116
|
-
expect(bm.getPageName(0)).toEqual('Page 1');
|
117
|
-
expect(bm.getPageName(1)).toEqual('Page 2');
|
118
|
-
});
|
119
|
-
|
120
|
-
describe('numLeafs', () => {
|
121
|
-
test('reads from data', () => {
|
122
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
123
|
-
expect(bm.getNumLeafs()).toBe(4);
|
124
|
-
});
|
125
|
-
|
126
|
-
test('numLeafs can be overriden', () => {
|
127
|
-
const bm = new BookModel({ data: SAMPLE_DATA, numLeafs: 12 });
|
128
|
-
expect(bm.getNumLeafs()).toBe(12);
|
129
|
-
});
|
130
|
-
});
|
131
|
-
|
132
|
-
test('getPageNum', () => {
|
133
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
134
|
-
expect(bm.getPageNum(0)).toBe('1');
|
135
|
-
});
|
136
|
-
|
137
|
-
test('getPageProp gets values from correct document', () => {
|
138
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
139
|
-
expect(bm.getPageProp(1, 'uri')).toBe(SAMPLE_DATA[1][0].uri);
|
140
|
-
});
|
141
|
-
|
142
|
-
describe('getSpreadIndices', () => {
|
143
|
-
test('Works for left to right text', () => {
|
144
|
-
const bm = new BookModel({ data: SAMPLE_DATA, pageProgression: 'lr' });
|
145
|
-
expect(bm.getSpreadIndices(1)).toEqual([1, 2]);
|
146
|
-
expect(bm.getSpreadIndices(2)).toEqual([1, 2]);
|
147
|
-
});
|
148
|
-
});
|
149
|
-
|
150
|
-
describe('leafNumToIndex', () => {
|
151
|
-
test('returns input if no leafNum in data', () => {
|
152
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
153
|
-
expect(bm.leafNumToIndex(1)).toBe(1);
|
154
|
-
expect(bm.leafNumToIndex(2)).toBe(2);
|
155
|
-
expect(bm.leafNumToIndex(3)).toBe(3);
|
156
|
-
});
|
157
|
-
|
158
|
-
test('returns true index when leafNum does not point to index', () => {
|
159
|
-
const data = deepCopy(SAMPLE_DATA);
|
160
|
-
for (const spread of data) {
|
161
|
-
for (const page of spread) {
|
162
|
-
page.leafNum = parseFloat(page.pageNum) + 2;
|
163
|
-
}
|
164
|
-
}
|
165
|
-
|
166
|
-
const bm = new BookModel({ data });
|
167
|
-
expect(bm.leafNumToIndex(3)).toBe(0);
|
168
|
-
});
|
169
|
-
});
|
170
|
-
|
171
|
-
describe('parsePageString', () => {
|
172
|
-
test('handles leaf-prefixed PageString', () => {
|
173
|
-
const data = deepCopy(SAMPLE_DATA);
|
174
|
-
for (const spread of data) {
|
175
|
-
for (const page of spread) {
|
176
|
-
page.leafNum = parseFloat(page.pageNum) + 2;
|
177
|
-
}
|
178
|
-
}
|
179
|
-
|
180
|
-
const bm = new BookModel({ data });
|
181
|
-
expect(bm.parsePageString('leaf3')).toBe(0);
|
182
|
-
});
|
183
|
-
});
|
184
|
-
|
185
|
-
describe('pagesIterator', () => {
|
186
|
-
test('Goes through all pages', () => {
|
187
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
188
|
-
let i = 0;
|
189
|
-
for (const page of bm.pagesIterator()) {
|
190
|
-
expect(page.index).toBe(i++);
|
191
|
-
}
|
192
|
-
});
|
193
|
-
|
194
|
-
test('Can combine unviewables', () => {
|
195
|
-
const data = deepCopy(SAMPLE_DATA);
|
196
|
-
// add some more pages
|
197
|
-
data.splice(2, 0, deepCopy(data[0]));
|
198
|
-
data[1].forEach(page => page.viewable = false);
|
199
|
-
const bm = new BookModel({ data });
|
200
|
-
for (const page of bm.pagesIterator({combineConsecutiveUnviewables: true})) {
|
201
|
-
expect(page.isConsecutiveUnviewable).toBe(false);
|
202
|
-
}
|
203
|
-
});
|
204
|
-
});
|
205
|
-
|
206
|
-
describe('_getDataFlattened', () => {
|
207
|
-
test('Assigns correct page sides', () => {
|
208
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
209
|
-
expect(bm._getDataFlattened().map(page => page.pageSide)).toEqual(['R', 'L', 'R', 'L']);
|
210
|
-
});
|
211
|
-
|
212
|
-
test('Memoized based on data length', () => {
|
213
|
-
const data = deepCopy(SAMPLE_DATA);
|
214
|
-
const bm = new BookModel({ data });
|
215
|
-
const firstResult = bm._getDataFlattened();
|
216
|
-
expect(bm._getDataFlattened()).toBe(firstResult);
|
217
|
-
expect(bm._getDataFlattened()).toBe(firstResult);
|
218
|
-
bm.br.data = data.slice(0, 1);
|
219
|
-
expect(bm._getDataFlattened()).not.toBe(firstResult);
|
220
|
-
});
|
221
|
-
|
222
|
-
test('Assigns unviewablesStart', () => {
|
223
|
-
const data = deepCopy(SAMPLE_DATA);
|
224
|
-
data.slice(1, -1)
|
225
|
-
.forEach(spread => spread.forEach(page => {
|
226
|
-
page.viewable = false;
|
227
|
-
}));
|
228
|
-
const bm = new BookModel({ data });
|
229
|
-
const pages = bm._getDataFlattened();
|
230
|
-
expect(pages[0].unviewablesStart).toBeUndefined();
|
231
|
-
expect(pages[1].unviewablesStart).toBe(1);
|
232
|
-
expect(pages[2].unviewablesStart).toBe(1);
|
233
|
-
expect(pages[3].unviewablesStart).toBeUndefined();
|
234
|
-
});
|
235
|
-
});
|
236
|
-
|
237
|
-
describe('getPage', () => {
|
238
|
-
test('loops around by default', () => {
|
239
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
240
|
-
expect(bm.getPage(-1).index).toBe(3);
|
241
|
-
expect(bm.getPage(-2).index).toBe(2);
|
242
|
-
expect(bm.getPage(-3).index).toBe(1);
|
243
|
-
expect(bm.getPage(4).index).toBe(0);
|
244
|
-
expect(bm.getPage(5).index).toBe(1);
|
245
|
-
});
|
246
|
-
|
247
|
-
test('does not loop if loop=false', () => {
|
248
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
249
|
-
expect(bm.getPage(-1, false)).toBeUndefined();
|
250
|
-
expect(bm.getPage(-2, false)).toBeUndefined();
|
251
|
-
expect(bm.getPage(4, false)).toBeUndefined();
|
252
|
-
expect(bm.getPage(5, false)).toBeUndefined();
|
253
|
-
});
|
254
|
-
});
|
255
|
-
|
256
|
-
describe('PageModel', () => {
|
257
|
-
test('constructor copies fields from book model', () => {
|
258
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
259
|
-
const spy = sinon.spy(bm, 'getPageWidth');
|
260
|
-
const page = bm.getPage(0);
|
261
|
-
expect(spy.callCount).toBe(1);
|
262
|
-
expect(page.width).toBe(SAMPLE_DATA[0][0].width);
|
263
|
-
});
|
264
|
-
|
265
|
-
test('prev at start of book returns null', () => {
|
266
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
267
|
-
expect(bm.getPage(0).prev).toBeUndefined();
|
268
|
-
});
|
269
|
-
|
270
|
-
test('prev to return previous', () => {
|
271
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
272
|
-
expect(bm.getPage(1).prev.index).toBe(0);
|
273
|
-
expect(bm.getPage(3).prev.prev.index).toBe(1);
|
274
|
-
});
|
275
|
-
|
276
|
-
test('next at end of book returns null', () => {
|
277
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
278
|
-
expect(bm.getPage(-1).next).toBeUndefined();
|
279
|
-
});
|
280
|
-
|
281
|
-
test('next to return next page', () => {
|
282
|
-
const bm = new BookModel({ data: SAMPLE_DATA });
|
283
|
-
expect(bm.getPage(0).next.index).toBe(1);
|
284
|
-
expect(bm.getPage(1).next.next.index).toBe(3);
|
285
|
-
});
|
286
|
-
|
287
|
-
describe('findNext combineConsecutiveUnviewables=true', () => {
|
288
|
-
const data = deepCopy(SAMPLE_DATA);
|
289
|
-
// add some more pages
|
290
|
-
data.splice(2, 0, deepCopy(data[0]));
|
291
|
-
data[1].forEach(page => page.viewable = false);
|
292
|
-
|
293
|
-
const bm = new BookModel({ data });
|
294
|
-
|
295
|
-
test('does not skip the first unviewable page', () => {
|
296
|
-
expect(bm.getPage(0).findNext({ combineConsecutiveUnviewables: true }).index).toBe(1);
|
297
|
-
});
|
298
|
-
|
299
|
-
test('skips consecutive unviewables', () => {
|
300
|
-
expect(bm.getPage(1).findNext({ combineConsecutiveUnviewables: true }).index).toBe(3);
|
301
|
-
});
|
302
|
-
|
303
|
-
test('at end is undefined', () => {
|
304
|
-
expect(bm.getPage(-1).findNext({ combineConsecutiveUnviewables: true })).toBeUndefined();
|
305
|
-
});
|
306
|
-
});
|
307
|
-
|
308
|
-
describe('findPrev', () => {
|
309
|
-
const data = deepCopy(SAMPLE_DATA);
|
310
|
-
// add some more pages
|
311
|
-
data.splice(2, 0, deepCopy(data[0]));
|
312
|
-
data[1].forEach(page => page.viewable = false);
|
313
|
-
|
314
|
-
const bm = new BookModel({ data });
|
315
|
-
|
316
|
-
test('works if called on first unviewable', () => {
|
317
|
-
expect(bm.getPage(1).findPrev({ combineConsecutiveUnviewables: true }).index).toBe(0);
|
318
|
-
});
|
319
|
-
|
320
|
-
test('works if called within unviewable chunk', () => {
|
321
|
-
expect(bm.getPage(2).findPrev({ combineConsecutiveUnviewables: true }).index).toBe(1);
|
322
|
-
});
|
323
|
-
|
324
|
-
test('at start is undefined', () => {
|
325
|
-
expect(bm.getPage(0).findPrev({ combineConsecutiveUnviewables: true })).toBeUndefined();
|
326
|
-
});
|
327
|
-
});
|
328
|
-
|
329
|
-
describe('findLeft/findRight', () => {
|
330
|
-
const data = deepCopy(SAMPLE_DATA);
|
331
|
-
|
332
|
-
test('Calls findNext/findPrev based on progression', () => {
|
333
|
-
const bm = new BookModel({ data });
|
334
|
-
const page = bm.getPage(0);
|
335
|
-
const findNextStub = sinon.stub(page, 'findNext');
|
336
|
-
const findPrevStub = sinon.stub(page, 'findPrev');
|
337
|
-
bm.pageProgression = 'lr';
|
338
|
-
page.findLeft();
|
339
|
-
expect(findPrevStub.callCount).toBe(1);
|
340
|
-
expect(findNextStub.callCount).toBe(0);
|
341
|
-
page.findRight();
|
342
|
-
expect(findPrevStub.callCount).toBe(1);
|
343
|
-
expect(findNextStub.callCount).toBe(1);
|
344
|
-
bm.pageProgression = 'rl';
|
345
|
-
page.findLeft();
|
346
|
-
expect(findPrevStub.callCount).toBe(1);
|
347
|
-
expect(findNextStub.callCount).toBe(2);
|
348
|
-
page.findRight();
|
349
|
-
expect(findPrevStub.callCount).toBe(2);
|
350
|
-
expect(findNextStub.callCount).toBe(2);
|
351
|
-
});
|
352
|
-
});
|
353
|
-
|
354
|
-
describe('getURISrcSet', () => {
|
355
|
-
const data = deepCopy(SAMPLE_DATA);
|
356
|
-
const bm = new BookModel({ data, reduceSet: NAMED_REDUCE_SETS.pow2 });
|
357
|
-
bm.getPageURI = (index, scale, rotate) => `correctURL.png?scale=${scale}`;
|
358
|
-
const page = bm.getPage(0);
|
359
|
-
|
360
|
-
test('with 0 elements in srcset', () => {
|
361
|
-
expect(page.getURISrcSet(1)).toBe("");
|
362
|
-
});
|
363
|
-
|
364
|
-
test('with 2 elements in srcset', () => {
|
365
|
-
expect(page.getURISrcSet(5)).toBe("correctURL.png?scale=2 2x, correctURL.png?scale=1 4x");
|
366
|
-
});
|
367
|
-
|
368
|
-
test('with the most elements in srcset', () => {
|
369
|
-
expect(page.getURISrcSet(35)).toBe("correctURL.png?scale=16 2x, correctURL.png?scale=8 4x, correctURL.png?scale=4 8x, correctURL.png?scale=2 16x, correctURL.png?scale=1 32x");
|
370
|
-
});
|
371
|
-
});
|
372
|
-
});
|
@@ -1,263 +0,0 @@
|
|
1
|
-
import BookReader from '@/src/BookReader.js';
|
2
|
-
import { sleep } from '@/src/BookReader/utils.js';
|
3
|
-
import sinon from 'sinon';
|
4
|
-
|
5
|
-
beforeAll(() => {
|
6
|
-
global.alert = sinon.fake();
|
7
|
-
});
|
8
|
-
afterEach(() => {
|
9
|
-
sinon.restore();
|
10
|
-
});
|
11
|
-
|
12
|
-
describe('BookReader.prototype.toggleFullscreen', () => {
|
13
|
-
test('uses `isFullscreen` to check fullscreen state', () => {
|
14
|
-
const isFSmock = sinon.fake();
|
15
|
-
// isFSmock.mockReturnValueOnce(false);
|
16
|
-
const br = new BookReader();
|
17
|
-
br.mode = br.constMode1up;
|
18
|
-
br.enterFullscreen = sinon.fake();
|
19
|
-
br.isFullscreen = isFSmock;
|
20
|
-
|
21
|
-
br.toggleFullscreen();
|
22
|
-
expect(br.isFullscreen.callCount).toEqual(1);
|
23
|
-
});
|
24
|
-
|
25
|
-
test('will always emit an event', async () => {
|
26
|
-
const br = new BookReader();
|
27
|
-
br.mode = br.constMode2up;
|
28
|
-
br.trigger = sinon.fake();
|
29
|
-
br.switchMode = sinon.fake();
|
30
|
-
br.updateBrClasses = sinon.fake();
|
31
|
-
br.jumpToIndex = sinon.fake();
|
32
|
-
br.refs.$brContainer = {
|
33
|
-
css: sinon.fake(),
|
34
|
-
animate: (options, speed, style, callback) => callback(),
|
35
|
-
};
|
36
|
-
br.refs.$br = {
|
37
|
-
updateBrClasses: sinon.fake(),
|
38
|
-
removeClass: sinon.fake(),
|
39
|
-
addClass: sinon.fake(),
|
40
|
-
css: sinon.fake(),
|
41
|
-
animate: (options, speed, style, callback) => callback(),
|
42
|
-
};
|
43
|
-
|
44
|
-
await br.toggleFullscreen();
|
45
|
-
expect(br.trigger.callCount).toBeGreaterThan(0);
|
46
|
-
});
|
47
|
-
|
48
|
-
test('will start with opening fullscreen', () => {
|
49
|
-
const br = new BookReader();
|
50
|
-
br.mode = br.constMode2up;
|
51
|
-
br.enterFullscreen = sinon.fake();
|
52
|
-
|
53
|
-
br.toggleFullscreen();
|
54
|
-
expect(br.enterFullscreen.callCount).toEqual(1);
|
55
|
-
});
|
56
|
-
|
57
|
-
test('will close fullscreen if BookReader is in fullscreen', () => {
|
58
|
-
const br = new BookReader();
|
59
|
-
br.mode = br.constMode1up;
|
60
|
-
br.exitFullScreen = sinon.fake();
|
61
|
-
br.isFullscreenActive = true;
|
62
|
-
|
63
|
-
br.toggleFullscreen();
|
64
|
-
expect(br.exitFullScreen.callCount).toEqual(1);
|
65
|
-
});
|
66
|
-
});
|
67
|
-
|
68
|
-
describe('BookReader.prototype.enterFullscreen', () => {
|
69
|
-
test('will bind `_fullscreenCloseHandler` by default', () => {
|
70
|
-
const br = new BookReader();
|
71
|
-
br.mode = br.constMode1up;
|
72
|
-
br.switchMode = sinon.fake();
|
73
|
-
br.updateBrClasses = sinon.fake();
|
74
|
-
br.refs.$br = {
|
75
|
-
css: sinon.fake(),
|
76
|
-
animate: sinon.fake(),
|
77
|
-
addClass: sinon.fake(),
|
78
|
-
};
|
79
|
-
expect(br._fullscreenCloseHandler).toBeUndefined();
|
80
|
-
|
81
|
-
br.enterFullscreen();
|
82
|
-
expect(br._fullscreenCloseHandler).toBeDefined();
|
83
|
-
});
|
84
|
-
|
85
|
-
test('fires certain events when called', async () => {
|
86
|
-
const br = new BookReader();
|
87
|
-
br.mode = br.constMode2up;
|
88
|
-
br.switchMode = sinon.fake();
|
89
|
-
br.updateBrClasses = sinon.fake();
|
90
|
-
br.trigger = sinon.fake();
|
91
|
-
br.resize = sinon.fake();
|
92
|
-
br.jumpToIndex = sinon.fake();
|
93
|
-
br.refs.$br = {
|
94
|
-
addClass: sinon.fake(),
|
95
|
-
removeClass: sinon.fake(),
|
96
|
-
};
|
97
|
-
br.refs.$brContainer = {
|
98
|
-
css: sinon.fake(),
|
99
|
-
animate: (options, speed, style, callback) => callback(),
|
100
|
-
};
|
101
|
-
|
102
|
-
await br.enterFullscreen();
|
103
|
-
expect(br.switchMode.callCount).toEqual(1);
|
104
|
-
expect(br.updateBrClasses.callCount).toEqual(1);
|
105
|
-
expect(br.trigger.callCount).toEqual(2); // fragmentChange, fullscreenToggled
|
106
|
-
expect(br.jumpToIndex.callCount).toEqual(1);
|
107
|
-
|
108
|
-
await sleep(0);
|
109
|
-
expect(br.resize.callCount).toEqual(1);
|
110
|
-
});
|
111
|
-
});
|
112
|
-
|
113
|
-
describe('BookReader.prototype.exitFullScreen', () => {
|
114
|
-
test('fires certain events when called', async () => {
|
115
|
-
const br = new BookReader();
|
116
|
-
br.mode = br.constMode2up;
|
117
|
-
br.switchMode = sinon.fake();
|
118
|
-
br.updateBrClasses = sinon.fake();
|
119
|
-
br.trigger = sinon.fake();
|
120
|
-
br.resize = sinon.fake();
|
121
|
-
br.refs.$br = {
|
122
|
-
addClass: sinon.fake(),
|
123
|
-
removeClass: sinon.fake(),
|
124
|
-
};
|
125
|
-
br.refs.$brContainer = {
|
126
|
-
css: sinon.fake(),
|
127
|
-
animate: (options, speed, style, callback) => callback(),
|
128
|
-
};
|
129
|
-
await br.exitFullScreen();
|
130
|
-
expect(br.switchMode.callCount).toEqual(1);
|
131
|
-
expect(br.updateBrClasses.callCount).toEqual(1);
|
132
|
-
expect(br.trigger.callCount).toEqual(2); // fragmentChange, fullscreenToggled
|
133
|
-
expect(br.resize.callCount).toEqual(1);
|
134
|
-
});
|
135
|
-
});
|
136
|
-
|
137
|
-
describe('BookReader.prototype.trigger', () => {
|
138
|
-
test('fires custom event', () => {
|
139
|
-
const br = new BookReader();
|
140
|
-
global.br = br;
|
141
|
-
global.dispatchEvent = sinon.fake();
|
142
|
-
|
143
|
-
const props = {bar: 1};
|
144
|
-
br.trigger('foo', props);
|
145
|
-
expect(global.dispatchEvent.callCount).toBe(1);
|
146
|
-
});
|
147
|
-
});
|
148
|
-
|
149
|
-
describe('`BookReader.prototype.prev`', () => {
|
150
|
-
let br;
|
151
|
-
let flipAnimationStub;
|
152
|
-
beforeEach(() => {
|
153
|
-
br = new BookReader();
|
154
|
-
global.br = br;
|
155
|
-
br.trigger = sinon.fake();
|
156
|
-
br.jumpToIndex = sinon.fake();
|
157
|
-
flipAnimationStub = sinon.stub(br._modes.mode2Up.mode2UpLit, 'flipAnimation');
|
158
|
-
});
|
159
|
-
|
160
|
-
afterEach(() => {
|
161
|
-
sinon.restore();
|
162
|
-
});
|
163
|
-
|
164
|
-
test('does not take action if user is on front page', () => {
|
165
|
-
br.firstIndex = 0;
|
166
|
-
br.prev();
|
167
|
-
expect(br.trigger.callCount).toBe(0);
|
168
|
-
expect(flipAnimationStub.callCount).toBe(0);
|
169
|
-
expect(br.jumpToIndex.callCount).toBe(0);
|
170
|
-
});
|
171
|
-
|
172
|
-
describe('2up mode', () => {
|
173
|
-
test('fires event and turns the page', () => {
|
174
|
-
br.firstIndex = 10;
|
175
|
-
br.mode = br.constMode2up;
|
176
|
-
br.prev();
|
177
|
-
expect(br.jumpToIndex.callCount).toBe(0); // <-- does not get called
|
178
|
-
expect(br.trigger.callCount).toBe(1);
|
179
|
-
expect(flipAnimationStub.callCount).toBe(1);
|
180
|
-
});
|
181
|
-
});
|
182
|
-
|
183
|
-
describe('non 2up mode', () => {
|
184
|
-
test('jumps to provided index', () => {
|
185
|
-
br.firstIndex = 100;
|
186
|
-
br.mode = br.constMode1up;
|
187
|
-
br.prev();
|
188
|
-
expect(br.jumpToIndex.callCount).toBe(1); // <-- gets called
|
189
|
-
expect(flipAnimationStub.callCount).toBe(0); // <-- gets called by `jumpToIndex` internally
|
190
|
-
});
|
191
|
-
});
|
192
|
-
});
|
193
|
-
|
194
|
-
describe('`BookReader.prototype.jumpToIndex`', () => {
|
195
|
-
/**
|
196
|
-
* @param {Partial<BookReaderOptions>} overrides
|
197
|
-
*/
|
198
|
-
function makeFakeBr(overrides = {}) {
|
199
|
-
const br = new BookReader({
|
200
|
-
data: [
|
201
|
-
[
|
202
|
-
{ index: 0, viewable: true },
|
203
|
-
],
|
204
|
-
[
|
205
|
-
{ index: 1, viewable: false },
|
206
|
-
{ index: 2, viewable: false },
|
207
|
-
],
|
208
|
-
[
|
209
|
-
{ index: 3, viewable: false },
|
210
|
-
{ index: 4, viewable: false },
|
211
|
-
],
|
212
|
-
[
|
213
|
-
{ index: 5, viewable: true },
|
214
|
-
],
|
215
|
-
],
|
216
|
-
...overrides,
|
217
|
-
});
|
218
|
-
br.init();
|
219
|
-
|
220
|
-
br._modes.mode2Up.jumpToIndex = sinon.fake();
|
221
|
-
|
222
|
-
expect(br.firstIndex).toBe(0);
|
223
|
-
expect(br.mode).toBe(br.constMode2up);
|
224
|
-
|
225
|
-
return br;
|
226
|
-
}
|
227
|
-
|
228
|
-
test('Jumping into an unviewables range will go to start of range', () => {
|
229
|
-
const br = makeFakeBr();
|
230
|
-
br.jumpToIndex(3, 0, 0, true);
|
231
|
-
expect(br._modes.mode2Up.jumpToIndex.callCount).toBe(1);
|
232
|
-
expect(br._modes.mode2Up.jumpToIndex.args[0][0]).toBe(1);
|
233
|
-
});
|
234
|
-
|
235
|
-
test('Trying to jump into unviewables range while in that range, will jump forward', () => {
|
236
|
-
const br = makeFakeBr();
|
237
|
-
br.displayedIndices = [1, 2];
|
238
|
-
br.jumpToIndex(3, 0, 0, true);
|
239
|
-
expect(br._modes.mode2Up.jumpToIndex.callCount).toBe(1);
|
240
|
-
expect(br._modes.mode2Up.jumpToIndex.args[0][0]).toBe(5);
|
241
|
-
});
|
242
|
-
|
243
|
-
test('Trying to jump into unviewables range while in that range, will do nothing if cannot jump forward', () => {
|
244
|
-
const br = makeFakeBr({
|
245
|
-
data: [
|
246
|
-
[
|
247
|
-
{ index: 0, viewable: true },
|
248
|
-
],
|
249
|
-
[
|
250
|
-
{ index: 1, viewable: false },
|
251
|
-
{ index: 2, viewable: false },
|
252
|
-
],
|
253
|
-
[
|
254
|
-
{ index: 3, viewable: false },
|
255
|
-
{ index: 4, viewable: false },
|
256
|
-
],
|
257
|
-
],
|
258
|
-
});
|
259
|
-
br.displayedIndices = [1, 2];
|
260
|
-
br.jumpToIndex(3, 0, 0, true);
|
261
|
-
expect(br._modes.mode2Up.jumpToIndex.callCount).toBe(0);
|
262
|
-
});
|
263
|
-
});
|