@internetarchive/bookreader 5.0.0-11 → 5.0.0-110

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 (380) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +604 -1239
  4. package/BookReader/BookReader.js +1 -1
  5. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  6. package/BookReader/BookReader.js.map +1 -1
  7. package/BookReader/bergamot-translator-worker.js +2966 -0
  8. package/BookReader/bergamot-translator-worker.wasm +0 -0
  9. package/BookReader/hypothesis/LICENSE +50 -0
  10. package/BookReader/hypothesis/README.md +55 -0
  11. package/BookReader/hypothesis/build/boot.js +1 -0
  12. package/BookReader/hypothesis/build/manifest.json +20 -0
  13. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
  14. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
  16. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  17. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
  18. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  19. package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
  20. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  38. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  39. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  40. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  41. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  42. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
  44. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
  46. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  47. package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
  48. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  49. package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
  50. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  51. package/BookReader/hypothesis/package.json +126 -0
  52. package/BookReader/ia-bookreader-bundle.js +1907 -0
  53. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +19 -0
  54. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  55. package/BookReader/icons/1up.svg +1 -1
  56. package/BookReader/icons/2up.svg +1 -1
  57. package/BookReader/icons/advance.svg +1 -1
  58. package/BookReader/icons/chevron-right.svg +1 -1
  59. package/BookReader/icons/close-circle-dark.svg +1 -1
  60. package/BookReader/icons/close-circle.svg +1 -1
  61. package/BookReader/icons/fullscreen.svg +1 -1
  62. package/BookReader/icons/fullscreen_exit.svg +1 -1
  63. package/BookReader/icons/hamburger.svg +1 -1
  64. package/BookReader/icons/left-arrow.svg +1 -1
  65. package/BookReader/icons/magnify-minus.svg +1 -1
  66. package/BookReader/icons/magnify-plus.svg +1 -1
  67. package/BookReader/icons/magnify.svg +1 -1
  68. package/BookReader/icons/pause.svg +1 -1
  69. package/BookReader/icons/play.svg +1 -1
  70. package/BookReader/icons/playback-speed.svg +1 -1
  71. package/BookReader/icons/read-aloud.svg +1 -1
  72. package/BookReader/icons/review.svg +1 -1
  73. package/BookReader/icons/slider-toggle.svg +1 -0
  74. package/BookReader/icons/thumbnails.svg +1 -1
  75. package/BookReader/icons/voice.svg +1 -0
  76. package/BookReader/icons/volume-full.svg +1 -1
  77. package/BookReader/images/BRicons.svg +3 -3
  78. package/BookReader/images/books_graphic.svg +1 -1
  79. package/BookReader/images/hypothesis.ico +0 -0
  80. package/BookReader/images/icon_book.svg +1 -1
  81. package/BookReader/images/icon_bookmark.svg +1 -1
  82. package/BookReader/images/icon_experiment.svg +1 -0
  83. package/BookReader/images/icon_gear.svg +1 -1
  84. package/BookReader/images/icon_hamburger.svg +1 -1
  85. package/BookReader/images/icon_home.svg +1 -1
  86. package/BookReader/images/icon_info.svg +1 -1
  87. package/BookReader/images/icon_one_page.svg +1 -1
  88. package/BookReader/images/icon_pause.svg +1 -1
  89. package/BookReader/images/icon_play.svg +1 -1
  90. package/BookReader/images/icon_playback-rate.svg +1 -1
  91. package/BookReader/images/icon_search_button.svg +1 -1
  92. package/BookReader/images/icon_share.svg +1 -1
  93. package/BookReader/images/icon_skip-ahead.svg +1 -1
  94. package/BookReader/images/icon_skip-back.svg +1 -1
  95. package/BookReader/images/icon_speaker.svg +1 -1
  96. package/BookReader/images/icon_speaker_open.svg +1 -1
  97. package/BookReader/images/icon_thumbnails.svg +1 -1
  98. package/BookReader/images/icon_toc.svg +1 -1
  99. package/BookReader/images/icon_two_pages.svg +1 -1
  100. package/BookReader/images/marker_chap-off.svg +1 -1
  101. package/BookReader/images/marker_chap-on.svg +1 -1
  102. package/BookReader/images/marker_srch-on.svg +1 -1
  103. package/BookReader/images/translate.svg +1 -0
  104. package/BookReader/images/unviewable_page.png +0 -0
  105. package/BookReader/jquery-3.js +2 -0
  106. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  107. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  108. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  109. package/BookReader/plugins/plugin.autoplay.js +1 -1
  110. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  111. package/BookReader/plugins/plugin.chapters.js +22 -1
  112. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  113. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  114. package/BookReader/plugins/plugin.experiments.js +3 -0
  115. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  116. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  117. package/BookReader/plugins/plugin.iframe.js +1 -1
  118. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  119. package/BookReader/plugins/plugin.iiif.js +2 -0
  120. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  121. package/BookReader/plugins/plugin.resume.js +1 -1
  122. package/BookReader/plugins/plugin.resume.js.map +1 -1
  123. package/BookReader/plugins/plugin.search.js +2 -1
  124. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  125. package/BookReader/plugins/plugin.search.js.map +1 -1
  126. package/BookReader/plugins/plugin.text_selection.js +2 -1
  127. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  128. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  129. package/BookReader/plugins/plugin.translate.js +137 -0
  130. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  131. package/BookReader/plugins/plugin.translate.js.map +1 -0
  132. package/BookReader/plugins/plugin.tts.js +1 -1
  133. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  134. package/BookReader/plugins/plugin.tts.js.map +1 -1
  135. package/BookReader/plugins/plugin.url.js +1 -1
  136. package/BookReader/plugins/plugin.url.js.map +1 -1
  137. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  138. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  139. package/BookReader/plugins/translator-worker.js +2 -0
  140. package/BookReader/plugins/translator-worker.js.map +1 -0
  141. package/BookReader/silence.mp3 +0 -0
  142. package/BookReader/translator-worker.js +475 -0
  143. package/BookReader/webcomponents-bundle.js +3 -0
  144. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  145. package/BookReader/webcomponents-bundle.js.map +1 -0
  146. package/README.md +14 -3
  147. package/jsconfig.json +19 -0
  148. package/package.json +92 -70
  149. package/src/BookReader/BookModel.js +92 -46
  150. package/src/BookReader/DragScrollable.js +233 -0
  151. package/src/BookReader/ImageCache.js +49 -16
  152. package/src/BookReader/Mode1Up.js +66 -365
  153. package/src/BookReader/Mode1UpLit.js +392 -0
  154. package/src/BookReader/Mode2Up.js +87 -1315
  155. package/src/BookReader/Mode2UpLit.js +788 -0
  156. package/src/BookReader/ModeAbstract.js +43 -0
  157. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  158. package/src/BookReader/ModeSmoothZoom.js +312 -0
  159. package/src/BookReader/ModeThumb.js +29 -15
  160. package/src/BookReader/Navbar/Navbar.js +201 -76
  161. package/src/BookReader/PageContainer.js +120 -23
  162. package/src/BookReader/ReduceSet.js +2 -2
  163. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  164. package/src/BookReader/events.js +3 -3
  165. package/src/BookReader/options.js +94 -17
  166. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  167. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  168. package/src/BookReader/utils/SelectionObserver.js +45 -0
  169. package/src/BookReader/utils/classes.js +1 -1
  170. package/src/BookReader/utils.js +136 -12
  171. package/src/BookReader.js +678 -1226
  172. package/src/BookReaderPlugin.js +52 -0
  173. package/src/assets/icons/magnify-minus.svg +3 -7
  174. package/src/assets/icons/magnify-plus.svg +3 -7
  175. package/src/assets/icons/slider-toggle.svg +1 -0
  176. package/src/assets/icons/voice.svg +1 -0
  177. package/src/assets/images/hypothesis.ico +0 -0
  178. package/src/assets/images/icon_experiment.svg +1 -0
  179. package/src/assets/images/translate.svg +1 -0
  180. package/src/assets/images/unviewable_page.png +0 -0
  181. package/src/assets/silence.mp3 +0 -0
  182. package/src/css/BookReader.scss +1 -5
  183. package/src/css/_BRBookmarks.scss +1 -1
  184. package/src/css/_BRComponent.scss +1 -1
  185. package/src/css/_BRicon.scss +8 -2
  186. package/src/css/_BRmain.scss +16 -3
  187. package/src/css/_BRnav.scss +74 -70
  188. package/src/css/_BRpages.scss +171 -42
  189. package/src/css/_BRsearch.scss +69 -30
  190. package/src/css/_BRtoolbar.scss +5 -5
  191. package/src/css/_TextSelection.scss +129 -24
  192. package/src/css/_colorbox.scss +2 -2
  193. package/src/css/_controls.scss +24 -7
  194. package/src/css/_icons.scss +8 -1
  195. package/src/{BookNavigator/assets → css}/button-base.js +2 -2
  196. package/src/css/icon_checkmark.js +9 -0
  197. package/src/css/sharedStyles.js +15 -0
  198. package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
  199. package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
  200. package/src/ia-bookreader/ia-bookreader.js +666 -0
  201. package/src/ia-bookreader/sharing.js +27 -0
  202. package/src/ia-bookreader/viewable-files.js +98 -0
  203. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
  204. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
  205. package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
  206. package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
  207. package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
  208. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
  209. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
  210. package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
  211. package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
  212. package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
  213. package/src/plugins/plugin.archive_analytics.js +84 -78
  214. package/src/plugins/plugin.autoplay.js +99 -104
  215. package/src/plugins/plugin.chapters.js +314 -205
  216. package/src/plugins/plugin.experiments.js +321 -0
  217. package/src/plugins/plugin.iframe.js +1 -1
  218. package/src/plugins/plugin.iiif.js +141 -0
  219. package/src/plugins/plugin.resume.js +54 -51
  220. package/src/plugins/plugin.text_selection.js +522 -219
  221. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  222. package/src/plugins/search/plugin.search.js +374 -392
  223. package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
  224. package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
  225. package/src/plugins/search/utils.js +50 -0
  226. package/src/plugins/search/view.js +50 -68
  227. package/src/plugins/translate/TranslationManager.js +164 -0
  228. package/src/plugins/translate/plugin.translate.js +512 -0
  229. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  230. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  231. package/src/plugins/tts/PageChunk.js +33 -21
  232. package/src/plugins/tts/PageChunkIterator.js +11 -17
  233. package/src/plugins/tts/WebTTSEngine.js +131 -91
  234. package/src/plugins/tts/plugin.tts.js +345 -350
  235. package/src/plugins/tts/utils.js +77 -49
  236. package/src/plugins/url/UrlPlugin.js +191 -0
  237. package/src/plugins/{plugin.url.js → url/plugin.url.js} +44 -15
  238. package/src/util/TextSelectionManager.js +282 -0
  239. package/src/util/browserSniffing.js +33 -1
  240. package/src/util/cache.js +20 -0
  241. package/src/util/docCookies.js +21 -2
  242. package/src/util/lit.js +15 -0
  243. package/src/util/strings.js +1 -0
  244. package/.babelrc +0 -12
  245. package/.dependabot/config.yml +0 -6
  246. package/.eslintrc.js +0 -50
  247. package/.gitattributes +0 -2
  248. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  249. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  250. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  251. package/.github/workflows/node.js.yml +0 -37
  252. package/.github/workflows/npm-publish.yml +0 -47
  253. package/.testcaferc.json +0 -5
  254. package/BookReader/bookreader-component-bundle.js +0 -1450
  255. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  256. package/BookReader/bookreader-component-bundle.js.map +0 -1
  257. package/BookReader/jquery-1.10.1.js +0 -2
  258. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  259. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  260. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  261. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  262. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  263. package/BookReaderDemo/BookReaderDemo.css +0 -41
  264. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  265. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  266. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  267. package/BookReaderDemo/IIIFBookReader.js +0 -207
  268. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  269. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  270. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  273. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  274. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  275. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  276. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  277. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  278. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  279. package/BookReaderDemo/demo-advanced.html +0 -33
  280. package/BookReaderDemo/demo-autoplay.html +0 -38
  281. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  282. package/BookReaderDemo/demo-embed.html +0 -26
  283. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  284. package/BookReaderDemo/demo-fullscreen.html +0 -33
  285. package/BookReaderDemo/demo-iiif.html +0 -34
  286. package/BookReaderDemo/demo-iiif.js +0 -26
  287. package/BookReaderDemo/demo-internetarchive.html +0 -74
  288. package/BookReaderDemo/demo-multiple.html +0 -43
  289. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  290. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  291. package/BookReaderDemo/demo-simple.html +0 -34
  292. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  293. package/BookReaderDemo/immersion-1up.html +0 -64
  294. package/BookReaderDemo/immersion-mode.html +0 -35
  295. package/BookReaderDemo/toggle_controls.html +0 -53
  296. package/BookReaderDemo/view_mode.html +0 -39
  297. package/BookReaderDemo/viewmode-cycle.html +0 -41
  298. package/CHANGELOG.md +0 -495
  299. package/CONTRIBUTING.md +0 -7
  300. package/codecov.yml +0 -17
  301. package/index.html +0 -31
  302. package/karma.conf.js +0 -23
  303. package/screenshot.png +0 -0
  304. package/scripts/postversion.js +0 -10
  305. package/scripts/preversion.js +0 -14
  306. package/scripts/version.js +0 -26
  307. package/src/BookNavigator/BookModel.js +0 -14
  308. package/src/BookNavigator/BookNavigator.js +0 -446
  309. package/src/BookNavigator/assets/book-loader.js +0 -27
  310. package/src/BookNavigator/assets/icon_checkmark.js +0 -6
  311. package/src/BookNavigator/assets/icon_close.js +0 -3
  312. package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
  313. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  314. package/src/BookNavigator/downloads/downloads-provider.js +0 -66
  315. package/src/BookNavigator/search/a-search-result.js +0 -55
  316. package/src/BookReader/DebugConsole.js +0 -54
  317. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  318. package/src/ItemNavigator/ItemNavigator.js +0 -376
  319. package/src/ItemNavigator/providers/sharing.js +0 -29
  320. package/src/css/_MobileNav.scss +0 -194
  321. package/src/dragscrollable-br.js +0 -261
  322. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  323. package/src/plugins/plugin.mobile_nav.js +0 -287
  324. package/tests/BookReader/BookModel.test.js +0 -312
  325. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  326. package/tests/BookReader/DebugConsole.test.js +0 -25
  327. package/tests/BookReader/ImageCache.test.js +0 -150
  328. package/tests/BookReader/Mode1Up.test.js +0 -164
  329. package/tests/BookReader/Mode2Up.test.js +0 -247
  330. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  331. package/tests/BookReader/PageContainer.test.js +0 -115
  332. package/tests/BookReader/ReduceSet.test.js +0 -38
  333. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  334. package/tests/BookReader/utils/classes.test.js +0 -88
  335. package/tests/BookReader/utils.test.js +0 -109
  336. package/tests/BookReader.options.test.js +0 -39
  337. package/tests/BookReader.test.js +0 -301
  338. package/tests/e2e/README.md +0 -75
  339. package/tests/e2e/autoplay.test.js +0 -13
  340. package/tests/e2e/base.test.js +0 -35
  341. package/tests/e2e/helpers/base.js +0 -263
  342. package/tests/e2e/helpers/debug.js +0 -13
  343. package/tests/e2e/helpers/desktopSearch.js +0 -72
  344. package/tests/e2e/helpers/mobileSearch.js +0 -85
  345. package/tests/e2e/helpers/mockSearch.js +0 -93
  346. package/tests/e2e/helpers/rightToLeft.js +0 -29
  347. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  348. package/tests/e2e/models/BookReader.js +0 -11
  349. package/tests/e2e/models/Navigation.js +0 -56
  350. package/tests/e2e/rightToLeft.test.js +0 -20
  351. package/tests/e2e/viewmode.test.js +0 -37
  352. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  353. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  354. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  355. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  356. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  357. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  358. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  359. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  360. package/tests/plugins/plugin.autoplay.test.js +0 -52
  361. package/tests/plugins/plugin.chapters.test.js +0 -130
  362. package/tests/plugins/plugin.iframe.test.js +0 -42
  363. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  364. package/tests/plugins/plugin.resume.test.js +0 -98
  365. package/tests/plugins/plugin.text_selection.test.js +0 -203
  366. package/tests/plugins/plugin.url.test.js +0 -129
  367. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  368. package/tests/plugins/search/plugin.search.test.js +0 -173
  369. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  370. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  371. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  372. package/tests/plugins/tts/PageChunk.test.js +0 -57
  373. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  374. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  375. package/tests/plugins/tts/utils.test.js +0 -133
  376. package/tests/util/browserSniffing.test.js +0 -56
  377. package/tests/util/docCookies.test.js +0 -15
  378. package/tests/util/strings.test.js +0 -63
  379. package/tests/utils.js +0 -42
  380. package/webpack.config.js +0 -86
