@internetarchive/bookreader 5.0.0-88-alpha.11 → 5.0.0-89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/BookReader/BookReader.css +17 -3
  2. package/BookReader/BookReader.js +1 -1
  3. package/BookReader/BookReader.js.map +1 -1
  4. package/BookReader/ia-bookreader-bundle.js +87 -108
  5. package/BookReader/ia-bookreader-bundle.js.map +1 -1
  6. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  7. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  8. package/BookReader/plugins/plugin.autoplay.js +1 -1
  9. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  10. package/BookReader/plugins/plugin.iiif.js +1 -1
  11. package/BookReader/plugins/plugin.iiif.js.map +1 -1
  12. package/BookReader/plugins/plugin.resume.js +1 -1
  13. package/BookReader/plugins/plugin.resume.js.map +1 -1
  14. package/BookReader/plugins/plugin.search.js +1 -1
  15. package/BookReader/plugins/plugin.search.js.map +1 -1
  16. package/BookReader/plugins/plugin.text_selection.js +1 -1
  17. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  18. package/BookReader/plugins/plugin.tts.js +1 -1
  19. package/BookReader/plugins/plugin.tts.js.map +1 -1
  20. package/BookReader/plugins/plugin.url.js +1 -1
  21. package/BookReader/plugins/plugin.url.js.map +1 -1
  22. package/CHANGELOG.md +14 -0
  23. package/babel.config.js +12 -30
  24. package/codecov.yml +1 -1
  25. package/jsconfig.json +1 -3
  26. package/package.json +14 -16
  27. package/src/BookNavigator/search/search-results.js +1 -1
  28. package/src/BookReader/ImageCache.js +48 -15
  29. package/src/BookReader/Mode1UpLit.js +56 -86
  30. package/src/BookReader/Mode2UpLit.js +5 -5
  31. package/src/BookReader/Navbar/Navbar.js +53 -11
  32. package/src/BookReader/PageContainer.js +41 -22
  33. package/src/BookReader/options.js +27 -3
  34. package/src/BookReader/utils.js +10 -0
  35. package/src/BookReader.js +120 -21
  36. package/src/BookReaderPlugin.js +44 -0
  37. package/src/css/_BRnav.scss +0 -3
  38. package/src/css/_BRpages.scss +21 -2
  39. package/src/css/_controls.scss +4 -0
  40. package/src/plugins/plugin.archive_analytics.js +84 -78
  41. package/src/plugins/plugin.autoplay.js +98 -102
  42. package/src/plugins/plugin.chapters.js +17 -22
  43. package/src/plugins/plugin.iiif.js +16 -30
  44. package/src/plugins/plugin.resume.js +54 -51
  45. package/src/plugins/plugin.text_selection.js +68 -76
  46. package/src/plugins/tts/AbstractTTSEngine.js +2 -4
  47. package/src/plugins/tts/PageChunk.js +5 -9
  48. package/src/plugins/tts/PageChunkIterator.js +3 -5
  49. package/src/plugins/tts/plugin.tts.js +309 -329
  50. package/src/plugins/url/plugin.url.js +1 -1
  51. package/src/util/strings.js +1 -0
  52. package/tests/e2e/autoplay.test.js +8 -5
  53. package/tests/e2e/helpers/base.js +2 -2
  54. package/tests/e2e/helpers/mockSearch.js +6 -9
  55. package/tests/jest/BookReader/Navbar/Navbar.test.js +16 -3
  56. package/tests/jest/BookReader/PageContainer.test.js +96 -55
  57. package/tests/jest/BookReader/utils.test.js +21 -0
  58. package/tests/jest/BookReader.test.js +13 -12
  59. package/tests/jest/plugins/plugin.archive_analytics.test.js +8 -11
  60. package/tests/jest/plugins/plugin.autoplay.test.js +9 -22
  61. package/tests/jest/plugins/plugin.resume.test.js +19 -32
  62. package/tests/jest/plugins/plugin.text_selection.test.js +23 -24
  63. package/dist/esm/BookNavigator/assets/bookmark-colors.js +0 -4
  64. package/dist/esm/BookNavigator/assets/button-base.js +0 -4
  65. package/dist/esm/BookNavigator/assets/ia-logo.js +0 -4
  66. package/dist/esm/BookNavigator/assets/icon_checkmark.js +0 -8
  67. package/dist/esm/BookNavigator/assets/icon_close.js +0 -4
  68. package/dist/esm/BookNavigator/book-navigator.js +0 -612
  69. package/dist/esm/BookNavigator/bookmarks/bookmark-button.js +0 -35
  70. package/dist/esm/BookNavigator/bookmarks/bookmark-edit.js +0 -78
  71. package/dist/esm/BookNavigator/bookmarks/bookmarks-list.js +0 -160
  72. package/dist/esm/BookNavigator/bookmarks/bookmarks-loginCTA.js +0 -24
  73. package/dist/esm/BookNavigator/bookmarks/bookmarks-provider.js +0 -55
  74. package/dist/esm/BookNavigator/bookmarks/ia-bookmarks.js +0 -521
  75. package/dist/esm/BookNavigator/delete-modal-actions.js +0 -29
  76. package/dist/esm/BookNavigator/downloads/downloads-provider.js +0 -84
  77. package/dist/esm/BookNavigator/downloads/downloads.js +0 -69
  78. package/dist/esm/BookNavigator/search/search-provider.js +0 -238
  79. package/dist/esm/BookNavigator/search/search-results.js +0 -161
  80. package/dist/esm/BookNavigator/sharing.js +0 -26
  81. package/dist/esm/BookNavigator/viewable-files.js +0 -94
  82. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments-provider.js +0 -83
  83. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments.js +0 -131
  84. package/dist/esm/BookReader/BookModel.js +0 -575
  85. package/dist/esm/BookReader/DragScrollable.js +0 -224
  86. package/dist/esm/BookReader/ImageCache.js +0 -122
  87. package/dist/esm/BookReader/Mode1Up.js +0 -114
  88. package/dist/esm/BookReader/Mode1UpLit.js +0 -579
  89. package/dist/esm/BookReader/Mode2Up.js +0 -106
  90. package/dist/esm/BookReader/Mode2UpLit.js +0 -1020
  91. package/dist/esm/BookReader/ModeCoordinateSpace.js +0 -28
  92. package/dist/esm/BookReader/ModeSmoothZoom.js +0 -318
  93. package/dist/esm/BookReader/ModeThumb.js +0 -366
  94. package/dist/esm/BookReader/Navbar/Navbar.js +0 -253
  95. package/dist/esm/BookReader/PageContainer.js +0 -165
  96. package/dist/esm/BookReader/ReduceSet.js +0 -27
  97. package/dist/esm/BookReader/Toolbar/Toolbar.js +0 -242
  98. package/dist/esm/BookReader/events.js +0 -20
  99. package/dist/esm/BookReader/options.js +0 -331
  100. package/dist/esm/BookReader/utils/HTMLDimensionsCacher.js +0 -48
  101. package/dist/esm/BookReader/utils/ScrollClassAdder.js +0 -31
  102. package/dist/esm/BookReader/utils/SelectionObserver.js +0 -42
  103. package/dist/esm/BookReader/utils/classes.js +0 -37
  104. package/dist/esm/BookReader/utils.js +0 -315
  105. package/dist/esm/BookReader.js +0 -1828
  106. package/dist/esm/assets/icons/1up.svg +0 -12
  107. package/dist/esm/assets/icons/2up.svg +0 -15
  108. package/dist/esm/assets/icons/advance.svg +0 -26
  109. package/dist/esm/assets/icons/chevron-right.svg +0 -1
  110. package/dist/esm/assets/icons/close-circle-dark.svg +0 -1
  111. package/dist/esm/assets/icons/close-circle.svg +0 -1
  112. package/dist/esm/assets/icons/fullscreen.svg +0 -17
  113. package/dist/esm/assets/icons/fullscreen_exit.svg +0 -17
  114. package/dist/esm/assets/icons/hamburger.svg +0 -15
  115. package/dist/esm/assets/icons/left-arrow.svg +0 -12
  116. package/dist/esm/assets/icons/magnify-minus.svg +0 -12
  117. package/dist/esm/assets/icons/magnify-plus.svg +0 -13
  118. package/dist/esm/assets/icons/magnify.svg +0 -15
  119. package/dist/esm/assets/icons/pause.svg +0 -23
  120. package/dist/esm/assets/icons/play.svg +0 -22
  121. package/dist/esm/assets/icons/playback-speed.svg +0 -34
  122. package/dist/esm/assets/icons/read-aloud.svg +0 -22
  123. package/dist/esm/assets/icons/review.svg +0 -22
  124. package/dist/esm/assets/icons/thumbnails.svg +0 -17
  125. package/dist/esm/assets/icons/voice.svg +0 -1
  126. package/dist/esm/assets/icons/volume-full.svg +0 -22
  127. package/dist/esm/assets/images/BRicons.png +0 -0
  128. package/dist/esm/assets/images/BRicons.svg +0 -94
  129. package/dist/esm/assets/images/BRicons_ia.png +0 -0
  130. package/dist/esm/assets/images/back_pages.png +0 -0
  131. package/dist/esm/assets/images/book_bottom_icon.png +0 -0
  132. package/dist/esm/assets/images/book_down_icon.png +0 -0
  133. package/dist/esm/assets/images/book_left_icon.png +0 -0
  134. package/dist/esm/assets/images/book_leftmost_icon.png +0 -0
  135. package/dist/esm/assets/images/book_right_icon.png +0 -0
  136. package/dist/esm/assets/images/book_rightmost_icon.png +0 -0
  137. package/dist/esm/assets/images/book_top_icon.png +0 -0
  138. package/dist/esm/assets/images/book_up_icon.png +0 -0
  139. package/dist/esm/assets/images/books_graphic.svg +0 -177
  140. package/dist/esm/assets/images/booksplit.png +0 -0
  141. package/dist/esm/assets/images/control_pause_icon.png +0 -0
  142. package/dist/esm/assets/images/control_play_icon.png +0 -0
  143. package/dist/esm/assets/images/embed_icon.png +0 -0
  144. package/dist/esm/assets/images/icon-home-ia.png +0 -0
  145. package/dist/esm/assets/images/icon_OL-logo-xs.png +0 -0
  146. package/dist/esm/assets/images/icon_alert-xs.png +0 -0
  147. package/dist/esm/assets/images/icon_book.svg +0 -12
  148. package/dist/esm/assets/images/icon_bookmark.svg +0 -12
  149. package/dist/esm/assets/images/icon_close-pop.png +0 -0
  150. package/dist/esm/assets/images/icon_download.png +0 -0
  151. package/dist/esm/assets/images/icon_gear.svg +0 -14
  152. package/dist/esm/assets/images/icon_hamburger.svg +0 -20
  153. package/dist/esm/assets/images/icon_home.png +0 -0
  154. package/dist/esm/assets/images/icon_home.svg +0 -21
  155. package/dist/esm/assets/images/icon_home_ia.png +0 -0
  156. package/dist/esm/assets/images/icon_indicator.png +0 -0
  157. package/dist/esm/assets/images/icon_info.svg +0 -11
  158. package/dist/esm/assets/images/icon_one_page.svg +0 -8
  159. package/dist/esm/assets/images/icon_pause.svg +0 -1
  160. package/dist/esm/assets/images/icon_play.svg +0 -1
  161. package/dist/esm/assets/images/icon_playback-rate.svg +0 -15
  162. package/dist/esm/assets/images/icon_return.png +0 -0
  163. package/dist/esm/assets/images/icon_search_button.svg +0 -8
  164. package/dist/esm/assets/images/icon_share.svg +0 -9
  165. package/dist/esm/assets/images/icon_skip-ahead.svg +0 -6
  166. package/dist/esm/assets/images/icon_skip-back.svg +0 -13
  167. package/dist/esm/assets/images/icon_speaker.svg +0 -18
  168. package/dist/esm/assets/images/icon_speaker_open.svg +0 -10
  169. package/dist/esm/assets/images/icon_thumbnails.svg +0 -12
  170. package/dist/esm/assets/images/icon_toc.svg +0 -5
  171. package/dist/esm/assets/images/icon_two_pages.svg +0 -9
  172. package/dist/esm/assets/images/icon_zoomer.png +0 -0
  173. package/dist/esm/assets/images/loading.gif +0 -0
  174. package/dist/esm/assets/images/logo_icon.png +0 -0
  175. package/dist/esm/assets/images/marker_chap-off.png +0 -0
  176. package/dist/esm/assets/images/marker_chap-off.svg +0 -11
  177. package/dist/esm/assets/images/marker_chap-off_ia.png +0 -0
  178. package/dist/esm/assets/images/marker_chap-on.png +0 -0
  179. package/dist/esm/assets/images/marker_chap-on.svg +0 -11
  180. package/dist/esm/assets/images/marker_srch-on.svg +0 -11
  181. package/dist/esm/assets/images/marker_srchchap-off.png +0 -0
  182. package/dist/esm/assets/images/marker_srchchap-on.png +0 -0
  183. package/dist/esm/assets/images/nav_control-dn.png +0 -0
  184. package/dist/esm/assets/images/nav_control-dn_ia.png +0 -0
  185. package/dist/esm/assets/images/nav_control-up.png +0 -0
  186. package/dist/esm/assets/images/nav_control-up_ia.png +0 -0
  187. package/dist/esm/assets/images/nav_control.png +0 -0
  188. package/dist/esm/assets/images/one_page_mode_icon.png +0 -0
  189. package/dist/esm/assets/images/paper-badge.png +0 -0
  190. package/dist/esm/assets/images/print_icon.png +0 -0
  191. package/dist/esm/assets/images/progressbar.gif +0 -0
  192. package/dist/esm/assets/images/right_edges.png +0 -0
  193. package/dist/esm/assets/images/slider.png +0 -0
  194. package/dist/esm/assets/images/slider_ia.png +0 -0
  195. package/dist/esm/assets/images/thumbnail_mode_icon.png +0 -0
  196. package/dist/esm/assets/images/transparent.png +0 -0
  197. package/dist/esm/assets/images/two_page_mode_icon.png +0 -0
  198. package/dist/esm/assets/images/unviewable_page.png +0 -0
  199. package/dist/esm/assets/images/zoom_in_icon.png +0 -0
  200. package/dist/esm/assets/images/zoom_out_icon.png +0 -0
  201. package/dist/esm/css/BookReader.scss +0 -85
  202. package/dist/esm/css/_BRBookmarks.scss +0 -29
  203. package/dist/esm/css/_BRComponent.scss +0 -13
  204. package/dist/esm/css/_BRfloat.scss +0 -197
  205. package/dist/esm/css/_BRicon.scss +0 -54
  206. package/dist/esm/css/_BRmain.scss +0 -262
  207. package/dist/esm/css/_BRnav.scss +0 -354
  208. package/dist/esm/css/_BRpages.scss +0 -213
  209. package/dist/esm/css/_BRsearch.scss +0 -268
  210. package/dist/esm/css/_BRtoolbar.scss +0 -84
  211. package/dist/esm/css/_BRvendor.scss +0 -5
  212. package/dist/esm/css/_TextSelection.scss +0 -108
  213. package/dist/esm/css/_colorbox.scss +0 -52
  214. package/dist/esm/css/_controls.scss +0 -257
  215. package/dist/esm/css/_icons.scss +0 -121
  216. package/dist/esm/ia-bookreader/ia-bookreader.js +0 -141
  217. package/dist/esm/jquery-wrapper.js +0 -3
  218. package/dist/esm/plugins/plugin.archive_analytics.js +0 -72
  219. package/dist/esm/plugins/plugin.autoplay.js +0 -119
  220. package/dist/esm/plugins/plugin.chapters.js +0 -288
  221. package/dist/esm/plugins/plugin.iframe.js +0 -44
  222. package/dist/esm/plugins/plugin.iiif.js +0 -146
  223. package/dist/esm/plugins/plugin.resume.js +0 -66
  224. package/dist/esm/plugins/plugin.text_selection.js +0 -621
  225. package/dist/esm/plugins/plugin.vendor-fullscreen.js +0 -227
  226. package/dist/esm/plugins/search/plugin.search.js +0 -499
  227. package/dist/esm/plugins/search/utils.js +0 -42
  228. package/dist/esm/plugins/search/view.js +0 -360
  229. package/dist/esm/plugins/tts/AbstractTTSEngine.js +0 -282
  230. package/dist/esm/plugins/tts/FestivalTTSEngine.js +0 -192
  231. package/dist/esm/plugins/tts/PageChunk.js +0 -105
  232. package/dist/esm/plugins/tts/PageChunkIterator.js +0 -155
  233. package/dist/esm/plugins/tts/WebTTSEngine.js +0 -364
  234. package/dist/esm/plugins/tts/plugin.tts.js +0 -315
  235. package/dist/esm/plugins/tts/tooltip_dict.js +0 -14
  236. package/dist/esm/plugins/tts/utils.js +0 -79
  237. package/dist/esm/plugins/url/UrlPlugin.js +0 -197
  238. package/dist/esm/plugins/url/plugin.url.js +0 -212
  239. package/dist/esm/util/browserSniffing.js +0 -56
  240. package/dist/esm/util/debouncer.js +0 -25
  241. package/dist/esm/util/docCookies.js +0 -75
  242. package/dist/esm/util/strings.js +0 -34
  243. package/index.js +0 -2
