@internetarchive/bookreader 5.0.0-7-multiple-files → 5.0.0-70

Sign up to get free protection for your applications and to get access to all the features.
Files changed (319) hide show
  1. package/.eslintrc.js +17 -15
  2. package/.github/workflows/node.js.yml +78 -6
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +416 -1365
  6. package/BookReader/BookReader.js +2 -21564
  7. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1509 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +19 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/1up.svg +1 -12
  13. package/BookReader/icons/2up.svg +1 -15
  14. package/BookReader/icons/advance.svg +3 -26
  15. package/BookReader/icons/chevron-right.svg +1 -1
  16. package/BookReader/icons/close-circle-dark.svg +1 -0
  17. package/BookReader/icons/close-circle.svg +1 -1
  18. package/BookReader/icons/fullscreen.svg +1 -17
  19. package/BookReader/icons/fullscreen_exit.svg +1 -17
  20. package/BookReader/icons/hamburger.svg +1 -15
  21. package/BookReader/icons/left-arrow.svg +1 -12
  22. package/BookReader/icons/magnify-minus.svg +1 -16
  23. package/BookReader/icons/magnify-plus.svg +1 -17
  24. package/BookReader/icons/magnify.svg +1 -15
  25. package/BookReader/icons/pause.svg +1 -23
  26. package/BookReader/icons/play.svg +1 -22
  27. package/BookReader/icons/playback-speed.svg +1 -34
  28. package/BookReader/icons/read-aloud.svg +1 -22
  29. package/BookReader/icons/review.svg +3 -22
  30. package/BookReader/icons/thumbnails.svg +1 -17
  31. package/BookReader/icons/voice.svg +1 -0
  32. package/BookReader/icons/volume-full.svg +1 -22
  33. package/BookReader/images/BRicons.svg +5 -94
  34. package/BookReader/images/books_graphic.svg +1 -177
  35. package/BookReader/images/icon_book.svg +1 -12
  36. package/BookReader/images/icon_bookmark.svg +1 -12
  37. package/BookReader/images/icon_gear.svg +1 -14
  38. package/BookReader/images/icon_hamburger.svg +1 -20
  39. package/BookReader/images/icon_home.svg +1 -21
  40. package/BookReader/images/icon_info.svg +1 -11
  41. package/BookReader/images/icon_one_page.svg +1 -8
  42. package/BookReader/images/icon_pause.svg +1 -1
  43. package/BookReader/images/icon_play.svg +1 -1
  44. package/BookReader/images/icon_playback-rate.svg +1 -15
  45. package/BookReader/images/icon_search_button.svg +1 -8
  46. package/BookReader/images/icon_share.svg +1 -9
  47. package/BookReader/images/icon_skip-ahead.svg +1 -6
  48. package/BookReader/images/icon_skip-back.svg +2 -13
  49. package/BookReader/images/icon_speaker.svg +1 -18
  50. package/BookReader/images/icon_speaker_open.svg +1 -10
  51. package/BookReader/images/icon_thumbnails.svg +1 -12
  52. package/BookReader/images/icon_toc.svg +1 -5
  53. package/BookReader/images/icon_two_pages.svg +1 -9
  54. package/BookReader/images/marker_chap-off.svg +1 -11
  55. package/BookReader/images/marker_chap-on.svg +1 -11
  56. package/BookReader/images/marker_srch-on.svg +1 -11
  57. package/BookReader/jquery-3.js +2 -0
  58. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  59. package/BookReader/plugins/plugin.archive_analytics.js +1 -172
  60. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  61. package/BookReader/plugins/plugin.autoplay.js +1 -165
  62. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  63. package/BookReader/plugins/plugin.chapters.js +22 -301
  64. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  65. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  66. package/BookReader/plugins/plugin.iframe.js +1 -74
  67. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  68. package/BookReader/plugins/plugin.resume.js +1 -368
  69. package/BookReader/plugins/plugin.resume.js.map +1 -1
  70. package/BookReader/plugins/plugin.search.js +2 -1420
  71. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  72. package/BookReader/plugins/plugin.search.js.map +1 -1
  73. package/BookReader/plugins/plugin.text_selection.js +2 -1080
  74. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  75. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  76. package/BookReader/plugins/plugin.tts.js +2 -9193
  77. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  78. package/BookReader/plugins/plugin.tts.js.map +1 -1
  79. package/BookReader/plugins/plugin.url.js +1 -269
  80. package/BookReader/plugins/plugin.url.js.map +1 -1
  81. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
  82. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  83. package/BookReader/webcomponents-bundle.js +3 -0
  84. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  85. package/BookReader/webcomponents-bundle.js.map +1 -0
  86. package/BookReaderDemo/BookReaderDemo.css +16 -19
  87. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
  88. package/BookReaderDemo/BookReaderJSAutoplay.js +4 -1
  89. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  90. package/BookReaderDemo/IADemoBr.js +147 -0
  91. package/BookReaderDemo/demo-advanced.html +2 -2
  92. package/BookReaderDemo/demo-autoplay.html +2 -3
  93. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  94. package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
  95. package/BookReaderDemo/demo-fullscreen.html +2 -4
  96. package/BookReaderDemo/demo-iiif.html +2 -1
  97. package/BookReaderDemo/demo-iiif.js +0 -1
  98. package/BookReaderDemo/demo-internetarchive.html +213 -17
  99. package/BookReaderDemo/demo-multiple.html +2 -1
  100. package/BookReaderDemo/demo-preview-pages.html +2 -1
  101. package/BookReaderDemo/demo-simple.html +2 -1
  102. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -4
  103. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  104. package/BookReaderDemo/immersion-1up.html +2 -2
  105. package/BookReaderDemo/immersion-mode.html +2 -4
  106. package/BookReaderDemo/toggle_controls.html +3 -2
  107. package/BookReaderDemo/view_mode.html +2 -1
  108. package/BookReaderDemo/viewmode-cycle.html +2 -3
  109. package/CHANGELOG.md +289 -0
  110. package/README.md +14 -1
  111. package/babel.config.js +20 -0
  112. package/codecov.yml +6 -0
  113. package/index.html +4 -1
  114. package/jsconfig.json +19 -0
  115. package/netlify.toml +9 -0
  116. package/package.json +71 -60
  117. package/renovate.json +52 -0
  118. package/scripts/preversion.js +4 -1
  119. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  120. package/src/BookNavigator/assets/button-base.js +9 -2
  121. package/src/BookNavigator/assets/ia-logo.js +17 -0
  122. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  123. package/src/BookNavigator/assets/icon_close.js +1 -1
  124. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  125. package/src/BookNavigator/assets/{icon_sort_ascending.js → icon_sort_desc.js} +2 -2
  126. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  127. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  128. package/src/BookNavigator/book-navigator.js +586 -0
  129. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  130. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  131. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  132. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
  133. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  134. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  135. package/src/BookNavigator/delete-modal-actions.js +1 -1
  136. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  137. package/src/BookNavigator/downloads/downloads.js +41 -25
  138. package/src/BookNavigator/search/search-provider.js +80 -28
  139. package/src/BookNavigator/search/search-results.js +28 -25
  140. package/src/BookNavigator/sharing.js +27 -0
  141. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
  142. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  143. package/src/BookNavigator/volumes/volumes-provider.js +88 -53
  144. package/src/BookNavigator/volumes/volumes.js +41 -14
  145. package/src/BookReader/BookModel.js +64 -34
  146. package/src/BookReader/DragScrollable.js +233 -0
  147. package/src/BookReader/Mode1Up.js +56 -351
  148. package/src/BookReader/Mode1UpLit.js +388 -0
  149. package/src/BookReader/Mode2Up.js +73 -1318
  150. package/src/BookReader/Mode2UpLit.js +776 -0
  151. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  152. package/src/BookReader/ModeSmoothZoom.js +312 -0
  153. package/src/BookReader/ModeThumb.js +18 -12
  154. package/src/BookReader/Navbar/Navbar.js +12 -38
  155. package/src/BookReader/PageContainer.js +81 -6
  156. package/src/BookReader/ReduceSet.js +1 -1
  157. package/src/BookReader/Toolbar/Toolbar.js +10 -37
  158. package/src/BookReader/events.js +2 -3
  159. package/src/BookReader/options.js +24 -2
  160. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  161. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  162. package/src/BookReader/utils/SelectionObserver.js +43 -0
  163. package/src/BookReader/utils.js +118 -13
  164. package/src/BookReader.js +446 -1062
  165. package/src/assets/icons/close-circle-dark.svg +1 -0
  166. package/src/assets/icons/magnify-minus.svg +3 -7
  167. package/src/assets/icons/magnify-plus.svg +3 -7
  168. package/src/assets/icons/voice.svg +1 -0
  169. package/src/css/BookReader.scss +1 -17
  170. package/src/css/_BRBookmarks.scss +1 -1
  171. package/src/css/_BRComponent.scss +1 -1
  172. package/src/css/_BRmain.scss +33 -24
  173. package/src/css/_BRnav.scss +11 -38
  174. package/src/css/_BRpages.scss +149 -40
  175. package/src/css/_BRsearch.scss +67 -226
  176. package/src/css/_TextSelection.scss +87 -27
  177. package/src/css/_colorbox.scss +2 -2
  178. package/src/css/_controls.scss +20 -7
  179. package/src/css/_icons.scss +7 -1
  180. package/src/ia-bookreader/ia-bookreader.js +224 -0
  181. package/src/plugins/plugin.archive_analytics.js +3 -3
  182. package/src/plugins/plugin.autoplay.js +5 -11
  183. package/src/plugins/plugin.chapters.js +211 -186
  184. package/src/plugins/plugin.resume.js +3 -3
  185. package/src/plugins/plugin.text_selection.js +464 -134
  186. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  187. package/src/plugins/search/plugin.search.js +175 -120
  188. package/src/plugins/search/utils.js +43 -0
  189. package/src/plugins/search/view.js +64 -202
  190. package/src/plugins/tts/AbstractTTSEngine.js +68 -40
  191. package/src/plugins/tts/FestivalTTSEngine.js +13 -14
  192. package/src/plugins/tts/PageChunk.js +15 -21
  193. package/src/plugins/tts/PageChunkIterator.js +8 -12
  194. package/src/plugins/tts/WebTTSEngine.js +87 -71
  195. package/src/plugins/tts/plugin.tts.js +95 -126
  196. package/src/plugins/tts/utils.js +0 -25
  197. package/src/plugins/url/UrlPlugin.js +191 -0
  198. package/src/plugins/{plugin.url.js → url/plugin.url.js} +45 -16
  199. package/src/util/browserSniffing.js +22 -0
  200. package/src/util/docCookies.js +21 -2
  201. package/tests/e2e/README.md +37 -0
  202. package/tests/e2e/autoplay.test.js +2 -2
  203. package/tests/e2e/base.test.js +8 -16
  204. package/tests/e2e/helpers/base.js +53 -48
  205. package/tests/e2e/helpers/debug.js +1 -1
  206. package/tests/e2e/helpers/params.js +17 -0
  207. package/tests/e2e/helpers/rightToLeft.js +8 -14
  208. package/tests/e2e/helpers/search.js +73 -0
  209. package/tests/e2e/models/Navigation.js +20 -37
  210. package/tests/e2e/rightToLeft.test.js +4 -5
  211. package/tests/e2e/viewmode.test.js +40 -33
  212. package/tests/jest/BookNavigator/book-navigator.test.js +658 -0
  213. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  214. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  215. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  216. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  217. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  218. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  219. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  220. package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +109 -60
  221. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  222. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  223. package/tests/jest/BookNavigator/volumes/volumes-provider.test.js +184 -0
  224. package/tests/jest/BookNavigator/volumes/volumes.test.js +97 -0
  225. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  226. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  227. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  228. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  229. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  230. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  231. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  232. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  233. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  234. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +10 -10
  235. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
  236. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  237. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  238. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  239. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  240. package/tests/jest/BookReader/utils/SelectionObserver.test.js +43 -0
  241. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  242. package/tests/jest/BookReader/utils.test.js +229 -0
  243. package/tests/jest/BookReader.keyboard.test.js +190 -0
  244. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  245. package/tests/{BookReader.test.js → jest/BookReader.test.js} +26 -37
  246. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  247. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
  248. package/tests/jest/plugins/plugin.chapters.test.js +145 -0
  249. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  250. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  251. package/tests/jest/plugins/plugin.text_selection.test.js +317 -0
  252. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  253. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +26 -47
  254. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +39 -6
  255. package/tests/jest/plugins/search/utils.js +25 -0
  256. package/tests/jest/plugins/search/utils.test.js +29 -0
  257. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +29 -9
  258. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  259. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  260. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  261. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  262. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  263. package/tests/jest/plugins/url/UrlPlugin.test.js +198 -0
  264. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +53 -14
  265. package/tests/jest/setup.js +3 -0
  266. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  267. package/tests/jest/util/docCookies.test.js +24 -0
  268. package/tests/{util → jest/util}/strings.test.js +1 -1
  269. package/tests/{utils.js → jest/utils.js} +38 -0
  270. package/webpack.config.js +11 -6
  271. package/.babelrc +0 -12
  272. package/.dependabot/config.yml +0 -6
  273. package/.testcaferc.json +0 -5
  274. package/BookReader/bookreader-component-bundle.js +0 -14311
  275. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  276. package/BookReader/bookreader-component-bundle.js.map +0 -1
  277. package/BookReader/icons/sort-ascending.svg +0 -1
  278. package/BookReader/icons/sort-descending.svg +0 -1
  279. package/BookReader/jquery-1.10.1.js +0 -108
  280. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  281. package/BookReader/plugins/plugin.menu_toggle.js +0 -369
  282. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  283. package/BookReader/plugins/plugin.mobile_nav.js +0 -335
  284. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  285. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  286. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  287. package/karma.conf.js +0 -23
  288. package/src/BookNavigator/BookModel.js +0 -14
  289. package/src/BookNavigator/BookNavigator.js +0 -452
  290. package/src/BookNavigator/assets/book-loader.js +0 -27
  291. package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
  292. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  293. package/src/BookNavigator/search/a-search-result.js +0 -55
  294. package/src/BookReader/DebugConsole.js +0 -54
  295. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  296. package/src/ItemNavigator/ItemNavigator.js +0 -372
  297. package/src/ItemNavigator/providers/sharing.js +0 -29
  298. package/src/assets/icons/sort-ascending.svg +0 -1
  299. package/src/assets/icons/sort-descending.svg +0 -1
  300. package/src/css/_MobileNav.scss +0 -194
  301. package/src/dragscrollable-br.js +0 -261
  302. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  303. package/src/plugins/plugin.mobile_nav.js +0 -287
  304. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  305. package/tests/BookReader/DebugConsole.test.js +0 -25
  306. package/tests/BookReader/Mode1Up.test.js +0 -164
  307. package/tests/BookReader/Mode2Up.test.js +0 -247
  308. package/tests/BookReader/utils.test.js +0 -109
  309. package/tests/e2e/helpers/desktopSearch.js +0 -72
  310. package/tests/e2e/helpers/mobileSearch.js +0 -85
  311. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  312. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  313. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  314. package/tests/karma/BookNavigator/volumes.test.js +0 -101
  315. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  316. package/tests/plugins/plugin.chapters.test.js +0 -130
  317. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  318. package/tests/plugins/plugin.text_selection.test.js +0 -203
  319. package/tests/util/docCookies.test.js +0 -15
