@internetarchive/bookreader 5.0.0-3 → 5.0.0-30-d

Sign up to get free protection for your applications and to get access to all the features.
Files changed (391) hide show
  1. package/.eslintrc.js +17 -5
  2. package/.github/dependabot.yml +8 -0
  3. package/.github/workflows/node.js.yml +10 -1
  4. package/.husky/_/husky.sh +30 -0
  5. package/.testcaferc.js +10 -0
  6. package/BookReader/BookReader.css +75 -323
  7. package/BookReader/BookReader.js +32261 -2
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +15235 -0
  10. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  11. package/BookReader/icons/close-circle-dark.svg +1 -0
  12. package/BookReader/icons/voice.svg +1 -0
  13. package/BookReader/jquery-1.10.1.js +108 -2
  14. package/BookReader/plugins/plugin.archive_analytics.js +170 -1
  15. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  16. package/BookReader/plugins/plugin.autoplay.js +163 -1
  17. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  18. package/BookReader/plugins/plugin.chapters.js +333 -1
  19. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  20. package/BookReader/plugins/plugin.iframe.js +72 -1
  21. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  22. package/BookReader/plugins/plugin.mobile_nav.js +332 -1
  23. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  24. package/BookReader/plugins/plugin.resume.js +241 -1
  25. package/BookReader/plugins/plugin.resume.js.map +1 -1
  26. package/BookReader/plugins/plugin.search.js +1261 -1
  27. package/BookReader/plugins/plugin.search.js.map +1 -1
  28. package/BookReader/plugins/plugin.text_selection.js +839 -1
  29. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  30. package/BookReader/plugins/plugin.tts.js +9115 -2
  31. package/BookReader/plugins/plugin.tts.js.map +1 -1
  32. package/BookReader/plugins/plugin.url.js +811 -1
  33. package/BookReader/plugins/plugin.url.js.map +1 -1
  34. package/BookReader/plugins/plugin.vendor-fullscreen.js +326 -1
  35. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  36. package/BookReader/webcomponents-bundle.js +412 -0
  37. package/BookReader/webcomponents-bundle.js.map +1 -0
  38. package/BookReaderDemo/BookReaderDemo.css +14 -1
  39. package/BookReaderDemo/IADemoBr.js +107 -0
  40. package/BookReaderDemo/demo-advanced.html +1 -1
  41. package/BookReaderDemo/demo-autoplay.html +1 -0
  42. package/BookReaderDemo/demo-embed-iframe-src.html +1 -0
  43. package/BookReaderDemo/demo-fullscreen-mobile.html +1 -0
  44. package/BookReaderDemo/demo-fullscreen.html +1 -0
  45. package/BookReaderDemo/demo-iiif.html +1 -0
  46. package/BookReaderDemo/demo-internetarchive.html +66 -18
  47. package/BookReaderDemo/demo-multiple.html +1 -0
  48. package/BookReaderDemo/demo-preview-pages.html +1 -0
  49. package/BookReaderDemo/demo-simple.html +1 -0
  50. package/BookReaderDemo/demo-vendor-fullscreen.html +1 -0
  51. package/BookReaderDemo/immersion-1up.html +1 -0
  52. package/BookReaderDemo/immersion-mode.html +1 -0
  53. package/BookReaderDemo/toggle_controls.html +1 -0
  54. package/BookReaderDemo/view_mode.html +1 -0
  55. package/BookReaderDemo/viewmode-cycle.html +1 -2
  56. package/CHANGELOG.md +114 -0
  57. package/babel.config.js +18 -0
  58. package/index.html +3 -0
  59. package/jsconfig.json +19 -0
  60. package/package.json +45 -27
  61. package/src/BookNavigator/assets/button-base.js +8 -1
  62. package/src/BookNavigator/assets/ia-logo.js +17 -0
  63. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  64. package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
  65. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  66. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  67. package/src/BookNavigator/book-navigator.js +528 -0
  68. package/src/BookNavigator/bookmarks/bookmark-button.js +2 -1
  69. package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -1
  70. package/src/BookNavigator/bookmarks/bookmarks-list.js +1 -0
  71. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +4 -9
  72. package/src/BookNavigator/bookmarks/bookmarks-provider.js +32 -11
  73. package/src/BookNavigator/bookmarks/ia-bookmarks.js +88 -43
  74. package/src/BookNavigator/downloads/downloads-provider.js +22 -16
  75. package/src/BookNavigator/downloads/downloads.js +16 -23
  76. package/src/BookNavigator/search/a-search-result.js +1 -0
  77. package/src/BookNavigator/search/search-provider.js +54 -20
  78. package/src/BookNavigator/search/search-results.js +7 -18
  79. package/src/BookNavigator/sharing.js +27 -0
  80. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +10 -12
  81. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +1 -0
  82. package/src/BookNavigator/volumes/volumes-provider.js +114 -0
  83. package/src/BookNavigator/volumes/volumes.js +189 -0
  84. package/src/BookReader/DebugConsole.js +3 -3
  85. package/src/BookReader/DragScrollable.js +233 -0
  86. package/src/BookReader/Mode1Up.js +50 -351
  87. package/src/BookReader/Mode1UpLit.js +434 -0
  88. package/src/BookReader/Mode2Up.js +94 -72
  89. package/src/BookReader/ModeSmoothZoom.js +177 -0
  90. package/src/BookReader/ModeThumb.js +16 -8
  91. package/src/BookReader/Navbar/Navbar.js +2 -31
  92. package/src/BookReader/PageContainer.js +47 -2
  93. package/src/BookReader/ReduceSet.js +1 -1
  94. package/src/BookReader/Toolbar/Toolbar.js +5 -5
  95. package/src/BookReader/options.js +10 -0
  96. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  97. package/src/BookReader/utils.js +68 -13
  98. package/src/BookReader.js +316 -232
  99. package/src/assets/icons/close-circle-dark.svg +1 -0
  100. package/src/assets/icons/voice.svg +1 -0
  101. package/src/css/BookReader.scss +0 -12
  102. package/src/css/_BRComponent.scss +1 -1
  103. package/src/css/_BRmain.scss +19 -24
  104. package/src/css/_BRnav.scss +4 -26
  105. package/src/css/_BRpages.scss +35 -0
  106. package/src/css/_BRsearch.scss +11 -215
  107. package/src/css/_TextSelection.scss +1 -17
  108. package/src/css/_controls.scss +16 -3
  109. package/src/css/_icons.scss +6 -0
  110. package/src/ia-bookreader/ia-bookreader.js +206 -0
  111. package/src/plugins/plugin.chapters.js +15 -18
  112. package/src/plugins/plugin.mobile_nav.js +11 -10
  113. package/src/plugins/plugin.resume.js +3 -3
  114. package/src/plugins/plugin.text_selection.js +17 -29
  115. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  116. package/src/plugins/search/plugin.search.js +113 -104
  117. package/src/plugins/search/view.js +48 -163
  118. package/src/plugins/tts/AbstractTTSEngine.js +7 -0
  119. package/src/plugins/tts/FestivalTTSEngine.js +2 -2
  120. package/src/plugins/tts/WebTTSEngine.js +5 -0
  121. package/src/plugins/tts/plugin.tts.js +67 -102
  122. package/src/plugins/url/UrlPlugin.js +184 -0
  123. package/src/plugins/url/plugin.url.js +220 -0
  124. package/{src → stat}/BookNavigator/BookModel.js +0 -0
  125. package/{src → stat}/BookNavigator/BookNavigator.js +151 -104
  126. package/stat/BookNavigator/assets/bookmark-colors.js +15 -0
  127. package/stat/BookNavigator/assets/button-base.js +61 -0
  128. package/stat/BookNavigator/assets/ia-logo.js +17 -0
  129. package/stat/BookNavigator/assets/icon_checkmark.js +6 -0
  130. package/stat/BookNavigator/assets/icon_close.js +3 -0
  131. package/stat/BookNavigator/assets/icon_sort_asc.js +5 -0
  132. package/stat/BookNavigator/assets/icon_sort_desc.js +5 -0
  133. package/stat/BookNavigator/assets/icon_sort_neutral.js +5 -0
  134. package/stat/BookNavigator/assets/icon_volumes.js +11 -0
  135. package/stat/BookNavigator/bookmarks/bookmark-button.js +64 -0
  136. package/stat/BookNavigator/bookmarks/bookmark-edit.js +215 -0
  137. package/stat/BookNavigator/bookmarks/bookmarks-list.js +285 -0
  138. package/stat/BookNavigator/bookmarks/bookmarks-loginCTA.js +28 -0
  139. package/stat/BookNavigator/bookmarks/bookmarks-provider.js +56 -0
  140. package/stat/BookNavigator/bookmarks/ia-bookmarks.js +523 -0
  141. package/{src → stat}/BookNavigator/br-fullscreen-mgr.js +1 -2
  142. package/stat/BookNavigator/delete-modal-actions.js +49 -0
  143. package/stat/BookNavigator/downloads/downloads-provider.js +72 -0
  144. package/stat/BookNavigator/downloads/downloads.js +139 -0
  145. package/stat/BookNavigator/provider-config.js +0 -0
  146. package/stat/BookNavigator/search/a-search-result.js +55 -0
  147. package/stat/BookNavigator/search/search-provider.js +180 -0
  148. package/stat/BookNavigator/search/search-results.js +360 -0
  149. package/stat/BookNavigator/sharing.js +31 -0
  150. package/stat/BookNavigator/visual-adjustments/visual-adjustments-provider.js +94 -0
  151. package/stat/BookNavigator/visual-adjustments/visual-adjustments.js +280 -0
  152. package/stat/BookNavigator/volumes/volumes-provider.js +83 -0
  153. package/stat/BookNavigator/volumes/volumes.js +178 -0
  154. package/stat/BookReader/BookModel.js +518 -0
  155. package/stat/BookReader/DebugConsole.js +54 -0
  156. package/stat/BookReader/DragScrollable.js +233 -0
  157. package/stat/BookReader/ImageCache.js +116 -0
  158. package/stat/BookReader/Mode1Up.js +102 -0
  159. package/stat/BookReader/Mode1UpLit.js +434 -0
  160. package/stat/BookReader/Mode2Up.js +1372 -0
  161. package/stat/BookReader/ModeSmoothZoom.js +177 -0
  162. package/stat/BookReader/ModeThumb.js +344 -0
  163. package/stat/BookReader/Navbar/Navbar.js +310 -0
  164. package/stat/BookReader/PageContainer.js +120 -0
  165. package/stat/BookReader/ReduceSet.js +26 -0
  166. package/stat/BookReader/Toolbar/Toolbar.js +384 -0
  167. package/stat/BookReader/events.js +20 -0
  168. package/stat/BookReader/options.js +324 -0
  169. package/stat/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  170. package/stat/BookReader/utils/classes.js +36 -0
  171. package/stat/BookReader/utils.js +240 -0
  172. package/stat/BookReader.js +2550 -0
  173. package/{src → stat}/BookReaderComponent/BookReaderComponent.js +16 -11
  174. package/stat/assets/icons/1up.svg +12 -0
  175. package/stat/assets/icons/2up.svg +15 -0
  176. package/stat/assets/icons/advance.svg +26 -0
  177. package/stat/assets/icons/chevron-right.svg +1 -0
  178. package/stat/assets/icons/close-circle-dark.svg +1 -0
  179. package/stat/assets/icons/close-circle.svg +1 -0
  180. package/stat/assets/icons/fullscreen.svg +17 -0
  181. package/stat/assets/icons/fullscreen_exit.svg +17 -0
  182. package/stat/assets/icons/hamburger.svg +15 -0
  183. package/stat/assets/icons/left-arrow.svg +12 -0
  184. package/stat/assets/icons/magnify-minus.svg +16 -0
  185. package/stat/assets/icons/magnify-plus.svg +17 -0
  186. package/stat/assets/icons/magnify.svg +15 -0
  187. package/stat/assets/icons/pause.svg +23 -0
  188. package/stat/assets/icons/play.svg +22 -0
  189. package/stat/assets/icons/playback-speed.svg +34 -0
  190. package/stat/assets/icons/read-aloud.svg +22 -0
  191. package/stat/assets/icons/review.svg +22 -0
  192. package/stat/assets/icons/thumbnails.svg +17 -0
  193. package/stat/assets/icons/voice.svg +1 -0
  194. package/stat/assets/icons/volume-full.svg +22 -0
  195. package/stat/assets/images/BRicons.png +0 -0
  196. package/stat/assets/images/BRicons.svg +94 -0
  197. package/stat/assets/images/BRicons_ia.png +0 -0
  198. package/stat/assets/images/back_pages.png +0 -0
  199. package/stat/assets/images/book_bottom_icon.png +0 -0
  200. package/stat/assets/images/book_down_icon.png +0 -0
  201. package/stat/assets/images/book_left_icon.png +0 -0
  202. package/stat/assets/images/book_leftmost_icon.png +0 -0
  203. package/stat/assets/images/book_right_icon.png +0 -0
  204. package/stat/assets/images/book_rightmost_icon.png +0 -0
  205. package/stat/assets/images/book_top_icon.png +0 -0
  206. package/stat/assets/images/book_up_icon.png +0 -0
  207. package/stat/assets/images/books_graphic.svg +177 -0
  208. package/stat/assets/images/booksplit.png +0 -0
  209. package/stat/assets/images/control_pause_icon.png +0 -0
  210. package/stat/assets/images/control_play_icon.png +0 -0
  211. package/stat/assets/images/embed_icon.png +0 -0
  212. package/stat/assets/images/icon-home-ia.png +0 -0
  213. package/stat/assets/images/icon_OL-logo-xs.png +0 -0
  214. package/stat/assets/images/icon_alert-xs.png +0 -0
  215. package/stat/assets/images/icon_book.svg +12 -0
  216. package/stat/assets/images/icon_bookmark.svg +12 -0
  217. package/stat/assets/images/icon_close-pop.png +0 -0
  218. package/stat/assets/images/icon_download.png +0 -0
  219. package/stat/assets/images/icon_gear.svg +14 -0
  220. package/stat/assets/images/icon_hamburger.svg +20 -0
  221. package/stat/assets/images/icon_home.png +0 -0
  222. package/stat/assets/images/icon_home.svg +21 -0
  223. package/stat/assets/images/icon_home_ia.png +0 -0
  224. package/stat/assets/images/icon_indicator.png +0 -0
  225. package/stat/assets/images/icon_info.svg +11 -0
  226. package/stat/assets/images/icon_one_page.svg +8 -0
  227. package/stat/assets/images/icon_pause.svg +1 -0
  228. package/stat/assets/images/icon_play.svg +1 -0
  229. package/stat/assets/images/icon_playback-rate.svg +15 -0
  230. package/stat/assets/images/icon_return.png +0 -0
  231. package/stat/assets/images/icon_search_button.svg +8 -0
  232. package/stat/assets/images/icon_share.svg +9 -0
  233. package/stat/assets/images/icon_skip-ahead.svg +6 -0
  234. package/stat/assets/images/icon_skip-back.svg +13 -0
  235. package/stat/assets/images/icon_speaker.svg +18 -0
  236. package/stat/assets/images/icon_speaker_open.svg +10 -0
  237. package/stat/assets/images/icon_thumbnails.svg +12 -0
  238. package/stat/assets/images/icon_toc.svg +5 -0
  239. package/stat/assets/images/icon_two_pages.svg +9 -0
  240. package/stat/assets/images/icon_zoomer.png +0 -0
  241. package/stat/assets/images/loading.gif +0 -0
  242. package/stat/assets/images/logo_icon.png +0 -0
  243. package/stat/assets/images/marker_chap-off.png +0 -0
  244. package/stat/assets/images/marker_chap-off.svg +11 -0
  245. package/stat/assets/images/marker_chap-off_ia.png +0 -0
  246. package/stat/assets/images/marker_chap-on.png +0 -0
  247. package/stat/assets/images/marker_chap-on.svg +11 -0
  248. package/stat/assets/images/marker_srch-on.svg +11 -0
  249. package/stat/assets/images/marker_srchchap-off.png +0 -0
  250. package/stat/assets/images/marker_srchchap-on.png +0 -0
  251. package/stat/assets/images/nav_control-dn.png +0 -0
  252. package/stat/assets/images/nav_control-dn_ia.png +0 -0
  253. package/stat/assets/images/nav_control-up.png +0 -0
  254. package/stat/assets/images/nav_control-up_ia.png +0 -0
  255. package/stat/assets/images/nav_control.png +0 -0
  256. package/stat/assets/images/one_page_mode_icon.png +0 -0
  257. package/stat/assets/images/paper-badge.png +0 -0
  258. package/stat/assets/images/print_icon.png +0 -0
  259. package/stat/assets/images/progressbar.gif +0 -0
  260. package/stat/assets/images/right_edges.png +0 -0
  261. package/stat/assets/images/slider.png +0 -0
  262. package/stat/assets/images/slider_ia.png +0 -0
  263. package/stat/assets/images/thumbnail_mode_icon.png +0 -0
  264. package/stat/assets/images/transparent.png +0 -0
  265. package/stat/assets/images/two_page_mode_icon.png +0 -0
  266. package/stat/assets/images/zoom_in_icon.png +0 -0
  267. package/stat/assets/images/zoom_out_icon.png +0 -0
  268. package/stat/css/BookReader.scss +89 -0
  269. package/stat/css/_BRBookmarks.scss +29 -0
  270. package/stat/css/_BRComponent.scss +13 -0
  271. package/stat/css/_BRfloat.scss +197 -0
  272. package/stat/css/_BRicon.scss +48 -0
  273. package/stat/css/_BRmain.scss +251 -0
  274. package/stat/css/_BRnav.scss +359 -0
  275. package/stat/css/_BRpages.scss +139 -0
  276. package/stat/css/_BRsearch.scss +226 -0
  277. package/stat/css/_BRtoolbar.scss +84 -0
  278. package/stat/css/_BRvendor.scss +5 -0
  279. package/stat/css/_MobileNav.scss +194 -0
  280. package/stat/css/_TextSelection.scss +32 -0
  281. package/stat/css/_colorbox.scss +52 -0
  282. package/stat/css/_controls.scss +253 -0
  283. package/stat/css/_icons.scss +121 -0
  284. package/stat/jquery-wrapper.js +4 -0
  285. package/stat/plugins/plugin.archive_analytics.js +86 -0
  286. package/stat/plugins/plugin.autoplay.js +129 -0
  287. package/stat/plugins/plugin.chapters.js +248 -0
  288. package/stat/plugins/plugin.iframe.js +48 -0
  289. package/stat/plugins/plugin.mobile_nav.js +288 -0
  290. package/stat/plugins/plugin.resume.js +68 -0
  291. package/stat/plugins/plugin.text_selection.js +291 -0
  292. package/{src → stat}/plugins/plugin.url.js +4 -4
  293. package/stat/plugins/plugin.vendor-fullscreen.js +247 -0
  294. package/stat/plugins/search/plugin.search.js +439 -0
  295. package/stat/plugins/search/view.js +439 -0
  296. package/stat/plugins/tts/AbstractTTSEngine.js +249 -0
  297. package/stat/plugins/tts/FestivalTTSEngine.js +169 -0
  298. package/stat/plugins/tts/PageChunk.js +107 -0
  299. package/stat/plugins/tts/PageChunkIterator.js +163 -0
  300. package/stat/plugins/tts/WebTTSEngine.js +357 -0
  301. package/stat/plugins/tts/plugin.tts.js +357 -0
  302. package/stat/plugins/tts/tooltip_dict.js +15 -0
  303. package/stat/plugins/tts/utils.js +91 -0
  304. package/stat/util/browserSniffing.js +30 -0
  305. package/stat/util/debouncer.js +26 -0
  306. package/stat/util/docCookies.js +67 -0
  307. package/stat/util/strings.js +34 -0
  308. package/tests/e2e/README.md +37 -0
  309. package/tests/e2e/autoplay.test.js +2 -2
  310. package/tests/e2e/base.test.js +5 -7
  311. package/tests/e2e/helpers/base.js +8 -3
  312. package/tests/e2e/helpers/debug.js +1 -1
  313. package/tests/e2e/helpers/desktopSearch.js +1 -1
  314. package/tests/e2e/helpers/mobileSearch.js +3 -3
  315. package/tests/e2e/helpers/params.js +17 -0
  316. package/tests/e2e/rightToLeft.test.js +4 -5
  317. package/tests/e2e/viewmode.test.js +30 -31
  318. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +3 -3
  319. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +176 -0
  320. package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
  321. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  322. package/tests/jest/BookReader/Mode1UpLit.test.js +87 -0
  323. package/tests/{BookReader → jest/BookReader}/Mode2Up.test.js +5 -7
  324. package/tests/jest/BookReader/ModeSmoothZoom.test.js +149 -0
  325. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  326. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +7 -7
  327. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +74 -2
  328. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  329. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  330. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  331. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  332. package/tests/jest/BookReader/utils.test.js +136 -0
  333. package/tests/jest/BookReader.keyboard.test.js +190 -0
  334. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  335. package/tests/{BookReader.test.js → jest/BookReader.test.js} +20 -4
  336. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  337. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +2 -2
  338. package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +8 -8
  339. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  340. package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
  341. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  342. package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +14 -24
  343. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  344. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +12 -5
  345. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +6 -6
  346. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +3 -3
  347. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  348. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  349. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  350. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +1 -1
  351. package/tests/{plugins → jest/plugins}/tts/utils.test.js +3 -3
  352. package/tests/jest/plugins/url/UrlPlugin.test.js +175 -0
  353. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +33 -14
  354. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  355. package/tests/{util → jest/util}/docCookies.test.js +1 -1
  356. package/tests/{util → jest/util}/strings.test.js +1 -1
  357. package/tests/{utils.js → jest/utils.js} +38 -0
  358. package/tests/karma/BookNavigator/book-navigator.test.js +485 -0
  359. package/tests/karma/BookNavigator/bookmarks/bookmark-button.test.js +44 -0
  360. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +1 -3
  361. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +1 -2
  362. package/tests/karma/BookNavigator/downloads/downloads-provider.test.js +67 -0
  363. package/tests/karma/BookNavigator/downloads/downloads.test.js +54 -0
  364. package/tests/karma/BookNavigator/search/search-provider.test.js +123 -0
  365. package/tests/karma/BookNavigator/{search-results.test.js → search/search-results.test.js} +1 -4
  366. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +49 -0
  367. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -2
  368. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +184 -0
  369. package/tests/karma/BookNavigator/volumes/volumes.test.js +98 -0
  370. package/webpack.config.js +11 -5
  371. package/.babelrc +0 -12
  372. package/.dependabot/config.yml +0 -6
  373. package/.testcaferc.json +0 -5
  374. package/BookReader/BookReader.js.LICENSE.txt +0 -72
  375. package/BookReader/bookreader-component-bundle.js +0 -1450
  376. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  377. package/BookReader/bookreader-component-bundle.js.map +0 -1
  378. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  379. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  380. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  381. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +0 -27
  382. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  383. package/src/BookNavigator/assets/book-loader.js +0 -27
  384. package/src/ItemNavigator/ItemNavigator.js +0 -372
  385. package/src/ItemNavigator/providers/sharing.js +0 -29
  386. package/src/dragscrollable-br.js +0 -261
  387. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  388. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  389. package/tests/BookReader/Mode1Up.test.js +0 -164
  390. package/tests/BookReader/utils.test.js +0 -109
  391. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
