@d-i-t-a/reader 2.0.0-beta.18 → 2.0.0-beta.20

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.
package/dist/esm/index.js CHANGED
@@ -46005,6 +46005,9 @@ var Publication = class extends import_publication.Publication {
46005
46005
  get readingOrder() {
46006
46006
  return this.Spine ?? [];
46007
46007
  }
46008
+ get resources() {
46009
+ return this.Resources ?? [];
46010
+ }
46008
46011
  get tableOfContents() {
46009
46012
  if (this.sample?.isSampleRead && this.positions?.length > 0) {
46010
46013
  return this.limitedTOC();
@@ -46501,6 +46504,111 @@ var Popup = class {
46501
46504
  }
46502
46505
  }
46503
46506
  }
46507
+ async hidePopover() {
46508
+ let footnote = this.navigator.iframes[0].contentDocument?.getElementById("d2-popover");
46509
+ if (footnote) {
46510
+ footnote.parentElement?.removeChild(footnote);
46511
+ }
46512
+ const wrapper = findRequiredElement(document, "#iframe-wrapper");
46513
+ wrapper.style.overflow = "auto";
46514
+ }
46515
+ async showPopover(link, event) {
46516
+ const href = link.getAttribute("href");
46517
+ const src = link.getAttribute("src");
46518
+ function getAbsoluteHref(href2) {
46519
+ const currentUrl = document.location.href;
46520
+ return new URL(href2, currentUrl).href;
46521
+ }
46522
+ if (href) {
46523
+ let absolute = getAbsoluteHref(href);
46524
+ if (absolute) {
46525
+ event.preventDefault();
46526
+ event.stopPropagation();
46527
+ let popover = this.navigator.iframes[0].contentDocument?.getElementById("d2-popover");
46528
+ if (popover) {
46529
+ popover.parentElement?.removeChild(popover);
46530
+ }
46531
+ const d2popover = document.createElement("div");
46532
+ d2popover.id = "d2-popover";
46533
+ d2popover.className = "d2-popover is-active";
46534
+ const wrapper = findRequiredElement(document, "#iframe-wrapper");
46535
+ wrapper.style.overflow = "hidden";
46536
+ d2popover.style.top = wrapper.scrollTop + "px";
46537
+ d2popover.style.height = wrapper.clientHeight * 0.9 + "px";
46538
+ const d2wrapper = document.createElement("div");
46539
+ d2wrapper.className = "d2-popover-wrapper";
46540
+ d2popover.appendChild(d2wrapper);
46541
+ const d2content = document.createElement("div");
46542
+ d2content.className = "d2-popover-content";
46543
+ d2wrapper.appendChild(d2content);
46544
+ await fetch(absolute).then((r) => r.text()).then(async (data) => {
46545
+ d2content.innerHTML = data;
46546
+ let doc = this.navigator.iframes[0].contentDocument;
46547
+ if (doc) {
46548
+ doc.body.appendChild(d2popover);
46549
+ }
46550
+ });
46551
+ let win = this.navigator.iframes[0].contentWindow;
46552
+ if (!win) {
46553
+ return;
46554
+ }
46555
+ let self2 = this;
46556
+ win.onclick = function(ev) {
46557
+ if (event.target !== ev.target) {
46558
+ if (d2popover.parentElement) {
46559
+ self2.hidePopover();
46560
+ if (win) {
46561
+ win.onclick = null;
46562
+ }
46563
+ }
46564
+ }
46565
+ };
46566
+ }
46567
+ } else if (src) {
46568
+ let absolute = getAbsoluteHref(src);
46569
+ if (absolute) {
46570
+ event.preventDefault();
46571
+ event.stopPropagation();
46572
+ let popover = this.navigator.iframes[0].contentDocument?.getElementById("d2-popover");
46573
+ if (popover) {
46574
+ popover.parentElement?.removeChild(popover);
46575
+ }
46576
+ const d2popover = document.createElement("div");
46577
+ d2popover.id = "d2-popover";
46578
+ d2popover.className = "d2-popover is-active";
46579
+ const wrapper = findRequiredElement(document, "#iframe-wrapper");
46580
+ wrapper.style.overflow = "hidden";
46581
+ d2popover.style.top = wrapper.scrollTop + "px";
46582
+ d2popover.style.height = wrapper.clientHeight * 0.9 + "px";
46583
+ const d2wrapper = document.createElement("div");
46584
+ d2wrapper.className = "d2-popover-wrapper";
46585
+ d2popover.appendChild(d2wrapper);
46586
+ const d2content = document.createElement("img");
46587
+ d2content.className = "d2-popover-content";
46588
+ d2wrapper.appendChild(d2content);
46589
+ d2content.src = src;
46590
+ let doc = this.navigator.iframes[0].contentDocument;
46591
+ if (doc) {
46592
+ doc.body.appendChild(d2popover);
46593
+ }
46594
+ let win = this.navigator.iframes[0].contentWindow;
46595
+ if (!win) {
46596
+ return;
46597
+ }
46598
+ let self2 = this;
46599
+ win.onclick = function(ev) {
46600
+ if (event.target !== ev.target) {
46601
+ if (d2popover.parentElement) {
46602
+ self2.hidePopover();
46603
+ if (win) {
46604
+ win.onclick = null;
46605
+ }
46606
+ }
46607
+ }
46608
+ };
46609
+ }
46610
+ }
46611
+ }
46504
46612
  showPopup(element, event) {
46505
46613
  let footnote = this.navigator.iframes[0].contentDocument?.getElementById("d2-popup");
46506
46614
  if (footnote) {
@@ -46586,11 +46694,19 @@ var EventHandler = class {
46586
46694
  }
46587
46695
  return null;
46588
46696
  };
46589
- this.isEpubInternal = (clickedLink) => {
46697
+ this.linkInPublication = (readingOrder, clickedHref) => readingOrder.some((link) => {
46698
+ return !link.Rel?.includes("external") && this.navigator.publication.getRelativeHref(clickedHref).includes(link.Href);
46699
+ });
46700
+ this.isReadingOrderInternal = (clickedLink) => {
46701
+ if (IS_DEV)
46702
+ console.log("clickedLink: ", clickedLink);
46703
+ const isEpubInternal = this.linkInPublication(this.navigator.publication.readingOrder, clickedLink.href);
46704
+ return isEpubInternal;
46705
+ };
46706
+ this.isResourceInternal = (clickedLink) => {
46590
46707
  if (IS_DEV)
46591
46708
  console.log("clickedLink: ", clickedLink);
46592
- const linkInReadingOrder = (readingOrder, clickedPathname) => readingOrder.some((link) => !link.Rel?.includes("external") && link.Href.includes(clickedPathname));
46593
- const isEpubInternal = linkInReadingOrder(this.navigator.publication.readingOrder, clickedLink.pathname);
46709
+ const isEpubInternal = this.linkInPublication(this.navigator.publication.resources, clickedLink.href);
46594
46710
  return isEpubInternal;
46595
46711
  };
46596
46712
  this.handleLinks = async (event) => {
@@ -46599,9 +46715,13 @@ var EventHandler = class {
46599
46715
  const link = this.checkForLink(event);
46600
46716
  if (link) {
46601
46717
  const isSameOrigin = window.location.protocol === link.protocol && window.location.port === link.port && window.location.hostname === link.hostname;
46602
- const isEpubInternal = this.isEpubInternal(link);
46718
+ const isEpubInternal = this.isReadingOrderInternal(link);
46719
+ const isResourceInternal = this.isResourceInternal(link);
46720
+ if (!isResourceInternal) {
46721
+ await this.popup.hidePopover();
46722
+ }
46603
46723
  const isInternal = link.href.indexOf("#");
46604
- if (!isSameOrigin && !isEpubInternal) {
46724
+ if (!isSameOrigin && !isEpubInternal && !isResourceInternal) {
46605
46725
  window.open(link.href, "_blank");
46606
46726
  event.preventDefault();
46607
46727
  event.stopPropagation();
@@ -46613,6 +46733,8 @@ var EventHandler = class {
46613
46733
  const attribute = link2.getAttribute("epub:type") === "noteref";
46614
46734
  if (attribute) {
46615
46735
  await this.popup.handleFootnote(link2, event);
46736
+ } else if (isResourceInternal && !isEpubInternal) {
46737
+ await this.popup.showPopover(link2, event);
46616
46738
  } else {
46617
46739
  this.onInternalLink(event);
46618
46740
  }
@@ -46632,6 +46754,12 @@ var EventHandler = class {
46632
46754
  }
46633
46755
  setupEvents(element) {
46634
46756
  if (element !== null) {
46757
+ element.addEventListener("dblclick", async (event) => {
46758
+ let htmlElement = event.target;
46759
+ if (event.target && htmlElement.tagName.toLowerCase() === "img") {
46760
+ await this.popup.showPopover(htmlElement, event);
46761
+ }
46762
+ }, true);
46635
46763
  element.addEventListener("click", this.handleLinks.bind(this));
46636
46764
  } else {
46637
46765
  throw "cannot setup events for null";
@@ -46808,10 +46936,9 @@ var ReflowableBookView = class {
46808
46936
  }
46809
46937
  }
46810
46938
  goToElement(element, relative) {
46811
- const wrapper = findRequiredElement(document, "#iframe-wrapper");
46812
46939
  if (this.scrollMode) {
46813
46940
  if (element) {
46814
- wrapper.scrollTop = element.offsetTop;
46941
+ element.scrollIntoView({ block: "center" });
46815
46942
  }
46816
46943
  } else {
46817
46944
  if (element) {
@@ -58316,9 +58443,12 @@ var TTSModule = class {
58316
58443
  }
58317
58444
  });
58318
58445
  }
58319
- cancel() {
58320
- if (this.api?.stopped)
58321
- this.api?.stopped();
58446
+ cancel(api = true) {
58447
+ if (api) {
58448
+ if (this.api?.stopped)
58449
+ this.api?.stopped();
58450
+ this.delegate.emit("readaloud.stopped", "stopped");
58451
+ }
58322
58452
  this.userScrolled = false;
58323
58453
  window.speechSynthesis.cancel();
58324
58454
  if (this.splittingResult && this.delegate.tts?.enableSplitter) {
@@ -58347,7 +58477,7 @@ var TTSModule = class {
58347
58477
  this.api?.started();
58348
58478
  var self2 = this;
58349
58479
  this.userScrolled = false;
58350
- this.cancel();
58480
+ this.cancel(false);
58351
58481
  if (this.delegate.tts?.enableSplitter) {
58352
58482
  if (partial) {
58353
58483
  var allWords = self2.body.querySelectorAll("[data-word]");