@internetarchive/bookreader 5.0.0-6-14 → 5.0.0-61

Sign up to get free protection for your applications and to get access to all the features.
Files changed (273) hide show
  1. package/.eslintrc.js +17 -15
  2. package/.github/workflows/node.js.yml +72 -10
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +241 -140
  6. package/BookReader/BookReader.js +1 -1
  7. package/BookReader/BookReader.js.LICENSE.txt +24 -20
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1519 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +17 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/close-circle-dark.svg +1 -0
  13. package/BookReader/icons/magnify-minus.svg +1 -1
  14. package/BookReader/icons/magnify-plus.svg +1 -1
  15. package/BookReader/icons/pause.svg +1 -1
  16. package/BookReader/icons/playback-speed.svg +1 -1
  17. package/BookReader/icons/read-aloud.svg +1 -1
  18. package/BookReader/icons/voice.svg +1 -0
  19. package/BookReader/images/BRicons.svg +2 -2
  20. package/BookReader/images/books_graphic.svg +1 -1
  21. package/BookReader/images/icon_book.svg +1 -1
  22. package/BookReader/images/icon_gear.svg +1 -1
  23. package/BookReader/images/icon_info.svg +1 -1
  24. package/BookReader/images/icon_playback-rate.svg +1 -1
  25. package/BookReader/images/icon_search_button.svg +1 -1
  26. package/BookReader/images/icon_share.svg +1 -1
  27. package/BookReader/images/icon_speaker.svg +1 -1
  28. package/BookReader/images/icon_speaker_open.svg +1 -1
  29. package/BookReader/images/marker_chap-off.svg +1 -1
  30. package/BookReader/images/marker_chap-on.svg +1 -1
  31. package/BookReader/images/marker_srch-on.svg +1 -1
  32. package/BookReader/jquery-3.js +2 -0
  33. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  34. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  35. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  36. package/BookReader/plugins/plugin.autoplay.js +1 -1
  37. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  38. package/BookReader/plugins/plugin.chapters.js +1 -1
  39. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  40. package/BookReader/plugins/plugin.iframe.js +1 -1
  41. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  42. package/BookReader/plugins/plugin.mobile_nav.js +1 -1
  43. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  44. package/BookReader/plugins/plugin.resume.js +1 -1
  45. package/BookReader/plugins/plugin.resume.js.map +1 -1
  46. package/BookReader/plugins/plugin.search.js +1 -1
  47. package/BookReader/plugins/plugin.search.js.map +1 -1
  48. package/BookReader/plugins/plugin.text_selection.js +1 -1
  49. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  50. package/BookReader/plugins/plugin.tts.js +1 -1
  51. package/BookReader/plugins/plugin.tts.js.map +1 -1
  52. package/BookReader/plugins/plugin.url.js +1 -1
  53. package/BookReader/plugins/plugin.url.js.map +1 -1
  54. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  55. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  56. package/BookReader/webcomponents-bundle.js +3 -0
  57. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  58. package/BookReader/webcomponents-bundle.js.map +1 -0
  59. package/BookReaderDemo/BookReaderDemo.css +14 -1
  60. package/BookReaderDemo/BookReaderJSAutoplay.js +4 -1
  61. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  62. package/BookReaderDemo/IADemoBr.js +147 -0
  63. package/BookReaderDemo/demo-advanced.html +2 -2
  64. package/BookReaderDemo/demo-autoplay.html +2 -1
  65. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  66. package/BookReaderDemo/demo-fullscreen-mobile.html +2 -1
  67. package/BookReaderDemo/demo-fullscreen.html +2 -1
  68. package/BookReaderDemo/demo-iiif.html +2 -1
  69. package/BookReaderDemo/demo-internetarchive.html +84 -17
  70. package/BookReaderDemo/demo-multiple.html +2 -1
  71. package/BookReaderDemo/demo-preview-pages.html +2 -1
  72. package/BookReaderDemo/demo-simple.html +2 -1
  73. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -1
  74. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  75. package/BookReaderDemo/immersion-1up.html +2 -1
  76. package/BookReaderDemo/immersion-mode.html +2 -1
  77. package/BookReaderDemo/toggle_controls.html +2 -1
  78. package/BookReaderDemo/view_mode.html +2 -1
  79. package/BookReaderDemo/viewmode-cycle.html +2 -3
  80. package/CHANGELOG.md +248 -0
  81. package/README.md +14 -1
  82. package/babel.config.js +19 -0
  83. package/codecov.yml +6 -0
  84. package/index.html +3 -0
  85. package/jsconfig.json +19 -0
  86. package/netlify.toml +5 -0
  87. package/package.json +70 -59
  88. package/renovate.json +52 -0
  89. package/scripts/preversion.js +4 -1
  90. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  91. package/src/BookNavigator/assets/button-base.js +9 -2
  92. package/src/BookNavigator/assets/ia-logo.js +17 -0
  93. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  94. package/src/BookNavigator/assets/icon_close.js +1 -1
  95. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  96. package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
  97. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  98. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  99. package/src/BookNavigator/book-navigator.js +585 -0
  100. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  101. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  102. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  103. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
  104. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  105. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  106. package/src/BookNavigator/delete-modal-actions.js +1 -1
  107. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  108. package/src/BookNavigator/downloads/downloads.js +41 -25
  109. package/src/BookNavigator/search/search-provider.js +80 -28
  110. package/src/BookNavigator/search/search-results.js +34 -25
  111. package/src/BookNavigator/sharing.js +27 -0
  112. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
  113. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  114. package/src/BookNavigator/volumes/volumes-provider.js +111 -0
  115. package/src/BookNavigator/volumes/volumes.js +188 -0
  116. package/src/BookReader/BookModel.js +59 -30
  117. package/src/BookReader/DebugConsole.js +3 -3
  118. package/src/BookReader/DragScrollable.js +233 -0
  119. package/src/BookReader/Mode1Up.js +56 -351
  120. package/src/BookReader/Mode1UpLit.js +391 -0
  121. package/src/BookReader/Mode2Up.js +73 -1318
  122. package/src/BookReader/Mode2UpLit.js +781 -0
  123. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  124. package/src/BookReader/ModeSmoothZoom.js +211 -0
  125. package/src/BookReader/ModeThumb.js +17 -11
  126. package/src/BookReader/Navbar/Navbar.js +10 -36
  127. package/src/BookReader/PageContainer.js +69 -6
  128. package/src/BookReader/ReduceSet.js +1 -1
  129. package/src/BookReader/Toolbar/Toolbar.js +10 -37
  130. package/src/BookReader/events.js +2 -0
  131. package/src/BookReader/options.js +24 -2
  132. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  133. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  134. package/src/BookReader/utils/SelectionStartedObserver.js +46 -0
  135. package/src/BookReader/utils.js +108 -13
  136. package/src/BookReader.js +481 -828
  137. package/src/assets/icons/close-circle-dark.svg +1 -0
  138. package/src/assets/icons/magnify-minus.svg +3 -7
  139. package/src/assets/icons/magnify-plus.svg +3 -7
  140. package/src/assets/icons/voice.svg +1 -0
  141. package/src/css/_BRBookmarks.scss +1 -1
  142. package/src/css/_BRComponent.scss +1 -1
  143. package/src/css/_BRmain.scss +33 -0
  144. package/src/css/_BRnav.scss +4 -26
  145. package/src/css/_BRpages.scss +147 -40
  146. package/src/css/_BRsearch.scss +25 -11
  147. package/src/css/_TextSelection.scss +16 -17
  148. package/src/css/_colorbox.scss +2 -2
  149. package/src/css/_controls.scss +17 -5
  150. package/src/css/_icons.scss +7 -1
  151. package/src/ia-bookreader/ia-bookreader.js +224 -0
  152. package/src/plugins/plugin.archive_analytics.js +3 -3
  153. package/src/plugins/plugin.autoplay.js +4 -9
  154. package/src/plugins/plugin.chapters.js +28 -35
  155. package/src/plugins/plugin.mobile_nav.js +11 -10
  156. package/src/plugins/plugin.resume.js +3 -3
  157. package/src/plugins/plugin.text_selection.js +46 -41
  158. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  159. package/src/plugins/search/plugin.search.js +181 -103
  160. package/src/plugins/search/view.js +59 -44
  161. package/src/plugins/tts/AbstractTTSEngine.js +46 -37
  162. package/src/plugins/tts/FestivalTTSEngine.js +13 -14
  163. package/src/plugins/tts/PageChunk.js +15 -21
  164. package/src/plugins/tts/PageChunkIterator.js +8 -12
  165. package/src/plugins/tts/WebTTSEngine.js +87 -71
  166. package/src/plugins/tts/plugin.tts.js +94 -125
  167. package/src/plugins/tts/utils.js +0 -25
  168. package/src/plugins/url/UrlPlugin.js +193 -0
  169. package/src/plugins/{plugin.url.js → url/plugin.url.js} +45 -16
  170. package/src/util/docCookies.js +21 -2
  171. package/tests/e2e/README.md +37 -0
  172. package/tests/e2e/autoplay.test.js +2 -2
  173. package/tests/e2e/base.test.js +7 -7
  174. package/tests/e2e/helpers/base.js +28 -23
  175. package/tests/e2e/helpers/debug.js +1 -1
  176. package/tests/e2e/helpers/desktopSearch.js +14 -13
  177. package/tests/e2e/helpers/mobileSearch.js +3 -3
  178. package/tests/e2e/helpers/params.js +17 -0
  179. package/tests/e2e/helpers/rightToLeft.js +4 -10
  180. package/tests/e2e/models/Navigation.js +13 -4
  181. package/tests/e2e/rightToLeft.test.js +4 -5
  182. package/tests/e2e/viewmode.test.js +40 -33
  183. package/tests/jest/BookNavigator/book-navigator.test.js +658 -0
  184. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  185. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  186. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  187. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  188. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  189. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  190. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  191. package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +104 -60
  192. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  193. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  194. package/tests/jest/BookNavigator/volumes/volumes-provider.test.js +184 -0
  195. package/tests/jest/BookNavigator/volumes/volumes.test.js +97 -0
  196. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +59 -14
  197. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  198. package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
  199. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  200. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  201. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  202. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  203. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  204. package/tests/jest/BookReader/ModeSmoothZoom.test.js +175 -0
  205. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  206. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +10 -10
  207. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
  208. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  209. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  210. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  211. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  212. package/tests/jest/BookReader/utils/SelectionStartedObserver.test.js +73 -0
  213. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  214. package/tests/jest/BookReader/utils.test.js +217 -0
  215. package/tests/jest/BookReader.keyboard.test.js +190 -0
  216. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  217. package/tests/{BookReader.test.js → jest/BookReader.test.js} +26 -37
  218. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  219. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
  220. package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +10 -11
  221. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  222. package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
  223. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  224. package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +39 -47
  225. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  226. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +57 -47
  227. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +35 -6
  228. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +9 -9
  229. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  230. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  231. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  232. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  233. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  234. package/tests/jest/plugins/url/UrlPlugin.test.js +190 -0
  235. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +53 -14
  236. package/tests/jest/setup.js +3 -0
  237. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  238. package/tests/jest/util/docCookies.test.js +24 -0
  239. package/tests/{util → jest/util}/strings.test.js +1 -1
  240. package/tests/{utils.js → jest/utils.js} +38 -0
  241. package/webpack.config.js +11 -5
  242. package/.babelrc +0 -12
  243. package/.dependabot/config.yml +0 -6
  244. package/.testcaferc.json +0 -5
  245. package/BookReader/bookreader-component-bundle.js +0 -1450
  246. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  247. package/BookReader/bookreader-component-bundle.js.map +0 -1
  248. package/BookReader/jquery-1.10.1.js +0 -2
  249. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  250. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  251. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  252. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  253. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  254. package/karma.conf.js +0 -23
  255. package/src/BookNavigator/BookModel.js +0 -14
  256. package/src/BookNavigator/BookNavigator.js +0 -438
  257. package/src/BookNavigator/assets/book-loader.js +0 -27
  258. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  259. package/src/BookNavigator/search/a-search-result.js +0 -55
  260. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  261. package/src/ItemNavigator/ItemNavigator.js +0 -372
  262. package/src/ItemNavigator/providers/sharing.js +0 -29
  263. package/src/dragscrollable-br.js +0 -261
  264. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  265. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  266. package/tests/BookReader/Mode1Up.test.js +0 -164
  267. package/tests/BookReader/Mode2Up.test.js +0 -247
  268. package/tests/BookReader/utils.test.js +0 -109
  269. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  270. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  271. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  272. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  273. 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,438 +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 BRFullscreenMgr from './br-fullscreen-mgr.js';