@@ -1,2 +1,1262 @@
1
- (self.webpackChunk_internetarchive_bookreader=self.webpackChunk_internetarchive_bookreader||[]).push([[73],{8011:function(e,t,a){"use strict";a(5666),a(4916),a(4765),a(9826),a(5306),a(2222),a(9601),a(4747),a(1539),a(8674),a(6992),a(8783),a(3948),a(285),a(7042),a(8309),a(1038),a(2526),a(1817),a(2165),a(4603),a(9714),a(1249),a(9600);var r=a(3609);function n(e,t){for(var a=0;a<t.length;a++){var r=t[a];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var s,i=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),t.selector?(this.br=t.br,this.matcher=new RegExp("{{{(.+?)}}}","g"),this.matches=[],this.cacheDOMElements(t.selector),this.bindEvents()):console.warn("BookReader::Search - SearchView must be passed a valid CSS selector")}var t,a;return t=e,(a=[{key:"cacheDOMElements",value:function(e){this.dom={},this.dom.searchTray=this.renderSearchTray(e),this.dom.results=this.dom.searchTray.querySelector('[data-id="results"]'),this.dom.resultsCount=this.dom.searchTray.querySelector('[data-id="results_count"]'),this.dom.searchField=this.dom.searchTray.querySelector('[name="query"]'),this.dom.searchPending=this.dom.searchTray.querySelector('[data-id="searchPending"]'),this.dom.mobileSearch=this.buildMobileDrawer(),this.dom.toolbarSearch=this.buildToolbarSearch()}},{key:"toggleSearchTray",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.dom.searchTray.classList.contains("hidden");this.dom.searchTray.classList.toggle("hidden",!e)}},{key:"toggleResultsCount",value:function(e){this.dom.resultsCount.classList.toggle("visible",e)}},{key:"updateResultsCount",value:function(e){this.dom.resultsCount.innerText="(".concat(e," result").concat(1!=e?"s":"",")"),this.toggleResultsCount(!0)}},{key:"setQuery",value:function(e){this.br.$('[name="query"]').val(e)}},{key:"emptyMatches",value:function(){this.dom.results.innerHTML="",this.matches=[]}},{key:"removeResultPins",value:function(){this.br.$(".BRnavpos .BRsearch").remove()}},{key:"clearSearchFieldAndResults",value:function(){this.br.removeSearchResults(),this.toggleResultsCount(!1),this.removeResultPins(),this.emptyMatches(),this.setQuery(""),this.teardownSearchNavigation(),this.br.trigger("SearchResultsCleared")}},{key:"toggleSidebar",value:function(){this.br.trigger("ToggleSearchMenu")}},{key:"renderSearchTray",value:function(e){var t=document.createElement("div");return t.setAttribute("id",e.replace(/^#/,"")),t.innerHTML='\n <header>\n <div>\n <h3>Search inside</h3>\n <p data-id="results_count"></p>\n </div>\n <a href="#" class="close"></a>\n </header>\n <form action="" method="get">\n <fieldset>\n <input name="all_files" id="all_files" type="checkbox" />\n <label class="checkbox" for="all_files">Search all files</label>\n <input type="search" name="query" placeholder="Enter a search term" />\n </fieldset>\n </form>\n <div data-id="searchPending" id="search_pending">\n <p>Your search results will appear below</p>\n <div class="loader tc mt20"></div>\n </div>\n <ul data-id="results"></ul>\n ',t}},{key:"renderSearchNavigation",value:function(){var e="BRsearch-navigation";r(".BRnav").before('\n <div class="'.concat(e,'">\n <button class="toggle-sidebar">\n <h4>\n <span class="icon icon-search"></span> Results\n </h4>\n </button>\n <div class="pagination">\n <button class="prev" title="Previous result"><span class="icon icon-chevron hflip"></span></button>\n <span data-id="resultsCount">').concat(this.resultsPosition(),'</span>\n <button class="next" title="Next result"><span class="icon icon-chevron"></button>\n </div>\n <button class="clear" title="Clear search results">\n <span class="icon icon-close"></span>\n </button>\n </div>\n ')),this.dom.searchNavigation=r(".".concat(e))}},{key:"resultsPosition",value:function(){var e="".concat(this.matches.length," result").concat(1===this.matches.length?"":"s");return~this.currentMatchIndex&&(e="".concat(this.currentMatchIndex+1," / ").concat(this.matches.length)),e}},{key:"bindSearchNavigationEvents",value:function(){if(this.dom.searchNavigation){var e="searchNavigation";this.dom.searchNavigation.on("click.".concat(e),".clear",this.clearSearchFieldAndResults.bind(this)).on("click.".concat(e),".prev",this.showPrevResult.bind(this)).on("click.".concat(e),".next",this.showNextResult.bind(this)).on("click.".concat(e),".toggle-sidebar",this.toggleSidebar.bind(this)).on("click.".concat(e),!1)}}},{key:"showPrevResult",value:function(){0!==this.currentMatchIndex&&(this.br.mode===this.br.constModeThumb&&this.br.switchMode(this.br.constMode1up),~this.currentMatchIndex||(this.currentMatchIndex=this.getClosestMatchIndex((function(e,t,a){return t[0]>a}))+1),this.br.$(".BRnavline .BRsearch").eq(--this.currentMatchIndex).click(),this.updateResultsPosition(),this.updateSearchNavigationButtons())}},{key:"showNextResult",value:function(){this.currentMatchIndex+1!==this.matches.length&&(this.br.mode===this.br.constModeThumb&&this.br.switchMode(this.br.constMode1up),~this.currentMatchIndex||(this.currentMatchIndex=this.getClosestMatchIndex((function(e,t,a){return e[e.length-1]>a}))-1),this.br.$(".BRnavline .BRsearch").eq(++this.currentMatchIndex).click(),this.updateResultsPosition(),this.updateSearchNavigationButtons())}},{key:"getClosestMatchIndex",value:function(e){var t=function t(a,r){if(1===a.length)return a[0];var n=a.slice(0,a.length/2),s=a.slice(a.length/2);return t(e(n,s,r)?n:s,r)}(this.matches.map((function(e){return e.par[0].page})),this.br.currentIndex()+1);return this.matches.indexOf(this.matches.find((function(e){return e.par[0].page===t})))}},{key:"updateResultsPosition",value:function(){this.dom.searchNavigation.find("[data-id=resultsCount]").text(this.resultsPosition())}},{key:"updateSearchNavigationButtons",value:function(){this.dom.searchNavigation.find(".prev").attr("disabled",!this.currentMatchIndex),this.dom.searchNavigation.find(".next").attr("disabled",this.currentMatchIndex+1===this.matches.length)}},{key:"teardownSearchNavigation",value:function(){this.dom.searchNavigation||(this.dom.searchNavigation=r(".BRsearch-navigation")),this.dom.searchNavigation.length&&(this.dom.searchNavigation.off(".searchNavigation").remove(),this.dom.searchNavigation=null,this.br.resize())}},{key:"setCurrentMatchIndex",value:function(){var e;this.br.mode!==this.br.constModeThumb?(e=this.br.mode===this.br.constMode2up?this.find2upMatchingSearchResult():this.find1upMatchingSearchResult(),this.currentMatchIndex=this.matches.indexOf(e)):this.currentMatchIndex=-1}},{key:"find1upMatchingSearchResult",value:function(){var e=this;return this.matches.find((function(t){return e.br.currentIndex()===t.par[0].page-1}))}},{key:"find2upMatchingSearchResult",value:function(){var e=this;return this.matches.find((function(t){return e.br._isIndexDisplayed(t.par[0].page-1)}))}},{key:"updateSearchNavigation",value:function(){this.matches.length&&(this.setCurrentMatchIndex(),this.updateResultsPosition(),this.updateSearchNavigationButtons())}},{key:"renderMatches",value:function(e){var t=this,a=e.map((function(e){return'\n <li data-page="'.concat(e.par[0].page,'" data-page-index="').concat(t.br.leafNumToIndex(e.par[0].page),'">\n <h4>Page ').concat(e.par[0].page,"</h4>\n <p>").concat(e.text.replace(t.matcher,"<mark>$1</mark>"),"</p>\n </li>\n ")}));this.dom.results.innerHTML=a.join("")}},{key:"togglePinsFor",value:function(e){var t=e?"visible":"hidden";this.br.refs.$BRfooter.find(".BRsearch").css({visibility:t})}},{key:"buildMobileDrawer",value:function(){var e=document.createElement("li");return e.innerHTML='\n <span>\n <span class="DrawerIconWrapper">\n <img class="DrawerIcon" src="'.concat(this.br.imagesBaseURL,'icon_search_button.svg" />\n </span>\n Search\n </span>\n <div data-id="search_slot">\n </div>\n '),e.querySelector('[data-id="search_slot"]').appendChild(this.dom.searchTray),e.classList.add("BRmobileMenu__search"),e}},{key:"buildToolbarSearch",value:function(){var e=document.createElement("span");return e.classList.add("BRtoolbarSection","BRtoolbarSectionSearch"),e.innerHTML='\n <form class="BRbooksearch desktop">\n <input type="search" name="query" class="BRsearchInput" value="" placeholder="Search inside"/>\n <button type="submit" class="BRsearchSubmit">\n <img src="'.concat(this.br.imagesBaseURL,'icon_search_button.svg" />\n </button>\n </form>\n '),e}},{key:"renderPins",value:function(e){var t=this;e.forEach((function(e){var a=e.text,n=t.br.leafNumToIndex(e.par[0].page),s=t.br.getPageNum(n),i=t.br.constructor.util.cssPercentage(n,t.br.getNumLeafs()-1),o=a.replace(t.matcher,"<b>$1</b>"),c="";a.length>100&&(c=a.replace(/^(.{100}[^\s]*).*/,"$1").replace(t.matcher,"<b>$1</b>")+"..."),r("<div>").addClass("BRsearch").css({left:i}).attr("title","Search result").append('\n <div class="BRquery">\n <div>'.concat(c||o,"</div>\n <div>").concat("Page"," ").concat(s,"</div>\n </div>\n ")).data({pageIndex:n}).appendTo(t.br.$(".BRnavline")).hover((function(e){var t=e.currentTarget,a=t.querySelector(".BRquery"),n=a.getBoundingClientRect(),s=t.getBoundingClientRect(),i=2*parseInt(getComputedStyle(a).paddingLeft);n.x-i<0&&a.style.setProperty("transform","translateX(-".concat(s.left-i,"px)")),r(".BRsearch,.BRchapter").removeClass("front"),r(e.target).addClass("front")}),(function(e){return r(e.target).removeClass("front")})).click(function(e){this.br._searchPluginGoToResult(+r(e.target).data("pageIndex")),this.br.updateSearchHilites()}.bind(t))}))}},{key:"toggleSearchPending",value:function(e){this.dom.searchPending.classList.toggle("visible",e),e?this.br.showProgressPopup("Search results will appear below..."):this.br.removeProgressPopup()}},{key:"renderErrorModal",value:function(){this.renderModalMessage("\n Sorry, there was an error with your search.\n <br />\n The text may still be processing.\n "),this.delayModalRemovalFor(4e3)}},{key:"renderBookNotIndexedModal",value:function(){this.renderModalMessage("\n <p>\n This book hasn't been indexed for searching yet.\n We've just started indexing it, so search should be available soon.\n <br />\n Please try again later. Thanks!\n </p>\n "),this.delayModalRemovalFor(5e3)}},{key:"renderResultsEmptyModal",value:function(){this.renderModalMessage("No matches were found."),this.delayModalRemovalFor(2e3)}},{key:"renderModalMessage",value:function(e){var t=document.createElement("div");t.classList.add("BRprogresspopup","search_modal"),t.innerHTML=e,document.querySelector(this.br.el).append(t)}},{key:"delayModalRemovalFor",value:function(e){setTimeout(this.br.removeProgressPopup.bind(this.br),e)}},{key:"openMobileMenu",value:function(){this.br.refs.$mmenu.data("mmenu").open()}},{key:"closeMobileMenu",value:function(){this.br.refs.$mmenu.data("mmenu").close()}},{key:"submitHandler",value:function(e){e.preventDefault();var t=e.target.querySelector('[name="query"]').value;return!!t.length&&(this.br.search(t),this.dom.searchField.blur(),this.emptyMatches(),this.toggleSearchPending(!0),!1)}},{key:"handleSearchCallback",value:function(e,t){var a=this,n=t.results,s=t.options;this.matches=n.matches,this.setCurrentMatchIndex(),this.teardownSearchNavigation(),this.renderSearchNavigation(),this.bindSearchNavigationEvents(),this.renderMatches(n.matches),this.renderPins(n.matches),this.updateResultsCount(n.matches.length),this.toggleSearchPending(!1),s.goToFirstResult?r(document).one("BookReader:pageChanged",(function(){a.br.resize()})):this.br.resize()}},{key:"handleNavToggledCallback",value:function(e){var t=this.br.navigationIsVisible();this.togglePinsFor(t),this.toggleSearchTray(!!t&&!!this.dom.results.querySelector("li"))}},{key:"handleSearchStarted",value:function(){this.emptyMatches(),this.br.removeSearchHilites(),this.removeResultPins(),this.toggleSearchPending(!0),this.teardownSearchNavigation(),this.setQuery(this.br.searchTerm)}},{key:"handleSearchCallbackError",value:function(){this.toggleSearchPending(!1),this.renderErrorModal()}},{key:"handleSearchCallbackBookNotIndexed",value:function(){this.toggleSearchPending(!1),this.renderBookNotIndexedModal()}},{key:"handleSearchCallbackEmpty",value:function(){this.toggleSearchPending(!1),this.renderResultsEmptyModal()}},{key:"bindEvents",value:function(){var e=this,t="BookReader:";r(document).on("".concat(t,"SearchCallback"),this.handleSearchCallback.bind(this)).on("".concat(t,"navToggled"),this.handleNavToggledCallback.bind(this)).on("".concat(t,"SearchStarted"),this.handleSearchStarted.bind(this)).on("".concat(t,"SearchCallbackError"),this.handleSearchCallbackError.bind(this)).on("".concat(t,"SearchCallbackBookNotIndexed"),this.handleSearchCallbackBookNotIndexed.bind(this)).on("".concat(t,"SearchCallbackEmpty"),this.handleSearchCallbackEmpty.bind(this)).on("".concat(t,"pageChanged"),this.updateSearchNavigation.bind(this)),this.dom.searchTray.addEventListener("submit",this.submitHandler.bind(this)),this.dom.toolbarSearch.querySelector("form").addEventListener("submit",this.submitHandler.bind(this)),this.dom.searchField.addEventListener("search",(function(){e.dom.searchField.value||e.clearSearchFieldAndResults()})),r(this.dom.results).on("click","li",(function(t){e.br._searchPluginGoToResult(+t.currentTarget.dataset.pageIndex),e.br.updateSearchHilites(),e.closeMobileMenu()}))}}])&&n(t.prototype,a),e}(),o=a(3609),c=a(3609);function h(e,t){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!a){if(Array.isArray(e)||(a=function(e,t){if(e){if("string"==typeof e)return l(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?l(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){a&&(e=a);var r=0,n=function(){};return{s:n,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,i=!0,o=!1;return{s:function(){a=a.call(e)},n:function(){var e=a.next();return i=e.done,e},e:function(e){o=!0,s=e},f:function(){try{i||null==a.return||a.return()}finally{if(o)throw s}}}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=new Array(t);a<t;a++)r[a]=e[a];return r}function u(e,t,a,r,n,s,i){try{var o=e[s](i),c=o.value}catch(e){return void a(e)}o.done?t(c):Promise.resolve(c).then(r,n)}o.extend(BookReader.defaultOptions,{server:"ia600609.us.archive.org",bookId:"",subPrefix:"",bookPath:"",enableSearch:!0,searchInsideUrl:"/fulltext/inside.php",initialSearchTerm:null}),BookReader.prototype.setup=(s=BookReader.prototype.setup,function(e){s.call(this,e),this.searchTerm="",this.searchResults=null,this.searchInsideUrl=e.searchInsideUrl,this.enableSearch=e.enableSearch,this.goToFirstResult=!1,this.bookId=e.bookId,this.server=e.server,this.subPrefix=e.subPrefix,this.bookPath=e.bookPath,this.searchView||(this.searchView=new i({br:this,selector:"#BRsearch_tray"}))}),BookReader.prototype.init=function(e){return function(){e.call(this),this.options.enableSearch&&this.options.initialSearchTerm&&this.search(this.options.initialSearchTerm,{goToFirstResult:this.goToFirstResult,suppressFragmentChange:!0})}}(BookReader.prototype.init),BookReader.prototype.buildMobileDrawerElement=function(e){return function(){var t=e.call(this);if(this.enableSearch)return this.searchView.dom.mobileSearch&&t.find(".BRmobileMenu__moreInfoRow").after(this.searchView.dom.mobileSearch),t}}(BookReader.prototype.buildMobileDrawerElement),BookReader.prototype.buildToolbarElement=function(e){return function(){var t=e.call(this);if(this.enableSearch)return this.searchView.dom.toolbarSearch&&t.find(".BRtoolbarSectionInfo").after(this.searchView.dom.toolbarSearch),t}}(BookReader.prototype.buildToolbarElement),BookReader.prototype.search=function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={goToFirstResult:!1,disablePopup:!1,suppressFragmentChange:!1,error:null,success:null},n=o.extend({},r,a);this.suppressFragmentChange=n.suppressFragmentChange,this.searchTerm=t.replace(/\//g," "),n.suppressFragmentChange||this.trigger(BookReader.eventNames.fragmentChange);var s=this.server.replace(/:.+/,""),i="https://".concat(s).concat(this.searchInsideUrl,"?"),h=this.bookPath,l="/".concat(this.subPrefix);this.bookPath.length-this.bookPath.lastIndexOf(l)==l.length&&(h=this.bookPath.substr(0,this.bookPath.length-l.length));var u={item_id:this.bookId,doc:this.subPrefix,path:h,q:t},d=c.param(u).replace(/%2F/g,"/"),p="".concat(i).concat(d),g=function(t){var a=t.error||!t.matches.length,r="function"==typeof n.error,s="function"==typeof n.success;a?r?n.error.call(e,t,n):e.BRSearchCallbackError(t,n):s?n.success.call(e,t,n):e.BRSearchCallback(t,n)};return this.trigger("SearchStarted",{term:this.searchTerm}),c.ajax({url:p,dataType:"jsonp"}).then(g)},BookReader.prototype.BRSearchCallback=function(e,t){this.searchResults=e,this.updateSearchHilites(),this.removeProgressPopup(),t.goToFirstResult&&this._searchPluginGoToResult(e.matches[0].par[0].page),this.trigger("SearchCallback",{results:e,options:t,instance:this})},BookReader.prototype.BRSearchCallbackError=function(e){this._BRSearchCallbackError(e)},BookReader.prototype._BRSearchCallbackError=function(e){this.searchResults=e;var t={term:this.searchTerm,instance:this};if(e.error){var a=Object.assign({},t,{results:e});this.trigger("SearchCallbackError",a)}else if(0==e.matches.length){if(!1===e.indexed)return void this.trigger("SearchCallbackBookNotIndexed",t);this.trigger("SearchCallbackEmpty",t)}},BookReader.prototype.updateSearchHilites=function(){this.constMode2up!=this.mode?this.updateSearchHilites1UP():this.updateSearchHilites2UP()},BookReader.prototype.updateSearchHilites1UP=function(){var e=this,t=this.searchResults;null!=t&&t.matches.forEach((function(t){t.par[0].boxes.forEach((function(t){var a=e.leafNumToIndex(t.page);if(o.inArray(a,e.displayedIndices)>=0){t.div||(t.div=document.createElement("div"),c(t.div).prop("className","BookReaderSearchHilite").appendTo(e.$(".pagediv".concat(a))));var r=e._models.book.getPage(a),n={width:e._modes.mode1Up.physicalInchesToDisplayPixels((t.r-t.l)/r.ppi),height:e._modes.mode1Up.physicalInchesToDisplayPixels((t.b-t.t)/r.ppi),left:e._modes.mode1Up.physicalInchesToDisplayPixels(t.l/r.ppi),top:e._modes.mode1Up.physicalInchesToDisplayPixels(t.t/r.ppi)};c(t.div).css(n)}else t.div&&(c(t.div).remove(),t.div=null)}))}))},BookReader.prototype.updateSearchHilites2UP=function(){var e=this,t=this.searchResults;null!==t&&t.matches.forEach((function(t){t.par[0].boxes.forEach((function(a){var r=e.leafNumToIndex(t.par[0].page),n=o.inArray(r,e.displayedIndices)>=0,s=e._models.book.getPage(r).isViewable;n&&s?(a.div||(a.div=document.createElement("div"),c(a.div).addClass("BookReaderSearchHilite").appendTo(e.refs.$brTwoPageView)),e.setHilightCss2UP(a.div,r,a.l,a.r,a.t,a.b)):a.div&&(c(a.div).remove(),a.div=null)}))}))},BookReader.prototype.removeSearchHilites=function(){var e=this.searchResults;null!=e&&e.matches&&e.matches.forEach((function(e){e.par[0].boxes.forEach((function(e){null!=e.div&&(c(e.div).remove(),e.div=null)}))}))},BookReader.prototype._searchPluginGoToResult=function(){var e,t=(e=regeneratorRuntime.mark((function e(t){var a,r,n,s,i,o,c;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=this._models.book,r=a.getPage(t),n=!1,r.isViewable){e.next=10;break}return e.next=6,fetch("/services/bookreader/request_page?"+new URLSearchParams({id:this.options.bookId,subprefix:this.options.subPrefix,leafNum:r.leafNum})).then((function(e){return e.json()}));case 6:s=e.sent,i=h(s.value);try{for(i.s();!(o=i.n()).done;)c=o.value,a.getPage(a.leafNumToIndex(c)).makeViewable()}catch(e){i.e(e)}finally{i.f()}s.value.length||(a.getPage(t).makeViewable(),n=!0);case 10:this.suppressFragmentChange=!1,this.jumpToIndex(t),n&&a.getPage(t).makeViewable(!1);case 13:case"end":return e.stop()}}),e,this)})),function(){var t=this,a=arguments;return new Promise((function(r,n){var s=e.apply(t,a);function i(e){u(s,r,n,i,o,"next",e)}function o(e){u(s,r,n,i,o,"throw",e)}i(void 0)}))});return function(e){return t.apply(this,arguments)}}(),BookReader.prototype.removeSearchResults=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.removeSearchHilites(),this.searchTerm=null,this.searchResults=null,e||this.trigger(BookReader.eventNames.fragmentChange)},BookReader.prototype.searchHighlightVisible=function(){var e=this,t=this.searchResults,a=[];if(null==t)return!1;if(this.constMode2up==this.mode)a=[this.twoPage.currentIndexL,this.twoPage.currentIndexR];else{if(this.constMode1up!=this.mode)return!1;a=[this.currentIndex()]}return t.matches.some((function(t){return t.par[0].boxes.some((function(t){var r=e.leafNumToIndex(t.page);if(o.inArray(r,a)>=0)return!0}))})),!1}},9587:function(e,t,a){var r=a(111),n=a(7674);e.exports=function(e,t,a){var s,i;return n&&"function"==typeof(s=t.constructor)&&s!==a&&r(i=s.prototype)&&i!==a.prototype&&n(e,i),e}},9601:function(e,t,a){var r=a(2109),n=a(1574);r({target:"Object",stat:!0,forced:Object.assign!==n},{assign:n})},4603:function(e,t,a){var r=a(9781),n=a(7854),s=a(4705),i=a(9587),o=a(3070).f,c=a(8006).f,h=a(7850),l=a(7066),u=a(2999),d=a(1320),p=a(7293),g=a(9909).enforce,v=a(6340),f=a(5112)("match"),m=n.RegExp,b=m.prototype,y=/a/g,k=/a/g,S=new m(y)!==y,R=u.UNSUPPORTED_Y;if(r&&s("RegExp",!S||R||p((function(){return k[f]=!1,m(y)!=y||m(k)==k||"/a/i"!=m(y,"i")})))){for(var x=function(e,t){var a,r=this instanceof x,n=h(e),s=void 0===t;if(!r&&n&&e.constructor===x&&s)return e;S?n&&!s&&(e=e.source):e instanceof x&&(s&&(t=l.call(e)),e=e.source),R&&(a=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var o=i(S?new m(e,t):m(e,t),r?this:b,x);return R&&a&&(g(o).sticky=!0),o},P=function(e){e in x||o(x,e,{configurable:!0,get:function(){return m[e]},set:function(t){m[e]=t}})},M=c(m),T=0;M.length>T;)P(M[T++]);b.constructor=x,x.prototype=b,d(n,"RegExp",x)}v("RegExp")}},function(e){"use strict";e(e.s=8011)}]);
1
+ (self["webpackChunk_internetarchive_bookreader"] = self["webpackChunk_internetarchive_bookreader"] || []).push([["plugins/plugin.search.js"],{
2
+
3
+ /***/ "./src/plugins/search/plugin.search.js":
4
+ /*!*********************************************!*\
5
+ !*** ./src/plugins/search/plugin.search.js ***!
6
+ \*********************************************/
7
+ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8
+
9
+ "use strict";
10
+ __webpack_require__.r(__webpack_exports__);
11
+ /* harmony import */ var regenerator_runtime_runtime_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! regenerator-runtime/runtime.js */ "./node_modules/regenerator-runtime/runtime.js");
12
+ /* harmony import */ var regenerator_runtime_runtime_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(regenerator_runtime_runtime_js__WEBPACK_IMPORTED_MODULE_0__);
13
+ /* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ "./node_modules/core-js/modules/es.regexp.exec.js");
14
+ /* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_1__);
15
+ /* harmony import */ var core_js_modules_es_string_search_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.string.search.js */ "./node_modules/core-js/modules/es.string.search.js");
16
+ /* harmony import */ var core_js_modules_es_string_search_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_search_js__WEBPACK_IMPORTED_MODULE_2__);
17
+ /* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.array.find.js */ "./node_modules/core-js/modules/es.array.find.js");
18
+ /* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_3__);
19
+ /* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ "./node_modules/core-js/modules/es.string.replace.js");
20
+ /* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_4__);
21
+ /* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.array.concat.js */ "./node_modules/core-js/modules/es.array.concat.js");
22
+ /* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_5__);
23
+ /* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.object.assign.js */ "./node_modules/core-js/modules/es.object.assign.js");
24
+ /* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6__);
25
+ /* harmony import */ var core_js_modules_es_object_entries_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.object.entries.js */ "./node_modules/core-js/modules/es.object.entries.js");
26
+ /* harmony import */ var core_js_modules_es_object_entries_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_entries_js__WEBPACK_IMPORTED_MODULE_7__);
27
+ /* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ "./node_modules/core-js/modules/web.dom-collections.for-each.js");
28
+ /* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_8__);
29
+ /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js");
30
+ /* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_9__);
31
+ /* harmony import */ var core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.promise.js */ "./node_modules/core-js/modules/es.promise.js");
32
+ /* harmony import */ var core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_10__);
33
+ /* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.array.iterator.js */ "./node_modules/core-js/modules/es.array.iterator.js");
34
+ /* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_11__);
35
+ /* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.string.iterator.js */ "./node_modules/core-js/modules/es.string.iterator.js");
36
+ /* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_12__);
37
+ /* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ "./node_modules/core-js/modules/web.dom-collections.iterator.js");
38
+ /* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_13__);
39
+ /* harmony import */ var core_js_modules_web_url_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/web.url.js */ "./node_modules/core-js/modules/web.url.js");
40
+ /* harmony import */ var core_js_modules_web_url_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_js__WEBPACK_IMPORTED_MODULE_14__);
41
+ /* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.array.slice.js */ "./node_modules/core-js/modules/es.array.slice.js");
42
+ /* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_15__);
43
+ /* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ "./node_modules/core-js/modules/es.function.name.js");
44
+ /* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_16__);
45
+ /* harmony import */ var core_js_modules_es_array_from_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! core-js/modules/es.array.from.js */ "./node_modules/core-js/modules/es.array.from.js");
46
+ /* harmony import */ var core_js_modules_es_array_from_js__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_from_js__WEBPACK_IMPORTED_MODULE_17__);
47
+ /* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! core-js/modules/es.symbol.js */ "./node_modules/core-js/modules/es.symbol.js");
48
+ /* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_18__);
49
+ /* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! core-js/modules/es.symbol.description.js */ "./node_modules/core-js/modules/es.symbol.description.js");
50
+ /* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_19__);
51
+ /* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ "./node_modules/core-js/modules/es.symbol.iterator.js");
52
+ /* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_20__);
53
+ /* harmony import */ var _BookReader_PageContainer_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../BookReader/PageContainer.js */ "./src/BookReader/PageContainer.js");
54
+ /* harmony import */ var _view_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./view.js */ "./src/plugins/search/view.js");
55
+ /* provided dependency */ var jQuery = __webpack_require__(/*! jquery */ "jquery");
56
+ /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "jquery");
57
+
58
+
59
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
60
+
61
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
62
+
63
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
64
+
65
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
66
+
67
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
68
+
69
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
70
+
71
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
72
+
73
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
74
+
75
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+ /* global BookReader */
99
+
100
+ /**
101
+ * Plugin for Archive.org book search
102
+ * NOTE: This script must be loaded AFTER `plugin.mobile_nav.js`
103
+ * as it mutates mobile nav drawer
104
+ *
105
+ * Events fired at various points throughout search processing are published
106
+ * on the document DOM element. These can be subscribed to using jQuery's event
107
+ * binding method `$.fn.on`. All of the events are prefixed with a BookReader
108
+ * namespace. The events are:
109
+ *
110
+ * @event BookReader:SearchStarted - When a search form is submitted, immediately
111
+ * before an AJAX call is made to request search results
112
+ * @event BookReader:SearchCallback - When the search AJAX call is returned and at
113
+ * least one result is returned. The event callback receives an object
114
+ * with the `results`, plugin `options`, and the BookReader `instance`
115
+ * @event BookReader:SearchCallbackError - When the AJAX request returns an error.
116
+ * Receives the `results` and `instance`
117
+ * @event BookReader:SearchCallbackNotIndexed - When a message is received that
118
+ * the book has not had OCR text indexed yet. Receives `instance`
119
+ * @event BookReader:SearchCallbackEmpty - When no results found. Receives
120
+ * `instance`
121
+ * @event BookReader:SearchCanceled - When no results found. Receives
122
+ * `instance`
123
+ */
124
+
125
+
126
+ /** @typedef {import('../../BookReader/PageContainer').PageContainer} PageContainer */
127
+
128
+ /** @typedef {import('../../BookReader/BookModel').PageIndex} PageIndex */
129
+
130
+ jQuery.extend(BookReader.defaultOptions, {
131
+ server: 'ia600609.us.archive.org',
132
+ bookId: '',
133
+ subPrefix: '',
134
+ bookPath: '',
135
+ enableSearch: true,
136
+ searchInsideUrl: '/fulltext/inside.php',
137
+ initialSearchTerm: null
138
+ });
139
+ /** @override */
140
+
141
+ BookReader.prototype.setup = function (super_) {
142
+ return function (options) {
143
+ super_.call(this, options);
144
+ this.searchTerm = '';
145
+ this.searchResults = null;
146
+ this.searchInsideUrl = options.searchInsideUrl;
147
+ this.enableSearch = options.enableSearch; // Base server used by some api calls
148
+
149
+ this.bookId = options.bookId;
150
+ this.server = options.server;
151
+ this.subPrefix = options.subPrefix;
152
+ this.bookPath = options.bookPath;
153
+ this.searchXHR = null;
154
+
155
+ this._cancelSearch.bind(this);
156
+
157
+ this.cancelSearchRequest.bind(this);
158
+ /** @type { {[pageIndex: number]: SearchInsideMatchBox[]} } */
159
+
160
+ this._searchBoxesByIndex = {};
161
+ this.searchView = undefined;
162
+ };
163
+ }(BookReader.prototype.setup);
164
+ /** @override */
165
+
166
+
167
+ BookReader.prototype.init = function (super_) {
168
+ return function () {
169
+ var _this = this;
170
+
171
+ super_.call(this); // give SearchView the most complete bookreader state
172
+
173
+ this.searchView = new _view_js__WEBPACK_IMPORTED_MODULE_22__.default({
174
+ br: this,
175
+ searchCancelledCallback: function searchCancelledCallback() {
176
+ _this._cancelSearch();
177
+
178
+ _this.trigger('SearchCanceled', {
179
+ term: _this.searchTerm,
180
+ instance: _this
181
+ });
182
+ }
183
+ });
184
+
185
+ if (this.options.enableSearch && this.options.initialSearchTerm) {
186
+ /**
187
+ * this.search() take two parameter
188
+ * 1. this.options.initialSearchTerm - search term
189
+ * 2. {
190
+ * goToFirstResult: this.options.goToFirstResult,
191
+ * suppressFragmentChange: false // always want to change fragment in URL
192
+ * }
193
+ */
194
+ this.search(this.options.initialSearchTerm, {
195
+ goToFirstResult: this.options.goToFirstResult,
196
+ suppressFragmentChange: false
197
+ });
198
+ }
199
+ };
200
+ }(BookReader.prototype.init);
201
+ /** @override */
202
+
203
+
204
+ BookReader.prototype.buildToolbarElement = function (super_) {
205
+ return function () {
206
+ var $el = super_.call(this);
207
+
208
+ if (!this.enableSearch) {
209
+ return;
210
+ }
211
+
212
+ if (this.searchView.dom.toolbarSearch) {
213
+ $el.find('.BRtoolbarSectionInfo').after(this.searchView.dom.toolbarSearch);
214
+ }
215
+
216
+ return $el;
217
+ };
218
+ }(BookReader.prototype.buildToolbarElement);
219
+ /** @override */
220
+
221
+
222
+ BookReader.prototype._createPageContainer = function (super_) {
223
+ return function (index) {
224
+ var pageContainer = super_.call(this, index);
225
+
226
+ if (this.enableSearch && pageContainer.page && index in this._searchBoxesByIndex) {
227
+ var pageIndex = pageContainer.page.index;
228
+ (0,_BookReader_PageContainer_js__WEBPACK_IMPORTED_MODULE_21__.renderBoxesInPageContainerLayer)('searchHiliteLayer', this._searchBoxesByIndex[pageIndex], pageContainer.page, pageContainer.$container[0]);
229
+ }
230
+
231
+ return pageContainer;
232
+ };
233
+ }(BookReader.prototype._createPageContainer);
234
+ /**
235
+ * @typedef {object} SearchOptions
236
+ * @property {boolean} goToFirstResult
237
+ * @property {boolean} disablePopup
238
+ * @property {(null|function)} error - @deprecated at v.5.0
239
+ * @property {(null|function)} success - @deprecated at v.5.0
240
+ */
241
+
242
+ /**
243
+ * Submits search request
244
+ *
245
+ * @param {string} term
246
+ * @param {SearchOptions} overrides
247
+ */
248
+
249
+
250
+ BookReader.prototype.search = function () {
251
+ var _this2 = this;
252
+
253
+ var term = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
254
+ var overrides = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
255
+
256
+ /** @type {SearchOptions} */
257
+ var defaultOptions = {
258
+ goToFirstResult: false,
259
+
260
+ /* jump to the first result (default=false) */
261
+ disablePopup: false,
262
+
263
+ /* don't show the modal progress (default=false) */
264
+ suppressFragmentChange: false,
265
+
266
+ /* don't change the URL on initial load */
267
+ error: null,
268
+
269
+ /* optional error handler (default=null) */
270
+ success: null
271
+ /* optional success handler (default=null) */
272
+
273
+ };
274
+ var options = jQuery.extend({}, defaultOptions, overrides);
275
+ this.suppressFragmentChange = options.suppressFragmentChange; // strip slashes, since this goes in the url
276
+
277
+ this.searchTerm = term.replace(/\//g, ' ');
278
+
279
+ if (!options.suppressFragmentChange) {
280
+ this.trigger(BookReader.eventNames.fragmentChange);
281
+ } // Add quotes to the term. This is to compenstate for the backends default OR query
282
+ // term = term.replace(/['"]+/g, '');
283
+ // term = '"' + term + '"';
284
+ // Remove the port and userdir
285
+
286
+
287
+ var serverPath = this.server.replace(/:.+/, '');
288
+ var baseUrl = "https://".concat(serverPath).concat(this.searchInsideUrl, "?"); // Remove subPrefix from end of path
289
+
290
+ var path = this.bookPath;
291
+ var subPrefixWithSlash = "/".concat(this.subPrefix);
292
+
293
+ if (this.bookPath.length - this.bookPath.lastIndexOf(subPrefixWithSlash) == subPrefixWithSlash.length) {
294
+ path = this.bookPath.substr(0, this.bookPath.length - subPrefixWithSlash.length);
295
+ }
296
+
297
+ var urlParams = {
298
+ item_id: this.bookId,
299
+ doc: this.subPrefix,
300
+ path: path,
301
+ q: term
302
+ }; // NOTE that the API does not expect / (slashes) to be encoded. (%2F) won't work
303
+
304
+ var paramStr = $.param(urlParams).replace(/%2F/g, '/');
305
+ var url = "".concat(baseUrl).concat(paramStr);
306
+
307
+ var cleanup = function cleanup() {
308
+ _this2.searchXHR = null;
309
+
310
+ window.BRSearchInProgress = function () {};
311
+ };
312
+
313
+ var processSearchResults = function processSearchResults(searchInsideResults) {
314
+ if (!_this2.searchXHR) {
315
+ return;
316
+ }
317
+
318
+ var responseHasError = searchInsideResults.error || !searchInsideResults.matches.length;
319
+ var hasCustomError = typeof options.error === 'function';
320
+ var hasCustomSuccess = typeof options.success === 'function';
321
+
322
+ if (responseHasError) {
323
+ hasCustomError ? options.error.call(_this2, searchInsideResults, options) : _this2.BRSearchCallbackError(searchInsideResults, options);
324
+ } else {
325
+ hasCustomSuccess ? options.success.call(_this2, searchInsideResults, options) : _this2.BRSearchCallback(searchInsideResults, options);
326
+ }
327
+
328
+ cleanup();
329
+ };
330
+
331
+ var beforeSend = function beforeSend(xhr) {
332
+ _this2.searchXHR = xhr;
333
+ window.BRSearchInProgress = processSearchResults;
334
+ };
335
+
336
+ this.trigger('SearchStarted', {
337
+ term: this.searchTerm,
338
+ instance: this
339
+ });
340
+ return $.ajax({
341
+ url: url,
342
+ dataType: 'jsonp',
343
+ cache: true,
344
+ beforeSend: beforeSend,
345
+ jsonpCallback: 'BRSearchInProgress'
346
+ }).then(processSearchResults);
347
+ };
348
+ /**
349
+ * cancels AJAX Call
350
+ * emits custom event
351
+ */
352
+
353
+
354
+ BookReader.prototype._cancelSearch = function () {
355
+ var _this$searchXHR;
356
+
357
+ (_this$searchXHR = this.searchXHR) === null || _this$searchXHR === void 0 ? void 0 : _this$searchXHR.abort();
358
+ this.searchView.clearSearchFieldAndResults(false);
359
+ this.searchTerm = '';
360
+ this.searchXHR = null;
361
+ this.searchResults = [];
362
+
363
+ window.BRSearchInProgress = function () {};
364
+ };
365
+ /**
366
+ * External function to cancel search
367
+ * checks for term & xhr in flight before running
368
+ */
369
+
370
+
371
+ BookReader.prototype.cancelSearchRequest = function () {
372
+ if (this.searchXHR !== null) {
373
+ this._cancelSearch();
374
+
375
+ this.searchView.toggleSearchPending();
376
+ this.trigger('SearchCanceled', {
377
+ term: this.searchTerm,
378
+ instance: this
379
+ });
380
+ }
381
+ };
382
+ /**
383
+ * @typedef {object} SearchInsideMatchBox
384
+ * @property {number} page
385
+ * @property {number} r
386
+ * @property {number} l
387
+ * @property {number} b
388
+ * @property {number} t
389
+ * @property {HTMLDivElement} [div]
390
+ */
391
+
392
+ /**
393
+ * @typedef {object} SearchInsideMatch
394
+ * @property {string} text
395
+ * @property {Array<{ page: number, boxes: SearchInsideMatchBox[] }>} par
396
+ */
397
+
398
+ /**
399
+ * @typedef {object} SearchInsideResults
400
+ * @property {string} error
401
+ * @property {SearchInsideMatch[]} matches
402
+ * @property {boolean} indexed
403
+ */
404
+
405
+ /**
406
+ * Search Results return handler
407
+ * @callback
408
+ * @param {SearchInsideResults} results
409
+ * @param {object} options
410
+ * @param {boolean} options.goToFirstResult
411
+ */
412
+
413
+
414
+ BookReader.prototype.BRSearchCallback = function (results, options) {
415
+ this.searchResults = results || [];
416
+ this.updateSearchHilites();
417
+ this.removeProgressPopup();
418
+
419
+ if (options.goToFirstResult) {
420
+ var pageIndex = this._models.book.leafNumToIndex(results.matches[0].par[0].page);
421
+
422
+ this._searchPluginGoToResult(pageIndex);
423
+ }
424
+
425
+ this.trigger('SearchCallback', {
426
+ results: results,
427
+ options: options,
428
+ instance: this
429
+ });
430
+ };
431
+ /**
432
+ * Main search results error handler
433
+ * @callback
434
+ * @param {SearchInsideResults} results
435
+ */
436
+
437
+
438
+ BookReader.prototype.BRSearchCallbackError = function (results) {
439
+ this._BRSearchCallbackError(results);
440
+ };
441
+ /**
442
+ * @private draws search results error
443
+ * @callback
444
+ * @param {SearchInsideResults} results
445
+ * @param {jQuery} $el
446
+ * @param {boolean} fade
447
+ */
448
+
449
+
450
+ BookReader.prototype._BRSearchCallbackError = function (results) {
451
+ this.searchResults = results;
452
+ var basePayload = {
453
+ term: this.searchTerm,
454
+ instance: this
455
+ };
456
+
457
+ if (results.error) {
458
+ var payload = Object.assign({}, basePayload, {
459
+ results: results
460
+ });
461
+ this.trigger('SearchCallbackError', payload);
462
+ } else if (0 == results.matches.length) {
463
+ if (false === results.indexed) {
464
+ this.trigger('SearchCallbackBookNotIndexed', basePayload);
465
+ return;
466
+ }
467
+
468
+ this.trigger('SearchCallbackEmpty', basePayload);
469
+ }
470
+ };
471
+ /**
472
+ * updates search on-page highlights controller
473
+ */
474
+
475
+
476
+ BookReader.prototype.updateSearchHilites = function () {
477
+ var _this$searchResults,
478
+ _this3 = this;
479
+
480
+ /** @type {SearchInsideMatch[]} */
481
+ var matches = ((_this$searchResults = this.searchResults) === null || _this$searchResults === void 0 ? void 0 : _this$searchResults.matches) || [];
482
+ /** @type { {[pageIndex: number]: SearchInsideMatch[]} } */
483
+
484
+ var boxesByIndex = {}; // Clear any existing svg layers
485
+
486
+ this.removeSearchHilites(); // Group by pageIndex
487
+
488
+ var _iterator = _createForOfIteratorHelper(matches),
489
+ _step;
490
+
491
+ try {
492
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
493
+ var match = _step.value;
494
+
495
+ var _iterator2 = _createForOfIteratorHelper(match.par[0].boxes),
496
+ _step2;
497
+
498
+ try {
499
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
500
+ var box = _step2.value;
501
+ var pageIndex = this.leafNumToIndex(box.page);
502
+ var pageMatches = boxesByIndex[pageIndex] || (boxesByIndex[pageIndex] = []);
503
+ pageMatches.push(box);
504
+ }
505
+ } catch (err) {
506
+ _iterator2.e(err);
507
+ } finally {
508
+ _iterator2.f();
509
+ }
510
+ } // update any already created pages
511
+
512
+ } catch (err) {
513
+ _iterator.e(err);
514
+ } finally {
515
+ _iterator.f();
516
+ }
517
+
518
+ var _loop = function _loop() {
519
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
520
+ pageIndexString = _Object$entries$_i[0],
521
+ boxes = _Object$entries$_i[1];
522
+
523
+ var pageIndex = parseFloat(pageIndexString);
524
+
525
+ var page = _this3._models.book.getPage(pageIndex);
526
+
527
+ var pageContainers = _this3.getActivePageContainerElementsForIndex(pageIndex);
528
+
529
+ pageContainers.forEach(function (container) {
530
+ return (0,_BookReader_PageContainer_js__WEBPACK_IMPORTED_MODULE_21__.renderBoxesInPageContainerLayer)('searchHiliteLayer', boxes, page, container);
531
+ });
532
+ };
533
+
534
+ for (var _i = 0, _Object$entries = Object.entries(boxesByIndex); _i < _Object$entries.length; _i++) {
535
+ _loop();
536
+ }
537
+
538
+ this._searchBoxesByIndex = boxesByIndex;
539
+ };
540
+ /**
541
+ * remove search highlights
542
+ */
543
+
544
+
545
+ BookReader.prototype.removeSearchHilites = function () {
546
+ $(this.getActivePageContainerElements()).find('.searchHiliteLayer').remove();
547
+ };
548
+ /**
549
+ * @private
550
+ * Goes to the page specified. If the page is not viewable, tries to load the page
551
+ * FIXME Most of this logic is IA specific, and should be less integrated into here
552
+ * or at least more configurable.
553
+ * @param {PageIndex} pageIndex
554
+ */
555
+
556
+
557
+ BookReader.prototype._searchPluginGoToResult = /*#__PURE__*/function () {
558
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(pageIndex) {
559
+ var book, page, makeUnviewableAtEnd, resp, _iterator3, _step3, leafNum;
560
+
561
+ return regeneratorRuntime.wrap(function _callee$(_context) {
562
+ while (1) {
563
+ switch (_context.prev = _context.next) {
564
+ case 0:
565
+ book = this._models.book;
566
+ page = book.getPage(pageIndex);
567
+ makeUnviewableAtEnd = false;
568
+
569
+ if (page.isViewable) {
570
+ _context.next = 10;
571
+ break;
572
+ }
573
+
574
+ _context.next = 6;
575
+ return fetch('/services/bookreader/request_page?' + new URLSearchParams({
576
+ id: this.options.bookId,
577
+ subprefix: this.options.subPrefix,
578
+ leafNum: page.leafNum
579
+ })).then(function (r) {
580
+ return r.json();
581
+ });
582
+
583
+ case 6:
584
+ resp = _context.sent;
585
+ _iterator3 = _createForOfIteratorHelper(resp.value);
586
+
587
+ try {
588
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
589
+ leafNum = _step3.value;
590
+ book.getPage(book.leafNumToIndex(leafNum)).makeViewable();
591
+ } // not able to show page; make the page viewable anyways so that it can
592
+ // actually open. On IA, it has a fallback to a special error page.
593
+
594
+ } catch (err) {
595
+ _iterator3.e(err);
596
+ } finally {
597
+ _iterator3.f();
598
+ }
599
+
600
+ if (!resp.value.length) {
601
+ book.getPage(pageIndex).makeViewable();
602
+ makeUnviewableAtEnd = true;
603
+ }
604
+
605
+ case 10:
606
+ /* this updates the URL */
607
+ this.suppressFragmentChange = false;
608
+ this.jumpToIndex(pageIndex); // Reset it to unviewable if it wasn't resolved
609
+
610
+ if (makeUnviewableAtEnd) {
611
+ book.getPage(pageIndex).makeViewable(false);
612
+ }
613
+
614
+ case 13:
615
+ case "end":
616
+ return _context.stop();
617
+ }
618
+ }
619
+ }, _callee, this);
620
+ }));
621
+
622
+ return function (_x) {
623
+ return _ref.apply(this, arguments);
624
+ };
625
+ }();
626
+ /**
627
+ * Removes all search pins
628
+ */
629
+
630
+
631
+ BookReader.prototype.removeSearchResults = function () {
632
+ var suppressFragmentChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
633
+ this.removeSearchHilites(); //be sure to set all box.divs to null
634
+
635
+ this.searchTerm = null;
636
+ this.searchResults = null;
637
+
638
+ if (!suppressFragmentChange) {
639
+ this.trigger(BookReader.eventNames.fragmentChange);
640
+ }
641
+ };
642
+ /**
643
+ * Returns true if a search highlight is currently being displayed
644
+ * @returns {boolean}
645
+ */
646
+
647
+
648
+ BookReader.prototype.searchHighlightVisible = function () {
649
+ var _this4 = this;
650
+
651
+ var results = this.searchResults;
652
+ var visiblePages = [];
653
+ if (null == results) return false;
654
+
655
+ if (this.constMode2up == this.mode) {
656
+ visiblePages = [this.twoPage.currentIndexL, this.twoPage.currentIndexR];
657
+ } else if (this.constMode1up == this.mode) {
658
+ visiblePages = [this.currentIndex()];
659
+ } else {
660
+ return false;
661
+ }
662
+
663
+ results.matches.some(function (match) {
664
+ return match.par[0].boxes.some(function (box) {
665
+ var pageIndex = _this4.leafNumToIndex(box.page);
666
+
667
+ if (jQuery.inArray(pageIndex, visiblePages) >= 0) {
668
+ return true;
669
+ }
670
+ });
671
+ });
672
+ return false;
673
+ };
674
+
675
+ /***/ }),
676
+
677
+ /***/ "./src/plugins/search/view.js":
678
+ /*!************************************!*\
679
+ !*** ./src/plugins/search/view.js ***!
680
+ \************************************/
681
+ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
682
+
683
+ "use strict";
684
+ __webpack_require__.r(__webpack_exports__);
685
+ /* harmony import */ var core_js_modules_es_regexp_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.regexp.constructor.js */ "./node_modules/core-js/modules/es.regexp.constructor.js");
686
+ /* harmony import */ var core_js_modules_es_regexp_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_constructor_js__WEBPACK_IMPORTED_MODULE_0__);
687
+ /* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ "./node_modules/core-js/modules/es.regexp.exec.js");
688
+ /* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_1__);
689
+ /* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ "./node_modules/core-js/modules/es.regexp.to-string.js");
690
+ /* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2__);
691
+ /* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.array.concat.js */ "./node_modules/core-js/modules/es.array.concat.js");
692
+ /* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_3__);
693
+ /* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.array.map.js */ "./node_modules/core-js/modules/es.array.map.js");
694
+ /* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_4__);
695
+ /* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.array.slice.js */ "./node_modules/core-js/modules/es.array.slice.js");
696
+ /* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_5__);
697
+ /* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.array.find.js */ "./node_modules/core-js/modules/es.array.find.js");
698
+ /* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_6__);
699
+ /* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ "./node_modules/core-js/modules/web.dom-collections.for-each.js");
700
+ /* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_7__);
701
+ /* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ "./node_modules/core-js/modules/es.string.replace.js");
702
+ /* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_8__);
703
+ /* harmony import */ var core_js_modules_es_string_search_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.string.search.js */ "./node_modules/core-js/modules/es.string.search.js");
704
+ /* harmony import */ var core_js_modules_es_string_search_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_search_js__WEBPACK_IMPORTED_MODULE_9__);
705
+ /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "jquery");
706
+
707
+
708
+
709
+
710
+
711
+
712
+
713
+
714
+
715
+
716
+
717
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
718
+
719
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
720
+
721
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
722
+
723
+ var SearchView = /*#__PURE__*/function () {
724
+ /**
725
+ * @param {object} params
726
+ * @param {object} params.br The BookReader instance
727
+ * @param {function} params.cancelSearch callback when a user wants to cancel search
728
+ *
729
+ * @event BookReader:SearchResultsCleared - when the search results nav gets cleared
730
+ * @event BookReader:ToggleSearchMenu - when search results menu should toggle
731
+ */
732
+ function SearchView(_ref) {
733
+ var br = _ref.br,
734
+ _ref$searchCancelledC = _ref.searchCancelledCallback,
735
+ searchCancelledCallback = _ref$searchCancelledC === void 0 ? function () {} : _ref$searchCancelledC;
736
+
737
+ _classCallCheck(this, SearchView);
738
+
739
+ this.br = br; // Search results are returned as a text blob with the hits wrapped in
740
+ // triple mustaches. Hits occasionally include text beyond the search
741
+ // term, so everything within the staches is captured and wrapped.
742
+
743
+ this.matcher = new RegExp('{{{(.+?)}}}', 'g');
744
+ this.matches = [];
745
+ this.cacheDOMElements();
746
+ this.bindEvents();
747
+ this.cancelSearch = searchCancelledCallback;
748
+ }
749
+
750
+ _createClass(SearchView, [{
751
+ key: "cacheDOMElements",
752
+ value: function cacheDOMElements() {
753
+ this.dom = {}; // Search input within the top toolbar. Will be removed once the mobile menu is replaced.
754
+
755
+ this.dom.toolbarSearch = this.buildToolbarSearch();
756
+ }
757
+ /**
758
+ * @param {string} query
759
+ */
760
+
761
+ }, {
762
+ key: "setQuery",
763
+ value: function setQuery(query) {
764
+ this.br.$('[name="query"]').val(query);
765
+ }
766
+ }, {
767
+ key: "emptyMatches",
768
+ value: function emptyMatches() {
769
+ this.matches = [];
770
+ }
771
+ }, {
772
+ key: "removeResultPins",
773
+ value: function removeResultPins() {
774
+ this.br.$('.BRnavpos .BRsearch').remove();
775
+ }
776
+ }, {
777
+ key: "clearSearchFieldAndResults",
778
+ value: function clearSearchFieldAndResults() {
779
+ var dispatchEventWhenComplete = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
780
+ this.br.removeSearchResults();
781
+ this.removeResultPins();
782
+ this.emptyMatches();
783
+ this.setQuery('');
784
+ this.teardownSearchNavigation();
785
+
786
+ if (dispatchEventWhenComplete) {
787
+ this.br.trigger('SearchResultsCleared');
788
+ }
789
+ }
790
+ }, {
791
+ key: "toggleSidebar",
792
+ value: function toggleSidebar() {
793
+ this.br.trigger('ToggleSearchMenu');
794
+ }
795
+ }, {
796
+ key: "renderSearchNavigation",
797
+ value: function renderSearchNavigation() {
798
+ var selector = 'BRsearch-navigation';
799
+ $('.BRnav').before("\n <div class=\"".concat(selector, "\">\n <button class=\"toggle-sidebar\">\n <h4>\n <span class=\"icon icon-search\"></span> Results\n </h4>\n </button>\n <div class=\"pagination\">\n <button class=\"prev\" title=\"Previous result\"><span class=\"icon icon-chevron hflip\"></span></button>\n <span data-id=\"resultsCount\">").concat(this.resultsPosition(), "</span>\n <button class=\"next\" title=\"Next result\"><span class=\"icon icon-chevron\"></button>\n </div>\n <button class=\"clear\" title=\"Clear search results\">\n <span class=\"icon icon-close\"></span>\n </button>\n </div>\n "));
800
+ this.dom.searchNavigation = $(".".concat(selector));
801
+ }
802
+ }, {
803
+ key: "resultsPosition",
804
+ value: function resultsPosition() {
805
+ var positionMessage = "".concat(this.matches.length, " result").concat(this.matches.length === 1 ? '' : 's');
806
+
807
+ if (~this.currentMatchIndex) {
808
+ positionMessage = "".concat(this.currentMatchIndex + 1, " / ").concat(this.matches.length);
809
+ }
810
+
811
+ return positionMessage;
812
+ }
813
+ }, {
814
+ key: "bindSearchNavigationEvents",
815
+ value: function bindSearchNavigationEvents() {
816
+ if (!this.dom.searchNavigation) {
817
+ return;
818
+ }
819
+
820
+ var namespace = 'searchNavigation';
821
+ this.dom.searchNavigation.on("click.".concat(namespace), '.clear', this.clearSearchFieldAndResults.bind(this)).on("click.".concat(namespace), '.prev', this.showPrevResult.bind(this)).on("click.".concat(namespace), '.next', this.showNextResult.bind(this)).on("click.".concat(namespace), '.toggle-sidebar', this.toggleSidebar.bind(this)).on("click.".concat(namespace), false);
822
+ }
823
+ }, {
824
+ key: "showPrevResult",
825
+ value: function showPrevResult() {
826
+ if (this.currentMatchIndex === 0) {
827
+ return;
828
+ }
829
+
830
+ if (this.br.mode === this.br.constModeThumb) {
831
+ this.br.switchMode(this.br.constMode1up);
832
+ }
833
+
834
+ if (!~this.currentMatchIndex) {
835
+ this.currentMatchIndex = this.getClosestMatchIndex(function (start, end, comparator) {
836
+ return end[0] > comparator;
837
+ }) + 1;
838
+ }
839
+
840
+ this.br.$('.BRnavline .BRsearch').eq(--this.currentMatchIndex).click();
841
+ this.updateResultsPosition();
842
+ this.updateSearchNavigationButtons();
843
+ }
844
+ }, {
845
+ key: "showNextResult",
846
+ value: function showNextResult() {
847
+ if (this.currentMatchIndex + 1 === this.matches.length) {
848
+ return;
849
+ }
850
+
851
+ if (this.br.mode === this.br.constModeThumb) {
852
+ this.br.switchMode(this.br.constMode1up);
853
+ }
854
+
855
+ if (!~this.currentMatchIndex) {
856
+ this.currentMatchIndex = this.getClosestMatchIndex(function (start, end, comparator) {
857
+ return start[start.length - 1] > comparator;
858
+ }) - 1;
859
+ }
860
+
861
+ this.br.$('.BRnavline .BRsearch').eq(++this.currentMatchIndex).click();
862
+ this.updateResultsPosition();
863
+ this.updateSearchNavigationButtons();
864
+ }
865
+ /**
866
+ * Obtains closest match based on the logical comparison function passed in.
867
+ * When the comparison function returns true, the starting (left) half of the
868
+ * matches array is used in the binary split, else the ending (right) half is
869
+ * used. A recursive call is made to perform the same split and comparison
870
+ * on the winning half of the matches. This is traditionally known as binary
871
+ * search (https://en.wikipedia.org/wiki/Binary_search_algorithm), and in
872
+ * most cases (medium to large search result arrays) should outperform
873
+ * traversing the array from start to finish. In the case of small arrays,
874
+ * the speed difference is negligible.
875
+ *
876
+ * @param {function} comparisonFn
877
+ * @return {number} matchIndex
878
+ */
879
+
880
+ }, {
881
+ key: "getClosestMatchIndex",
882
+ value: function getClosestMatchIndex(comparisonFn) {
883
+ var matchPages = this.matches.map(function (m) {
884
+ return m.par[0].page;
885
+ });
886
+ var currentPage = this.br.currentIndex() + 1;
887
+
888
+ var closestTo = function closestTo(pool, comparator) {
889
+ if (pool.length === 1) {
890
+ return pool[0];
891
+ }
892
+
893
+ var start = pool.slice(0, pool.length / 2);
894
+ var end = pool.slice(pool.length / 2);
895
+ return closestTo(comparisonFn(start, end, comparator) ? start : end, comparator);
896
+ };
897
+
898
+ var closestPage = closestTo(matchPages, currentPage);
899
+ return this.matches.indexOf(this.matches.find(function (m) {
900
+ return m.par[0].page === closestPage;
901
+ }));
902
+ }
903
+ }, {
904
+ key: "updateResultsPosition",
905
+ value: function updateResultsPosition() {
906
+ this.dom.searchNavigation.find('[data-id=resultsCount]').text(this.resultsPosition());
907
+ }
908
+ }, {
909
+ key: "updateSearchNavigationButtons",
910
+ value: function updateSearchNavigationButtons() {
911
+ this.dom.searchNavigation.find('.prev').attr('disabled', !this.currentMatchIndex);
912
+ this.dom.searchNavigation.find('.next').attr('disabled', this.currentMatchIndex + 1 === this.matches.length);
913
+ }
914
+ }, {
915
+ key: "teardownSearchNavigation",
916
+ value: function teardownSearchNavigation() {
917
+ if (!this.dom.searchNavigation) {
918
+ this.dom.searchNavigation = $('.BRsearch-navigation');
919
+ }
920
+
921
+ if (!this.dom.searchNavigation.length) {
922
+ return;
923
+ }
924
+
925
+ this.dom.searchNavigation.off('.searchNavigation').remove();
926
+ this.dom.searchNavigation = null;
927
+ this.br.resize();
928
+ }
929
+ }, {
930
+ key: "setCurrentMatchIndex",
931
+ value: function setCurrentMatchIndex() {
932
+ var matchingSearchResult;
933
+
934
+ if (this.br.mode === this.br.constModeThumb) {
935
+ this.currentMatchIndex = -1;
936
+ return;
937
+ }
938
+
939
+ if (this.br.mode === this.br.constMode2up) {
940
+ matchingSearchResult = this.find2upMatchingSearchResult();
941
+ } else {
942
+ matchingSearchResult = this.find1upMatchingSearchResult();
943
+ }
944
+
945
+ this.currentMatchIndex = this.matches.indexOf(matchingSearchResult);
946
+ }
947
+ }, {
948
+ key: "find1upMatchingSearchResult",
949
+ value: function find1upMatchingSearchResult() {
950
+ var _this = this;
951
+
952
+ return this.matches.find(function (m) {
953
+ return _this.br.currentIndex() === m.par[0].page - 1;
954
+ });
955
+ }
956
+ }, {
957
+ key: "find2upMatchingSearchResult",
958
+ value: function find2upMatchingSearchResult() {
959
+ var _this2 = this;
960
+
961
+ return this.matches.find(function (m) {
962
+ return _this2.br._isIndexDisplayed(m.par[0].page - 1);
963
+ });
964
+ }
965
+ }, {
966
+ key: "updateSearchNavigation",
967
+ value: function updateSearchNavigation() {
968
+ if (!this.matches.length) {
969
+ return;
970
+ }
971
+
972
+ this.setCurrentMatchIndex();
973
+ this.updateResultsPosition();
974
+ this.updateSearchNavigationButtons();
975
+ }
976
+ /**
977
+ * @param {boolean} bool
978
+ */
979
+
980
+ }, {
981
+ key: "togglePinsFor",
982
+ value: function togglePinsFor(bool) {
983
+ var pinsVisibleState = bool ? 'visible' : 'hidden';
984
+ this.br.refs.$BRfooter.find('.BRsearch').css({
985
+ visibility: pinsVisibleState
986
+ });
987
+ }
988
+ }, {
989
+ key: "buildToolbarSearch",
990
+ value: function buildToolbarSearch() {
991
+ var toolbarSearch = document.createElement('span');
992
+ toolbarSearch.classList.add('BRtoolbarSection', 'BRtoolbarSectionSearch');
993
+ toolbarSearch.innerHTML = "\n <form class=\"BRbooksearch desktop\">\n <input type=\"search\" name=\"query\" class=\"BRsearchInput\" value=\"\" placeholder=\"Search inside\"/>\n <button type=\"submit\" class=\"BRsearchSubmit\">\n <img src=\"".concat(this.br.imagesBaseURL, "icon_search_button.svg\" />\n </button>\n </form>\n ");
994
+ return toolbarSearch;
995
+ }
996
+ /**
997
+ * @param {array} matches
998
+ */
999
+
1000
+ }, {
1001
+ key: "renderPins",
1002
+ value: function renderPins(matches) {
1003
+ var _this3 = this;
1004
+
1005
+ matches.forEach(function (match) {
1006
+ var queryString = match.text;
1007
+
1008
+ var pageIndex = _this3.br.leafNumToIndex(match.par[0].page);
1009
+
1010
+ var pageNumber = _this3.br.getPageNum(pageIndex);
1011
+
1012
+ var uiStringSearch = "Search result"; // i18n
1013
+
1014
+ var uiStringPage = "Page"; // i18n
1015
+
1016
+ var percentThrough = _this3.br.constructor.util.cssPercentage(pageIndex, _this3.br.getNumLeafs() - 1);
1017
+
1018
+ var queryStringWithB = queryString.replace(_this3.matcher, '<b>$1</b>');
1019
+ var queryStringWithBTruncated = '';
1020
+
1021
+ if (queryString.length > 100) {
1022
+ queryStringWithBTruncated = queryString.replace(/^(.{100}[^\s]*).*/, "$1").replace(_this3.matcher, '<b>$1</b>') + '...';
1023
+ } // draw marker
1024
+
1025
+
1026
+ $('<div>').addClass('BRsearch').css({
1027
+ left: percentThrough
1028
+ }).attr('title', uiStringSearch).append("\n <div class=\"BRquery\">\n <div>".concat(queryStringWithBTruncated || queryStringWithB, "</div>\n <div>").concat(uiStringPage, " ").concat(pageNumber, "</div>\n </div>\n ")).data({
1029
+ pageIndex: pageIndex
1030
+ }).appendTo(_this3.br.$('.BRnavline')).on("mouseenter", function (event) {
1031
+ // remove from other markers then turn on just for this
1032
+ // XXX should be done when nav slider moves
1033
+ var marker = event.currentTarget;
1034
+ var tooltip = marker.querySelector('.BRquery');
1035
+ var tooltipOffset = tooltip.getBoundingClientRect();
1036
+ var targetOffset = marker.getBoundingClientRect();
1037
+ var boxSizeAdjust = parseInt(getComputedStyle(tooltip).paddingLeft) * 2;
1038
+
1039
+ if (tooltipOffset.x - boxSizeAdjust < 0) {
1040
+ tooltip.style.setProperty('transform', "translateX(-".concat(targetOffset.left - boxSizeAdjust, "px)"));
1041
+ }
1042
+
1043
+ $('.BRsearch,.BRchapter').removeClass('front');
1044
+ $(event.target).addClass('front');
1045
+ }).on("mouseleave", function (event) {
1046
+ return $(event.target).removeClass('front');
1047
+ }).on("click", function (event) {
1048
+ // closures are nested and deep, using an arrow function breaks references.
1049
+ // Todo: update to arrow function & clean up closures
1050
+ // to remove `bind` dependency
1051
+ this.br._searchPluginGoToResult(+$(event.target).data('pageIndex'));
1052
+ }.bind(_this3));
1053
+ });
1054
+ }
1055
+ /**
1056
+ * @param {boolean} bool
1057
+ */
1058
+
1059
+ }, {
1060
+ key: "toggleSearchPending",
1061
+ value: function toggleSearchPending(bool) {
1062
+ var _this4 = this;
1063
+
1064
+ if (bool) {
1065
+ this.br.showProgressPopup("Search results will appear below...", function () {
1066
+ return _this4.progressPopupClosed();
1067
+ });
1068
+ } else {
1069
+ this.br.removeProgressPopup();
1070
+ }
1071
+ }
1072
+ /**
1073
+ * Primary callback when user cancels search popup
1074
+ */
1075
+
1076
+ }, {
1077
+ key: "progressPopupClosed",
1078
+ value: function progressPopupClosed() {
1079
+ this.toggleSearchPending();
1080
+ this.cancelSearch();
1081
+ }
1082
+ }, {
1083
+ key: "renderErrorModal",
1084
+ value: function renderErrorModal() {
1085
+ var textIsProcessing = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
1086
+ var errorDetails = "".concat(!textIsProcessing ? 'The text may still be processing. ' : '', "Please try again.");
1087
+ this.renderModalMessage("\n Sorry, there was an error with your search.\n <br />\n ".concat(errorDetails, "\n "));
1088
+ this.delayModalRemovalFor(4000);
1089
+ }
1090
+ }, {
1091
+ key: "renderBookNotIndexedModal",
1092
+ value: function renderBookNotIndexedModal() {
1093
+ this.renderModalMessage("\n <p>\n This book hasn't been indexed for searching yet.\n We've just started indexing it, so search should be available soon.\n <br />\n Please try again later. Thanks!\n </p>\n ");
1094
+ this.delayModalRemovalFor(5000);
1095
+ }
1096
+ }, {
1097
+ key: "renderResultsEmptyModal",
1098
+ value: function renderResultsEmptyModal() {
1099
+ this.renderModalMessage('No matches were found.');
1100
+ this.delayModalRemovalFor(2000);
1101
+ }
1102
+ /**
1103
+ * @param {string} messageHTML The innerHTML string used to popupate the modal contents
1104
+ */
1105
+
1106
+ }, {
1107
+ key: "renderModalMessage",
1108
+ value: function renderModalMessage(messageHTML) {
1109
+ var modal = document.createElement('div');
1110
+ modal.classList.add('BRprogresspopup', 'search_modal');
1111
+ modal.innerHTML = messageHTML;
1112
+ document.querySelector(this.br.el).append(modal);
1113
+ }
1114
+ /**
1115
+ * @param {number} timeoutMS
1116
+ */
1117
+
1118
+ }, {
1119
+ key: "delayModalRemovalFor",
1120
+ value: function delayModalRemovalFor(timeoutMS) {
1121
+ setTimeout(this.br.removeProgressPopup.bind(this.br), timeoutMS);
1122
+ }
1123
+ /**
1124
+ * @param {Event} e
1125
+ */
1126
+
1127
+ }, {
1128
+ key: "submitHandler",
1129
+ value: function submitHandler(e) {
1130
+ e.preventDefault();
1131
+ var query = e.target.querySelector('[name="query"]').value;
1132
+
1133
+ if (!query.length) {
1134
+ return false;
1135
+ }
1136
+
1137
+ this.br.search(query);
1138
+ this.emptyMatches();
1139
+ this.toggleSearchPending(true);
1140
+ return false;
1141
+ }
1142
+ /**
1143
+ * @param {Event} e
1144
+ * @param {object} properties
1145
+ * @param {object} properties.results
1146
+ * @param {object} properties.options
1147
+ */
1148
+
1149
+ }, {
1150
+ key: "handleSearchCallback",
1151
+ value: function handleSearchCallback(e, _ref2) {
1152
+ var _this5 = this;
1153
+
1154
+ var results = _ref2.results,
1155
+ options = _ref2.options;
1156
+ this.matches = results.matches;
1157
+ this.setCurrentMatchIndex();
1158
+ this.teardownSearchNavigation();
1159
+ this.renderSearchNavigation();
1160
+ this.bindSearchNavigationEvents();
1161
+ this.renderPins(results.matches);
1162
+ this.toggleSearchPending(false);
1163
+
1164
+ if (options.goToFirstResult) {
1165
+ $(document).one('BookReader:pageChanged', function () {
1166
+ _this5.br.resize();
1167
+ });
1168
+ } else {
1169
+ this.br.resize();
1170
+ }
1171
+ }
1172
+ /**
1173
+ * @param {Event} e
1174
+ */
1175
+
1176
+ }, {
1177
+ key: "handleNavToggledCallback",
1178
+ value: function handleNavToggledCallback(e) {
1179
+ var is_visible = this.br.navigationIsVisible();
1180
+ this.togglePinsFor(is_visible);
1181
+ }
1182
+ }, {
1183
+ key: "handleSearchStarted",
1184
+ value: function handleSearchStarted() {
1185
+ this.emptyMatches();
1186
+ this.br.removeSearchHilites();
1187
+ this.removeResultPins();
1188
+ this.toggleSearchPending(true);
1189
+ this.teardownSearchNavigation();
1190
+ this.setQuery(this.br.searchTerm);
1191
+ }
1192
+ /**
1193
+ * Event listener for: `BookReader:SearchCallbackError`
1194
+ * @param {CustomEvent} event
1195
+ */
1196
+
1197
+ }, {
1198
+ key: "handleSearchCallbackError",
1199
+ value: function handleSearchCallbackError() {
1200
+ var _event$detail, _event$detail$props, _event$detail$props$r;
1201
+
1202
+ var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1203
+ this.toggleSearchPending(false);
1204
+ var isIndexed = event === null || event === void 0 ? void 0 : (_event$detail = event.detail) === null || _event$detail === void 0 ? void 0 : (_event$detail$props = _event$detail.props) === null || _event$detail$props === void 0 ? void 0 : (_event$detail$props$r = _event$detail$props.results) === null || _event$detail$props$r === void 0 ? void 0 : _event$detail$props$r.indexed;
1205
+ this.renderErrorModal(isIndexed);
1206
+ }
1207
+ }, {
1208
+ key: "handleSearchCallbackBookNotIndexed",
1209
+ value: function handleSearchCallbackBookNotIndexed() {
1210
+ this.toggleSearchPending(false);
1211
+ this.renderBookNotIndexedModal();
1212
+ }
1213
+ }, {
1214
+ key: "handleSearchCallbackEmpty",
1215
+ value: function handleSearchCallbackEmpty() {
1216
+ this.toggleSearchPending(false);
1217
+ this.renderResultsEmptyModal();
1218
+ }
1219
+ }, {
1220
+ key: "bindEvents",
1221
+ value: function bindEvents() {
1222
+ var namespace = 'BookReader:';
1223
+ window.addEventListener("".concat(namespace, "SearchCallbackError"), this.handleSearchCallbackError.bind(this));
1224
+ $(document).on("".concat(namespace, "SearchCallback"), this.handleSearchCallback.bind(this)).on("".concat(namespace, "navToggled"), this.handleNavToggledCallback.bind(this)).on("".concat(namespace, "SearchStarted"), this.handleSearchStarted.bind(this)).on("".concat(namespace, "SearchCallbackBookNotIndexed"), this.handleSearchCallbackBookNotIndexed.bind(this)).on("".concat(namespace, "SearchCallbackEmpty"), this.handleSearchCallbackEmpty.bind(this)).on("".concat(namespace, "pageChanged"), this.updateSearchNavigation.bind(this));
1225
+ this.dom.toolbarSearch.querySelector('form').addEventListener('submit', this.submitHandler.bind(this));
1226
+ }
1227
+ }]);
1228
+
1229
+ return SearchView;
1230
+ }();
1231
+
1232
+ /* harmony default export */ __webpack_exports__["default"] = (SearchView);
1233
+
1234
+ /***/ }),
1235
+
1236
+ /***/ "./node_modules/core-js/modules/es.object.entries.js":
1237
+ /*!***********************************************************!*\
1238
+ !*** ./node_modules/core-js/modules/es.object.entries.js ***!
1239
+ \***********************************************************/
1240
+ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
1241
+
1242
+ var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
1243
+ var $entries = __webpack_require__(/*! ../internals/object-to-array */ "./node_modules/core-js/internals/object-to-array.js").entries;
1244
+
1245
+ // `Object.entries` method
1246
+ // https://tc39.es/ecma262/#sec-object.entries
1247
+ $({ target: 'Object', stat: true }, {
1248
+ entries: function entries(O) {
1249
+ return $entries(O);
1250
+ }
1251
+ });
1252
+
1253
+
1254
+ /***/ })
1255
+
1256
+ },
1257
+ /******/ function(__webpack_require__) { // webpackRuntimeModules
1258
+ /******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
1259
+ /******/ var __webpack_exports__ = (__webpack_exec__("./src/plugins/search/plugin.search.js"));
1260
+ /******/ }
1261
+ ]);
2
1262
  //# sourceMappingURL=plugin.search.js.map