@@ -1,23 +1,13 @@
1
1
  //@ts-check
2
2
  import { createDIVPageLayer } from '../BookReader/PageContainer.js';
3
3
  import { SelectionObserver } from '../BookReader/utils/SelectionObserver.js';
4
+ import { BookReaderPlugin } from '../BookReaderPlugin.js';
4
5
  import { applyVariables } from '../util/strings.js';
5
6
  /** @typedef {import('../util/strings.js').StringWithVars} StringWithVars */
6
7
  /** @typedef {import('../BookReader/PageContainer.js').PageContainer} PageContainer */
7
8
 
8
9
  const BookReader = /** @type {typeof import('../BookReader').default} */(window.BookReader);
9
10
 
10
- export const DEFAULT_OPTIONS = {
11
- enabled: true,
12
- /** @type {StringWithVars} The URL to fetch the entire DJVU xml. Supports options.vars */
13
- fullDjvuXmlUrl: null,
14
- /** @type {StringWithVars} The URL to fetch a single page of the DJVU xml. Supports options.vars. Also has {{pageIndex}} */
15
- singlePageDjvuXmlUrl: null,
16
- /** Whether to fetch the XML as a jsonp */
17
- jsonp: false,
18
- };
19
- /** @typedef {typeof DEFAULT_OPTIONS} TextSelectionPluginOptions */
20
-
21
11
  /**
22
12
  * @template T
23
13
  */