@@ -1,7 +1,10 @@
1
- import { html } from 'lit-element';
2
- import { nothing } from 'lit-html';
3
-
4
- import './search-results';
1
+ // @ts-check
2
+ import { html, nothing } from 'lit';
3
+ import '@internetarchive/icon-search/icon-search.js';
4
+ import './search-results.js';
5
+ /** @typedef {import('@/src/plugins/search/plugin.search.js').SearchInsideMatch} SearchInsideMatch */
6
+ /** @typedef {import('@/src/plugins/search/plugin.search.js').SearchInsideResults} SearchInsideResults */
7
+ /** @typedef {import('@/src/BookReader.js').default} BookReader */
5
8
 
6
9
  let searchState = {
7
10
  query: '',
@@ -10,8 +13,11 @@ let searchState = {
10
13
  queryInProgress: false,
11
14
  errorMessage: '',
12
15
  };
13
- export default class {
14
- constructor(onSearchChange = () => {}, brInstance) {
16
+ export default class SearchProvider {
17
+ constructor({
18
+ onProviderChange,
19
+ bookreader,
20
+ }) {
15
21
  /* search menu events */
16
22
  this.onBookSearchInitiated = this.onBookSearchInitiated.bind(this);
17
23
  /* bookreader search events */
@@ -26,12 +32,16 @@ export default class {
26
32
  this.bindEventListeners = this.bindEventListeners.bind(this);
27
33
  this.getMenuDetails = this.getMenuDetails.bind(this);
28
34
  this.getComponent = this.getComponent.bind(this);
29
- this.advanceToPage = this.advanceToPage.bind(this);
30
35
  this.updateMenu = this.updateMenu.bind(this);
31
36
 
32
- this.onSearchChange = onSearchChange;
33
- this.bookreader = brInstance;
34
- this.icon = html`<ia-icon icon="search" style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon>`;
37
+ this.onProviderChange = onProviderChange;
38
+ /** @type {import('@/src/BookReader.js').default} */
39
+ this.bookreader = bookreader;
40
+ this.icon = html`
41
+ <ia-icon-search
42
+ aria-hidden="true" role="presentation"
43
+ style="width: var(--iconWidth); height: var(--iconHeight);"
44
+ ></ia-icon-search>`;
35
45
  this.label = 'Search inside';
36
46
  this.menuDetails = this.getMenuDetails();
37
47
  this.id = 'search';
@@ -69,13 +79,20 @@ export default class {
69
79
  errorMessage: '',
70
80
  };
71
81
  const updateMenuFor = {
72
- searchCanceled: true
82
+ searchCanceled: true,
73
83
  };
74
84
  this.updateMenu(updateMenuFor);
85
+
86
+ if (this.bookreader.urlPlugin) {
87
+ this.updateSearchInUrl();
88
+ }
75
89
  }
76
90
 
77
91
  onSearchStarted(e) {
78
- const { term = '' } = e.detail.props;
92
+ const { term = '', instance } = e.detail.props;
93
+ if (instance) {
94
+ this.bookreader = instance;
95
+ }
79
96
  searchState.query = term;
80
97
  searchState.results = [];
81
98
  searchState.resultsCount = 0;
@@ -89,11 +106,14 @@ export default class {
89
106
  this.bookreader.search(searchState.query);
90
107
  }
91
108
 
109
+ /**
110
+ * @param {CustomEvent<{props: {instance: BookReader, results: SearchInsideResults}}>} event
111
+ */
92
112
  onSearchRequestError(event, errorType = 'default') {
93
- const { detail: { props = {} } } = event;
94
- const { instance = null } = props;
113
+ const { detail: { props } } = event;
114
+ const { instance, results } = props;
95
115
  if (instance) {
96
- /* keep bookreader instance reference up-to-date */
116
+ /** @type {BookReader} keep bookreader instance reference up-to-date */
97
117
  this.bookreader = instance;
98
118
  }
99
119
  const errorMessages = {
@@ -104,6 +124,7 @@ export default class {
104
124
  };
105
125
 
106
126
  const messageToShow = errorMessages[errorType] ?? errorMessages.default;
127
+ searchState.query = results?.q || '';
107
128
  searchState.results = [];
108
129
  searchState.resultsCount = 0;
109
130
  searchState.queryInProgress = false;
@@ -126,7 +147,7 @@ export default class {
126
147
  }
127
148
 
128
149
  searchCanceledInMenu() {
129
- this.bookreader?.cancelSearchRequest();
150
+ this.bookreader.plugins.search.cancelSearchRequest();
130
151
  }
131
152
 
132
153
  onSearchResultsCleared() {
@@ -137,8 +158,23 @@ export default class {
137
158
  queryInProgress: false,
138
159
  errorMessage: '',
139
160
  };
140
- this.updateMenu();
141
- this.bookreader?.searchView?.clearSearchFieldAndResults();
161
+ this.updateMenu({ openMenu: false });
162
+ this.bookreader.plugins.search.searchView.clearSearchFieldAndResults(false);
163
+ if (this.bookreader.urlPlugin) {
164
+ this.updateSearchInUrl();
165
+ }
166
+ }
167
+
168
+ /** update URL `q=<term>` query param in URL */
169
+ updateSearchInUrl() {
170
+ if (this.bookreader.urlPlugin) {
171
+ this.bookreader.urlPlugin.pullFromAddressBar();
172
+ if (searchState.query) {
173
+ this.bookreader.urlPlugin.setUrlParam('q', searchState.query);
174
+ } else {
175
+ this.bookreader.urlPlugin.removeUrlParam('q');
176
+ }
177
+ }
142
178
  }
143
179
 
144
180
  /**
@@ -148,7 +184,7 @@ export default class {
148
184
  updateMenu(searchUpdates = {}) {
149
185
  this.menuDetails = this.getMenuDetails();
150
186
  this.component = this.getComponent();
151
- this.onSearchChange(this.bookreader, searchUpdates);
187
+ this.onProviderChange(this.bookreader, searchUpdates);
152
188
  }
153
189
 
154
190
  getComponent() {
@@ -168,14 +204,10 @@ export default class {
168
204
  `;
169
205
  }
170
206
 
207
+ /**
208
+ * @param {{ detail: {match: SearchInsideMatch} }} param0
209
+ */
171
210
  onSearchResultsClicked({ detail }) {
172
- const page = detail.match.par[0].page;
173
- this.advanceToPage(page);
174
- }
175
-
176
- advanceToPage(leaf) {
177
- const page = this.bookreader.leafNumToIndex(leaf);
178
- this.bookreader._searchPluginGoToResult(page);
179
- this.bookreader.updateSearchHilites();
211
+ this.bookreader.plugins.search.jumpToMatch(detail.match.matchIndex);
180
212
  }
181
213
  }
@@ -1,12 +1,17 @@
1
1
  /* eslint-disable class-methods-use-this */
2
- import { nothing } from 'lit-html';
3
- import { css, html, LitElement } from 'lit-element';
4
- import '@internetarchive/ia-activity-indicator/ia-activity-indicator';
5
- import './a-search-result.js';
6
- import checkmarkIcon from '../assets/icon_checkmark.js';
7
- import closeIcon from '../assets/icon_close.js';
8
- import buttonCSS from '../assets/button-base.js';
9
-
2
+ import { unsafeHTML } from 'lit/directives/unsafe-html.js';
3
+ import { css, html, LitElement, nothing } from 'lit';
4
+ import '@internetarchive/ia-activity-indicator';
5
+ import checkmarkIconTemplate from '../../css/icon_checkmark.js';
6
+ import closeIconTemplate from '@internetarchive/icon-close/index.js';
7
+ import buttonCSS from '../../css/button-base.js';
8
+ import { ifDefined } from 'lit/directives/if-defined.js';
9
+ import { sharedStyles } from '../../css/sharedStyles.js';
10
+ import { svgToDataUrl } from '../../util/lit.js';
11
+ /** @typedef {import('@/src/plugins/search/plugin.search.js').SearchInsideMatch} SearchInsideMatch */
12
+
13
+ const checkmarkIconData = svgToDataUrl(checkmarkIconTemplate);
14
+ const closeIconData = svgToDataUrl(closeIconTemplate);
10
15
 
11
16
  export class IABookSearchResults extends LitElement {
12
17
  static get properties() {
@@ -16,7 +21,6 @@ export class IABookSearchResults extends LitElement {
16
21
  queryInProgress: { type: Boolean },
17
22
  renderHeader: { type: Boolean },
18
23
  renderSearchAllFiles: { type: Boolean },
19
- displayResultImages: { type: Boolean },
20
24
  errorMessage: { type: String },
21
25
  };
22
26
  }
@@ -24,12 +28,12 @@ export class IABookSearchResults extends LitElement {
24
28
  constructor() {
25
29
  super();
26
30
 
31
+ /** @type {SearchInsideMatch[]} */
27
32
  this.results = [];
28
33
  this.query = '';
29
34
  this.queryInProgress = false;
30
35
  this.renderHeader = false;
31
- this.renderSearchAllFields = false;
32
- this.displayResultImages = false;
36
+ this.renderSearchAllFiles = false;
33
37
  this.errorMessage = '';
34
38
 
35
39
  this.bindBookReaderListeners();
@@ -61,6 +65,9 @@ export class IABookSearchResults extends LitElement {
61
65
 
62
66
  setQuery(e) {
63
67
  this.query = e.currentTarget.value;
68
+ if (!this.query) {
69
+ this.cancelSearch();
70
+ }
64
71
  }
65
72
 
66
73
  performSearch(e) {
@@ -78,7 +85,15 @@ export class IABookSearchResults extends LitElement {
78
85
  }));
79
86
  }
80
87
 
81
- selectResult() {
88
+ /**
89
+ * @param {SearchInsideMatch} match
90
+ */
91
+ selectResult(match) {
92
+ this.dispatchEvent(new CustomEvent('resultSelected', {
93
+ bubbles: true,
94
+ composed: true,
95
+ detail: { match },
96
+ }));
82
97
  this.dispatchEvent(new CustomEvent('closeMenu', {
83
98
  bubbles: true,
84
99
  composed: true,
@@ -96,13 +111,13 @@ export class IABookSearchResults extends LitElement {
96
111
 
97
112
  get resultsCount() {
98
113
  const count = this.results.length;
99
- return count ? html`<p>(${count} result${count > 1 ? 's' : ''})</p>` : nothing;
114
+ return count ? `${count} result${count > 1 ? 's' : ''}` : nothing;
100
115
  }
101
116
 
102
117
  get headerSection() {
103
118
  const header = html`<header>
104
119
  <h3>Search inside</h3>
105
- ${this.resultsCount}
120
+ ${this.resultsCount ? html`(${this.resultsCount})` : nothing}
106
121
  </header>`;
107
122
  return this.renderHeader ? header : nothing;
108
123
  }
@@ -118,7 +133,7 @@ export class IABookSearchResults extends LitElement {
118
133
  get loadingIndicator() {
119
134
  return html`
120
135
  <div class="loading">
121
- <ia-activity-indicator mode="processing"></ia-activity-indicator>
136
+ <ia-activity-indicator mode="processing" aria-hidden="true" role="presentation"></ia-activity-indicator>
122
137
  <p>Searching</p>
123
138
  <button class="ia-button external cancel-search" @click=${this.cancelSearch}>Cancel</button>
124
139
  </div>
@@ -126,33 +141,37 @@ export class IABookSearchResults extends LitElement {
126
141
  }
127
142
 
128
143
  get resultsSet() {
129
- const resultsClass = this.displayResultImages ? 'show-image' : '';
130
144
  return html`
131
- <ul class="results ${resultsClass}">
145
+ <nav aria-label="Search results">
146
+ <div>
147
+ ${this.resultsCount}
148
+ <a
149
+ href="#"
150
+ class="skip-link"
151
+ @click=${(e) => {
152
+ e.preventDefault();
153
+ this.shadowRoot.querySelector('.results li:last-child .result-item').focus();
154
+ }}
155
+ >Skip to last result</a>
156
+ </div>
157
+ <ul class="results">
132
158
  ${this.results.map(match => html`
133
- <book-search-result
134
- .match=${match}
135
- @resultSelected=${this.selectResult}
136
- ></book-search-result>
159
+ <li>
160
+ <button class="result-item" @click=${this.selectResult.bind(this, match)}>
161
+ <span class="page-num">Page ${match.displayPageNumber}</span> — <span lang=${ifDefined(match.lang)}>${unsafeHTML(match.html)}</span>
162
+ </button>
163
+ </li>
137
164
  `)}
138
165
  </ul>
139
- `;
140
- }
141
-
142
- get searchForm() {
143
- return html`
144
- <form action="" method="get" @submit=${this.performSearch}>
145
- <fieldset>
146
- ${this.searchMultipleControls}
147
- <input
148
- type="search"
149
- name="query"
150
- alt="Search inside this book."
151
- @keyup=${this.setQuery}
152
- .value=${this.query}
153
- />
154
- </fieldset>
155
- </form>
166
+ <a
167
+ href="#"
168
+ class="skip-link"
169
+ @click=${(e) => {
170
+ e.preventDefault();
171
+ this.shadowRoot.querySelector('.results li:first-child .result-item').focus();
172
+ }}
173
+ >Skip to first result</a>
174
+ </nav>
156
175
  `;
157
176
  }
158
177
 
@@ -162,21 +181,29 @@ export class IABookSearchResults extends LitElement {
162
181
  `;
163
182
  }
164
183
 
165
- get searchCTA() {
166
- return html`<p class="search-cta"><em>Please enter text to search for</em></p>`;
167
- }
168
-
169
184
  render() {
170
185
  const showSearchCTA = (!this.queryInProgress && !this.errorMessage)
171
186
  && (!this.queryInProgress && !this.results.length);
172
187
  return html`
173
188
  ${this.headerSection}
174
- ${this.searchForm}
175
- <div class="results-container">
189
+ <form action="" method="get" @submit=${this.performSearch}>
190
+ ${this.searchMultipleControls}
191
+ <input
192
+ type="search"
193
+ name="query"
194
+ id="br-search-input"
195
+ @keyup=${this.setQuery}
196
+ @search=${this.setQuery}
197
+ .value=${this.query}
198
+ />
199
+ <label class="search-cta ${showSearchCTA ? '' : 'sr-only'}" for="br-search-input">
200
+ Please enter text to search for
201
+ </label>
202
+ </form>
203
+ <div class="results-container" aria-live="polite">
176
204
  ${this.queryInProgress ? this.loadingIndicator : nothing}
177
205
  ${this.errorMessage ? this.setErrorMessage : nothing}
178
206
  ${this.results.length ? this.resultsSet : nothing}
179
- ${showSearchCTA ? this.searchCTA : nothing}
180
207
  </div>
181
208
  `;
182
209
  }
@@ -197,6 +224,15 @@ export class IABookSearchResults extends LitElement {
197
224
  box-sizing: border-box;
198
225
  }
199
226
 
227
+ .skip-link {
228
+ position: absolute;
229
+ left: -9999px;
230
+ }
231
+ .skip-link:focus {
232
+ position: static;
233
+ left: auto;
234
+ }
235
+
200
236
  mark {
201
237
  padding: 0 .2rem;
202
238
  color: ${searchResultText};
@@ -224,9 +260,8 @@ export class IABookSearchResults extends LitElement {
224
260
  font-style: italic;
225
261
  }
226
262
 
227
- fieldset {
263
+ form {
228
264
  padding: 0 0 1rem 0;
229
- border: none;
230
265
  }
231
266
 
232
267
  [type="checkbox"] {
@@ -254,7 +289,7 @@ export class IABookSearchResults extends LitElement {
254
289
  border-radius: 2px;
255
290
  }
256
291
  :checked + label.checkbox:after {
257
- background-image: url('${checkmarkIcon}');
292
+ background-image: url('${checkmarkIconData}');
258
293
  }
259
294
 
260
295
  label.checkbox[for="all_files"]:after {
@@ -268,7 +303,7 @@ export class IABookSearchResults extends LitElement {
268
303
  -webkit-appearance: textfield;
269
304
  width: 100%;
270
305
  height: 3rem;
271
- padding: 0 1.5rem;
306
+ padding: 0 10px;
272
307
  box-sizing: border-box;
273
308
  font: normal 1.6rem "Helvetica qNeue", Helvetica, Arial, sans-serif;
274
309
  border-radius: 1.5rem;
@@ -280,22 +315,25 @@ export class IABookSearchResults extends LitElement {
280
315
  [type="search"]::-webkit-search-cancel-button {
281
316
  width: 18px;
282
317
  height: 18px;
318
+ margin-right: -5px;
283
319
  -webkit-appearance: none;
284
320
  appearance: none;
285
- -webkit-mask: url('${closeIcon}') 0 0 no-repeat;
286
- mask: url('${closeIcon}') 0 0 no-repeat;
321
+ -webkit-mask: url('${closeIconData}') 0 0 no-repeat;
322
+ mask: url('${closeIconData}') 0 0 no-repeat;
287
323
  -webkit-mask-size: 100%;
288
324
  mask-size: 100%;
289
325
  background: #fff;
290
326
  }
291
327
 
292
- p.page-num {
328
+ .page-num {
293
329
  font-weight: bold;
294
330
  padding-bottom: 0;
295
331
  }
296
332
 
297
- p.search-cta {
333
+ .search-cta {
334
+ padding: 10px 0;
298
335
  text-align: center;
336
+ font-style: italic;
299
337
  }
300
338
 
301
339
  .results-container {
@@ -308,33 +346,24 @@ export class IABookSearchResults extends LitElement {
308
346
  list-style: none;
309
347
  }
310
348
 
311
- ul.show-image li {
312
- display: grid;
313
- }
314
-
315
- li {
349
+ .result-item {
316
350
  cursor: pointer;
317
- grid-template-columns: 30px 1fr;
318
- grid-gap: 0 .5rem;
319
- }
320
-
321
- li img {
351
+ margin-top: 8px;
352
+ font-size: 12px;
353
+ padding: 5px;
354
+ border-radius: 4px;
322
355
  display: block;
323
356
  width: 100%;
357
+ /* Reset button styles */
358
+ background: none;
359
+ border: none;
360
+ text-align: left;
361
+ font-family: inherit;
362
+ transition: background-color 0.2s;
324
363
  }
325
364
 
326
- li h4 {
327
- grid-column: 2 / 3;
328
- padding: 0 0 2rem 0;
329
- margin: 0;
330
- font-weight: normal;
331
- }
332
-
333
- li p {
334
- grid-column: 2 / 3;
335
- padding: 0 0 1.5rem 0;
336
- margin: 0;
337
- font-size: 1.2rem;
365
+ .result-item:hover {
366
+ background-color: rgba(255, 255, 255, 0.1);
338
367
  }
339
368
 
340
369
  .loading {
@@ -354,7 +383,7 @@ export class IABookSearchResults extends LitElement {
354
383
  margin: 0 auto;
355
384
  }
356
385
  `;
357
- return [buttonCSS, mainCSS];
386
+ return [sharedStyles, buttonCSS, mainCSS];
358
387
  }
359
388
  }
360
389
  customElements.define('ia-book-search-results', IABookSearchResults);
@@ -0,0 +1,50 @@
1
+ // @ts-check
2
+ import { escapeHTML, escapeRegExp } from '../../BookReader/utils.js';
3
+ /** @typedef {import('@/src/plugins/search/plugin.search.js').SearchInsideResults} SearchInsideResults */
4
+ /** @typedef {import('@/src/plugins/search/plugin.search.js').LeafNum} LeafNum */
5
+ /** @typedef {import('@/src/plugins/search/plugin.search.js').PageNumString} PageNumString */
6
+
7
+ /**
8
+ * @param {string} match
9
+ * @param {string} preTag
10
+ * @param {string} postTag
11
+ * @returns {string}
12
+ */
13
+ export function renderMatch(match, preTag, postTag) {
14
+ // Search results are returned as a text blob with the hits wrapped in
15
+ // triple mustaches. Hits occasionally include text beyond the search
16
+ // term, so everything within the staches is captured and wrapped.
17
+ const preTagRe = escapeRegExp(escapeHTML(preTag));
18
+ const postTagRe = escapeRegExp(escapeHTML(postTag));
19
+ // [^] matches any character, including line breaks
20
+ const regex = new RegExp(`${preTagRe}([^]+?)${postTagRe}`, 'g');
21
+ return escapeHTML(match)
22
+ .replace(regex, '<mark>$1</mark>')
23
+ // Fix trailing hyphens. This over-corrects but is net useful.
24
+ .replace(/(\b)- /g, '$1');
25
+ }
26
+
27
+ /**
28
+ * Attach some fields to search inside results
29
+ * @param {SearchInsideResults} results
30
+ * @param {(pageNum: LeafNum) => PageNumString} displayPageNumberFn
31
+ * @param {string} preTag
32
+ * @param {string} postTag
33
+ * @param {string | null} bookLanguage The ISO 639-1 language code of the book
34
+ */
35
+ export function marshallSearchResults(results, displayPageNumberFn, preTag, postTag, bookLanguage) {
36
+ // Attach matchIndex to a few things to make it easier to identify
37
+ // an active/selected match
38
+
39
+ for (const [index, match] of results.matches.entries()) {
40
+ match.matchIndex = index;
41
+ match.displayPageNumber = displayPageNumberFn(match.par[0].page);
42
+ match.html = renderMatch(match.text, preTag, postTag);
43
+ match.lang = bookLanguage;
44
+ for (const par of match.par) {
45
+ for (const box of par.boxes) {
46
+ box.matchIndex = index;
47
+ }
48
+ }
49
+ }
50
+ }