@internetarchive/bookreader 5.0.0-88-alpha.7 → 5.0.0-88-alpha.9

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 (183) hide show
  1. package/babel.config.js +30 -12
  2. package/dist/esm/BookNavigator/assets/bookmark-colors.js +4 -0
  3. package/dist/esm/BookNavigator/assets/button-base.js +4 -0
  4. package/dist/esm/BookNavigator/assets/ia-logo.js +4 -0
  5. package/dist/esm/BookNavigator/assets/icon_checkmark.js +8 -0
  6. package/dist/esm/BookNavigator/assets/icon_close.js +4 -0
  7. package/dist/esm/BookNavigator/book-navigator.js +612 -0
  8. package/dist/esm/BookNavigator/bookmarks/bookmark-button.js +35 -0
  9. package/dist/esm/BookNavigator/bookmarks/bookmark-edit.js +78 -0
  10. package/dist/esm/BookNavigator/bookmarks/bookmarks-list.js +160 -0
  11. package/dist/esm/BookNavigator/bookmarks/bookmarks-loginCTA.js +24 -0
  12. package/dist/esm/BookNavigator/bookmarks/bookmarks-provider.js +55 -0
  13. package/dist/esm/BookNavigator/bookmarks/ia-bookmarks.js +521 -0
  14. package/dist/esm/BookNavigator/delete-modal-actions.js +29 -0
  15. package/dist/esm/BookNavigator/downloads/downloads-provider.js +84 -0
  16. package/dist/esm/BookNavigator/downloads/downloads.js +69 -0
  17. package/dist/esm/BookNavigator/search/search-provider.js +238 -0
  18. package/dist/esm/BookNavigator/search/search-results.js +161 -0
  19. package/dist/esm/BookNavigator/sharing.js +26 -0
  20. package/dist/esm/BookNavigator/viewable-files.js +94 -0
  21. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments-provider.js +83 -0
  22. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments.js +131 -0
  23. package/dist/esm/BookReader/BookModel.js +575 -0
  24. package/dist/esm/BookReader/DragScrollable.js +224 -0
  25. package/dist/esm/BookReader/ImageCache.js +122 -0
  26. package/dist/esm/BookReader/Mode1Up.js +114 -0
  27. package/dist/esm/BookReader/Mode1UpLit.js +579 -0
  28. package/dist/esm/BookReader/Mode2Up.js +106 -0
  29. package/dist/esm/BookReader/Mode2UpLit.js +1020 -0
  30. package/dist/esm/BookReader/ModeCoordinateSpace.js +28 -0
  31. package/dist/esm/BookReader/ModeSmoothZoom.js +318 -0
  32. package/dist/esm/BookReader/ModeThumb.js +366 -0
  33. package/dist/esm/BookReader/Navbar/Navbar.js +253 -0
  34. package/dist/esm/BookReader/PageContainer.js +165 -0
  35. package/dist/esm/BookReader/ReduceSet.js +27 -0
  36. package/dist/esm/BookReader/Toolbar/Toolbar.js +242 -0
  37. package/dist/esm/BookReader/events.js +20 -0
  38. package/dist/esm/BookReader/options.js +331 -0
  39. package/dist/esm/BookReader/utils/HTMLDimensionsCacher.js +48 -0
  40. package/dist/esm/BookReader/utils/ScrollClassAdder.js +31 -0
  41. package/dist/esm/BookReader/utils/SelectionObserver.js +42 -0
  42. package/dist/esm/BookReader/utils/classes.js +37 -0
  43. package/dist/esm/BookReader/utils.js +315 -0
  44. package/dist/esm/BookReader.js +1827 -0
  45. package/dist/esm/assets/icons/1up.svg +12 -0
  46. package/dist/esm/assets/icons/2up.svg +15 -0
  47. package/dist/esm/assets/icons/advance.svg +26 -0
  48. package/dist/esm/assets/icons/chevron-right.svg +1 -0
  49. package/dist/esm/assets/icons/close-circle-dark.svg +1 -0
  50. package/dist/esm/assets/icons/close-circle.svg +1 -0
  51. package/dist/esm/assets/icons/fullscreen.svg +17 -0
  52. package/dist/esm/assets/icons/fullscreen_exit.svg +17 -0
  53. package/dist/esm/assets/icons/hamburger.svg +15 -0
  54. package/dist/esm/assets/icons/left-arrow.svg +12 -0
  55. package/dist/esm/assets/icons/magnify-minus.svg +12 -0
  56. package/dist/esm/assets/icons/magnify-plus.svg +13 -0
  57. package/dist/esm/assets/icons/magnify.svg +15 -0
  58. package/dist/esm/assets/icons/pause.svg +23 -0
  59. package/dist/esm/assets/icons/play.svg +22 -0
  60. package/dist/esm/assets/icons/playback-speed.svg +34 -0
  61. package/dist/esm/assets/icons/read-aloud.svg +22 -0
  62. package/dist/esm/assets/icons/review.svg +22 -0
  63. package/dist/esm/assets/icons/thumbnails.svg +17 -0
  64. package/dist/esm/assets/icons/voice.svg +1 -0
  65. package/dist/esm/assets/icons/volume-full.svg +22 -0
  66. package/dist/esm/assets/images/BRicons.png +0 -0
  67. package/dist/esm/assets/images/BRicons.svg +94 -0
  68. package/dist/esm/assets/images/BRicons_ia.png +0 -0
  69. package/dist/esm/assets/images/back_pages.png +0 -0
  70. package/dist/esm/assets/images/book_bottom_icon.png +0 -0
  71. package/dist/esm/assets/images/book_down_icon.png +0 -0
  72. package/dist/esm/assets/images/book_left_icon.png +0 -0
  73. package/dist/esm/assets/images/book_leftmost_icon.png +0 -0
  74. package/dist/esm/assets/images/book_right_icon.png +0 -0
  75. package/dist/esm/assets/images/book_rightmost_icon.png +0 -0
  76. package/dist/esm/assets/images/book_top_icon.png +0 -0
  77. package/dist/esm/assets/images/book_up_icon.png +0 -0
  78. package/dist/esm/assets/images/books_graphic.svg +177 -0
  79. package/dist/esm/assets/images/booksplit.png +0 -0
  80. package/dist/esm/assets/images/control_pause_icon.png +0 -0
  81. package/dist/esm/assets/images/control_play_icon.png +0 -0
  82. package/dist/esm/assets/images/embed_icon.png +0 -0
  83. package/dist/esm/assets/images/icon-home-ia.png +0 -0
  84. package/dist/esm/assets/images/icon_OL-logo-xs.png +0 -0
  85. package/dist/esm/assets/images/icon_alert-xs.png +0 -0
  86. package/dist/esm/assets/images/icon_book.svg +12 -0
  87. package/dist/esm/assets/images/icon_bookmark.svg +12 -0
  88. package/dist/esm/assets/images/icon_close-pop.png +0 -0
  89. package/dist/esm/assets/images/icon_download.png +0 -0
  90. package/dist/esm/assets/images/icon_gear.svg +14 -0
  91. package/dist/esm/assets/images/icon_hamburger.svg +20 -0
  92. package/dist/esm/assets/images/icon_home.png +0 -0
  93. package/dist/esm/assets/images/icon_home.svg +21 -0
  94. package/dist/esm/assets/images/icon_home_ia.png +0 -0
  95. package/dist/esm/assets/images/icon_indicator.png +0 -0
  96. package/dist/esm/assets/images/icon_info.svg +11 -0
  97. package/dist/esm/assets/images/icon_one_page.svg +8 -0
  98. package/dist/esm/assets/images/icon_pause.svg +1 -0
  99. package/dist/esm/assets/images/icon_play.svg +1 -0
  100. package/dist/esm/assets/images/icon_playback-rate.svg +15 -0
  101. package/dist/esm/assets/images/icon_return.png +0 -0
  102. package/dist/esm/assets/images/icon_search_button.svg +8 -0
  103. package/dist/esm/assets/images/icon_share.svg +9 -0
  104. package/dist/esm/assets/images/icon_skip-ahead.svg +6 -0
  105. package/dist/esm/assets/images/icon_skip-back.svg +13 -0
  106. package/dist/esm/assets/images/icon_speaker.svg +18 -0
  107. package/dist/esm/assets/images/icon_speaker_open.svg +10 -0
  108. package/dist/esm/assets/images/icon_thumbnails.svg +12 -0
  109. package/dist/esm/assets/images/icon_toc.svg +5 -0
  110. package/dist/esm/assets/images/icon_two_pages.svg +9 -0
  111. package/dist/esm/assets/images/icon_zoomer.png +0 -0
  112. package/dist/esm/assets/images/loading.gif +0 -0
  113. package/dist/esm/assets/images/logo_icon.png +0 -0
  114. package/dist/esm/assets/images/marker_chap-off.png +0 -0
  115. package/dist/esm/assets/images/marker_chap-off.svg +11 -0
  116. package/dist/esm/assets/images/marker_chap-off_ia.png +0 -0
  117. package/dist/esm/assets/images/marker_chap-on.png +0 -0
  118. package/dist/esm/assets/images/marker_chap-on.svg +11 -0
  119. package/dist/esm/assets/images/marker_srch-on.svg +11 -0
  120. package/dist/esm/assets/images/marker_srchchap-off.png +0 -0
  121. package/dist/esm/assets/images/marker_srchchap-on.png +0 -0
  122. package/dist/esm/assets/images/nav_control-dn.png +0 -0
  123. package/dist/esm/assets/images/nav_control-dn_ia.png +0 -0
  124. package/dist/esm/assets/images/nav_control-up.png +0 -0
  125. package/dist/esm/assets/images/nav_control-up_ia.png +0 -0
  126. package/dist/esm/assets/images/nav_control.png +0 -0
  127. package/dist/esm/assets/images/one_page_mode_icon.png +0 -0
  128. package/dist/esm/assets/images/paper-badge.png +0 -0
  129. package/dist/esm/assets/images/print_icon.png +0 -0
  130. package/dist/esm/assets/images/progressbar.gif +0 -0
  131. package/dist/esm/assets/images/right_edges.png +0 -0
  132. package/dist/esm/assets/images/slider.png +0 -0
  133. package/dist/esm/assets/images/slider_ia.png +0 -0
  134. package/dist/esm/assets/images/thumbnail_mode_icon.png +0 -0
  135. package/dist/esm/assets/images/transparent.png +0 -0
  136. package/dist/esm/assets/images/two_page_mode_icon.png +0 -0
  137. package/dist/esm/assets/images/unviewable_page.png +0 -0
  138. package/dist/esm/assets/images/zoom_in_icon.png +0 -0
  139. package/dist/esm/assets/images/zoom_out_icon.png +0 -0
  140. package/dist/esm/css/BookReader.scss +85 -0
  141. package/dist/esm/css/_BRBookmarks.scss +29 -0
  142. package/dist/esm/css/_BRComponent.scss +13 -0
  143. package/dist/esm/css/_BRfloat.scss +197 -0
  144. package/dist/esm/css/_BRicon.scss +54 -0
  145. package/dist/esm/css/_BRmain.scss +262 -0
  146. package/dist/esm/css/_BRnav.scss +354 -0
  147. package/dist/esm/css/_BRpages.scss +213 -0
  148. package/dist/esm/css/_BRsearch.scss +268 -0
  149. package/dist/esm/css/_BRtoolbar.scss +84 -0
  150. package/dist/esm/css/_BRvendor.scss +5 -0
  151. package/dist/esm/css/_TextSelection.scss +108 -0
  152. package/dist/esm/css/_colorbox.scss +52 -0
  153. package/dist/esm/css/_controls.scss +257 -0
  154. package/dist/esm/css/_icons.scss +121 -0
  155. package/dist/esm/ia-bookreader/ia-bookreader.js +141 -0
  156. package/dist/esm/jquery-wrapper.js +3 -0
  157. package/dist/esm/plugins/plugin.archive_analytics.js +72 -0
  158. package/dist/esm/plugins/plugin.autoplay.js +119 -0
  159. package/dist/esm/plugins/plugin.chapters.js +288 -0
  160. package/dist/esm/plugins/plugin.iframe.js +44 -0
  161. package/dist/esm/plugins/plugin.iiif.js +146 -0
  162. package/dist/esm/plugins/plugin.resume.js +66 -0
  163. package/dist/esm/plugins/plugin.text_selection.js +621 -0
  164. package/dist/esm/plugins/plugin.vendor-fullscreen.js +227 -0
  165. package/dist/esm/plugins/search/plugin.search.js +499 -0
  166. package/dist/esm/plugins/search/utils.js +42 -0
  167. package/dist/esm/plugins/search/view.js +360 -0
  168. package/dist/esm/plugins/tts/AbstractTTSEngine.js +282 -0
  169. package/dist/esm/plugins/tts/FestivalTTSEngine.js +192 -0
  170. package/dist/esm/plugins/tts/PageChunk.js +105 -0
  171. package/dist/esm/plugins/tts/PageChunkIterator.js +155 -0
  172. package/dist/esm/plugins/tts/WebTTSEngine.js +364 -0
  173. package/dist/esm/plugins/tts/plugin.tts.js +315 -0
  174. package/dist/esm/plugins/tts/tooltip_dict.js +14 -0
  175. package/dist/esm/plugins/tts/utils.js +79 -0
  176. package/dist/esm/plugins/url/UrlPlugin.js +197 -0
  177. package/dist/esm/plugins/url/plugin.url.js +212 -0
  178. package/dist/esm/util/browserSniffing.js +56 -0
  179. package/dist/esm/util/debouncer.js +25 -0
  180. package/dist/esm/util/docCookies.js +75 -0
  181. package/dist/esm/util/strings.js +34 -0
  182. package/jsconfig.json +1 -0
  183. package/package.json +13 -6