@@ -39,30 +29,73 @@ export class Cache {
39
29
  }
40
30
  }
41
31
 
42
- export class TextSelectionPlugin {
32
+ export class TextSelectionPlugin extends BookReaderPlugin {
33
+ options = {
34
+ enabled: true,
35
+ /** @type {StringWithVars} The URL to fetch the entire DJVU xml. Supports options.vars */
36
+ fullDjvuXmlUrl: null,
37
+ /** @type {StringWithVars} The URL to fetch a single page of the DJVU xml. Supports options.vars. Also has {{pageIndex}} */
38
+ singlePageDjvuXmlUrl: null,
39
+ /** Whether to fetch the XML as a jsonp */
40
+ jsonp: false,
41
+ }
42
+
43
+ /**@type {PromiseLike<JQuery<HTMLElement>|undefined>} */
44
+ djvuPagesPromise = null;
45
+
46
+ /** @type {Cache<{index: number, response: any}>} */
47
+ pageTextCache = new Cache();
48
+
43
49
  /**
44
- * @param {'lr' | 'rl'} pageProgression In the future this should be in the ocr file
45
- * since a book being right to left doesn't mean the ocr is right to left. But for
46
- * now we do make that assumption.
50
+ * Sometimes there are too many words on a page, and the browser becomes near
51
+ * unusable. For now don't render text layer for pages with too many words.
47
52
  */
48
- constructor(options = DEFAULT_OPTIONS, optionVariables, pageProgression = 'lr') {
49
- this.options = options;
50
- this.optionVariables = optionVariables;
51
- /**@type {PromiseLike<JQuery<HTMLElement>|undefined>} */
52
- this.djvuPagesPromise = null;
53
+ maxWordRendered = 2500;
54
+
55
+ /**
56
+ * @param {import('../BookReader.js').default} br
57
+ */
58
+ constructor(br) {
59
+ super(br);
60
+ // In the future this should be in the ocr file
61
+ // since a book being right to left doesn't mean the ocr is right to left. But for
62
+ // now we do make that assumption.
53
63
  /** Whether the book is right-to-left */
54
- this.rtl = pageProgression === 'rl';
64
+ this.rtl = this.br.pageProgression === 'rl';
65
+ this.selectionObserver = new SelectionObserver('.BRtextLayer', this._onSelectionChange);
66
+ }
55
67
 
56
- /** @type {Cache<{index: number, response: any}>} */
57
- this.pageTextCache = new Cache();
68
+ /** @override */
69
+ init() {
70
+ if (!this.options.enabled) return;
58
71
 
59
- /**
60
- * Sometimes there are too many words on a page, and the browser becomes near
61
- * unusable. For now don't render text layer for pages with too many words.
62
- */
63
- this.maxWordRendered = 2500;
72
+ this.loadData();
64
73
 
65
- this.selectionObserver = new SelectionObserver('.BRtextLayer', this._onSelectionChange);
74
+ this.selectionObserver.attach();
75
+ new SelectionObserver('.BRtextLayer', (selectEvent) => {
76
+ // Track how often selection is used
77
+ if (selectEvent == 'started') {
78
+ this.br._plugins.archiveAnalytics?.sendEvent('BookReader', 'SelectStart');
79
+
80
+ // Set a class on the page to avoid hiding it when zooming/etc
81
+ this.br.refs.$br.find('.BRpagecontainer--hasSelection').removeClass('BRpagecontainer--hasSelection');
82
+ $(window.getSelection().anchorNode).closest('.BRpagecontainer').addClass('BRpagecontainer--hasSelection');
83
+ }
84
+ }).attach();
85
+ }
86
+
87
+ /**
88
+ * @override
89
+ * @param {PageContainer} pageContainer
90
+ * @returns {PageContainer}
91
+ */
92
+ _configurePageContainer(pageContainer) {
93
+ // Disable if thumb mode; it's too janky
94
+ // .page can be null for "pre-cover" region
95
+ if (this.br.mode !== this.br.constModeThumb && pageContainer.page) {
96
+ this.createTextLayer(pageContainer);
97
+ }
98
+ return pageContainer;
66
99
  }
67
100
 
68
101
  /**
@@ -79,18 +112,16 @@ export class TextSelectionPlugin {
79
112
  }
80
113
  }
81
114
 
82
- init() {
83
- this.selectionObserver.attach();
84
-
115
+ loadData() {
85
116
  // Only fetch the full djvu xml if the single page url isn't there
86
117
  if (this.options.singlePageDjvuXmlUrl) return;
87
118
  this.djvuPagesPromise = $.ajax({
88
119
  type: "GET",
89
- url: applyVariables(this.options.fullDjvuXmlUrl, this.optionVariables),
120
+ url: applyVariables(this.options.fullDjvuXmlUrl, this.br.options.vars),
90
121
  dataType: this.options.jsonp ? "jsonp" : "html",
91
122
  cache: true,
92
123
  xhrFields: {
93
- withCredentials: window.br.protected,
124
+ withCredentials: this.br.protected,
94
125
  },
95
126
  error: (e) => undefined,
96
127
  }).then((res) => {
@@ -115,11 +146,11 @@ export class TextSelectionPlugin {
115
146
  }
116
147
  const res = await $.ajax({
117
148
  type: "GET",
118
- url: applyVariables(this.options.singlePageDjvuXmlUrl, this.optionVariables, { pageIndex: index }),
149
+ url: applyVariables(this.options.singlePageDjvuXmlUrl, this.br.options.vars, { pageIndex: index }),
119
150
  dataType: this.options.jsonp ? "jsonp" : "html",
120
151
  cache: true,
121
152
  xhrFields: {
122
- withCredentials: window.br.protected,
153
+ withCredentials: this.br.protected,
123
154
  },
124
155
  error: (e) => undefined,
125
156
  });
@@ -410,46 +441,7 @@ export class TextSelectionPlugin {
410
441
  }
411
442
  }
412
443
 
413
- export class BookreaderWithTextSelection extends BookReader {
414
- init() {
415
- const options = Object.assign({}, DEFAULT_OPTIONS, this.options.plugins.textSelection);
416
- if (options.enabled) {
417
- this.textSelectionPlugin = new TextSelectionPlugin(options, this.options.vars, this.pageProgression);
418
- // Write this back; this way the plugin is the source of truth, and BR just
419
- // contains a reference to it.
420
- this.options.plugins.textSelection = options;
421
- this.textSelectionPlugin.init();
422
-
423
- new SelectionObserver('.BRtextLayer', (selectEvent) => {
424
- // Track how often selection is used
425
- if (selectEvent == 'started') {
426
- this.archiveAnalyticsSendEvent?.('BookReader', 'SelectStart');
427
-
428
- // Set a class on the page to avoid hiding it when zooming/etc
429
- this.refs.$br.find('.BRpagecontainer--hasSelection').removeClass('BRpagecontainer--hasSelection');
430
- $(window.getSelection().anchorNode).closest('.BRpagecontainer').addClass('BRpagecontainer--hasSelection');
431
- }
432
- }).attach();
433
- }
434
-
435
- super.init();
436
- }
437
-
438
- /**
439
- * @param {number} index
440
- */
441
- _createPageContainer(index) {
442
- const pageContainer = super._createPageContainer(index);
443
- // Disable if thumb mode; it's too janky
444
- // .page can be null for "pre-cover" region
445
- if (this.mode !== this.constModeThumb && pageContainer.page) {
446
- this.textSelectionPlugin?.createTextLayer(pageContainer);
447
- }
448
- return pageContainer;
449
- }
450
- }
451
- window.BookReader = BookreaderWithTextSelection;
452
- export default BookreaderWithTextSelection;
444
+ BookReader?.registerPlugin('textSelection', TextSelectionPlugin);
453
445
 
454
446
 
455
447
  /**
@@ -6,8 +6,7 @@ import { hasLocalStorage } from './utils.js';
6
6
  /**
7
7
  * @export
8
8
  * @typedef {Object} TTSEngineOptions
9
- * @property {String} server
10
- * @property {String} bookPath
9
+ * @property {import('@/src/util/strings.js').StringWithVars} pageChunkUrl
11
10
  * @property {ISO6391} bookLanguage
12
11
  * @property {Function} onLoadingStart
13
12
  * @property {Function} onLoadingComplete
@@ -85,8 +84,7 @@ export default class AbstractTTSEngine {
85
84
  this.opts.onLoadingStart();
86
85
 
87
86
  this._chunkIterator = new PageChunkIterator(numLeafs, leafIndex, {
88
- server: this.opts.server,
89
- bookPath: this.opts.bookPath,
87
+ pageChunkUrl: this.opts.pageChunkUrl,
90
88
  pageBufferSize: 5,
91
89
  });
92
90
 
@@ -1,3 +1,5 @@
1
+ import { applyVariables } from "../../util/strings.js";
2
+
1
3
  /**
2
4
  * Class to manage a 'chunk' (approximately a paragraph) of text on a page.
3
5
  */
@@ -16,24 +18,18 @@ export default class PageChunk {
16
18
  }
17
19
 
18
20
  /**
19
- * @param {string} server
20
- * @param {string} bookPath
21
+ * @param {import('@/src/util/strings.js').StringWithVars} pageChunkUrl
21
22
  * @param {number} leafIndex
22
23
  * @return {Promise<PageChunk[]>}
23
24
  */
24
- static async fetch(server, bookPath, leafIndex) {
25
+ static async fetch(pageChunkUrl, leafIndex) {
25
26
  const chunks = await $.ajax({
26
27
  type: 'GET',
27
- url: `https://${server}/BookReader/BookReaderGetTextWrapper.php`,
28
+ url: applyVariables(pageChunkUrl, { pageIndex: leafIndex }),
28
29
  cache: true,
29
30
  xhrFields: {
30
31
  withCredentials: window.br.protected,
31
32
  },
32
- data: {
33
- path: `${bookPath}_djvu.xml`,
34
- page: leafIndex,
35
- callback: 'false',
36
- },
37
33
  });
38
34
  return PageChunk._fromTextWrapperResponse(leafIndex, chunks);
39
35
  }
@@ -138,7 +138,7 @@ export default class PageChunkIterator {
138
138
  * @param {number} index
139
139
  */
140
140
  _fetchPageChunksDirect(index) {
141
- return PageChunk.fetch(this.opts.server, this.opts.bookPath, index);
141
+ return PageChunk.fetch(this.opts.pageChunkUrl, index);
142
142
  }
143
143
  }
144
144
 
@@ -146,14 +146,12 @@ PageChunkIterator.AT_END = "__PageChunkIterator.AT_END__";
146
146
 
147
147
  /** @type {PageChunkIteratorOptions} */
148
148
  const DEFAULT_OPTS = {
149
- server: null,
150
- bookPath: null,
149
+ pageChunkUrl: null,
151
150
  pageBufferSize: 2,
152
151
  };
153
152
 
154
153
  /**
155
154
  * @typedef {Object} PageChunkIteratorOptions
156
- * @property {string} server
157
- * @property {string} bookPath
155
+ * @property {import('@/src/util/strings.js').StringWithVars} pageChunkUrl
158
156
  * @property {number} [pageBufferSize] number of pages to buffer before/after the current page
159
157
  */