@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.
Files changed (305) hide show
  1. package/BookReader/BookReader.css +2251 -0
  2. package/BookReader/BookReader.js +3 -0
  3. package/BookReader/BookReader.js.LICENSE.txt +72 -0
  4. package/BookReader/BookReader.js.map +1 -0
  5. package/BookReader/hypothesis/LICENSE +50 -0
  6. package/BookReader/hypothesis/README.md +55 -0
  7. package/BookReader/hypothesis/build/boot.js +1 -0
  8. package/BookReader/hypothesis/build/manifest.json +20 -0
  9. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
  10. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  11. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
  12. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  13. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
  14. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
  16. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  17. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  18. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  19. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  20. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  38. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  39. package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
  40. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  41. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
  42. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
  44. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
  46. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  47. package/BookReader/hypothesis/package.json +126 -0
  48. package/BookReader/ia-bookreader-bundle.js +1782 -0
  49. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  50. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  51. package/BookReader/icons/1up.svg +1 -0
  52. package/BookReader/icons/2up.svg +1 -0
  53. package/BookReader/icons/advance.svg +3 -0
  54. package/BookReader/icons/chevron-right.svg +1 -0
  55. package/BookReader/icons/close-circle-dark.svg +1 -0
  56. package/BookReader/icons/close-circle.svg +1 -0
  57. package/BookReader/icons/fullscreen.svg +1 -0
  58. package/BookReader/icons/fullscreen_exit.svg +1 -0
  59. package/BookReader/icons/hamburger.svg +1 -0
  60. package/BookReader/icons/left-arrow.svg +1 -0
  61. package/BookReader/icons/magnify-minus.svg +1 -0
  62. package/BookReader/icons/magnify-plus.svg +1 -0
  63. package/BookReader/icons/magnify.svg +1 -0
  64. package/BookReader/icons/pause.svg +1 -0
  65. package/BookReader/icons/play.svg +1 -0
  66. package/BookReader/icons/playback-speed.svg +1 -0
  67. package/BookReader/icons/read-aloud.svg +1 -0
  68. package/BookReader/icons/review.svg +3 -0
  69. package/BookReader/icons/thumbnails.svg +1 -0
  70. package/BookReader/icons/voice.svg +1 -0
  71. package/BookReader/icons/volume-full.svg +1 -0
  72. package/BookReader/images/BRicons.png +0 -0
  73. package/BookReader/images/BRicons.svg +5 -0
  74. package/BookReader/images/BRicons_ia.png +0 -0
  75. package/BookReader/images/back_pages.png +0 -0
  76. package/BookReader/images/book_bottom_icon.png +0 -0
  77. package/BookReader/images/book_down_icon.png +0 -0
  78. package/BookReader/images/book_left_icon.png +0 -0
  79. package/BookReader/images/book_leftmost_icon.png +0 -0
  80. package/BookReader/images/book_right_icon.png +0 -0
  81. package/BookReader/images/book_rightmost_icon.png +0 -0
  82. package/BookReader/images/book_top_icon.png +0 -0
  83. package/BookReader/images/book_up_icon.png +0 -0
  84. package/BookReader/images/books_graphic.svg +1 -0
  85. package/BookReader/images/booksplit.png +0 -0
  86. package/BookReader/images/control_pause_icon.png +0 -0
  87. package/BookReader/images/control_play_icon.png +0 -0
  88. package/BookReader/images/embed_icon.png +0 -0
  89. package/BookReader/images/hypothesis.ico +0 -0
  90. package/BookReader/images/icon-home-ia.png +0 -0
  91. package/BookReader/images/icon_OL-logo-xs.png +0 -0
  92. package/BookReader/images/icon_alert-xs.png +0 -0
  93. package/BookReader/images/icon_book.svg +1 -0
  94. package/BookReader/images/icon_bookmark.svg +1 -0
  95. package/BookReader/images/icon_close-pop.png +0 -0
  96. package/BookReader/images/icon_download.png +0 -0
  97. package/BookReader/images/icon_gear.svg +1 -0
  98. package/BookReader/images/icon_hamburger.svg +1 -0
  99. package/BookReader/images/icon_home.png +0 -0
  100. package/BookReader/images/icon_home.svg +1 -0
  101. package/BookReader/images/icon_home_ia.png +0 -0
  102. package/BookReader/images/icon_indicator.png +0 -0
  103. package/BookReader/images/icon_info.svg +1 -0
  104. package/BookReader/images/icon_one_page.svg +1 -0
  105. package/BookReader/images/icon_pause.svg +1 -0
  106. package/BookReader/images/icon_play.svg +1 -0
  107. package/BookReader/images/icon_playback-rate.svg +1 -0
  108. package/BookReader/images/icon_return.png +0 -0
  109. package/BookReader/images/icon_search_button.svg +1 -0
  110. package/BookReader/images/icon_share.svg +1 -0
  111. package/BookReader/images/icon_skip-ahead.svg +1 -0
  112. package/BookReader/images/icon_skip-back.svg +2 -0
  113. package/BookReader/images/icon_speaker.svg +1 -0
  114. package/BookReader/images/icon_speaker_open.svg +1 -0
  115. package/BookReader/images/icon_thumbnails.svg +1 -0
  116. package/BookReader/images/icon_toc.svg +1 -0
  117. package/BookReader/images/icon_two_pages.svg +1 -0
  118. package/BookReader/images/icon_zoomer.png +0 -0
  119. package/BookReader/images/loading.gif +0 -0
  120. package/BookReader/images/logo_icon.png +0 -0
  121. package/BookReader/images/marker_chap-off.png +0 -0
  122. package/BookReader/images/marker_chap-off.svg +1 -0
  123. package/BookReader/images/marker_chap-off_ia.png +0 -0
  124. package/BookReader/images/marker_chap-on.png +0 -0
  125. package/BookReader/images/marker_chap-on.svg +1 -0
  126. package/BookReader/images/marker_srch-on.svg +1 -0
  127. package/BookReader/images/marker_srchchap-off.png +0 -0
  128. package/BookReader/images/marker_srchchap-on.png +0 -0
  129. package/BookReader/images/nav_control-dn.png +0 -0
  130. package/BookReader/images/nav_control-dn_ia.png +0 -0
  131. package/BookReader/images/nav_control-up.png +0 -0
  132. package/BookReader/images/nav_control-up_ia.png +0 -0
  133. package/BookReader/images/nav_control.png +0 -0
  134. package/BookReader/images/one_page_mode_icon.png +0 -0
  135. package/BookReader/images/paper-badge.png +0 -0
  136. package/BookReader/images/print_icon.png +0 -0
  137. package/BookReader/images/progressbar.gif +0 -0
  138. package/BookReader/images/right_edges.png +0 -0
  139. package/BookReader/images/slider.png +0 -0
  140. package/BookReader/images/slider_ia.png +0 -0
  141. package/BookReader/images/thumbnail_mode_icon.png +0 -0
  142. package/BookReader/images/transparent.png +0 -0
  143. package/BookReader/images/two_page_mode_icon.png +0 -0
  144. package/BookReader/images/unviewable_page.png +0 -0
  145. package/BookReader/images/zoom_in_icon.png +0 -0
  146. package/BookReader/images/zoom_out_icon.png +0 -0
  147. package/BookReader/jquery-3.js +2 -0
  148. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  149. package/BookReader/plugins/plugin.archive_analytics.js +2 -0
  150. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -0
  151. package/BookReader/plugins/plugin.autoplay.js +2 -0
  152. package/BookReader/plugins/plugin.autoplay.js.map +1 -0
  153. package/BookReader/plugins/plugin.chapters.js +26 -0
  154. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  155. package/BookReader/plugins/plugin.chapters.js.map +1 -0
  156. package/BookReader/plugins/plugin.experiments.js +3 -0
  157. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  158. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  159. package/BookReader/plugins/plugin.iframe.js +2 -0
  160. package/BookReader/plugins/plugin.iframe.js.map +1 -0
  161. package/BookReader/plugins/plugin.iiif.js +2 -0
  162. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  163. package/BookReader/plugins/plugin.resume.js +2 -0
  164. package/BookReader/plugins/plugin.resume.js.map +1 -0
  165. package/BookReader/plugins/plugin.search.js +3 -0
  166. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  167. package/BookReader/plugins/plugin.search.js.map +1 -0
  168. package/BookReader/plugins/plugin.text_selection.js +3 -0
  169. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  170. package/BookReader/plugins/plugin.text_selection.js.map +1 -0
  171. package/BookReader/plugins/plugin.tts.js +3 -0
  172. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +29 -0
  173. package/BookReader/plugins/plugin.tts.js.map +1 -0
  174. package/BookReader/plugins/plugin.url.js +2 -0
  175. package/BookReader/plugins/plugin.url.js.map +1 -0
  176. package/BookReader/plugins/plugin.vendor-fullscreen.js +2 -0
  177. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -0
  178. package/BookReader/webcomponents-bundle.js +3 -0
  179. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  180. package/BookReader/webcomponents-bundle.js.map +1 -0
  181. package/package.json +6 -1
  182. package/src/BookReader/BookModel.js +564 -0
  183. package/src/BookReader/DragScrollable.js +233 -0
  184. package/src/BookReader/ImageCache.js +149 -0
  185. package/src/BookReader/Mode1Up.js +110 -0
  186. package/src/BookReader/Mode1UpLit.js +388 -0
  187. package/src/BookReader/Mode2Up.js +107 -0
  188. package/src/BookReader/Mode2UpLit.js +777 -0
  189. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  190. package/src/BookReader/ModeSmoothZoom.js +312 -0
  191. package/src/BookReader/ModeThumb.js +344 -0
  192. package/src/BookReader/Navbar/Navbar.js +355 -0
  193. package/src/BookReader/PageContainer.js +172 -0
  194. package/src/BookReader/ReduceSet.js +26 -0
  195. package/src/BookReader/Toolbar/Toolbar.js +362 -0
  196. package/src/BookReader/events.js +19 -0
  197. package/src/BookReader/options.js +387 -0
  198. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  199. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  200. package/src/BookReader/utils/SelectionObserver.js +45 -0
  201. package/src/BookReader/utils/classes.js +36 -0
  202. package/src/BookReader/utils.js +313 -0
  203. package/.eslintrc.cjs +0 -51
  204. package/.gitattributes +0 -2
  205. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  206. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  207. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  208. package/.github/workflows/node.js.yml +0 -102
  209. package/.github/workflows/npm-publish.yml +0 -23
  210. package/.testcaferc.cjs +0 -10
  211. package/BookReaderDemo/BookReaderDemo.css +0 -40
  212. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -112
  213. package/BookReaderDemo/BookReaderJSSimple.js +0 -56
  214. package/BookReaderDemo/IADemoBr.js +0 -149
  215. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  216. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  217. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  218. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  219. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  220. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  221. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  222. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  223. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  224. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  225. package/BookReaderDemo/demo-advanced.html +0 -33
  226. package/BookReaderDemo/demo-embed-iframe-src.html +0 -85
  227. package/BookReaderDemo/demo-embed.html +0 -26
  228. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -34
  229. package/BookReaderDemo/demo-fullscreen.html +0 -31
  230. package/BookReaderDemo/demo-iiif.html +0 -121
  231. package/BookReaderDemo/demo-internetarchive.html +0 -271
  232. package/BookReaderDemo/demo-multiple.html +0 -44
  233. package/BookReaderDemo/demo-preview-pages.html +0 -1093
  234. package/BookReaderDemo/demo-simple.html +0 -35
  235. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -34
  236. package/BookReaderDemo/ia-multiple-volumes-manifest.js +0 -169
  237. package/BookReaderDemo/immersion-1up.html +0 -64
  238. package/BookReaderDemo/immersion-mode.html +0 -33
  239. package/BookReaderDemo/toggle_controls.html +0 -54
  240. package/BookReaderDemo/view_mode.html +0 -40
  241. package/BookReaderDemo/viewmode-cycle.html +0 -40
  242. package/CHANGELOG.md +0 -1087
  243. package/CONTRIBUTING.md +0 -7
  244. package/babel.config.cjs +0 -20
  245. package/codecov.yml +0 -23
  246. package/index.html +0 -34
  247. package/netlify.toml +0 -9
  248. package/renovate.json +0 -52
  249. package/screenshot.png +0 -0
  250. package/scripts/postversion.js +0 -11
  251. package/scripts/preversion.js +0 -15
  252. package/scripts/version.js +0 -24
  253. package/tests/e2e/README.md +0 -112
  254. package/tests/e2e/autoplay.test.js +0 -16
  255. package/tests/e2e/base.test.js +0 -27
  256. package/tests/e2e/helpers/base.js +0 -263
  257. package/tests/e2e/helpers/debug.js +0 -13
  258. package/tests/e2e/helpers/mockSearch.js +0 -90
  259. package/tests/e2e/helpers/params.js +0 -17
  260. package/tests/e2e/helpers/rightToLeft.js +0 -23
  261. package/tests/e2e/helpers/search.js +0 -73
  262. package/tests/e2e/models/BookReader.js +0 -11
  263. package/tests/e2e/models/Navigation.js +0 -39
  264. package/tests/e2e/rightToLeft.test.js +0 -19
  265. package/tests/e2e/viewmode.test.js +0 -44
  266. package/tests/jest/BookNavigator/book-navigator.test.js +0 -653
  267. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +0 -43
  268. package/tests/jest/BookNavigator/bookmarks/bookmark-edit.test.js +0 -132
  269. package/tests/jest/BookNavigator/bookmarks/bookmarks-list.test.js +0 -221
  270. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +0 -45
  271. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +0 -67
  272. package/tests/jest/BookNavigator/downloads/downloads.test.js +0 -53
  273. package/tests/jest/BookNavigator/search/search-provider.test.js +0 -179
  274. package/tests/jest/BookNavigator/search/search-results.test.js +0 -289
  275. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +0 -49
  276. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +0 -80
  277. package/tests/jest/BookNavigator/visual-adjustments.test.js +0 -200
  278. package/tests/jest/BookReader.keyboard.test.js +0 -190
  279. package/tests/jest/BookReader.options.test.js +0 -47
  280. package/tests/jest/BookReader.test.js +0 -316
  281. package/tests/jest/plugins/plugin.archive_analytics.test.js +0 -20
  282. package/tests/jest/plugins/plugin.autoplay.test.js +0 -35
  283. package/tests/jest/plugins/plugin.chapters.test.js +0 -193
  284. package/tests/jest/plugins/plugin.iframe.test.js +0 -42
  285. package/tests/jest/plugins/plugin.resume.test.js +0 -85
  286. package/tests/jest/plugins/plugin.text_selection.test.js +0 -447
  287. package/tests/jest/plugins/plugin.vendor-fullscreen.test.js +0 -65
  288. package/tests/jest/plugins/search/plugin.search.test.js +0 -120
  289. package/tests/jest/plugins/search/plugin.search.view.test.js +0 -131
  290. package/tests/jest/plugins/search/utils.js +0 -25
  291. package/tests/jest/plugins/search/utils.test.js +0 -29
  292. package/tests/jest/plugins/tts/AbstractTTSEngine.test.js +0 -173
  293. package/tests/jest/plugins/tts/FestivalTTSEngine.test.js +0 -59
  294. package/tests/jest/plugins/tts/PageChunk.test.js +0 -57
  295. package/tests/jest/plugins/tts/PageChunkIterator.test.js +0 -179
  296. package/tests/jest/plugins/tts/WebTTSEngine.test.js +0 -178
  297. package/tests/jest/plugins/tts/utils.test.js +0 -74
  298. package/tests/jest/plugins/url/UrlPlugin.test.js +0 -198
  299. package/tests/jest/plugins/url/plugin.url.test.js +0 -168
  300. package/tests/jest/setup.js +0 -3
  301. package/tests/jest/util/browserSniffing.test.js +0 -62
  302. package/tests/jest/util/docCookies.test.js +0 -24
  303. package/tests/jest/util/strings.test.js +0 -63
  304. package/tests/jest/utils.js +0 -83
  305. 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,'&lt;')
79
+ .replace(/"/g,'&quot;');
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,2 +0,0 @@
1
- # Build files
2
- BookReader/**/* binary
@@ -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,10 +0,0 @@
1
- // @ts-check
2
- /** @type {TestCafeConfigurationOptions} */
3
- module.exports = {
4
- appCommand: "npm run serve",
5
- browsers: [
6
- "chrome:headless",
7
- "firefox:headless",
8
- ],
9
- src: ["tests/e2e/**/*test.js"]
10
- };
@@ -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
- }