9
- import { Book } from './BookModel.js';
10
- import bookLoader from './assets/book-loader.js';
11
-
12
- const events = {
13
- menuUpdated: 'menuUpdated',
14
- updateSideMenu: 'updateSideMenu',
15
- PostInit: 'PostInit',
16
- ViewportInFullScreen: 'ViewportInFullScreen',
17
- };
18
- export class BookNavigator extends LitElement {
19
- static get properties() {
20
- return {
21
- book: { type: Object },
22
- pageContainerSelector: { type: String },
23
- brWidth: { type: Number },
24
- bookReaderLoaded: { type: Boolean },
25
- bookreader: { type: Object },
26
- downloadableTypes: { type: Array },
27
- isAdmin: { type: Boolean },
28
- lendingInitialized: { type: Boolean },
29
- lendingStatus: { type: Object },
30
- menuProviders: { type: Object },
31
- menuShortcuts: { type: Array },
32
- sideMenuOpen: { type: Boolean },
33
- signedIn: { type: Boolean },
34
- };
35
- }
36
-
37
- constructor() {
38
- super();
39
- this.book = {};
40
- this.pageContainerSelector = '.BRcontainer';
41
- this.brWidth = 0;
42
- this.bookReaderCannotLoad = false;
43
- this.bookReaderLoaded = false;
44
- this.bookreader = null;
45
- this.downloadableTypes = [];
46
- this.isAdmin = false;
47
- this.lendingInitialized = false;
48
- this.lendingStatus = {};
49
- this.menuProviders = {};
50
- this.menuShortcuts = [];
51
- this.sideMenuOpen = false;
52
- this.signedIn = false;
53
-
54
- // Untracked properties
55
- this.fullscreenMgr = null;
56
- this.brResizeObserver = null;
57
- this.model = new Book();
58
- this.shortcutOrder = ['volumes', 'search', 'bookmarks'];
59
- }
60
-
61
- firstUpdated() {
62
- this.model.setMetadata(this.book);
63
- this.bindEventListeners();
64
- this.emitPostInit();
65
- }
66
-
67
- updated(changed) {
68
- if (!this.bookreader) {
69
- return;
70
- }
71
- const isFirstSideMenuUpdate = changed.has('sideMenuOpen') && (changed.get('sideMenuOpen') === undefined);
72
- if (!isFirstSideMenuUpdate) {
73
- // realign image
74
- if (this.bookreader.animating) {
75
- return;
76
- }
77
- this.bookreader.resize();
78
- const curIndex = this.bookreader.currentIndex();
79
- this.bookreader.jumpToIndex(curIndex);
80
- }
81
- }
82
-
83
- /**
84
- * Global event emitter for when Book Navigator loads
85
- */
86
- emitPostInit() {
87
- // emit global event when book nav has loaded with current bookreader selector
88
- this.dispatchEvent(new CustomEvent(`BrBookNav:${events.PostInit}`, {
89
- detail: { brSelector: this.bookreader?.el },
90
- bubbles: true,
91
- composed: true,
92
- }));
93
- }
94
-
95
- /**
96
- * Instantiates books submenus & their update callbacks
97
- *
98
- * NOTE: we are doing our best to scope bookreader's instance.
99
- * If your submenu provider uses a bookreader instance to read, manually
100
- * manipulate BookReader, please update the navigator's instance of it
101
- * to keep it in sync.
102
- */
103
- initializeBookSubmenus() {
104
- this.menuProviders = {
105
- search: new SearchProvider(
106
- (brInstance = null) => {
107
- if (brInstance) {
108
- /* refresh br instance reference */
109
- this.bookreader = brInstance;
110
- }
111
- this.updateMenuContents();
112
- if (this.brWidth >= 640) { /* open side search menu */
113
- this.openSideSearchMenu();
114
- }
115
- },
116
- this.bookreader,
117
- ),
118
- downloads: new DownloadProvider(),
119
- visualAdjustments: new VisualAdjustmentProvider({
120
- onOptionChange: (event, brInstance = null) => {
121
- if (brInstance) {
122
- /* refresh br instance reference */
123
- this.bookreader = brInstance;
124
- }
125
- this.updateMenuContents();
126
- },
127
- bookContainerSelector: this.pageContainerSelector,
128
- bookreader: this.bookreader,
129
- }),
130
- share: new SharingProvider(this.book.metadata, this.baseHost, this.itemType),
131
- bookmarks: new BookmarksProvider(this.bookmarksOptions, this.bookreader)
132
- };
133
-
134
- this.addMenuShortcut('search'); /* start with search as a shortcut */
135
- this.updateMenuContents();
136
- }
137
-
138
- /** gets element that houses the bookreader in light dom */
139
- get mainBRContainer() {
140
- return document.querySelector(this.bookreader.el);
141
- }
142
-
143
- get bookmarksOptions() {
144
- const referrerStr = `referer=${encodeURIComponent(location.href)}`
145
- return {
146
- loginUrl: `https://${this.baseHost}/account/login?${referrerStr}`,
147
- displayMode: this.signedIn ? 'bookmarks' : 'login',
148
- showItemNavigatorModal: this.showItemNavigatorModal.bind(this),
149
- closeItemNavigatorModal: this.closeItemNavigatorModal.bind(this),
150
- onBookmarksChanged: (bookmarks) => {
151
- const method = Object.keys(bookmarks).length ? 'add' : 'remove';
152
- this[`${method}MenuShortcut`]('bookmarks');
153
- this.updateMenuContents();
154
- },
155
- };
156
- }
157
-
158
- /**
159
- * Open side search menu
160
- */
161
- openSideSearchMenu() {
162
- const event = new CustomEvent(
163
- events.updateSideMenu, {
164
- detail: { menuId: 'search', action: 'open' },
165
- },
166
- );
167
- this.dispatchEvent(event);
168
- }
169
-
170
- /**
171
- * Sets order of menu and emits custom event when done
172
- */
173
- updateMenuContents() {
174
- const {
175
- search, downloads, visualAdjustments, share, bookmarks,
176
- } = this.menuProviders;
177
- const availableMenus = [search, bookmarks, visualAdjustments, share].filter((menu) => !!menu);
178
-
179
- if (this.shouldShowDownloadsMenu()) {
180
- downloads.update(this.downloadableTypes);
181
- availableMenus.splice(1, 0, downloads);
182
- }
183
-
184
- const event = new CustomEvent(
185
- events.menuUpdated, {
186
- detail: availableMenus,
187
- },
188
- );
189
- this.dispatchEvent(event);
190
- }
191
-
192
- /**
193
- * Confirms if we should show the downloads menu
194
- * @returns {bool}
195
- */
196
- shouldShowDownloadsMenu() {
197
- if (this.model.isRestricted === false) { return true; }
198
- if (this.isAdmin) { return true; }
199
- const { user_loan_record = {} } = this.lendingStatus;
200
- const hasNoLoanRecord = Array.isArray(user_loan_record); /* (bc PHP assoc. arrays) */
201
-
202
- if (hasNoLoanRecord) { return false; }
203
-
204
- const hasValidLoan = user_loan_record.type && (user_loan_record.type !== 'SESSION_LOAN');
205
- return hasValidLoan;
206
- }
207
-
208
- /**
209
- * Adds a provider object to the menuShortcuts array property if it isn't
210
- * already added. menuShortcuts are then sorted by shortcutOrder and
211
- * a menuShortcutsUpdated event is emitted.
212
- *
213
- * @param {string} menuId - a string matching the id property of a provider
214
- */
215
- addMenuShortcut(menuId) {
216
- if (this.menuShortcuts.find((m) => m.id === menuId)) { return; }
217
-
218
- this.menuShortcuts.push(this.menuProviders[menuId]);
219
- this.sortMenuShortcuts();
220
- this.emitMenuShortcutsUpdated();
221
- }
222
-
223
- /**
224
- * Removes a provider object from the menuShortcuts array and emits a
225
- * menuShortcutsUpdated event.
226
- *
227
- * @param {string} menuId - a string matching the id property of a provider
228
- */
229
- removeMenuShortcut(menuId) {
230
- this.menuShortcuts = this.menuShortcuts.filter((m) => m.id !== menuId);
231
- this.emitMenuShortcutsUpdated();
232
- }
233
-
234
- /**
235
- * Sorts the menuShortcuts property by comparing each provider's id to
236
- * the id in each iteration over the shortcutOrder array.
237
- */
238
- sortMenuShortcuts() {
239
- this.menuShortcuts = this.shortcutOrder.reduce((shortcuts, id) => {
240
- const menu = this.menuShortcuts.find((m) => m.id === id);
241
- if (menu) { shortcuts.push(menu); }
242
- return shortcuts;
243
- }, []);
244
- }
245
-
246
- emitMenuShortcutsUpdated() {
247
- const event = new CustomEvent('menuShortcutsUpdated', {
248
- detail: this.menuShortcuts,
249
- });
250
- this.dispatchEvent(event);
251
- }
252
-
253
- /**
254
- * Core bookreader event handler registry
255
- *
256
- * NOTE: we are trying to keep bookreader's instance in scope
257
- * Please update Book Navigator's instance reference of it to keep it current
258
- */
259
- bindEventListeners() {
260
- window.addEventListener('BookReader:PostInit', (e) => {
261
- this.bookreader = e.detail.props;
262
- this.bookReaderLoaded = true;
263
- this.bookReaderCannotLoad = false;
264
- this.fullscreenMgr = new BRFullscreenMgr(this.bookreader.el);
265
-
266
- this.initializeBookSubmenus();
267
- setTimeout(() => this.bookreader.resize(), 0);
268
- this.brResizeObserver = new ResizeObserver((elements) => this.reactToBrResize(elements));
269
- this.brResizeObserver.observe(this.mainBRContainer);
270
- });
271
- window.addEventListener('BookReader:fullscreenToggled', (event) => {
272
- const { detail: { props: brInstance = null } } = event;
273
- if (brInstance) {
274
- this.bookreader = brInstance;
275
- }
276
- this.manageFullScreenBehavior(event);
277
- }, { passive: true });
278
- window.addEventListener('BookReader:ToggleSearchMenu', (event) => {
279
- this.dispatchEvent(new CustomEvent(events.updateSideMenu, {
280
- detail: { menuId: 'search', action: 'toggle' },
281
- }));
282
- });
283
- window.addEventListener('LendingFlow:PostInit', ({ detail }) => {
284
- const {
285
- downloadTypesAvailable, lendingStatus, isAdmin, previewType,
286
- } = detail;
287
- this.lendingInitialized = true;
288
- this.downloadableTypes = downloadTypesAvailable;
289
- this.lendingStatus = lendingStatus;
290
- this.isAdmin = isAdmin;
291
- this.bookReaderCannotLoad = previewType === 'singlePagePreview';
292
- });
293
- window.addEventListener('BRJSIA:PostInit', ({ detail }) => {
294
- const { isRestricted, downloadURLs } = detail;
295
- this.bookReaderLoaded = true;
296
- this.downloadableTypes = downloadURLs;
297
- this.model.setRestriction(isRestricted);
298
- });
299
- }
300
-
301
- /**
302
- * Uses resize observer to fire BookReader's `resize` functionality
303
- * We do not want to trigger resize IF:
304
- * - book animation is happening
305
- * - book is in fullscreen (fullscreen is handled separately)
306
- *
307
- * @param { Object } entries - resize observer entries
308
- */
309
- reactToBrResize(entries = []) {
310
- const startBrWidth = this.brWidth;
311
- const { animating } = this.bookreader;
312
-
313
- entries.forEach(({ contentRect, target }) => {
314
- if (target === this.mainBRContainer) {
315
- this.brWidth = contentRect.width;
316
- }
317
- });
318
- setTimeout(() => {
319
- if (startBrWidth && !animating) {
320
- this.bookreader.resize();
321
- }
322
- }, 0);
323
- }
324
-
325
- /**
326
- * Manages Fullscreen behavior
327
- * This makes sure that controls are _always_ in view
328
- * We need this to accommodate LOAN BAR during fullscreen
329
- */
330
- manageFullScreenBehavior() {
331
- this.emitFullScreenState();
332
-
333
- if (!this.bookreader.isFullscreen()) {
334
- this.fullscreenMgr.teardown();
335
- } else {
336
- this.fullscreenMgr.setup(this.bookreader);
337
- }
338
- }
339
-
340
- /**
341
- * Intercepts and relays fullscreen toggle events
342
- */
343
- emitFullScreenState() {
344
- const isFullScreen = this.bookreader.isFullscreen();
345
- const event = new CustomEvent('ViewportInFullScreen', {
346
- detail: { isFullScreen },
347
- });
348
- this.dispatchEvent(event);
349
- }
350
-
351
- emitShowItemNavigatorModal(e) {
352
- this.dispatchEvent(new CustomEvent('showItemNavigatorModal', {
353
- detail: e.detail,
354
- }));
355
- }
356
-
357
- emitCloseItemNavigatorModal() {
358
- this.dispatchEvent(new CustomEvent('closeItemNavigatorModal'));
359
- }
360
-
361
- showItemNavigatorModal(e) {
362
- this.emitShowItemNavigatorModal(e);
363
- }
364
-
365
- closeItemNavigatorModal() {
366
- this.emitCloseItemNavigatorModal();
367
- }
368
-
369
- get loader() {
370
- const loader = html`
371
- <div class="book-loader">${bookLoader}<div>
372
- <h3>Loading viewer</h3>
373
- `;
374
- return !this.bookReaderLoaded ? loader : nothing;
375
- }
376
-
377
- get loadingClass() {
378
- return !this.bookReaderLoaded ? 'loading' : '';
379
- }
380
-
381
- get itemImage() {
382
- const url = `https://${this.baseHost}/services/img/${this.book.metadata.identifier}`;
383
- return html`<img src="${url}" alt="cover image for ${this.book.metadata.identifier}">`;
384
- }
385
-
386
- render() {
387
- const placeholder = this.bookReaderCannotLoad ? this.itemImage : this.loader;
388
- return html`<div id="book-navigator" class="${this.loadingClass}">
389
- ${placeholder}
390
- <slot name="bookreader"></slot>
391
- </div>
392
- `;
393
- }
394
-
395
- static get styles() {
396
- return css`
397
- #book-navigator.loading {
398
- display: flex;
399
- align-items: center;
400
- justify-content: center;
401
- min-height: 30vh;
402
- }
403
-
404
- #book-navigator .book-loader {
405
- width: 30%;
406
- margin: auto;
407
- text-align: center;
408
- color: var(--primaryTextColor);
409
- }
410
-
411
- .book-loader svg {
412
- display: block;
413
- width: 60%;
414
- max-width: 100px;
415
- height: auto;
416
- margin: auto;
417
- }
418
-
419
- svg * {
420
- fill: var(--primaryTextColor);
421
- }
422
-
423
- svg .ring {
424
- animation: rotate 1.3s infinite linear;
425
- transform-origin: 50px 50px;
426
- transform-box: fill-box;
427
- }
428
-
429
- @keyframes rotate {
430
- 0% {
431
- transform: rotate(-360deg);
432
- }
433
- }
434
- `
435
- }
436
- }
437
-
438
- 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,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);