@d-i-t-a/reader 2.0.0-beta.18 → 2.0.0-beta.19
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 +132 -5
- package/dist/esm/index.js.map +2 -2
- package/dist/injectables/style/popover.css +125 -0
- package/dist/reader.js +27 -27
- package/dist/reader.js.map +2 -2
- package/dist/types/model/Publication.d.ts +1 -0
- package/dist/types/modules/search/Popup.d.ts +2 -0
- package/dist/types/utils/EventHandler.d.ts +2 -0
- package/package.json +1 -1
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
|
};
|
|
46697
|
+
this.linkInPublication = (readingOrder, clickedHref) => readingOrder.some((link) => {
|
|
46698
|
+
return !link.Rel?.includes("external") && this.navigator.publication.getRelativeHref(clickedHref).includes(link.Href);
|
|
46699
|
+
});
|
|
46589
46700
|
this.isEpubInternal = (clickedLink) => {
|
|
46590
46701
|
if (IS_DEV)
|
|
46591
46702
|
console.log("clickedLink: ", clickedLink);
|
|
46592
|
-
const
|
|
46593
|
-
|
|
46703
|
+
const isEpubInternal = this.linkInPublication(this.navigator.publication.readingOrder, clickedLink.href);
|
|
46704
|
+
return isEpubInternal;
|
|
46705
|
+
};
|
|
46706
|
+
this.isResourceInternal = (clickedLink) => {
|
|
46707
|
+
if (IS_DEV)
|
|
46708
|
+
console.log("clickedLink: ", clickedLink);
|
|
46709
|
+
const isEpubInternal = this.linkInPublication(this.navigator.publication.resources, clickedLink.href);
|
|
46594
46710
|
return isEpubInternal;
|
|
46595
46711
|
};
|
|
46596
46712
|
this.handleLinks = async (event) => {
|
|
@@ -46600,8 +46716,12 @@ var EventHandler = class {
|
|
|
46600
46716
|
if (link) {
|
|
46601
46717
|
const isSameOrigin = window.location.protocol === link.protocol && window.location.port === link.port && window.location.hostname === link.hostname;
|
|
46602
46718
|
const isEpubInternal = this.isEpubInternal(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) {
|
|
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
|
-
|
|
46941
|
+
element.scrollIntoView({ block: "center" });
|
|
46815
46942
|
}
|
|
46816
46943
|
} else {
|
|
46817
46944
|
if (element) {
|