@internetarchive/bookreader 5.0.0-95 → 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.css +2251 -0
- package/BookReader/BookReader.js +3 -0
- package/BookReader/BookReader.js.LICENSE.txt +72 -0
- package/BookReader/BookReader.js.map +1 -0
- 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/BookReader/ia-bookreader-bundle.js +1782 -0
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
- package/BookReader/ia-bookreader-bundle.js.map +1 -0
- package/BookReader/icons/1up.svg +1 -0
- package/BookReader/icons/2up.svg +1 -0
- package/BookReader/icons/advance.svg +3 -0
- package/BookReader/icons/chevron-right.svg +1 -0
- package/BookReader/icons/close-circle-dark.svg +1 -0
- package/BookReader/icons/close-circle.svg +1 -0
- package/BookReader/icons/fullscreen.svg +1 -0
- package/BookReader/icons/fullscreen_exit.svg +1 -0
- package/BookReader/icons/hamburger.svg +1 -0
- package/BookReader/icons/left-arrow.svg +1 -0
- package/BookReader/icons/magnify-minus.svg +1 -0
- package/BookReader/icons/magnify-plus.svg +1 -0
- package/BookReader/icons/magnify.svg +1 -0
- package/BookReader/icons/pause.svg +1 -0
- package/BookReader/icons/play.svg +1 -0
- package/BookReader/icons/playback-speed.svg +1 -0
- package/BookReader/icons/read-aloud.svg +1 -0
- package/BookReader/icons/review.svg +3 -0
- package/BookReader/icons/thumbnails.svg +1 -0
- package/BookReader/icons/voice.svg +1 -0
- package/BookReader/icons/volume-full.svg +1 -0
- package/BookReader/images/BRicons.png +0 -0
- package/BookReader/images/BRicons.svg +5 -0
- package/BookReader/images/BRicons_ia.png +0 -0
- package/BookReader/images/back_pages.png +0 -0
- package/BookReader/images/book_bottom_icon.png +0 -0
- package/BookReader/images/book_down_icon.png +0 -0
- package/BookReader/images/book_left_icon.png +0 -0
- package/BookReader/images/book_leftmost_icon.png +0 -0
- package/BookReader/images/book_right_icon.png +0 -0
- package/BookReader/images/book_rightmost_icon.png +0 -0
- package/BookReader/images/book_top_icon.png +0 -0
- package/BookReader/images/book_up_icon.png +0 -0
- package/BookReader/images/books_graphic.svg +1 -0
- package/BookReader/images/booksplit.png +0 -0
- package/BookReader/images/control_pause_icon.png +0 -0
- package/BookReader/images/control_play_icon.png +0 -0
- package/BookReader/images/embed_icon.png +0 -0
- package/BookReader/images/hypothesis.ico +0 -0
- package/BookReader/images/icon-home-ia.png +0 -0
- package/BookReader/images/icon_OL-logo-xs.png +0 -0
- package/BookReader/images/icon_alert-xs.png +0 -0
- package/BookReader/images/icon_book.svg +1 -0
- package/BookReader/images/icon_bookmark.svg +1 -0
- package/BookReader/images/icon_close-pop.png +0 -0
- package/BookReader/images/icon_download.png +0 -0
- package/BookReader/images/icon_gear.svg +1 -0
- package/BookReader/images/icon_hamburger.svg +1 -0
- package/BookReader/images/icon_home.png +0 -0
- package/BookReader/images/icon_home.svg +1 -0
- package/BookReader/images/icon_home_ia.png +0 -0
- package/BookReader/images/icon_indicator.png +0 -0
- package/BookReader/images/icon_info.svg +1 -0
- package/BookReader/images/icon_one_page.svg +1 -0
- package/BookReader/images/icon_pause.svg +1 -0
- package/BookReader/images/icon_play.svg +1 -0
- package/BookReader/images/icon_playback-rate.svg +1 -0
- package/BookReader/images/icon_return.png +0 -0
- package/BookReader/images/icon_search_button.svg +1 -0
- package/BookReader/images/icon_share.svg +1 -0
- package/BookReader/images/icon_skip-ahead.svg +1 -0
- package/BookReader/images/icon_skip-back.svg +2 -0
- package/BookReader/images/icon_speaker.svg +1 -0
- package/BookReader/images/icon_speaker_open.svg +1 -0
- package/BookReader/images/icon_thumbnails.svg +1 -0
- package/BookReader/images/icon_toc.svg +1 -0
- package/BookReader/images/icon_two_pages.svg +1 -0
- package/BookReader/images/icon_zoomer.png +0 -0
- package/BookReader/images/loading.gif +0 -0
- package/BookReader/images/logo_icon.png +0 -0
- package/BookReader/images/marker_chap-off.png +0 -0
- package/BookReader/images/marker_chap-off.svg +1 -0
- package/BookReader/images/marker_chap-off_ia.png +0 -0
- package/BookReader/images/marker_chap-on.png +0 -0
- package/BookReader/images/marker_chap-on.svg +1 -0
- package/BookReader/images/marker_srch-on.svg +1 -0
- package/BookReader/images/marker_srchchap-off.png +0 -0
- package/BookReader/images/marker_srchchap-on.png +0 -0
- package/BookReader/images/nav_control-dn.png +0 -0
- package/BookReader/images/nav_control-dn_ia.png +0 -0
- package/BookReader/images/nav_control-up.png +0 -0
- package/BookReader/images/nav_control-up_ia.png +0 -0
- package/BookReader/images/nav_control.png +0 -0
- package/BookReader/images/one_page_mode_icon.png +0 -0
- package/BookReader/images/paper-badge.png +0 -0
- package/BookReader/images/print_icon.png +0 -0
- package/BookReader/images/progressbar.gif +0 -0
- package/BookReader/images/right_edges.png +0 -0
- package/BookReader/images/slider.png +0 -0
- package/BookReader/images/slider_ia.png +0 -0
- package/BookReader/images/thumbnail_mode_icon.png +0 -0
- package/BookReader/images/transparent.png +0 -0
- package/BookReader/images/two_page_mode_icon.png +0 -0
- package/BookReader/images/unviewable_page.png +0 -0
- package/BookReader/images/zoom_in_icon.png +0 -0
- package/BookReader/images/zoom_out_icon.png +0 -0
- package/BookReader/jquery-3.js +2 -0
- package/BookReader/jquery-3.js.LICENSE.txt +24 -0
- package/BookReader/plugins/plugin.archive_analytics.js +2 -0
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -0
- package/BookReader/plugins/plugin.autoplay.js +2 -0
- package/BookReader/plugins/plugin.autoplay.js.map +1 -0
- package/BookReader/plugins/plugin.chapters.js +26 -0
- package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.chapters.js.map +1 -0
- package/BookReader/plugins/plugin.experiments.js +3 -0
- package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.experiments.js.map +1 -0
- package/BookReader/plugins/plugin.iframe.js +2 -0
- package/BookReader/plugins/plugin.iframe.js.map +1 -0
- package/BookReader/plugins/plugin.iiif.js +2 -0
- package/BookReader/plugins/plugin.iiif.js.map +1 -0
- package/BookReader/plugins/plugin.resume.js +2 -0
- package/BookReader/plugins/plugin.resume.js.map +1 -0
- package/BookReader/plugins/plugin.search.js +3 -0
- package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.search.js.map +1 -0
- package/BookReader/plugins/plugin.text_selection.js +3 -0
- package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.text_selection.js.map +1 -0
- package/BookReader/plugins/plugin.tts.js +3 -0
- package/BookReader/plugins/plugin.tts.js.LICENSE.txt +29 -0
- package/BookReader/plugins/plugin.tts.js.map +1 -0
- package/BookReader/plugins/plugin.url.js +2 -0
- package/BookReader/plugins/plugin.url.js.map +1 -0
- package/BookReader/plugins/plugin.vendor-fullscreen.js +2 -0
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -0
- package/BookReader/webcomponents-bundle.js +3 -0
- package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
- package/BookReader/webcomponents-bundle.js.map +1 -0
- package/package.json +6 -1
- package/src/BookReader/BookModel.js +564 -0
- package/src/BookReader/DragScrollable.js +233 -0
- package/src/BookReader/ImageCache.js +149 -0
- package/src/BookReader/Mode1Up.js +110 -0
- package/src/BookReader/Mode1UpLit.js +388 -0
- package/src/BookReader/Mode2Up.js +107 -0
- package/src/BookReader/Mode2UpLit.js +777 -0
- package/src/BookReader/ModeCoordinateSpace.js +29 -0
- package/src/BookReader/ModeSmoothZoom.js +312 -0
- package/src/BookReader/ModeThumb.js +344 -0
- package/src/BookReader/Navbar/Navbar.js +355 -0
- package/src/BookReader/PageContainer.js +172 -0
- package/src/BookReader/ReduceSet.js +26 -0
- package/src/BookReader/Toolbar/Toolbar.js +362 -0
- package/src/BookReader/events.js +19 -0
- package/src/BookReader/options.js +387 -0
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/ScrollClassAdder.js +31 -0
- package/src/BookReader/utils/SelectionObserver.js +45 -0
- package/src/BookReader/utils/classes.js +36 -0
- package/src/BookReader/utils.js +313 -0
- 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 -23
- 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 -1087
- 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 -24
- 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.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
@@ -0,0 +1,313 @@
|
|
1
|
+
/**
|
2
|
+
* Bind mouse handlers
|
3
|
+
* Disable mouse click to avoid selected/highlighted page images
|
4
|
+
* @param {JQuery} jObject
|
5
|
+
*/
|
6
|
+
export function disableSelect(jObject) {
|
7
|
+
// $$$ check here for right-click and don't disable. Also use jQuery style
|
8
|
+
// for stopping propagation. See https://bugs.edge.launchpad.net/gnubook/+bug/362626
|
9
|
+
jObject.bind('mousedown', () => false);
|
10
|
+
// Special hack for IE7
|
11
|
+
jObject[0].onselectstart = () => false;
|
12
|
+
}
|
13
|
+
|
14
|
+
/**
|
15
|
+
* @param {number} value
|
16
|
+
* @param {number} min
|
17
|
+
* @param {number} max
|
18
|
+
* @return {number}
|
19
|
+
*/
|
20
|
+
export function clamp(value, min, max) {
|
21
|
+
return Math.min(Math.max(value, min), max);
|
22
|
+
}
|
23
|
+
|
24
|
+
/**
|
25
|
+
* Given value and maximum, calculate a percentage suitable for CSS
|
26
|
+
* @param {number} value
|
27
|
+
* @param {number} max
|
28
|
+
* @return {string}
|
29
|
+
*/
|
30
|
+
export function cssPercentage(value, max) {
|
31
|
+
return ((value / max) * 100) + '%';
|
32
|
+
}
|
33
|
+
|
34
|
+
/**
|
35
|
+
* @param {*} value
|
36
|
+
* @param {Array} array
|
37
|
+
* @return {boolean}
|
38
|
+
*/
|
39
|
+
export function notInArray(value, array) {
|
40
|
+
return !array.includes(value);
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Determines the active element, going into shadow doms.
|
45
|
+
* @return {Element}
|
46
|
+
*/
|
47
|
+
export function getActiveElement(doc = document, recurseShadowDom = true) {
|
48
|
+
const activeElement = doc.activeElement;
|
49
|
+
if (recurseShadowDom && activeElement?.shadowRoot) {
|
50
|
+
return getActiveElement(activeElement.shadowRoot, true);
|
51
|
+
}
|
52
|
+
return activeElement;
|
53
|
+
}
|
54
|
+
|
55
|
+
/** Check if an input field/textarea is active. Also checks shadow DOMs. */
|
56
|
+
export function isInputActive(doc = document) {
|
57
|
+
const activeEl = getActiveElement(doc);
|
58
|
+
return activeEl?.tagName == "INPUT" || activeEl?.tagName == "TEXTAREA";
|
59
|
+
}
|
60
|
+
|
61
|
+
/**
|
62
|
+
* @param {HTMLIFrameElement} iframe
|
63
|
+
* @return {Document}
|
64
|
+
*/
|
65
|
+
export function getIFrameDocument(iframe) {
|
66
|
+
// Adapted from http://xkr.us/articles/dom/iframe-document/
|
67
|
+
const outer = iframe.contentWindow || iframe.contentDocument;
|
68
|
+
return outer.document || outer;
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* @param {string} str
|
73
|
+
* @return {string}
|
74
|
+
*/
|
75
|
+
export function escapeHTML(str) {
|
76
|
+
return str.replace(/&/g,'&')
|
77
|
+
.replace(/>/g,'>')
|
78
|
+
.replace(/</g,'<')
|
79
|
+
.replace(/"/g,'"');
|
80
|
+
}
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Decodes a URI component and converts '+' to ' '
|
84
|
+
* @param {string} value
|
85
|
+
* @return {string}
|
86
|
+
*/
|
87
|
+
export function decodeURIComponentPlus(value) {
|
88
|
+
return decodeURIComponent(value).replace(/\+/g, ' ');
|
89
|
+
}
|
90
|
+
|
91
|
+
/**
|
92
|
+
* Encodes a URI component and converts ' ' to '+'
|
93
|
+
* @param {string|number|boolean} value
|
94
|
+
* @return {string};
|
95
|
+
*/
|
96
|
+
export function encodeURIComponentPlus(value) {
|
97
|
+
return encodeURIComponent(value).replace(/%20/g, '+');
|
98
|
+
}
|
99
|
+
|
100
|
+
/**
|
101
|
+
* @template {Function} T
|
102
|
+
* Returns a function, that, as long as it continues to be invoked, will not
|
103
|
+
* be triggered. The function will be called after it stops being called for
|
104
|
+
* N milliseconds. If `immediate` is passed, trigger the function on the
|
105
|
+
* leading edge, instead of the trailing.
|
106
|
+
* @see https://davidwalsh.name/javascript-debounce-function
|
107
|
+
*
|
108
|
+
* @param {T} func
|
109
|
+
* @param {number} wait
|
110
|
+
* @param {boolean} immediate
|
111
|
+
* @return {T}
|
112
|
+
*/
|
113
|
+
export function debounce(func, wait, immediate) {
|
114
|
+
let timeout;
|
115
|
+
return function() {
|
116
|
+
const context = this;
|
117
|
+
const args = arguments;
|
118
|
+
const later = () => {
|
119
|
+
timeout = null;
|
120
|
+
if (!immediate) func.apply(context, args);
|
121
|
+
};
|
122
|
+
const callNow = immediate && !timeout;
|
123
|
+
clearTimeout(timeout);
|
124
|
+
timeout = setTimeout(later, wait);
|
125
|
+
if (callNow) func.apply(context, args);
|
126
|
+
};
|
127
|
+
}
|
128
|
+
|
129
|
+
/**
|
130
|
+
* @template T
|
131
|
+
* Throttle function
|
132
|
+
* @see https://remysharp.com/2010/07/21/throttling-function-calls
|
133
|
+
* @param {T} fn
|
134
|
+
* @param {number} threshold
|
135
|
+
* @param {boolean} delay
|
136
|
+
* @return {T}
|
137
|
+
*/
|
138
|
+
export function throttle(fn, threshold, delay) {
|
139
|
+
threshold || (threshold = 250);
|
140
|
+
let last;
|
141
|
+
let deferTimer;
|
142
|
+
if (delay) last = +new Date;
|
143
|
+
return function () {
|
144
|
+
const context = this;
|
145
|
+
const now = +new Date;
|
146
|
+
const args = arguments;
|
147
|
+
if (last && now < last + threshold) {
|
148
|
+
// hold on to it
|
149
|
+
clearTimeout(deferTimer);
|
150
|
+
deferTimer = setTimeout(() => {
|
151
|
+
last = now;
|
152
|
+
fn.apply(context, args);
|
153
|
+
}, threshold);
|
154
|
+
} else {
|
155
|
+
last = now;
|
156
|
+
fn.apply(context, args);
|
157
|
+
}
|
158
|
+
};
|
159
|
+
}
|
160
|
+
|
161
|
+
/**
|
162
|
+
* FIXME we need a better way to do this :/ This is not automatically poly-filled by
|
163
|
+
* core-js https://github.com/zloirock/core-js/issues/354
|
164
|
+
* @param {Window} window
|
165
|
+
*/
|
166
|
+
export function polyfillCustomEvent(window) {
|
167
|
+
if (typeof window.CustomEvent === "function") return false;
|
168
|
+
window.CustomEvent = PolyfilledCustomEvent;
|
169
|
+
}
|
170
|
+
|
171
|
+
/**
|
172
|
+
* https://caniuse.com/customevent has issues on older browsers where it can't be
|
173
|
+
* called as a constructor, so we have to use older methods.
|
174
|
+
* @param {String} eventName
|
175
|
+
* @return {CustomEvent}
|
176
|
+
*/
|
177
|
+
export function PolyfilledCustomEvent(eventName, {bubbles = false, cancelable = false, detail = null} = {}) {
|
178
|
+
const event = document.createEvent('CustomEvent');
|
179
|
+
event.initCustomEvent(eventName, bubbles, cancelable, detail);
|
180
|
+
return event;
|
181
|
+
}
|
182
|
+
|
183
|
+
/*
|
184
|
+
* Returns the number pixels something should be rendered at to be ~1n on the users
|
185
|
+
* screen when measured with a ruler.
|
186
|
+
*/
|
187
|
+
export function calcScreenDPI() {
|
188
|
+
const el = document.createElement('div');
|
189
|
+
el.style.width = '1in';
|
190
|
+
document.body.appendChild(el);
|
191
|
+
const dpi = el.offsetWidth;
|
192
|
+
document.body.removeChild(el);
|
193
|
+
|
194
|
+
// Do you believe in magic... numbers? We tested on some devices, and the displayed
|
195
|
+
// size of `width: 1in` was less than desired. On @pezvi's mac, it was ~75% ; on
|
196
|
+
// @cdrini's laptop it was ~85%. Since we want to avoid things appearing too small,
|
197
|
+
// let's just use a multiplier of 1.25
|
198
|
+
const screenDPI = dpi * 1.25;
|
199
|
+
// This will return 0 in testing; never want it to be 0!
|
200
|
+
return screenDPI == 0 ? 100 : screenDPI;
|
201
|
+
}
|
202
|
+
|
203
|
+
/**
|
204
|
+
* @param {number[]} nums
|
205
|
+
* @returns {number}
|
206
|
+
*/
|
207
|
+
export function sum(nums) {
|
208
|
+
return nums.reduce((cur, acc) => cur + acc, 0);
|
209
|
+
}
|
210
|
+
|
211
|
+
/**
|
212
|
+
* @template T
|
213
|
+
* @param {Generator<T>} gen
|
214
|
+
* @returns {T[]}
|
215
|
+
*/
|
216
|
+
export function genToArray(gen) {
|
217
|
+
const result = [];
|
218
|
+
for (const item of gen) {
|
219
|
+
result.push(item);
|
220
|
+
}
|
221
|
+
return result;
|
222
|
+
}
|
223
|
+
|
224
|
+
/**
|
225
|
+
* Check if arrays contain the same elements. Does reference comparison.
|
226
|
+
* @param {Array} arr1
|
227
|
+
* @param {Array} arr2
|
228
|
+
*/
|
229
|
+
export function arrEquals(arr1, arr2) {
|
230
|
+
return arr1.length == arr2.length && arr1.every((x, i) => x == arr2[i]);
|
231
|
+
}
|
232
|
+
|
233
|
+
/**
|
234
|
+
* Check if array has changed; namely to be used with lit's property.hasChanged
|
235
|
+
* @param {Array} [arr1]
|
236
|
+
* @param {Array} [arr2]
|
237
|
+
*/
|
238
|
+
export function arrChanged(arr1, arr2) {
|
239
|
+
return arr1 && arr2 && !arrEquals(arr1, arr2);
|
240
|
+
}
|
241
|
+
|
242
|
+
/**
|
243
|
+
* Waits the provided number of ms and then resolves with a promise
|
244
|
+
* @param {number} ms
|
245
|
+
**/
|
246
|
+
export async function sleep(ms) {
|
247
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
248
|
+
}
|
249
|
+
|
250
|
+
/**
|
251
|
+
* @template T
|
252
|
+
* @param {function(): T} fn
|
253
|
+
* @param {Object} options
|
254
|
+
* @param {function(T): boolean} [options.until]
|
255
|
+
* @return {T | undefined}
|
256
|
+
*/
|
257
|
+
export async function poll(fn, { step = 50, timeout = 500, until = val => Boolean(val), _sleep = sleep } = {}) {
|
258
|
+
const startTime = Date.now();
|
259
|
+
while (Date.now() - startTime < timeout) {
|
260
|
+
const result = fn();
|
261
|
+
if (until(result)) return result;
|
262
|
+
await _sleep(step);
|
263
|
+
}
|
264
|
+
}
|
265
|
+
|
266
|
+
/**
|
267
|
+
* Convert a EventTarget style event into a promise
|
268
|
+
* @param {EventTarget} target
|
269
|
+
* @param {string} eventType
|
270
|
+
* @return {Promise<Event>}
|
271
|
+
*/
|
272
|
+
export function promisifyEvent(target, eventType) {
|
273
|
+
return new Promise(res => {
|
274
|
+
const resolver = ev => {
|
275
|
+
target.removeEventListener(eventType, resolver);
|
276
|
+
res(ev);
|
277
|
+
};
|
278
|
+
target.addEventListener(eventType, resolver);
|
279
|
+
});
|
280
|
+
}
|
281
|
+
|
282
|
+
/**
|
283
|
+
* Escapes regex special characters in a string. Allows for safe usage in regexes.
|
284
|
+
* Src: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions
|
285
|
+
* @param {string} string
|
286
|
+
* @returns {string}
|
287
|
+
*/
|
288
|
+
export function escapeRegExp(string) {
|
289
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
|
290
|
+
}
|
291
|
+
|
292
|
+
/**
|
293
|
+
* @param {number | 'fast' | 'slow' | string} speed
|
294
|
+
* Parsing of the jquery animation speed; see https://api.jquery.com/animate/
|
295
|
+
*/
|
296
|
+
export function parseAnimationSpeed(speed) {
|
297
|
+
if (speed === 'slow') return 600;
|
298
|
+
if (speed === 'fast') return 200;
|
299
|
+
return parseInt(speed, 10);
|
300
|
+
}
|
301
|
+
|
302
|
+
/**
|
303
|
+
* @template T
|
304
|
+
* @param {T[]} array
|
305
|
+
* @param {function(T): number} [valueFn]
|
306
|
+
*/
|
307
|
+
export function sortBy(array, valueFn) {
|
308
|
+
return array.sort((a, b) => {
|
309
|
+
const aValue = valueFn ? valueFn(a) : a;
|
310
|
+
const bValue = valueFn ? valueFn(b) : b;
|
311
|
+
return aValue < bValue ? -1 : aValue > bValue ? 1 : 0;
|
312
|
+
});
|
313
|
+
}
|
package/.eslintrc.cjs
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
module.exports = {
|
2
|
-
"parser": "@babel/eslint-parser",
|
3
|
-
"env": {
|
4
|
-
"browser": true,
|
5
|
-
"jquery": true,
|
6
|
-
"es6": true,
|
7
|
-
"node": true,
|
8
|
-
"jest": true,
|
9
|
-
},
|
10
|
-
"plugins": [
|
11
|
-
"testcafe",
|
12
|
-
"no-jquery",
|
13
|
-
],
|
14
|
-
"extends": [
|
15
|
-
"eslint:recommended",
|
16
|
-
"plugin:testcafe/recommended",
|
17
|
-
"plugin:no-jquery/deprecated",
|
18
|
-
],
|
19
|
-
"globals": {
|
20
|
-
// Browser API
|
21
|
-
"MediaMetadata": "readonly",
|
22
|
-
},
|
23
|
-
"parserOptions": {
|
24
|
-
"ecmaVersion": 2020,
|
25
|
-
"ecmaFeatures": { "legacyDecorators": true },
|
26
|
-
"sourceType": "module",
|
27
|
-
},
|
28
|
-
"rules": {
|
29
|
-
"comma-dangle": ["error", "always-multiline", {"functions": "only-multiline"}],
|
30
|
-
"semi": ["error", "always"],
|
31
|
-
"space-before-blocks": ["error"],
|
32
|
-
"keyword-spacing": [2, {"before": true, "after": true}],
|
33
|
-
"indent": ["error", 2, {
|
34
|
-
// This for some reason causing errors after switch to parser: babel-eslint.
|
35
|
-
// See https://github.com/babel/babel-eslint/issues/681
|
36
|
-
"ignoredNodes": ["TemplateLiteral"],
|
37
|
-
}],
|
38
|
-
"no-console": "off", // Used too often behind `debug` options; not dealing with this now
|
39
|
-
"no-empty": ["error", { "allowEmptyCatch": true }],
|
40
|
-
"no-jquery/no-bind": ["error"],
|
41
|
-
"no-jquery/no-event-shorthand": ["error"],
|
42
|
-
"no-jquery/no-sizzle": ["error"],
|
43
|
-
"no-jquery/no-trim": ["error"],
|
44
|
-
"no-trailing-spaces": ["error"],
|
45
|
-
"no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": false }], // set args:none; this is generally more annoying than useful
|
46
|
-
"no-var": ["error"],
|
47
|
-
"prefer-const": ["error"],
|
48
|
-
"space-infix-ops": ["error", { "int32Hint": false }],
|
49
|
-
"eol-last": ["error", "always"],
|
50
|
-
},
|
51
|
-
};
|
package/.gitattributes
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
---
|
2
|
-
name: Bug
|
3
|
-
about: A general problem with website functionality
|
4
|
-
title: ''
|
5
|
-
labels: Bug
|
6
|
-
assignees: ''
|
7
|
-
|
8
|
-
---
|
9
|
-
|
10
|
-
**Description**
|
11
|
-
|
12
|
-
> What problem are we solving? What does the experience look like today? What are the symptoms? How can one reproduce the problem?
|
13
|
-
|
14
|
-
**Evidence / Screenshot (if possible)**
|
15
|
-
|
16
|
-
> Include evidence of the problem or provide a screenshot.
|
17
|
-
|
18
|
-
**Expectation**
|
19
|
-
|
20
|
-
> What should be happening? What will it look like / how will it behave when fixed?
|
21
|
-
|
22
|
-
**Context**
|
23
|
-
|
24
|
-
> What operating system? What browser type and version?
|
25
|
-
|
26
|
-
**Proposal & Constraints**
|
27
|
-
|
28
|
-
> What is the proposed solution / implementation? Is there a precedent of this approach succeeding elsewhere?
|
29
|
-
|
30
|
-
**Stakeholders**
|
31
|
-
|
32
|
-
> @-tag any stakeholders of this bug
|
@@ -1,30 +0,0 @@
|
|
1
|
-
---
|
2
|
-
name: Feature Request
|
3
|
-
about: A request for an entirely new feature
|
4
|
-
title: ''
|
5
|
-
labels: Feature Request
|
6
|
-
assignees: ''
|
7
|
-
|
8
|
-
---
|
9
|
-
|
10
|
-
**Context**
|
11
|
-
|
12
|
-
> Is your feature request related to a problem? What is the motivation for implementing this feature?
|
13
|
-
|
14
|
-
**Proposal & Constraints**
|
15
|
-
|
16
|
-
> What is the proposed solution / implementation? Is there a precedent for this approach succeeding elsewhere?
|
17
|
-
|
18
|
-
> Which suggestions or requirements should be considered for how this feature needs to appear or be implemented?
|
19
|
-
|
20
|
-
**Additional Resources**
|
21
|
-
|
22
|
-
> Add any other screenshots or assets related to the feature request.
|
23
|
-
|
24
|
-
**Success Metrics**
|
25
|
-
|
26
|
-
> How will you know if this change is successful? What specific metrics are relevant and how do you expect them to change?
|
27
|
-
|
28
|
-
**Stakeholders**
|
29
|
-
|
30
|
-
> @-tag stakeholders of this feature
|
@@ -1,15 +0,0 @@
|
|
1
|
-
**Description**
|
2
|
-
|
3
|
-
> What does this PR achieve? Is it a feature/bugfix/refactor? Does it close an Issue? If so, use `Closes #<issue number>`.
|
4
|
-
|
5
|
-
**Technical**
|
6
|
-
|
7
|
-
> What should be noted about the implementation?
|
8
|
-
|
9
|
-
**Testing**
|
10
|
-
|
11
|
-
> What steps should the reviewer take to verify this PR resolves the issue?
|
12
|
-
|
13
|
-
**Screenshots/Videos**
|
14
|
-
|
15
|
-
> Add a screenshot or video/GIF if the fix can be seen visually. This is helpful for reviewers to get context for the fix.
|
@@ -1,102 +0,0 @@
|
|
1
|
-
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
2
|
-
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
3
|
-
|
4
|
-
name: Node.js CI
|
5
|
-
|
6
|
-
on:
|
7
|
-
push:
|
8
|
-
branches: [ master ]
|
9
|
-
pull_request:
|
10
|
-
branches: [ master ]
|
11
|
-
|
12
|
-
jobs:
|
13
|
-
install:
|
14
|
-
runs-on: ubuntu-latest
|
15
|
-
|
16
|
-
steps:
|
17
|
-
- uses: actions/checkout@v4
|
18
|
-
- uses: actions/setup-node@v4
|
19
|
-
with:
|
20
|
-
# Keep in sync with netlify.toml
|
21
|
-
node-version: 20.x
|
22
|
-
- name: Cache node_modules
|
23
|
-
uses: actions/cache@v4
|
24
|
-
id: cache
|
25
|
-
with:
|
26
|
-
# Caching node_modules isn't recommended because it can break across
|
27
|
-
# Node versions and won't work with npm ci (See https://github.com/actions/cache/blob/main/examples.md#node---npm )
|
28
|
-
# But we pin the node version, and we don't update it that often anyways. And
|
29
|
-
# we don't use `npm ci` specifically to try to get faster CI flows. So caching
|
30
|
-
# `node_modules` directly.
|
31
|
-
path: 'node_modules'
|
32
|
-
key: ${{ runner.os }}-node-20-${{ hashFiles('package*.json') }}
|
33
|
-
- if: steps.cache.outputs.cache-hit != 'true'
|
34
|
-
run: npm install
|
35
|
-
|
36
|
-
build:
|
37
|
-
needs: install
|
38
|
-
runs-on: ubuntu-latest
|
39
|
-
steps:
|
40
|
-
- uses: actions/checkout@v4
|
41
|
-
- uses: actions/setup-node@v4
|
42
|
-
with:
|
43
|
-
node-version: 20.x
|
44
|
-
- name: Load node_modules from cache
|
45
|
-
uses: actions/cache@v4
|
46
|
-
with:
|
47
|
-
# Use node_modules from previous jobs
|
48
|
-
path: 'node_modules'
|
49
|
-
key: ${{ runner.os }}-node-20-${{ hashFiles('package*.json') }}
|
50
|
-
- name: Cache BookReader/
|
51
|
-
uses: actions/cache@v4
|
52
|
-
id: build-cache
|
53
|
-
with:
|
54
|
-
# Cache the build files so we don't have to build twice for e2e tests
|
55
|
-
path: 'BookReader'
|
56
|
-
key: ${{ runner.os }}-${{ github.sha }}
|
57
|
-
- if: steps.build-cache.outputs.cache-hit != 'true'
|
58
|
-
run: npm run build
|
59
|
-
|
60
|
-
tests:
|
61
|
-
needs: install
|
62
|
-
runs-on: ubuntu-latest
|
63
|
-
steps:
|
64
|
-
- uses: actions/checkout@v4
|
65
|
-
- uses: actions/setup-node@v4
|
66
|
-
with:
|
67
|
-
node-version: 20.x
|
68
|
-
- name: Load node_modules from cache
|
69
|
-
uses: actions/cache@v4
|
70
|
-
with:
|
71
|
-
# Use node_modules from previous jobs
|
72
|
-
path: 'node_modules'
|
73
|
-
key: ${{ runner.os }}-node-20-${{ hashFiles('package*.json') }}
|
74
|
-
- run: npm run lint
|
75
|
-
- run: npm run test
|
76
|
-
- uses: codecov/codecov-action@v4
|
77
|
-
with:
|
78
|
-
token: ${{ secrets.CODECOV_TOKEN }}
|
79
|
-
|
80
|
-
e2e-tests:
|
81
|
-
needs: build
|
82
|
-
runs-on: ubuntu-latest
|
83
|
-
steps:
|
84
|
-
- uses: actions/checkout@v4
|
85
|
-
- uses: actions/setup-node@v4
|
86
|
-
with:
|
87
|
-
node-version: 20.x
|
88
|
-
- name: Load node_modules from cache
|
89
|
-
uses: actions/cache@v4
|
90
|
-
with:
|
91
|
-
# Use node_modules from previous jobs
|
92
|
-
path: 'node_modules'
|
93
|
-
key: ${{ runner.os }}-node-20-${{ hashFiles('package*.json') }}
|
94
|
-
- name: Load BookReader/ from cache
|
95
|
-
uses: actions/cache@v4
|
96
|
-
with:
|
97
|
-
# Cache the build files so we don't have to build twice for e2e tests
|
98
|
-
path: 'BookReader'
|
99
|
-
key: ${{ runner.os }}-${{ github.sha }}
|
100
|
-
# Travis machines usually have 2 cores (see https://docs.travis-ci.com/user/reference/overview/#virtualisation-environment-vs-operating-system )
|
101
|
-
# Quarantine mode (sigh) to catch unstable tests (see https://devexpress.github.io/testcafe/documentation/guides/basic-guides/run-tests.html#quarantine-mode )
|
102
|
-
- run: npx testcafe --concurrency 2 --quarantine-mode
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
|
2
|
-
# For more information see: https://docs.github.com/en/actions/use-cases-and-examples/publishing-packages/publishing-nodejs-packages
|
3
|
-
|
4
|
-
name: Node.js Package
|
5
|
-
|
6
|
-
on:
|
7
|
-
release:
|
8
|
-
types: [created]
|
9
|
-
|
10
|
-
jobs:
|
11
|
-
publish-npm:
|
12
|
-
runs-on: ubuntu-latest
|
13
|
-
steps:
|
14
|
-
- uses: actions/checkout@v4
|
15
|
-
- uses: actions/setup-node@v4
|
16
|
-
with:
|
17
|
-
node-version: 20
|
18
|
-
registry-url: https://registry.npmjs.org/
|
19
|
-
- run: npm ci
|
20
|
-
- run: npm run build
|
21
|
-
- run: npm publish --tag next
|
22
|
-
env:
|
23
|
-
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
|
package/.testcaferc.cjs
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* Custom overrides for BookReader Demo.
|
3
|
-
*/
|
4
|
-
html {
|
5
|
-
/** This must be set because the nav menu uses rem and sets the fonts really big? */
|
6
|
-
font-size: 10px;
|
7
|
-
font-family: sans-serif;
|
8
|
-
}
|
9
|
-
|
10
|
-
body {
|
11
|
-
font-size: 16px;
|
12
|
-
background-color: #939598;
|
13
|
-
margin: 0px;
|
14
|
-
}
|
15
|
-
|
16
|
-
/* Hide print and embed functionality */
|
17
|
-
.BRtoolbar .embed, .print {
|
18
|
-
display: none;
|
19
|
-
}
|
20
|
-
|
21
|
-
body.BRfullscreenActive section.theater {
|
22
|
-
height: 100vh;
|
23
|
-
}
|
24
|
-
ia-bookreader[fullscreen] {
|
25
|
-
height: unset;
|
26
|
-
}
|
27
|
-
|
28
|
-
ia-bookreader{
|
29
|
-
--br-height: calc(100vh - 100px);
|
30
|
-
display: block;
|
31
|
-
height: var(--br-height);
|
32
|
-
}
|
33
|
-
|
34
|
-
.BookReader {
|
35
|
-
--br-height: calc(100vh - 100px);
|
36
|
-
--new-height: calc(var(--br-height) - 20px);
|
37
|
-
height: var(--br-height);
|
38
|
-
overflow: hidden;
|
39
|
-
margin: 0 auto;
|
40
|
-
}
|