@internetarchive/bookreader 5.0.0-34 → 5.0.0-37
Sign up to get free protection for your applications and to get access to all the features.
- package/.eslintrc.js +1 -11
- package/.github/workflows/node.js.yml +3 -3
- package/.github/workflows/npm-publish.yml +2 -16
- package/BookReader/BookReader.css +1 -1
- package/BookReader/BookReader.js +1 -1
- package/BookReader/BookReader.js.LICENSE.txt +8 -29
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/ia-bookreader-bundle.js +103 -102
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +15 -12
- package/BookReader/ia-bookreader-bundle.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +1 -1
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +1 -1
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +1 -1
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.tts.js +1 -1
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +1 -1
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/CHANGELOG.md +21 -0
- package/README.md +1 -1
- package/package.json +7 -10
- package/src/BookNavigator/assets/bookmark-colors.js +1 -1
- package/src/BookNavigator/assets/button-base.js +1 -1
- package/src/BookNavigator/assets/ia-logo.js +1 -1
- package/src/BookNavigator/assets/icon_checkmark.js +1 -1
- package/src/BookNavigator/assets/icon_close.js +1 -1
- package/src/BookNavigator/assets/icon_sort_asc.js +1 -1
- package/src/BookNavigator/assets/icon_sort_desc.js +1 -1
- package/src/BookNavigator/assets/icon_sort_neutral.js +1 -1
- package/src/BookNavigator/assets/icon_volumes.js +1 -1
- package/src/BookNavigator/book-navigator.js +15 -4
- package/src/BookNavigator/bookmarks/bookmark-button.js +1 -1
- package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -3
- package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
- package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +1 -1
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +1 -1
- package/src/BookNavigator/bookmarks/ia-bookmarks.js +30 -34
- package/src/BookNavigator/delete-modal-actions.js +1 -1
- package/src/BookNavigator/downloads/downloads-provider.js +1 -1
- package/src/BookNavigator/downloads/downloads.js +1 -2
- package/src/BookNavigator/search/a-search-result.js +2 -3
- package/src/BookNavigator/search/search-provider.js +3 -4
- package/src/BookNavigator/search/search-results.js +1 -2
- package/src/BookNavigator/sharing.js +1 -1
- package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +1 -1
- package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
- package/src/BookNavigator/volumes/volumes-provider.js +1 -1
- package/src/BookNavigator/volumes/volumes.js +2 -3
- package/src/BookReader/Mode1Up.js +2 -1
- package/src/BookReader/Mode1UpLit.js +3 -2
- package/src/BookReader/Toolbar/Toolbar.js +2 -2
- package/src/BookReader.js +59 -57
- package/src/css/_colorbox.scss +2 -2
- package/src/ia-bookreader/ia-bookreader.js +5 -2
- package/src/plugins/plugin.chapters.js +11 -15
- package/src/plugins/plugin.text_selection.js +9 -10
- package/src/plugins/search/plugin.search.js +3 -3
- package/src/plugins/tts/AbstractTTSEngine.js +31 -34
- package/src/plugins/tts/FestivalTTSEngine.js +10 -11
- package/src/plugins/tts/PageChunk.js +11 -20
- package/src/plugins/tts/PageChunkIterator.js +8 -12
- package/src/plugins/tts/WebTTSEngine.js +59 -68
- package/src/plugins/tts/plugin.tts.js +16 -10
- package/src/plugins/url/UrlPlugin.js +1 -1
- package/tests/e2e/base.test.js +7 -4
- package/tests/e2e/helpers/params.js +1 -1
- package/tests/e2e/viewmode.test.js +30 -30
- package/tests/jest/BookReader/Mode1UpLit.test.js +2 -1
- package/tests/jest/plugins/plugin.text_selection.test.js +25 -23
- package/tests/jest/plugins/search/plugin.search.test.js +12 -20
- package/tests/jest/plugins/tts/AbstractTTSEngine.test.js +3 -3
- package/tests/jest/plugins/url/UrlPlugin.test.js +15 -0
- package/tests/karma/BookNavigator/book-navigator.test.js +9 -0
- package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +2 -2
- package/tests/karma/BookNavigator/downloads/downloads.test.js +1 -1
- package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +3 -3
- package/webpack.config.js +1 -1
- package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
@@ -1,6 +1,6 @@
|
|
1
|
-
import { css, html, LitElement } from "lit
|
2
|
-
import { repeat } from "lit
|
3
|
-
import { nothing } from "lit
|
1
|
+
import { css, html, LitElement } from "lit";
|
2
|
+
import { repeat } from "lit/directives/repeat.js";
|
3
|
+
import { nothing } from "lit";
|
4
4
|
import checkmarkIcon from '../assets/icon_checkmark.js';
|
5
5
|
import "@internetarchive/icon-magnify-minus/icon-magnify-minus";
|
6
6
|
import "@internetarchive/icon-magnify-plus/icon-magnify-plus";
|
@@ -1,6 +1,5 @@
|
|
1
|
-
import { css, html, LitElement } from 'lit
|
2
|
-
import {
|
3
|
-
import { repeat } from 'lit-html/directives/repeat';
|
1
|
+
import { css, html, LitElement, nothing } from 'lit';
|
2
|
+
import { repeat } from 'lit/directives/repeat.js';
|
4
3
|
|
5
4
|
export class Volumes extends LitElement {
|
6
5
|
static get properties() {
|
@@ -46,7 +46,8 @@ export class Mode1Up {
|
|
46
46
|
if (!this.everShown) {
|
47
47
|
this.mode1UpLit.initFirstRender(startLeaf);
|
48
48
|
this.everShown = true;
|
49
|
-
|
49
|
+
this.mode1UpLit.requestUpdate();
|
50
|
+
await this.mode1UpLit.updateComplete;
|
50
51
|
new DragScrollable(this.mode1UpLit, {
|
51
52
|
preventDefault: true,
|
52
53
|
dragSelector: '.br-mode-1up__visible-world',
|
@@ -1,6 +1,7 @@
|
|
1
1
|
// @ts-check
|
2
|
-
import { customElement,
|
3
|
-
import {
|
2
|
+
import { customElement, property, query } from 'lit/decorators.js';
|
3
|
+
import {LitElement, html} from 'lit';
|
4
|
+
import { styleMap } from 'lit/directives/style-map.js';
|
4
5
|
import { ModeSmoothZoom } from './ModeSmoothZoom';
|
5
6
|
import { arrChanged, calcScreenDPI, genToArray, sum, throttle } from './utils';
|
6
7
|
import { HTMLDimensionsCacher } from "./utils/HTMLDimensionsCacher";
|
@@ -335,7 +335,7 @@ export function blankInfoDiv() {
|
|
335
335
|
return $(`
|
336
336
|
<div class="BRfloat BRinfo">
|
337
337
|
<div class="BRfloatHead">About this book
|
338
|
-
<button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="shift">Close</span></button>
|
338
|
+
<button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="br-colorbox-shift">Close</span></button>
|
339
339
|
</div>
|
340
340
|
<div class="BRfloatBody">
|
341
341
|
<div class="BRfloatCover"></div>
|
@@ -356,7 +356,7 @@ export function blankShareDiv() {
|
|
356
356
|
<div class="BRfloat BRshare">
|
357
357
|
<div class="BRfloatHead">
|
358
358
|
Share
|
359
|
-
<button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="shift">Close</span></button>
|
359
|
+
<button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="br-colorbox-shift">Close</span></button>
|
360
360
|
</div>
|
361
361
|
</div>`);
|
362
362
|
}
|
package/src/BookReader.js
CHANGED
@@ -333,9 +333,9 @@ BookReader.util = utils;
|
|
333
333
|
* @private
|
334
334
|
*/
|
335
335
|
BookReader.prototype.extendParams = function(params, newParams) {
|
336
|
-
|
336
|
+
const modifiedNewParams = $.extend({}, newParams);
|
337
337
|
if ('undefined' != typeof(modifiedNewParams.page)) {
|
338
|
-
|
338
|
+
const pageIndex = this._models.book.parsePageString(modifiedNewParams.page);
|
339
339
|
if (!isNaN(pageIndex))
|
340
340
|
modifiedNewParams.index = pageIndex;
|
341
341
|
delete modifiedNewParams.page;
|
@@ -349,7 +349,7 @@ BookReader.prototype.extendParams = function(params, newParams) {
|
|
349
349
|
* @return {object} the parsed params
|
350
350
|
*/
|
351
351
|
BookReader.prototype.initParams = function() {
|
352
|
-
|
352
|
+
const params = {};
|
353
353
|
// Flag initializing for updateFromParams()
|
354
354
|
params.init = true;
|
355
355
|
|
@@ -398,7 +398,7 @@ BookReader.prototype.initParams = function() {
|
|
398
398
|
// Check for URL plugin
|
399
399
|
if (this.options.enableUrlPlugin) {
|
400
400
|
// Params explicitly set in URL take precedence over all other methods
|
401
|
-
|
401
|
+
let urlParams = this.paramsFromFragment(this.urlReadFragment());
|
402
402
|
|
403
403
|
// Get params if hash fragment available with 'history' urlMode
|
404
404
|
const hasHashURL = !Object.keys(urlParams).length && this.urlReadHashFragment();
|
@@ -481,8 +481,8 @@ BookReader.prototype.readQueryString = function() {
|
|
481
481
|
*/
|
482
482
|
BookReader.prototype.getInitialMode = function(params) {
|
483
483
|
// Use params or browser width to set view mode
|
484
|
-
|
485
|
-
|
484
|
+
const windowWidth = $(window).width();
|
485
|
+
let nextMode;
|
486
486
|
if ('undefined' != typeof(params.mode)) {
|
487
487
|
nextMode = params.mode;
|
488
488
|
} else if (this.ui == 'full'
|
@@ -509,7 +509,7 @@ BookReader.prototype.init = function() {
|
|
509
509
|
this.init.initComplete = false;
|
510
510
|
this.pageScale = this.reduce; // preserve current reduce
|
511
511
|
|
512
|
-
|
512
|
+
const params = this.initParams();
|
513
513
|
|
514
514
|
this.firstIndex = params.index ? params.index : 0;
|
515
515
|
|
@@ -653,8 +653,8 @@ BookReader.prototype.resize = function() {
|
|
653
653
|
} else {
|
654
654
|
// used when zoomed in
|
655
655
|
// Re-center if the scrollbars have disappeared
|
656
|
-
|
657
|
-
|
656
|
+
const center = this.twoPageGetViewCenter();
|
657
|
+
let doRecenter = false;
|
658
658
|
if (this.twoPage.totalWidth < this.refs.$brContainer.prop('clientWidth')) {
|
659
659
|
center.percentageX = 0.5;
|
660
660
|
doRecenter = true;
|
@@ -816,8 +816,8 @@ BookReader.prototype.bindGestures = function(jElement) {
|
|
816
816
|
// when you move the book with one finger and then add another
|
817
817
|
// finger to pinch. Gestures are aware of scroll state.
|
818
818
|
|
819
|
-
|
820
|
-
|
819
|
+
const self = this;
|
820
|
+
let numTouches = 1;
|
821
821
|
|
822
822
|
jElement.unbind('touchmove').bind('touchmove', function(e) {
|
823
823
|
if (e.originalEvent.cancelable) numTouches = e.originalEvent.touches.length;
|
@@ -901,8 +901,8 @@ BookReader.prototype.resizeBRcontainer = function(animate) {
|
|
901
901
|
};
|
902
902
|
|
903
903
|
BookReader.prototype.centerPageView = function() {
|
904
|
-
|
905
|
-
|
904
|
+
const scrollWidth = this.refs.$brContainer.prop('scrollWidth');
|
905
|
+
const clientWidth = this.refs.$brContainer.prop('clientWidth');
|
906
906
|
if (scrollWidth > clientWidth) {
|
907
907
|
this.refs.$brContainer.prop('scrollLeft', (scrollWidth - clientWidth) / 2);
|
908
908
|
}
|
@@ -990,7 +990,7 @@ BookReader.prototype._reduceSort = (a, b) => a.reduce - b.reduce;
|
|
990
990
|
* @return {boolean} Returns true if page could be found, false otherwise.
|
991
991
|
*/
|
992
992
|
BookReader.prototype.jumpToPage = function(pageNum) {
|
993
|
-
|
993
|
+
const pageIndex = this._models.book.parsePageString(pageNum);
|
994
994
|
|
995
995
|
if ('undefined' != typeof(pageIndex)) {
|
996
996
|
this.jumpToIndex(pageIndex);
|
@@ -1119,14 +1119,14 @@ BookReader.prototype.switchMode = function(
|
|
1119
1119
|
if (!(this.suppressFragmentChange || suppressFragmentChange)) {
|
1120
1120
|
this.trigger(BookReader.eventNames.fragmentChange);
|
1121
1121
|
}
|
1122
|
-
|
1122
|
+
const eventName = mode + 'PageViewSelected';
|
1123
1123
|
this.trigger(BookReader.eventNames[eventName]);
|
1124
1124
|
|
1125
1125
|
this.textSelectionPlugin?.stopPageFlip(this.refs.$brContainer);
|
1126
1126
|
};
|
1127
1127
|
|
1128
1128
|
BookReader.prototype.updateBrClasses = function() {
|
1129
|
-
|
1129
|
+
const modeToClass = {};
|
1130
1130
|
modeToClass[this.constMode1up] = 'BRmode1up';
|
1131
1131
|
modeToClass[this.constMode2up] = 'BRmode2Up';
|
1132
1132
|
modeToClass[this.constModeThumb] = 'BRmodeThumb';
|
@@ -1192,7 +1192,8 @@ BookReader.prototype.enterFullscreen = async function(bindKeyboardControls = tru
|
|
1192
1192
|
if (this.activeMode instanceof Mode1Up) {
|
1193
1193
|
this.activeMode.mode1UpLit.scale = this.activeMode.mode1UpLit.computeDefaultScale(this._models.book.getPage(currentIndex));
|
1194
1194
|
// Need the new scale to be applied before calling jumpToIndex
|
1195
|
-
|
1195
|
+
this.activeMode.mode1UpLit.requestUpdate();
|
1196
|
+
await this.activeMode.mode1UpLit.updateComplete;
|
1196
1197
|
}
|
1197
1198
|
this.jumpToIndex(currentIndex);
|
1198
1199
|
this.animating = false;
|
@@ -1222,7 +1223,7 @@ BookReader.prototype.exitFullScreen = async function () {
|
|
1222
1223
|
|
1223
1224
|
$(document).off('keyup', this._fullscreenCloseHandler);
|
1224
1225
|
|
1225
|
-
|
1226
|
+
const windowWidth = $(window).width();
|
1226
1227
|
|
1227
1228
|
const canShow2up = this.options.controls.twoPage.visible;
|
1228
1229
|
if (canShow2up && (windowWidth <= this.onePageMinBreakpoint)) {
|
@@ -1241,7 +1242,8 @@ BookReader.prototype.exitFullScreen = async function () {
|
|
1241
1242
|
|
1242
1243
|
if (this.activeMode instanceof Mode1Up) {
|
1243
1244
|
this.activeMode.mode1UpLit.scale = this.activeMode.mode1UpLit.computeDefaultScale(this._models.book.getPage(this.currentIndex()));
|
1244
|
-
|
1245
|
+
this.activeMode.mode1UpLit.requestUpdate();
|
1246
|
+
await this.activeMode.mode1UpLit.updateComplete;
|
1245
1247
|
}
|
1246
1248
|
|
1247
1249
|
this.animating = false;
|
@@ -1706,7 +1708,7 @@ BookReader.prototype.bindNavigationHandlers = function() {
|
|
1706
1708
|
},
|
1707
1709
|
full: () => {
|
1708
1710
|
if (this.ui == 'embed') {
|
1709
|
-
|
1711
|
+
const url = this.$('.BRembedreturn a').attr('href');
|
1710
1712
|
window.open(url);
|
1711
1713
|
} else {
|
1712
1714
|
this.toggleFullscreen();
|
@@ -1725,12 +1727,12 @@ BookReader.prototype.bindNavigationHandlers = function() {
|
|
1725
1727
|
});
|
1726
1728
|
}
|
1727
1729
|
|
1728
|
-
|
1729
|
-
|
1730
|
+
const $brNavCntlBtmEl = this.$('.BRnavCntlBtm');
|
1731
|
+
const $brNavCntlTopEl = this.$('.BRnavCntlTop');
|
1730
1732
|
|
1731
1733
|
this.$('.BRnavCntl').click(
|
1732
1734
|
function() {
|
1733
|
-
|
1735
|
+
const promises = [];
|
1734
1736
|
// TODO don't use magic constants
|
1735
1737
|
// TODO move this to a function
|
1736
1738
|
if ($brNavCntlBtmEl.hasClass('BRdn')) {
|
@@ -1827,7 +1829,7 @@ BookReader.prototype.navigationMousemoveHandler = function(event) {
|
|
1827
1829
|
if (event.data['br'].uiAutoHide) {
|
1828
1830
|
// 77px is an approximate height of the Internet Archive Top Nav
|
1829
1831
|
// 75 & 76 (pixels) provide used in this context is checked against the IA top nav height
|
1830
|
-
|
1832
|
+
const navkey = $(document).height() - 75;
|
1831
1833
|
if ((event.pageY < 76) || (event.pageY > navkey)) {
|
1832
1834
|
// inside or near navigation elements
|
1833
1835
|
event.data['br'].hideNavigation();
|
@@ -1858,7 +1860,7 @@ BookReader.prototype.initSwipeData = function(clientX, clientY) {
|
|
1858
1860
|
};
|
1859
1861
|
|
1860
1862
|
BookReader.prototype.swipeMousedownHandler = function(event) {
|
1861
|
-
|
1863
|
+
const self = event.data['br'];
|
1862
1864
|
|
1863
1865
|
// We should be the last bubble point for the page images
|
1864
1866
|
// Disable image drag and select, but keep right-click
|
@@ -1888,8 +1890,8 @@ BookReader.prototype.swipeMousedownHandler = function(event) {
|
|
1888
1890
|
};
|
1889
1891
|
|
1890
1892
|
BookReader.prototype.swipeMousemoveHandler = function(event) {
|
1891
|
-
|
1892
|
-
|
1893
|
+
const self = event.data['br'];
|
1894
|
+
const _swipe = self._swipe;
|
1893
1895
|
if (! _swipe.mightBeSwiping) {
|
1894
1896
|
return;
|
1895
1897
|
}
|
@@ -1899,12 +1901,12 @@ BookReader.prototype.swipeMousemoveHandler = function(event) {
|
|
1899
1901
|
_swipe.deltaY = event.clientY - _swipe.startY;
|
1900
1902
|
_swipe.deltaT = (new Date).getTime() - _swipe.startTime;
|
1901
1903
|
|
1902
|
-
|
1903
|
-
|
1904
|
+
const absX = Math.abs(_swipe.deltaX);
|
1905
|
+
const absY = Math.abs(_swipe.deltaY);
|
1904
1906
|
|
1905
1907
|
// Minimum distance in the amount of tim to trigger the swipe
|
1906
|
-
|
1907
|
-
|
1908
|
+
const minSwipeLength = Math.min(self.refs.$br.width() / 5, 80);
|
1909
|
+
const maxSwipeTime = 400;
|
1908
1910
|
|
1909
1911
|
// Check for horizontal swipe
|
1910
1912
|
if (absX > absY && (absX > minSwipeLength) && _swipe.deltaT < maxSwipeTime) {
|
@@ -1938,7 +1940,7 @@ BookReader.prototype.swipeMousemoveHandler = function(event) {
|
|
1938
1940
|
};
|
1939
1941
|
|
1940
1942
|
BookReader.prototype.swipeMouseupHandler = function(event) {
|
1941
|
-
|
1943
|
+
const _swipe = event.data['br']._swipe;
|
1942
1944
|
_swipe.mightBeSwiping = false;
|
1943
1945
|
_swipe.mightBeDragging = false;
|
1944
1946
|
|
@@ -1955,7 +1957,7 @@ BookReader.prototype.swipeMouseupHandler = function(event) {
|
|
1955
1957
|
};
|
1956
1958
|
|
1957
1959
|
BookReader.prototype.bindMozTouchHandlers = function() {
|
1958
|
-
|
1960
|
+
const self = this;
|
1959
1961
|
|
1960
1962
|
// Currently only want touch handlers in 2up
|
1961
1963
|
this.refs.$br
|
@@ -1982,8 +1984,8 @@ BookReader.prototype.bindMozTouchHandlers = function() {
|
|
1982
1984
|
*/
|
1983
1985
|
BookReader.prototype.navigationIsVisible = function() {
|
1984
1986
|
// $$$ doesn't account for transitioning states, nav must be fully visible to return true
|
1985
|
-
|
1986
|
-
|
1987
|
+
const toolpos = this.refs.$BRtoolbar.position();
|
1988
|
+
const tooltop = toolpos.top;
|
1987
1989
|
return tooltop == 0;
|
1988
1990
|
};
|
1989
1991
|
|
@@ -1992,19 +1994,19 @@ BookReader.prototype.navigationIsVisible = function() {
|
|
1992
1994
|
* Defaults to SHOW the navigation chrome
|
1993
1995
|
*/
|
1994
1996
|
BookReader.prototype.setNavigationView = function brSetNavigationView(hide) {
|
1995
|
-
|
1996
|
-
|
1997
|
-
|
1997
|
+
const animationLength = this.constNavAnimationDuration;
|
1998
|
+
const animationType = 'linear';
|
1999
|
+
const resizePageContainer = function resizePageContainer () {
|
1998
2000
|
/* main page container fills whole container */
|
1999
2001
|
if (this.constMode2up !== this.mode) {
|
2000
|
-
|
2002
|
+
const animate = true;
|
2001
2003
|
this.resizeBRcontainer(animate);
|
2002
2004
|
}
|
2003
2005
|
this.trigger(BookReader.eventNames.navToggled);
|
2004
2006
|
}.bind(this);
|
2005
2007
|
|
2006
|
-
|
2007
|
-
|
2008
|
+
let toolbarHeight = 0;
|
2009
|
+
let navbarHeight = 0;
|
2008
2010
|
if (hide) {
|
2009
2011
|
toolbarHeight = this.getToolBarHeight() * -1;
|
2010
2012
|
navbarHeight = this.getFooterHeight() * -1;
|
@@ -2035,7 +2037,7 @@ BookReader.prototype.setNavigationView = function brSetNavigationView(hide) {
|
|
2035
2037
|
BookReader.prototype.hideNavigation = function() {
|
2036
2038
|
// Check if navigation is showing
|
2037
2039
|
if (this.navigationIsVisible()) {
|
2038
|
-
|
2040
|
+
const hide = true;
|
2039
2041
|
this.setNavigationView(hide);
|
2040
2042
|
}
|
2041
2043
|
};
|
@@ -2086,7 +2088,7 @@ BookReader.prototype.firstDisplayableIndex = function() {
|
|
2086
2088
|
*/
|
2087
2089
|
BookReader.prototype.lastDisplayableIndex = function() {
|
2088
2090
|
|
2089
|
-
|
2091
|
+
const lastIndex = this._models.book.getNumLeafs() - 1;
|
2090
2092
|
|
2091
2093
|
if (this.mode != this.constMode2up) {
|
2092
2094
|
return lastIndex;
|
@@ -2325,7 +2327,7 @@ BookReader.prototype.initUIStrings = function() {
|
|
2325
2327
|
// the toolbar and nav bar easier
|
2326
2328
|
|
2327
2329
|
// Setup tooltips -- later we could load these from a file for i18n
|
2328
|
-
|
2330
|
+
const titles = {
|
2329
2331
|
'.logo': 'Go to Archive.org', // $$$ update after getting OL record
|
2330
2332
|
'.zoom_in': 'Zoom in',
|
2331
2333
|
'.zoom_out': 'Zoom out',
|
@@ -2357,7 +2359,7 @@ BookReader.prototype.initUIStrings = function() {
|
|
2357
2359
|
titles['.book_rightmost'] = 'First page';
|
2358
2360
|
}
|
2359
2361
|
|
2360
|
-
for (
|
2362
|
+
for (const icon in titles) {
|
2361
2363
|
this.$(icon).prop('title', titles[icon]);
|
2362
2364
|
}
|
2363
2365
|
};
|
@@ -2368,7 +2370,7 @@ BookReader.prototype.initUIStrings = function() {
|
|
2368
2370
|
BookReader.prototype.reloadImages = function() {
|
2369
2371
|
this.refs.$brContainer.find('img').each(function(index, elem) {
|
2370
2372
|
if (!elem.complete || elem.naturalHeight === 0) {
|
2371
|
-
|
2373
|
+
const src = elem.src;
|
2372
2374
|
elem.src = '';
|
2373
2375
|
setTimeout(function() {
|
2374
2376
|
elem.src = src;
|
@@ -2382,10 +2384,10 @@ BookReader.prototype.reloadImages = function() {
|
|
2382
2384
|
* @return {number}
|
2383
2385
|
*/
|
2384
2386
|
BookReader.prototype.getFooterHeight = function() {
|
2385
|
-
|
2387
|
+
const $heightEl = this.mode == this.constMode2up ? this.refs.$BRfooter : this.refs.$BRnav;
|
2386
2388
|
if ($heightEl && this.refs.$BRfooter) {
|
2387
|
-
|
2388
|
-
|
2389
|
+
const outerHeight = $heightEl.outerHeight();
|
2390
|
+
const bottom = parseInt(this.refs.$BRfooter.css('bottom'));
|
2389
2391
|
if (!isNaN(outerHeight) && !isNaN(bottom)) {
|
2390
2392
|
return outerHeight + bottom;
|
2391
2393
|
}
|
@@ -2401,11 +2403,11 @@ BookReader.prototype.getFooterHeight = function() {
|
|
2401
2403
|
* @return {Object}
|
2402
2404
|
*/
|
2403
2405
|
BookReader.prototype.paramsFromCurrent = function() {
|
2404
|
-
|
2406
|
+
const params = {};
|
2405
2407
|
|
2406
2408
|
// Path params
|
2407
|
-
|
2408
|
-
|
2409
|
+
const index = this.currentIndex();
|
2410
|
+
const pageNum = this._models.book.getPageNum(index);
|
2409
2411
|
if ((pageNum === 0) || pageNum) {
|
2410
2412
|
params.page = pageNum;
|
2411
2413
|
}
|
@@ -2444,7 +2446,7 @@ BookReader.prototype.paramsFromCurrent = function() {
|
|
2444
2446
|
* @return {Object}
|
2445
2447
|
*/
|
2446
2448
|
BookReader.prototype.paramsFromFragment = function(fragment) {
|
2447
|
-
|
2449
|
+
const params = {};
|
2448
2450
|
|
2449
2451
|
// For backwards compatibility we allow an initial # character
|
2450
2452
|
// (as from window.location.hash) but don't require it
|
@@ -2453,7 +2455,7 @@ BookReader.prototype.paramsFromFragment = function(fragment) {
|
|
2453
2455
|
}
|
2454
2456
|
|
2455
2457
|
// Simple #nn syntax
|
2456
|
-
|
2458
|
+
const oldStyleLeafNum = parseInt( /^\d+$/.exec(fragment) );
|
2457
2459
|
if ( !isNaN(oldStyleLeafNum) ) {
|
2458
2460
|
params.index = oldStyleLeafNum;
|
2459
2461
|
|
@@ -2462,9 +2464,9 @@ BookReader.prototype.paramsFromFragment = function(fragment) {
|
|
2462
2464
|
}
|
2463
2465
|
|
2464
2466
|
// Split into key-value pairs
|
2465
|
-
|
2466
|
-
|
2467
|
-
for (
|
2467
|
+
const urlArray = fragment.split('/');
|
2468
|
+
const urlHash = {};
|
2469
|
+
for (let i = 0; i < urlArray.length; i += 2) {
|
2468
2470
|
urlHash[urlArray[i]] = urlArray[i + 1];
|
2469
2471
|
}
|
2470
2472
|
|
package/src/css/_colorbox.scss
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
* BookReaderTemplate to load BookNavigator components
|
3
3
|
*/
|
4
4
|
|
5
|
-
import { LitElement, html, css } from 'lit
|
5
|
+
import { LitElement, html, css } from 'lit';
|
6
6
|
|
7
7
|
import '@internetarchive/ia-item-navigator';
|
8
8
|
import '../BookNavigator/book-navigator.js';
|
@@ -40,6 +40,7 @@ export class IaBookReader extends LitElement {
|
|
40
40
|
this.loaded = false;
|
41
41
|
this.menuShortcuts = [];
|
42
42
|
this.menuContents = [];
|
43
|
+
this.openMenuName = '';
|
43
44
|
}
|
44
45
|
|
45
46
|
updated() {
|
@@ -98,10 +99,11 @@ export class IaBookReader extends LitElement {
|
|
98
99
|
return;
|
99
100
|
}
|
100
101
|
|
102
|
+
this.openMenuName = menuId;
|
103
|
+
|
101
104
|
if (action === 'open') {
|
102
105
|
this.itemNav?.openShortcut(menuId);
|
103
106
|
} else if (action === 'toggle') {
|
104
|
-
this.itemNav?.openMenu(menuId);
|
105
107
|
this.itemNav?.toggleMenu();
|
106
108
|
}
|
107
109
|
}
|
@@ -119,6 +121,7 @@ export class IaBookReader extends LitElement {
|
|
119
121
|
?signedIn=${this.signedIn}
|
120
122
|
.menuShortcuts=${this.menuShortcuts}
|
121
123
|
.menuContents=${this.menuContents}
|
124
|
+
.openMenu=${this.openMenuName}
|
122
125
|
>
|
123
126
|
<div slot="header">
|
124
127
|
<slot name="header"></slot>
|
@@ -174,7 +174,7 @@ BookReader.prototype.addChapterFromEntry = function(tocEntryObject) {
|
|
174
174
|
* This makes a call to OL API and calls the given callback function with the
|
175
175
|
* response from the API.
|
176
176
|
*/
|
177
|
-
BookReader.prototype.getOpenLibraryRecord = function () {
|
177
|
+
BookReader.prototype.getOpenLibraryRecord = async function () {
|
178
178
|
// Try looking up by ocaid first, then by source_record
|
179
179
|
const baseURL = `${this.olHost}/query.json?type=/type/edition&*=`;
|
180
180
|
const fetchUrlByBookId = `${baseURL}&ocaid=${this.bookId}`;
|
@@ -190,20 +190,16 @@ BookReader.prototype.getOpenLibraryRecord = function () {
|
|
190
190
|
}
|
191
191
|
};
|
192
192
|
|
193
|
-
$.ajax({ url: fetchUrlByBookId, dataType: 'jsonp' })
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
if (data && data.length > 0) {
|
204
|
-
setUpChapterMarkers(data[0]);
|
205
|
-
}
|
206
|
-
});
|
193
|
+
let data = await $.ajax({ url: fetchUrlByBookId, dataType: 'jsonp' });
|
194
|
+
|
195
|
+
if (!data || !data.length) {
|
196
|
+
// try sourceid
|
197
|
+
data = await $.ajax({ url: `${baseURL}&source_records=ia:${this.bookId}`, dataType: 'jsonp' });
|
198
|
+
}
|
199
|
+
|
200
|
+
if (data && data.length > 0) {
|
201
|
+
setUpChapterMarkers(data[0]);
|
202
|
+
}
|
207
203
|
};
|
208
204
|
|
209
205
|
// Extend buildMobileDrawerElement with table of contents list
|
@@ -96,21 +96,20 @@ export class TextSelectionPlugin {
|
|
96
96
|
if (cachedEntry) {
|
97
97
|
return cachedEntry.response;
|
98
98
|
}
|
99
|
-
|
99
|
+
const res = await $.ajax({
|
100
100
|
type: "GET",
|
101
101
|
url: applyVariables(this.options.singlePageDjvuXmlUrl, this.optionVariables, { pageIndex: index }),
|
102
102
|
dataType: "html",
|
103
103
|
error: (e) => undefined,
|
104
|
-
}).then((res) => {
|
105
|
-
try {
|
106
|
-
const xmlDoc = $.parseXML(res);
|
107
|
-
const result = xmlDoc && $(xmlDoc).find("OBJECT")[0];
|
108
|
-
this.pageTextCache.add({ index, response: result });
|
109
|
-
return result;
|
110
|
-
} catch (e) {
|
111
|
-
return undefined;
|
112
|
-
}
|
113
104
|
});
|
105
|
+
try {
|
106
|
+
const xmlDoc = $.parseXML(res);
|
107
|
+
const result = xmlDoc && $(xmlDoc).find("OBJECT")[0];
|
108
|
+
this.pageTextCache.add({ index, response: result });
|
109
|
+
return result;
|
110
|
+
} catch (e) {
|
111
|
+
return undefined;
|
112
|
+
}
|
114
113
|
} else {
|
115
114
|
const XMLpagesArr = await this.djvuPagesPromise;
|
116
115
|
if (XMLpagesArr) return XMLpagesArr[index];
|
@@ -132,7 +132,7 @@ BookReader.prototype._createPageContainer = (function (super_) {
|
|
132
132
|
* @param {string} term
|
133
133
|
* @param {SearchOptions} overrides
|
134
134
|
*/
|
135
|
-
BookReader.prototype.search = function(term = '', overrides = {}) {
|
135
|
+
BookReader.prototype.search = async function(term = '', overrides = {}) {
|
136
136
|
/** @type {SearchOptions} */
|
137
137
|
const defaultOptions = {
|
138
138
|
goToFirstResult: false, /* jump to the first result (default=false) */
|
@@ -210,13 +210,13 @@ BookReader.prototype.search = function(term = '', overrides = {}) {
|
|
210
210
|
};
|
211
211
|
|
212
212
|
this.trigger('SearchStarted', { term: this.searchTerm, instance: this });
|
213
|
-
return $.ajax({
|
213
|
+
return processSearchResults(await $.ajax({
|
214
214
|
url: url,
|
215
215
|
dataType: 'jsonp',
|
216
216
|
cache: true,
|
217
217
|
beforeSend,
|
218
218
|
jsonpCallback: 'BRSearchInProgress'
|
219
|
-
})
|
219
|
+
}));
|
220
220
|
};
|
221
221
|
|
222
222
|
/**
|
@@ -125,13 +125,13 @@ export default class AbstractTTSEngine {
|
|
125
125
|
}
|
126
126
|
|
127
127
|
/** @public */
|
128
|
-
jumpBackward() {
|
129
|
-
Promise.all([
|
128
|
+
async jumpBackward() {
|
129
|
+
await Promise.all([
|
130
130
|
this.activeSound.stop(),
|
131
131
|
this._chunkIterator.decrement()
|
132
132
|
.then(() => this._chunkIterator.decrement())
|
133
|
-
])
|
134
|
-
|
133
|
+
]);
|
134
|
+
this.step();
|
135
135
|
}
|
136
136
|
|
137
137
|
/** @param {number} newRate */
|
@@ -147,36 +147,33 @@ export default class AbstractTTSEngine {
|
|
147
147
|
}
|
148
148
|
|
149
149
|
/** @private */
|
150
|
-
step() {
|
151
|
-
this._chunkIterator.next()
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
.then(() => {
|
178
|
-
if (this.playing) return this.step();
|
179
|
-
});
|
150
|
+
async step() {
|
151
|
+
const chunk = await this._chunkIterator.next();
|
152
|
+
if (chunk == PageChunkIterator.AT_END) {
|
153
|
+
this.stop();
|
154
|
+
this.opts.onDone();
|
155
|
+
return;
|
156
|
+
}
|
157
|
+
this.opts.onLoadingStart();
|
158
|
+
const sound = this.createSound(chunk);
|
159
|
+
sound.chunk = chunk;
|
160
|
+
sound.rate = this.playbackRate;
|
161
|
+
sound.voice = this.voice;
|
162
|
+
sound.load(() => this.opts.onLoadingComplete());
|
163
|
+
|
164
|
+
this.opts.onLoadingComplete();
|
165
|
+
|
166
|
+
await this.opts.beforeChunkPlay(chunk);
|
167
|
+
|
168
|
+
if (!this.playing) return;
|
169
|
+
|
170
|
+
const playPromise = await this.playSound(sound)
|
171
|
+
.then(()=> this.opts.afterChunkPlay(sound.chunk));
|
172
|
+
|
173
|
+
if (this.paused) this.pause();
|
174
|
+
await playPromise;
|
175
|
+
|
176
|
+
if (this.playing) return this.step();
|
180
177
|
}
|
181
178
|
|
182
179
|
/**
|