@@ -1,34 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>bookreader demo</title>
5
-
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
7
- <meta name="apple-mobile-web-app-capable" content="yes">
8
-
9
- <!-- JS dependencies -->
10
- <script src="../BookReader/jquery-1.10.1.js"></script>
11
-
12
-
13
- <!-- BookReader and plugins -->
14
- <link rel="stylesheet" href="../BookReader/BookReader.css"/>
15
- <script src="../BookReader/BookReader.js"></script>
16
- <script type="text/javascript" src="../BookReader/plugins/plugin.url.js"></script>
17
- <script type="text/javascript" src="../BookReader/plugins/plugin.menu_toggle.js"></script>
18
-
19
- <!-- Custom CSS overrides -->
20
- <link rel="stylesheet" href="BookReaderDemo.css"/>
21
- </head>
22
- <body>
23
- <div id="BookReader">
24
- Internet Archive BookReader Demo<br/>
25
- plugin: Fullscreen menu toggle<br/>
26
- <noscript>
27
- <p>
28
- The BookReader requires JavaScript to be enabled. Please check that your browser supports JavaScript and that it is enabled in the browser settings. You can also try one of the <a href="https://archive.org/details/goodytwoshoes00newyiala"> other formats of the book</a>.
29
- </p>
30
- </noscript>
31
- </div>
32
- <script type="text/javascript" src="BookReaderJSAdvanced.js"></script>
33
- </body>
34
- </html>
package/karma.conf.js DELETED
@@ -1,23 +0,0 @@
1
- const { createDefaultConfig } = require('@open-wc/testing-karma');
2
- const merge = require('deepmerge');
3
-
4
- module.exports = (config) => {
5
- config.set(
6
- merge(createDefaultConfig(config), {
7
- files: [
8
- // runs all files ending with .test in the test folder,
9
- // can be overwritten by passing a --grep flag. examples:
10
- //
11
- // npm run test -- --grep test/foo/bar.test.js
12
- // npm run test -- --grep test/bar/*
13
- { pattern: config.grep ? config.grep : 'tests/karma/**/*.test.js', type: 'module' },
14
- ],
15
-
16
- esm: {
17
- nodeResolve: true,
18
- },
19
- // you can overwrite/extend the config further
20
- }),
21
- );
22
- return config;
23
- };
@@ -1,14 +0,0 @@
1
- export class Book {
2
- constructor() {
3
- this.metadata = {};
4
- this.isRestricted = null;
5
- }
6
-
7
- setMetadata(itemMetadata) {
8
- this.metadata = itemMetadata;
9
- }
10
-
11
- setRestriction(isRestricted) {
12
- this.isRestricted = isRestricted;
13
- }
14
- }
@@ -1,452 +0,0 @@
1
- import { css, html, LitElement } from 'lit-element';
2
- import { nothing } from 'lit-html';
3
- import SearchProvider from './search/search-provider.js';
4
- import DownloadProvider from './downloads/downloads-provider.js';
5
- import VisualAdjustmentProvider from './visual-adjustments/visual-adjustments-provider.js';
6
- import BookmarksProvider from './bookmarks/bookmarks-provider.js';
7
- import SharingProvider from '../ItemNavigator/providers/sharing.js';
8
- import VolumesProvider from './volumes/volumes-provider.js';
9
- import BRFullscreenMgr from './br-fullscreen-mgr.js';
10
- import { Book } from './BookModel.js';
11
- import bookLoader from './assets/book-loader.js';
12
-
13
- const events = {
14
- menuUpdated: 'menuUpdated',
15
- updateSideMenu: 'updateSideMenu',
16
- PostInit: 'PostInit',
17
- ViewportInFullScreen: 'ViewportInFullScreen',
18
- };
19
- export class BookNavigator extends LitElement {
20
- static get properties() {
21
- return {
22
- book: { type: Object },
23
- pageContainerSelector: { type: String },
24
- brWidth: { type: Number },
25
- bookReaderLoaded: { type: Boolean },
26
- bookreader: { type: Object },
27
- downloadableTypes: { type: Array },
28
- isAdmin: { type: Boolean },
29
- lendingInitialized: { type: Boolean },
30
- lendingStatus: { type: Object },
31
- menuProviders: { type: Object },
32
- menuShortcuts: { type: Array },
33
- sideMenuOpen: { type: Boolean },
34
- signedIn: { type: Boolean },
35
- };
36
- }
37
-
38
- constructor() {
39
- super();
40
- this.book = {};
41
- this.pageContainerSelector = '.BRcontainer';
42
- this.brWidth = 0;
43
- this.bookReaderCannotLoad = false;
44
- this.bookReaderLoaded = false;
45
- this.bookreader = null;
46
- this.downloadableTypes = [];
47
- this.isAdmin = false;
48
- this.lendingInitialized = false;
49
- this.lendingStatus = {};
50
- this.menuProviders = {};
51
- this.menuShortcuts = [];
52
- this.sideMenuOpen = false;
53
- this.signedIn = false;
54
-
55
- // Untracked properties
56
- this.fullscreenMgr = null;
57
- this.brResizeObserver = null;
58
- this.model = new Book();
59
- this.shortcutOrder = ['volumes', 'search', 'bookmarks'];
60
- }
61
-
62
- firstUpdated() {
63
- this.model.setMetadata(this.book);
64
- this.bindEventListeners();
65
- this.emitPostInit();
66
- }
67
-
68
- updated(changed) {
69
- if (!this.bookreader) {
70
- return;
71
- }
72
- const isFirstSideMenuUpdate = changed.has('sideMenuOpen') && (changed.get('sideMenuOpen') === undefined);
73
- if (!isFirstSideMenuUpdate) {
74
- // realign image
75
- if (this.bookreader.animating) {
76
- return;
77
- }
78
- this.bookreader.resize();
79
- const curIndex = this.bookreader.currentIndex();
80
- this.bookreader.jumpToIndex(curIndex);
81
- }
82
- }
83
-
84
- /**
85
- * Global event emitter for when Book Navigator loads
86
- */
87
- emitPostInit() {
88
- // emit global event when book nav has loaded with current bookreader selector
89
- this.dispatchEvent(new CustomEvent(`BrBookNav:${events.PostInit}`, {
90
- detail: { brSelector: this.bookreader?.el },
91
- bubbles: true,
92
- composed: true,
93
- }));
94
- }
95
-
96
- /**
97
- * Instantiates books submenus & their update callbacks
98
- *
99
- * NOTE: we are doing our best to scope bookreader's instance.
100
- * If your submenu provider uses a bookreader instance to read, manually
101
- * manipulate BookReader, please update the navigator's instance of it
102
- * to keep it in sync.
103
- */
104
- initializeBookSubmenus() {
105
- const bookreaderOptions = {...this.bookreader.options.multipleFilesList, baseHost: this.baseHost}
106
- this.menuProviders = {
107
- search: new SearchProvider(
108
- (brInstance = null) => {
109
- if (brInstance) {
110
- /* refresh br instance reference */
111
- this.bookreader = brInstance;
112
- }
113
- this.updateMenuContents();
114
- if (this.brWidth >= 640) { /* open side search menu */
115
- this.openSideSearchMenu();
116
- }
117
- },
118
- this.bookreader,
119
- ),
120
- downloads: new DownloadProvider(),
121
- visualAdjustments: new VisualAdjustmentProvider({
122
- onOptionChange: (event, brInstance = null) => {
123
- if (brInstance) {
124
- /* refresh br instance reference */
125
- this.bookreader = brInstance;
126
- }
127
- this.updateMenuContents();
128
- },
129
- bookContainerSelector: this.pageContainerSelector,
130
- bookreader: this.bookreader,
131
- }),
132
- share: new SharingProvider(this.book.metadata, this.baseHost, this.itemType),
133
- bookmarks: new BookmarksProvider(this.bookmarksOptions, this.bookreader),
134
- };
135
-
136
- // add shortcut for volumes if multipleBooksList exists
137
- if (this.bookreader.options.enableMultipleBooks) {
138
- this.menuProviders.volumes = new VolumesProvider((brInstance) => {
139
- if (brInstance) {
140
- /* refresh br instance reference */
141
- this.bookreader = brInstance;
142
- }
143
- this.updateMenuContents()
144
- }, bookreaderOptions, this.bookreader)
145
- this.addMenuShortcut('volumes')
146
- }
147
-
148
- this.addMenuShortcut('search'); /* start with search as a shortcut */
149
- this.updateMenuContents();
150
- }
151
-
152
- /** gets element that houses the bookreader in light dom */
153
- get mainBRContainer() {
154
- return document.querySelector(this.bookreader.el);
155
- }
156
-
157
- get bookmarksOptions() {
158
- const referrerStr = `referer=${encodeURIComponent(location.href)}`
159
- return {
160
- loginUrl: `https://${this.baseHost}/account/login?${referrerStr}`,
161
- displayMode: this.signedIn ? 'bookmarks' : 'login',
162
- showItemNavigatorModal: this.showItemNavigatorModal.bind(this),
163
- closeItemNavigatorModal: this.closeItemNavigatorModal.bind(this),
164
- onBookmarksChanged: (bookmarks) => {
165
- const method = Object.keys(bookmarks).length ? 'add' : 'remove';
166
- this[`${method}MenuShortcut`]('bookmarks');
167
- this.updateMenuContents();
168
- },
169
- };
170
- }
171
-
172
- /**
173
- * Open side search menu
174
- */
175
- openSideSearchMenu() {
176
- const event = new CustomEvent(
177
- events.updateSideMenu, {
178
- detail: { menuId: 'search', action: 'open' },
179
- },
180
- );
181
- this.dispatchEvent(event);
182
- }
183
-
184
- /**
185
- * Sets order of menu and emits custom event when done
186
- */
187
- updateMenuContents() {
188
- const {
189
- search, downloads, visualAdjustments, share, bookmarks, volumes
190
- } = this.menuProviders;
191
- const availableMenus = [volumes, search, bookmarks, visualAdjustments, share].filter((menu) => !!menu);
192
-
193
- if (this.shouldShowDownloadsMenu()) {
194
- downloads.update(this.downloadableTypes);
195
- availableMenus.splice(1, 0, downloads);
196
- }
197
-
198
- const event = new CustomEvent(
199
- events.menuUpdated, {
200
- detail: availableMenus,
201
- },
202
- );
203
- this.dispatchEvent(event);
204
- }
205
-
206
- /**
207
- * Confirms if we should show the downloads menu
208
- * @returns {bool}
209
- */
210
- shouldShowDownloadsMenu() {
211
- if (this.model.isRestricted === false) { return true; }
212
- if (this.isAdmin) { return true; }
213
- const { user_loan_record = {} } = this.lendingStatus;
214
- const hasNoLoanRecord = Array.isArray(user_loan_record); /* (bc PHP assoc. arrays) */
215
-
216
- if (hasNoLoanRecord) { return false; }
217
-
218
- const hasValidLoan = user_loan_record.type && (user_loan_record.type !== 'SESSION_LOAN');
219
- return hasValidLoan;
220
- }
221
-
222
- /**
223
- * Adds a provider object to the menuShortcuts array property if it isn't
224
- * already added. menuShortcuts are then sorted by shortcutOrder and
225
- * a menuShortcutsUpdated event is emitted.
226
- *
227
- * @param {string} menuId - a string matching the id property of a provider
228
- */
229
- addMenuShortcut(menuId) {
230
- if (this.menuShortcuts.find((m) => m.id === menuId)) { return; }
231
-
232
- this.menuShortcuts.push(this.menuProviders[menuId]);
233
- this.sortMenuShortcuts();
234
- this.emitMenuShortcutsUpdated();
235
- }
236
-
237
- /**
238
- * Removes a provider object from the menuShortcuts array and emits a
239
- * menuShortcutsUpdated event.
240
- *
241
- * @param {string} menuId - a string matching the id property of a provider
242
- */
243
- removeMenuShortcut(menuId) {
244
- this.menuShortcuts = this.menuShortcuts.filter((m) => m.id !== menuId);
245
- this.emitMenuShortcutsUpdated();
246
- }
247
-
248
- /**
249
- * Sorts the menuShortcuts property by comparing each provider's id to
250
- * the id in each iteration over the shortcutOrder array.
251
- */
252
- sortMenuShortcuts() {
253
- this.menuShortcuts = this.shortcutOrder.reduce((shortcuts, id) => {
254
- const menu = this.menuShortcuts.find((m) => m.id === id);
255
- if (menu) { shortcuts.push(menu); }
256
- return shortcuts;
257
- }, []);
258
- }
259
-
260
- emitMenuShortcutsUpdated() {
261
- const event = new CustomEvent('menuShortcutsUpdated', {
262
- detail: this.menuShortcuts,
263
- });
264
- this.dispatchEvent(event);
265
- }
266
-
267
- /**
268
- * Core bookreader event handler registry
269
- *
270
- * NOTE: we are trying to keep bookreader's instance in scope
271
- * Please update Book Navigator's instance reference of it to keep it current
272
- */
273
- bindEventListeners() {
274
- window.addEventListener('BookReader:PostInit', (e) => {
275
- this.bookreader = e.detail.props;
276
- this.bookReaderLoaded = true;
277
- this.bookReaderCannotLoad = false;
278
- this.fullscreenMgr = new BRFullscreenMgr(this.bookreader.el);
279
-
280
- this.initializeBookSubmenus();
281
- setTimeout(() => this.bookreader.resize(), 0);
282
- this.brResizeObserver = new ResizeObserver((elements) => this.reactToBrResize(elements));
283
- this.brResizeObserver.observe(this.mainBRContainer);
284
- });
285
- window.addEventListener('BookReader:fullscreenToggled', (event) => {
286
- const { detail: { props: brInstance = null } } = event;
287
- if (brInstance) {
288
- this.bookreader = brInstance;
289
- }
290
- this.manageFullScreenBehavior(event);
291
- }, { passive: true });
292
- window.addEventListener('BookReader:ToggleSearchMenu', (event) => {
293
- this.dispatchEvent(new CustomEvent(events.updateSideMenu, {
294
- detail: { menuId: 'search', action: 'toggle' },
295
- }));
296
- });
297
- window.addEventListener('LendingFlow:PostInit', ({ detail }) => {
298
- const {
299
- downloadTypesAvailable, lendingStatus, isAdmin, previewType,
300
- } = detail;
301
- this.lendingInitialized = true;
302
- this.downloadableTypes = downloadTypesAvailable;
303
- this.lendingStatus = lendingStatus;
304
- this.isAdmin = isAdmin;
305
- this.bookReaderCannotLoad = previewType === 'singlePagePreview';
306
- });
307
- window.addEventListener('BRJSIA:PostInit', ({ detail }) => {
308
- const { isRestricted, downloadURLs } = detail;
309
- this.bookReaderLoaded = true;
310
- this.downloadableTypes = downloadURLs;
311
- this.model.setRestriction(isRestricted);
312
- });
313
- }
314
-
315
- /**
316
- * Uses resize observer to fire BookReader's `resize` functionality
317
- * We do not want to trigger resize IF:
318
- * - book animation is happening
319
- * - book is in fullscreen (fullscreen is handled separately)
320
- *
321
- * @param { Object } entries - resize observer entries
322
- */
323
- reactToBrResize(entries = []) {
324
- const startBrWidth = this.brWidth;
325
- const { animating } = this.bookreader;
326
-
327
- entries.forEach(({ contentRect, target }) => {
328
- if (target === this.mainBRContainer) {
329
- this.brWidth = contentRect.width;
330
- }
331
- });
332
- setTimeout(() => {
333
- if (startBrWidth && !animating) {
334
- this.bookreader.resize();
335
- }
336
- }, 0);
337
- }
338
-
339
- /**
340
- * Manages Fullscreen behavior
341
- * This makes sure that controls are _always_ in view
342
- * We need this to accommodate LOAN BAR during fullscreen
343
- */
344
- manageFullScreenBehavior() {
345
- this.emitFullScreenState();
346
-
347
- if (!this.bookreader.isFullscreen()) {
348
- this.fullscreenMgr.teardown();
349
- } else {
350
- this.fullscreenMgr.setup(this.bookreader);
351
- }
352
- }
353
-
354
- /**
355
- * Intercepts and relays fullscreen toggle events
356
- */
357
- emitFullScreenState() {
358
- const isFullScreen = this.bookreader.isFullscreen();
359
- const event = new CustomEvent('ViewportInFullScreen', {
360
- detail: { isFullScreen },
361
- });
362
- this.dispatchEvent(event);
363
- }
364
-
365
- emitShowItemNavigatorModal(e) {
366
- this.dispatchEvent(new CustomEvent('showItemNavigatorModal', {
367
- detail: e.detail,
368
- }));
369
- }
370
-
371
- emitCloseItemNavigatorModal() {
372
- this.dispatchEvent(new CustomEvent('closeItemNavigatorModal'));
373
- }
374
-
375
- showItemNavigatorModal(e) {
376
- this.emitShowItemNavigatorModal(e);
377
- }
378
-
379
- closeItemNavigatorModal() {
380
- this.emitCloseItemNavigatorModal();
381
- }
382
-
383
- get loader() {
384
- const loader = html`
385
- <div class="book-loader">${bookLoader}<div>
386
- <h3>Loading viewer</h3>
387
- `;
388
- return !this.bookReaderLoaded ? loader : nothing;
389
- }
390
-
391
- get loadingClass() {
392
- return !this.bookReaderLoaded ? 'loading' : '';
393
- }
394
-
395
- get itemImage() {
396
- const url = `https://${this.baseHost}/services/img/${this.book.metadata.identifier}`;
397
- return html`<img src="${url}" alt="cover image for ${this.book.metadata.identifier}">`;
398
- }
399
-
400
- render() {
401
- const placeholder = this.bookReaderCannotLoad ? this.itemImage : this.loader;
402
- return html`<div id="book-navigator" class="${this.loadingClass}">
403
- ${placeholder}
404
- <slot name="bookreader"></slot>
405
- </div>
406
- `;
407
- }
408
-
409
- static get styles() {
410
- return css`
411
- #book-navigator.loading {
412
- display: flex;
413
- align-items: center;
414
- justify-content: center;
415
- min-height: 30vh;
416
- }
417
-
418
- #book-navigator .book-loader {
419
- width: 30%;
420
- margin: auto;
421
- text-align: center;
422
- color: var(--primaryTextColor);
423
- }
424
-
425
- .book-loader svg {
426
- display: block;
427
- width: 60%;
428
- max-width: 100px;
429
- height: auto;
430
- margin: auto;
431
- }
432
-
433
- svg * {
434
- fill: var(--primaryTextColor);
435
- }
436
-
437
- svg .ring {
438
- animation: rotate 1.3s infinite linear;
439
- transform-origin: 50px 50px;
440
- transform-box: fill-box;
441
- }
442
-
443
- @keyframes rotate {
444
- 0% {
445
- transform: rotate(-360deg);
446
- }
447
- }
448
- `
449
- }
450
- }
451
-
452
- customElements.define('book-navigator', BookNavigator);
@@ -1,27 +0,0 @@
1
- import { html } from 'lit-element';
2
-
3
- export default html`
4
- <svg
5
- height="100"
6
- viewBox="0 0 100 100"
7
- width="100"
8
- xmlns="http://www.w3.org/2000/svg"
9
- aria-labelledby="bookreader-loading"
10
- >
11
- <title id="bookreader-loading">Currently loading viewer.</title>
12
- <desc>Please wait while we load book reader.</desc>
13
- <g fill="#333" fill-rule="evenodd" class="book-icon">
14
- <g transform="matrix(1 0 0 -1 28 67.362264)">
15
- <path d="m44.71698 31.6981124v-29.99320678s-18.0956599.30735848-18.6322637-.7171698c-.0633962-.12226414-1.890566-.59207545-2.9745282-.59207545-1.3228302 0-3.5122641 0-4.1286791.74547168-.9707547 1.17452827-18.82811278.71660375-18.82811278.71660375v30.040754l1.83849052.7867924.29094339-28.48188608s15.94981097.15339622 17.09094297-1.10716978c.8145283-.90056602 4.997547-.91641507 5.3450942-.3526415.9611321 1.55716977 14.7101883 1.31716978 17.6077354 1.45981128l.3266038 28.22830118z"/>
16
- <path d="m40.1129424 33.5957539h-12.8337733c-1.8690565 0-3.1098112-.7545283-3.9299999-1.6279245v-26.70452764l1.2362264-.00792453c.4584906.72962262 3.0922641 1.39415091 3.0922641 1.39415091h10.1298111s1.0381131.01754717 1.5141509.47377357c.5643396.54056602.7913207 1.36981129.7913207 1.36981129z"/>
17
- <path d="m17.3354713 33.5957539h-12.8337733v-25.37660316s0-.75283017.49358489-1.14113205c.52867924-.41433961 1.3415094-.42849055 1.3415094-.42849055h10.59905631s2.2075471-.52698112 3.0928301-1.39415091l1.2.00792453v26.74245214c-.8201886.8581132-2.0530188 1.59-3.8932074 1.59"/>
18
- </g>
19
- <path
20
- class="ring"
21
- d="m17.8618849 11.6970233c18.5864635-15.59603144 45.6875867-15.59603102 64.2740497.000001 1.9271446 1.6170806 2.1785128 4.4902567.5614466 6.4174186-1.6170661 1.9271618-4.4902166 2.1785323-6.4173612.5614517-15.1996922-12.75416882-37.3625282-12.75416916-52.5622206-.000001-15.19969387 12.7541707-19.04823077 34.5805019-9.1273354 51.7641499 9.9208955 17.183646 30.7471499 24.7638499 49.3923323 17.9774983 18.6451823-6.7863521 29.7266014-25.9801026 26.2811129-45.5206248-.436848-2.4775114 1.2174186-4.8400696 3.6949079-5.2769215 2.4774893-.4368518 4.8400264 1.2174296 5.2768744 3.694941 4.2132065 23.8945096-9.3373563 47.3649806-32.137028 55.6634567-22.799672 8.2984758-48.2663986-.9707372-60.39785211-21.9832155-12.1314534-21.012481-7.42539173-47.7021198 11.16107351-63.2981544z"
22
- fill-rule="nonzero"
23
- />
24
- </g>
25
- </svg>
26
- `;
27
-
@@ -1,5 +0,0 @@
1
- import { html } from 'lit-html';
2
-
3
- export default html`
4
- <svg name="descending" height="18" viewBox="0 0 18 18" width="18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m2.32514544 8.30769231.7756949-2.08468003h2.92824822l.75630252 2.08468003h1.01809955l-2.70523594-6.92307693h-1.01809955l-2.69553976 6.92307693zm3.41305753-2.86037492h-2.34647705l1.17323853-3.22883h.01939237z" fill="#fff" fill-rule="nonzero"/><path d="m7.1689722 16.6153846v-.7756949h-4.4117647l4.29541047-5.3716871v-.77569491h-5.06140918v.77569491h3.97543633l-4.30510666 5.3716871v.7756949z" fill="#fff" fill-rule="nonzero"/><path d="m10.3846154 11.0769231 2.7692308 5.5384615 2.7692307-5.5384615m-2.7692307 4.1538461v-13.15384612" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.661538" transform="matrix(1 0 0 -1 0 18.692308)"/></g></svg>
5
- `;
@@ -1,83 +0,0 @@
1
- import Debouncer from '../util/debouncer';
2
-
3
- /**
4
- * Manages fullscreen size
5
- * so that bookreader chrome is always visible
6
- * This is a shim to hold us until we update loan bar
7
- * https://drive.google.com/drive/folders/1Ym9FDMZPiM4EbNh3NU-_2h8kizIYaLWt
8
- */
9
- export default class BRFullscreenMgr {
10
- constructor(brSelector = '#BookReader') {
11
- this.debounceTime = 250;
12
- this.savedScrollY = 0;
13
- this.savedScrollX = 0;
14
- this.brSelector = brSelector;
15
-
16
- this.setup = this.setup.bind(this);
17
- this.teardown = this.teardown.bind(this);
18
- this.resizeBookReaderContainer = this.resizeBookReaderContainer.bind(this);
19
-
20
- this.handleResizeEvent = this.handleResizeEvent.bind(this);
21
-
22
- this.handleBookReaderHeight = new Debouncer(
23
- this.resizeBookReaderContainer, this.debounceTime, this,
24
- );
25
- }
26
-
27
- get brDom() {
28
- return document.querySelector(this.brSelector);
29
- }
30
-
31
- /**
32
- * Sets bookreader height
33
- * & adds resize, orientationchange listeners
34
- * & passes captured scroll positions
35
- *
36
- * @param {object} brInstance
37
- */
38
- setup(brInstance) {
39
- this.bookreader = brInstance;
40
-
41
- this.resizeBookReaderContainer();
42
- window.addEventListener('resize', this.handleResizeEvent);
43
- }
44
-
45
- /**
46
- * Resets BookReader height
47
- * & removes event handlers, resets captured scroll positions
48
- */
49
- teardown() {
50
- this.brDom.setAttribute('style', '');
51
- window.removeEventListener('resize', this.handleResizeEvent);
52
- window.scrollTo(this.savedScrollX, this.savedScrollY);
53
- this.savedScrollX = 0;
54
- this.savedScrollY = 0;
55
- }
56
-
57
- /**
58
- * Event listener for resize & orientationchange
59
- */
60
- handleResizeEvent() {
61
- this.handleBookReaderHeight.execute();
62
- }
63
-
64
- /**
65
- * Calculates & sets BookReader's needed height to
66
- * take the loan bar into account
67
- * + appends fullscreen classes to DOM
68
- */
69
- resizeBookReaderContainer() {
70
- const { scrollX, scrollY } = window;
71
- this.savedScrollX = scrollX;
72
- this.savedScrollY = scrollY;
73
- this.bookreader.updateBrClasses();
74
-
75
- const loanbar = document.querySelector('.BookReaderMessage');
76
- const loanbarHeight = loanbar?.offsetHeight ?? 0;
77
- const windowHeight = window.innerHeight;
78
- const newHeight = `${(windowHeight - loanbarHeight)}px`;
79
- this.brDom.style.height = newHeight;
80
- this.brDom.style.top = loanbarHeight;
81
- window.scrollTo(0, 0);
82
- }
83
- }
@@ -1,55 +0,0 @@
1
- import { nothing } from 'lit-html';
2
- import { html, LitElement } from 'lit-element';
3
- import { unsafeHTML } from 'lit-html/directives/unsafe-html';
4
-
5
- export class BookSearchResult extends LitElement {
6
- static get properties() {
7
- return {
8
- match: { type: Object },
9
- };
10
- }
11
-
12
- constructor() {
13
- super();
14
-
15
- this.matchRegex = new RegExp('{{{(.+?)}}}', 'g');
16
- }
17
-
18
- createRenderRoot() {
19
- return this;
20
- }
21
-
22
- highlightedHit(hit) {
23
- return html`
24
- <p>${unsafeHTML(hit.replace(this.matchRegex, '<mark>$1</mark>'))}</p>
25
- `;
26
- }
27
-
28
- resultSelected() {
29
- this.dispatchEvent(new CustomEvent('resultSelected', {
30
- bubbles: true,
31
- composed: true,
32
- detail: {
33
- match: this.match,
34
- },
35
- }));
36
- }
37
-
38
- render() {
39
- const { match } = this;
40
- const { par = [] } = match;
41
- const [resultDetails = {}] = par;
42
- const pageNumber = Number.isInteger(resultDetails.page)
43
- ? html`<p class="page-num">Page -${resultDetails.page}-</p>` : nothing;
44
- const coverImage = html`<img src="${match.cover}" />`;
45
- return html`
46
- <li @click=${this.resultSelected}>
47
- ${match.cover ? coverImage : nothing}
48
- <h4>${match.title || nothing}</h4>
49
- ${pageNumber}
50
- ${this.highlightedHit(match.text)}
51
- </li>
52
- `;
53
- }
54
- }
55
- customElements.define('book-search-result', BookSearchResult);