@@ -0,0 +1,165 @@
1
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
2
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
3
+ // @ts-check
4
+ /** @typedef {import('./BookModel.js').PageModel} PageModel */
5
+ /** @typedef {import('./ImageCache.js').ImageCache} ImageCache */
6
+
7
+ export class PageContainer {
8
+ /**
9
+ * @param {PageModel} page
10
+ * @param {object} opts
11
+ * @param {boolean} opts.isProtected Whether we're in a protected book
12
+ * @param {ImageCache} opts.imageCache
13
+ * @param {string} opts.loadingImage
14
+ */
15
+ constructor(page, _ref) {
16
+ var {
17
+ isProtected,
18
+ imageCache,
19
+ loadingImage
20
+ } = _ref;
21
+ this.page = page;
22
+ this.imageCache = imageCache;
23
+ this.loadingImage = loadingImage;
24
+ this.$container = $('<div />', {
25
+ 'class': "BRpagecontainer ".concat(page ? "pagediv".concat(page.index) : 'BRemptypage'),
26
+ css: {
27
+ position: 'absolute'
28
+ }
29
+ }).attr('data-side', page === null || page === void 0 ? void 0 : page.pageSide);
30
+ if (isProtected) {
31
+ this.$container.append($('<div class="BRscreen" />'));
32
+ this.$container.addClass('protected');
33
+ }
34
+
35
+ /** @type {JQuery<HTMLImageElement>} The main book page image */
36
+ this.$img = null;
37
+ }
38
+
39
+ /**
40
+ * @param {object} param0
41
+ * @param {{ width: number, height: number, top: number, left: number }} [param0.dimensions]
42
+ * @param {number} param0.reduce
43
+ */
44
+ update(_ref2) {
45
+ var _this$$img, _this$$img2;
46
+ var {
47
+ dimensions = null,
48
+ reduce = null
49
+ } = _ref2;
50
+ if (dimensions) {
51
+ this.$container.css(dimensions);
52
+ }
53
+ if (reduce == null || !this.page) {
54
+ return;
55
+ }
56
+ var alreadyLoaded = this.imageCache.imageLoaded(this.page.index, reduce);
57
+ var nextBestLoadedReduce = !alreadyLoaded && this.imageCache.getBestLoadedReduce(this.page.index, reduce);
58
+
59
+ // Create high res image
60
+ var $newImg = this.imageCache.image(this.page.index, reduce);
61
+
62
+ // Avoid removing/re-adding the image if it's already there
63
+ // This can be called quite a bit, so we need to be fast
64
+ if (((_this$$img = this.$img) === null || _this$$img === void 0 ? void 0 : _this$$img[0].src) == $newImg[0].src) {
65
+ return this;
66
+ }
67
+ (_this$$img2 = this.$img) === null || _this$$img2 === void 0 || _this$$img2.remove();
68
+ this.$img = $newImg.prependTo(this.$container);
69
+ var backgroundLayers = [];
70
+ if (!alreadyLoaded) {
71
+ this.$container.addClass('BRpageloading');
72
+ backgroundLayers.push("url(\"".concat(this.loadingImage, "\") center/20px no-repeat"));
73
+ }
74
+ if (nextBestLoadedReduce) {
75
+ backgroundLayers.push("url(\"".concat(this.page.getURI(nextBestLoadedReduce, 0), "\") center/100% 100% no-repeat"));
76
+ }
77
+ if (!alreadyLoaded) {
78
+ this.$img.css('background', backgroundLayers.join(',')).one('loadend', /*#__PURE__*/function () {
79
+ var _ref3 = _asyncToGenerator(function* (ev) {
80
+ $(ev.target).css({
81
+ 'background': ''
82
+ });
83
+ $(ev.target).parent().removeClass('BRpageloading');
84
+ });
85
+ return function (_x) {
86
+ return _ref3.apply(this, arguments);
87
+ };
88
+ }());
89
+ }
90
+ return this;
91
+ }
92
+ }
93
+
94
+ /**
95
+ * @param {PageModel} page
96
+ * @param {string} className
97
+ */
98
+ export function createSVGPageLayer(page, className) {
99
+ var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
100
+ svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
101
+ svg.setAttribute("viewBox", "0 0 ".concat(page.width, " ").concat(page.height));
102
+ svg.setAttribute('class', "BRPageLayer ".concat(className));
103
+ svg.setAttribute('preserveAspectRatio', 'none');
104
+ return svg;
105
+ }
106
+
107
+ /**
108
+ * @param {PageModel} page
109
+ * @param {string} className
110
+ */
111
+ export function createDIVPageLayer(page, className) {
112
+ var div = document.createElement("div");
113
+ div.style.width = "".concat(page.width, "px");
114
+ div.style.height = "".concat(page.height, "px");
115
+ div.setAttribute('class', "BRPageLayer ".concat(className));
116
+ return div;
117
+ }
118
+
119
+ /**
120
+ * @param {{ l: number, r: number, b: number, t: number }} box
121
+ */
122
+ export function boxToSVGRect(_ref4) {
123
+ var {
124
+ l: left,
125
+ r: right,
126
+ b: bottom,
127
+ t: top
128
+ } = _ref4;
129
+ var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
130
+ rect.setAttribute("x", left.toString());
131
+ rect.setAttribute("y", top.toString());
132
+ rect.setAttribute("width", (right - left).toString());
133
+ rect.setAttribute("height", (bottom - top).toString());
134
+
135
+ // Some style; corner radius 4px. Can't set this in CSS yet
136
+ rect.setAttribute("rx", "4");
137
+ rect.setAttribute("ry", "4");
138
+ return rect;
139
+ }
140
+
141
+ /**
142
+ * @param {string} layerClass
143
+ * @param {Array<{ l: number, r: number, b: number, t: number }>} boxes
144
+ * @param {PageModel} page
145
+ * @param {HTMLElement} containerEl
146
+ * @param {string[]} [rectClasses] CSS classes to add to the rects
147
+ */
148
+ export function renderBoxesInPageContainerLayer(layerClass, boxes, page, containerEl) {
149
+ var rectClasses = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
150
+ var mountedSvg = containerEl.querySelector(".".concat(layerClass));
151
+ // Create the layer if it's not there
152
+ var svg = mountedSvg || createSVGPageLayer(page, layerClass);
153
+ if (!mountedSvg) {
154
+ // Insert after the image if the image is already loaded.
155
+ var imgEl = containerEl.querySelector('.BRpageimage');
156
+ if (imgEl) $(svg).insertAfter(imgEl);else $(svg).prependTo(containerEl);
157
+ }
158
+ for (var [i, box] of boxes.entries()) {
159
+ var rect = boxToSVGRect(box);
160
+ if (rectClasses) {
161
+ rect.setAttribute('class', rectClasses[i]);
162
+ }
163
+ svg.appendChild(rect);
164
+ }
165
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @typedef {object} ReduceSet Set of valid numbers for a reduce variable.
3
+ * @property {(n: number) => number} floor
4
+ * @property {(n: number) => number} decr Return the predecessor of the given element
5
+ */
6
+
7
+ /** @type {ReduceSet} */
8
+ export var IntegerReduceSet = {
9
+ floor: Math.floor,
10
+ decr(n) {
11
+ return n - 1;
12
+ }
13
+ };
14
+
15
+ /** @type {ReduceSet} */
16
+ export var Pow2ReduceSet = {
17
+ floor(n) {
18
+ return 2 ** Math.floor(Math.log2(Math.max(1, n)));
19
+ },
20
+ decr(n) {
21
+ return 2 ** (Math.log2(n) - 1);
22
+ }
23
+ };
24
+ export var NAMED_REDUCE_SETS = {
25
+ pow2: Pow2ReduceSet,
26
+ integer: IntegerReduceSet
27
+ };
@@ -0,0 +1,242 @@
1
+ import 'jquery-colorbox';
2
+ import { escapeHTML } from '../utils.js';
3
+ import { EVENTS } from '../events.js';
4
+ /** @typedef {import("../../BookReader.js").default} BookReader */
5
+
6
+ export class Toolbar {
7
+ /**
8
+ * @param {BookReader} br
9
+ */
10
+ constructor(br) {
11
+ this.br = br;
12
+ }
13
+
14
+ /**
15
+ * This method builds the html for the toolbar. It can be decorated to extend
16
+ * the toolbar.
17
+ * @return {JQuery}
18
+ */
19
+ buildToolbarElement() {
20
+ var {
21
+ br
22
+ } = this;
23
+ var logoHtml = !br.showLogo ? '' : "\n <span class=\"BRtoolbarSection BRtoolbarSectionLogo\">\n <a class=\"logo\" href=\"".concat(br.logoURL, "\"></a>\n </span>");
24
+
25
+ // Add large screen navigation
26
+ br.refs.$BRtoolbar = $("\n <div class=\"BRtoolbar header\">\n <div class=\"BRtoolbarbuttons\">\n <div class=\"BRtoolbarLeft\">\n ".concat(logoHtml, "\n <span class=\"BRtoolbarSection BRtoolbarSectionTitle\"></span>\n </div>\n <div class=\"BRtoolbarRight\">\n <span class=\"BRtoolbarSection BRtoolbarSectionInfo\">\n <button class=\"BRpill info js-tooltip\">Info</button>\n <button class=\"BRpill share js-tooltip\">Share</button>\n </span>\n </div>\n </div>\n </div>"));
27
+ // TODO actual hamburger menu
28
+ // <span class="BRtoolbarSection BRtoolbarSectionMenu">
29
+ // <button class="BRpill BRtoolbarHamburger">
30
+ // <img src="${br.imagesBaseURL}icon_hamburger.svg" />
31
+ // <div class="BRhamburgerDrawer"><ul><li>hi</li></ul></div>
32
+ // </button>
33
+ // </span>
34
+
35
+ var $titleSectionEl = br.refs.$BRtoolbar.find('.BRtoolbarSectionTitle');
36
+ if (br.bookUrl && br.options.enableBookTitleLink) {
37
+ $titleSectionEl.append($('<a>').attr({
38
+ href: br.bookUrl,
39
+ title: br.bookUrlTitle
40
+ }).addClass('BRreturn').html(br.bookUrlText || br.bookTitle));
41
+ } else if (br.bookTitle) {
42
+ $titleSectionEl.append(br.bookUrlText || br.bookTitle);
43
+ }
44
+
45
+ // const $hamburger = br.refs.$BRtoolbar.find('BRtoolbarHamburger');
46
+ return br.refs.$BRtoolbar;
47
+ }
48
+
49
+ /**
50
+ * Initializes the toolbar (top)
51
+ * @param {string} mode
52
+ * @param {string} ui
53
+ */
54
+ initToolbar(mode, ui) {
55
+ var {
56
+ br
57
+ } = this;
58
+ br.refs.$br.append(this.buildToolbarElement());
59
+ br.$('.BRnavCntl').addClass('BRup');
60
+ br.$('.pause').hide();
61
+
62
+ // We build in mode 2
63
+ br.refs.$BRtoolbar.append();
64
+
65
+ // Hide mode buttons and autoplay if 2up is not available
66
+ // $$$ if we end up with more than two modes we should show the applicable buttons
67
+ if (!br.canSwitchToMode(br.constMode2up)) {
68
+ br.$('.two_page_mode, .play, .pause').hide();
69
+ }
70
+ if (!br.canSwitchToMode(br.constModeThumb)) {
71
+ br.$('.thumbnail_mode').hide();
72
+ }
73
+
74
+ // Hide one page button if it is the only mode available
75
+ if (!(br.canSwitchToMode(br.constMode2up) || br.canSwitchToMode(br.constModeThumb))) {
76
+ br.$('.one_page_mode').hide();
77
+ }
78
+ $('<div style="display: none;"></div>').append(blankShareDiv()).append(blankInfoDiv()).appendTo(br.refs.$br);
79
+ br.$('.BRinfo .BRfloatTitle a').attr({
80
+ href: br.bookUrl
81
+ }).text(br.bookTitle).addClass('title');
82
+
83
+ // These functions can be overridden
84
+ this.buildInfoDiv(br.$('.BRinfo'));
85
+ this.buildShareDiv(br.$('.BRshare'));
86
+ br.$('.share').colorbox({
87
+ inline: true,
88
+ opacity: "0.5",
89
+ href: br.$('.BRshare'),
90
+ onLoad: () => {
91
+ br.trigger(EVENTS.stop);
92
+ br.$('.BRpageviewValue').val(window.location.href);
93
+ }
94
+ });
95
+ br.$('.info').colorbox({
96
+ inline: true,
97
+ opacity: "0.5",
98
+ href: br.$('.BRinfo'),
99
+ onLoad: () => {
100
+ br.trigger(EVENTS.stop);
101
+ }
102
+ });
103
+ }
104
+
105
+ /**
106
+ * @param {JQuery} $shareDiv
107
+ */
108
+ buildShareDiv($shareDiv) {
109
+ var {
110
+ br
111
+ } = this;
112
+ var pageView = document.location + '';
113
+ var bookView = (pageView + '').replace(/#.*/, '');
114
+ var embedHtml = !br.getEmbedCode ? '' : "\n <div class=\"share-embed\">\n <p class=\"share-embed-prompt\">Copy and paste one of these options to share this book elsewhere.</p>\n <form method=\"post\" action=\"\">\n <fieldset class=\"fieldset-share-pageview\">\n <label for=\"pageview\">Link to this page view</label>\n <input type=\"text\" name=\"pageview\" class=\"BRpageviewValue\" value=\"".concat(pageView, "\"/>\n </fieldset>\n <fieldset class=\"fieldset-share-book-link\">\n <label for=\"booklink\">Link to the book</label>\n <input type=\"text\" name=\"booklink\" class=\"booklink\" value=\"").concat(bookView, "\"/>\n </fieldset>\n <fieldset class=\"fieldset-embed\">\n <label for=\"iframe\">Embed a mini Book Reader</label>\n <fieldset class=\"sub\">\n <label class=\"sub\">\n <input type=\"radio\" name=\"pages\" value=\"").concat(br.constMode1up, "\" checked=\"checked\"/>\n 1 page\n </label>\n <label class=\"sub\">\n <input type=\"radio\" name=\"pages\" value=\"").concat(br.constMode2up, "\"/>\n 2 pages\n </label>\n <label class=\"sub\">\n <input type=\"checkbox\" name=\"thispage\" value=\"thispage\"/>\n Open to this page?\n </label>\n </fieldset>\n <textarea cols=\"30\" rows=\"4\" name=\"iframe\" class=\"BRframeEmbed\"></textarea>\n </fieldset>\n </form>\n </div>");
115
+ var $form = $("\n <div class=\"share-title\">Share this book</div>\n <div class=\"share-social\">\n <label class=\"sub open-to-this-page\">\n <input class=\"thispage-social\" type=\"checkbox\" />\n Open to this page?\n </label>\n <div><button class=\"BRaction share facebook-share-button\"><i class=\"BRicon fb\" /> Facebook</button></div>\n <div><button class=\"BRaction share twitter-share-button\"><i class=\"BRicon twitter\" /> Twitter</button></div>\n <div><button class=\"BRaction share email-share-button\"><i class=\"BRicon email\" /> Email</button></div>\n </div>\n ".concat(embedHtml, "\n <div class=\"BRfloatFoot\">\n <button class=\"share-finished\" type=\"button\" onclick=\"$.fn.colorbox.close();\">Finished</button>\n </div>"));
116
+ $form.appendTo($shareDiv);
117
+ $form.find('.fieldset-embed input').on('change', event => {
118
+ var form = $(event.target).parents('form').first();
119
+ var params = {};
120
+ params.mode = $(form.find('.fieldset-embed input[name=pages]:checked')).val();
121
+ if (form.find('.fieldset-embed input[name=thispage]').prop('checked')) {
122
+ params.page = br.book.getPageNum(br.currentIndex());
123
+ }
124
+ if (br.getEmbedCode) {
125
+ // $$$ changeable width/height to be added to share UI
126
+ var frameWidth = "480px";
127
+ var frameHeight = "430px";
128
+ form.find('.BRframeEmbed').val(br.getEmbedCode(frameWidth, frameHeight, params));
129
+ }
130
+ });
131
+ $form.find('input, textarea').on('focus', event => event.target.select());
132
+
133
+ // Bind share buttons
134
+
135
+ // Use url without hashes
136
+ $form.find('.facebook-share-button').on("click", () => {
137
+ var params = $.param({
138
+ u: this._getSocialShareUrl()
139
+ });
140
+ var url = 'https://www.facebook.com/sharer.php?' + params;
141
+ createPopup(url, 600, 400, 'Share');
142
+ });
143
+ $form.find('.twitter-share-button').on("click", () => {
144
+ var params = $.param({
145
+ url: this._getSocialShareUrl(),
146
+ text: br.bookTitle
147
+ });
148
+ var url = 'https://twitter.com/intent/tweet?' + params;
149
+ createPopup(url, 600, 400, 'Share');
150
+ });
151
+ $form.find('.email-share-button').on("click", () => {
152
+ var body = "".concat(br.bookTitle, "\n\n").concat(this._getSocialShareUrl());
153
+ window.location.href = "mailto:?subject=".concat(encodeURI(br.bookTitle), "&body=").concat(encodeURI(body));
154
+ });
155
+ $form.find('input[name=thispage]').trigger('change');
156
+ $form.appendTo($shareDiv);
157
+ }
158
+ _getSocialShareUrl() {
159
+ var {
160
+ br
161
+ } = this;
162
+ var shareThisPage = br.$('.thispage-social').prop('checked');
163
+ if (shareThisPage) {
164
+ return window.location.href;
165
+ } else {
166
+ return "".concat(document.location.protocol, "//").concat(window.location.hostname).concat(window.location.pathname);
167
+ }
168
+ }
169
+
170
+ /**
171
+ * @param {JQuery} $infoDiv DOM element. Appends info to this element
172
+ * Can be overridden or extended
173
+ */
174
+ buildInfoDiv($infoDiv) {
175
+ var {
176
+ br
177
+ } = this;
178
+ // Remove these legacy elements
179
+ $infoDiv.find('.BRfloatBody, .BRfloatCover, .BRfloatFoot').remove();
180
+ var $leftCol = $("<div class=\"BRinfoLeftCol\"></div>");
181
+ if (br.thumbnail) {
182
+ $leftCol.append($("\n <div class=\"BRimageW\">\n <img src=\"".concat(br.thumbnail, "\" alt=\"").concat(escapeHTML(br.bookTitle), "\" />\n </div>")));
183
+ }
184
+ var $rightCol = $("<div class=\"BRinfoRightCol\">");
185
+
186
+ // A loop to build fields
187
+ for (var {
188
+ extraValueClass = '',
189
+ label,
190
+ value
191
+ } of br.metadata) {
192
+ var escapedValue = label === 'Title' ? escapeHTML(value) : value;
193
+ $rightCol.append($("\n <div class=\"BRinfoValueWrapper\">\n <div class=\"BRinfoLabel\">".concat(label, "</div>\n <div class=\"BRinfoValue ").concat(extraValueClass, "\">").concat(escapedValue, "</div>\n </div>")));
194
+ }
195
+ var moreInfoText = br.bookUrlMoreInfo ? br.bookUrlMoreInfo : br.bookTitle;
196
+ if (moreInfoText && br.bookUrl) {
197
+ $rightCol.append($("\n <div class=\"BRinfoValueWrapper\">\n <div class=\"BRinfoMoreInfoWrapper\">\n <a class=\"BRinfoMoreInfo\" href=\"".concat(br.bookUrl, "\">\n ").concat(escapeHTML(moreInfoText), "\n </a>\n </div>\n </div>")));
198
+ }
199
+ var $footer = $("<div class=\"BRfloatFoot BRinfoFooter\"></div>");
200
+ var $children = $('<div class="BRinfoW mv20-lg">').append([$leftCol, $rightCol, $('<br style="clear:both"/>')]);
201
+ $infoDiv.append($children, $footer).addClass('wide');
202
+ }
203
+
204
+ /**
205
+ * @return {number} (in pixels) of the toolbar height. 0 if no toolbar.
206
+ */
207
+ getToolBarHeight() {
208
+ var {
209
+ $BRtoolbar
210
+ } = this.br.refs;
211
+ if ($BRtoolbar && $BRtoolbar.css('display') === 'block') {
212
+ return $BRtoolbar.outerHeight() + parseInt($BRtoolbar.css('top'));
213
+ } else {
214
+ return 0;
215
+ }
216
+ }
217
+ }
218
+ function blankInfoDiv() {
219
+ return $("\n <div class=\"BRfloat BRinfo\">\n <div class=\"BRfloatHead\">About this book\n <button class=\"floatShut\" href=\"javascript:;\" onclick=\"$.fn.colorbox.close();\"><span class=\"br-colorbox-shift\">Close</span></button>\n </div>\n <div class=\"BRfloatBody\">\n <div class=\"BRfloatCover\"></div>\n <div class=\"BRfloatMeta\">\n <div class=\"BRfloatTitle\">\n <h2><a /></h2>\n </div>\n </div>\n </div>\n <div class=\"BRfloatFoot\">\n <a href=\"https://openlibrary.org/dev/docs/bookreader\">About the BookReader</a>\n </div>\n </div>");
220
+ }
221
+ function blankShareDiv() {
222
+ return $("\n <div class=\"BRfloat BRshare\">\n <div class=\"BRfloatHead\">\n Share\n <button class=\"floatShut\" href=\"javascript:;\" onclick=\"$.fn.colorbox.close();\"><span class=\"br-colorbox-shift\">Close</span></button>\n </div>\n </div>");
223
+ }
224
+
225
+ /**
226
+ * Helper opens a popup window. On mobile it only opens a new tab. Used for share.
227
+ * @param {string} href
228
+ * @param {number} width
229
+ * @param {number} height
230
+ * @param {string} name
231
+ */
232
+ export function createPopup(href, width, height, name) {
233
+ // Fixes dual-screen position
234
+ var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left;
235
+ var dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top;
236
+ var win_w = window.innerWidth || document.documentElement.clientWidth || screen.width;
237
+ var win_h = window.innerHeight || document.documentElement.clientHeight || screen.height;
238
+ var left = win_w / 2 - width / 2 + dualScreenLeft;
239
+ var top = win_h / 2 - height / 2 + dualScreenTop;
240
+ var opts = "status=1,width=".concat(width, ",height=").concat(height, ",top=").concat(top, ",left=").concat(left);
241
+ window.open(href, name, opts);
242
+ }
@@ -0,0 +1,20 @@
1
+ /** @enum {string} */
2
+ export var EVENTS = {
3
+ /** Indicates that the fragment (a serialization of the reader
4
+ * state) has changed. */
5
+ fragmentChange: 'fragmentChange',
6
+ pageChanged: 'pageChanged',
7
+ PostInit: 'PostInit',
8
+ stop: 'stop',
9
+ resize: 'resize',
10
+ userAction: 'userAction',
11
+ // event to know if user is actively reading
12
+ // menu click events
13
+ fullscreenToggled: 'fullscreenToggled',
14
+ zoomOut: 'zoomOut',
15
+ zoomIn: 'zoomIn',
16
+ '1PageViewSelected': '1PageViewSelected',
17
+ '2PageViewSelected': '2PageViewSelected',
18
+ /* currently 3 represents thumbnail view */
19
+ '3PageViewSelected': '3PageViewSelected'
20
+ };