Skip to content

Commit 9554a02

Browse files
committed
Refactor link handling in ImageViewer and PopupRefer components
- Updated ImageViewer to use rendition's getTargetHref method instead of the removed getTargetHref utility function. - Refactored PopupRefer's handleLinkJump method to utilize rendition's handleLinkJump for improved link handling logic, including external URL opening and node navigation. - Removed unused getTargetHref function from common utilities. - Cleaned up SettingSwitch component by removing the unused _handleRest method.
1 parent 8e84c86 commit 9554a02

File tree

5 files changed

+153
-154
lines changed

5 files changed

+153
-154
lines changed

src/assets/lib/kookit.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/imageViewer/component.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import "./imageViewer.css";
33
import { ImageViewerProps, ImageViewerStates } from "./interface";
44
import { saveAs } from "file-saver";
55
import { getIframeDoc } from "../../utils/reader/docUtil";
6-
import { getTargetHref } from "../../utils/common";
76
declare var window: any;
87
class ImageViewer extends React.Component<ImageViewerProps, ImageViewerStates> {
98
constructor(props: ImageViewerProps) {
@@ -37,7 +36,7 @@ class ImageViewer extends React.Component<ImageViewerProps, ImageViewerStates> {
3736
this.props.handleLeaveReader("bottom");
3837
}
3938

40-
let href = getTargetHref(event);
39+
let href = this.props.rendition.getTargetHref(event);
4140
if (
4241
href &&
4342
(this.props.rendition.resolveChapter(href) ||

src/components/popups/popupRefer/component.tsx

Lines changed: 151 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import "./popupRefer.css";
33
import { PopupReferProps, PopupReferStates } from "./interface";
44
import { getIframeDoc } from "../../../utils/reader/docUtil";
55
import {
6-
getTargetHref,
76
isElementFootnote,
87
openExternalUrl,
98
processHtml,
@@ -93,133 +92,162 @@ class PopupRefer extends React.Component<PopupReferProps, PopupReferStates> {
9392
event: any,
9493
rendition: any = {}
9594
): Promise<boolean> => {
96-
let href = getTargetHref(event);
95+
let href = this.props.rendition.getTargetHref(event);
9796
console.log("handleLinkJump", href, event);
98-
if (href && href.startsWith("kindle:")) {
99-
let chapterInfo = rendition.resolveChapter(href);
100-
if (chapterInfo) {
101-
await rendition.goToChapter(
102-
chapterInfo.index,
103-
chapterInfo.href,
104-
chapterInfo.label
105-
);
106-
return true;
107-
}
108-
let result = await this.props.rendition.resolveHref(href);
109-
if (!result.anchor) {
110-
return false;
111-
}
112-
let currentPosition = rendition.getPosition();
113-
if (result.index === parseInt(currentPosition.chapterDocIndex)) {
114-
let doc = getIframeDoc(this.props.currentBook.format)[0];
115-
let node = result.anchor(doc);
116-
if (node) {
117-
href = "#" + node.getAttribute("id");
118-
}
119-
} else {
120-
this.setState({
121-
isJump: true,
122-
returnPosition: ConfigService.getObjectConfig(
123-
this.props.currentBook.key,
124-
"recordLocation",
125-
{}
126-
),
127-
});
128-
let rect = event.target.getBoundingClientRect();
129-
await rendition.goToChapterDocIndex(result.index);
130-
let doc = getIframeDoc(this.props.currentBook.format)[0];
131-
let node = result.anchor(doc);
132-
await rendition.goToNode(node);
133-
if (isElementFootnote(event.target)) {
134-
await this.handleShowMenu(node, event.target, rect);
135-
}
136-
137-
return true;
138-
}
97+
let result = await this.props.rendition.handleLinkJump(href, event);
98+
console.log("handleLinkJump result", result);
99+
if (!result.handled) {
100+
return false;
139101
}
140-
141-
if (href && href.indexOf("#") > -1) {
142-
let pageArea = document.getElementById("page-area");
143-
if (!pageArea) return false;
144-
let iframe = pageArea.getElementsByTagName("iframe")[0];
145-
if (!iframe) return false;
146-
let doc: any = iframe.contentDocument;
147-
if (!doc) {
148-
return false;
149-
}
150-
this.setState({ href: href });
151-
let id = href.split("#").reverse()[0];
152-
let node = doc.body.querySelector("#" + CSS.escape(id));
153-
let rect = event.target.getBoundingClientRect();
154-
console.log("find node by id", node, id);
155-
156-
if (!node) {
157-
if (href.indexOf("filepos") > -1 && rendition.resolveChapter(href)) {
158-
let chapterInfo = rendition.resolveChapter(href);
159-
await rendition.goToChapter(
160-
chapterInfo.index,
161-
chapterInfo.href,
162-
chapterInfo.label
163-
);
164-
return true;
165-
}
166-
//can't find the node, go to href
167-
if (href.indexOf("#") !== 0) {
168-
while (href.startsWith(".")) {
169-
href = href.substring(1);
170-
}
171-
let chapterInfo = rendition.resolveChapter(href.split("#")[0]);
172-
await rendition.goToChapter(
173-
chapterInfo.index,
174-
chapterInfo.href,
175-
chapterInfo.label
176-
);
177-
}
178-
node = doc.body.querySelector("#" + CSS.escape(id));
179-
if (!node) {
180-
return false;
181-
}
182-
this.setState({
183-
isJump: true,
184-
returnPosition: ConfigService.getObjectConfig(
185-
this.props.currentBook.key,
186-
"recordLocation",
187-
{}
188-
),
189-
});
190-
await rendition.goToNode(node);
191-
}
192-
console.log("go to node", isElementFootnote(event.target));
193-
if (isElementFootnote(event.target)) {
194-
await this.handleShowMenu(node, event.target, rect);
195-
}
196-
return true;
197-
} else if (
198-
href &&
199-
rendition.resolveChapter &&
200-
rendition.resolveChapter(href)
201-
) {
202-
let chapterInfo = rendition.resolveChapter(href);
203-
await rendition.goToChapter(
204-
chapterInfo.index,
205-
chapterInfo.href,
206-
chapterInfo.label
207-
);
208-
return true;
209-
} else if (
210-
href &&
211-
href.indexOf("../") === -1 &&
212-
(href.indexOf("http") === 0 || href.indexOf("mailto") === 0) &&
213-
href.indexOf("OEBPF") === -1 &&
214-
href.indexOf("OEBPS") === -1 &&
215-
href.indexOf("footnote") === -1 &&
216-
href.indexOf("blob") === -1 &&
217-
href.indexOf("data:application") === -1
218-
) {
102+
if (result.external) {
219103
openExternalUrl(href);
220104
return true;
221105
}
222-
return false;
106+
if (result.isJump) {
107+
this.setState({
108+
isJump: true,
109+
returnPosition: ConfigService.getObjectConfig(
110+
this.props.currentBook.key,
111+
"recordLocation",
112+
{}
113+
),
114+
});
115+
}
116+
if (result.href) {
117+
this.setState({ href: result.href });
118+
}
119+
if (result.isShowMenu) {
120+
let rect = event.target.getBoundingClientRect();
121+
console.log("show menu", event.target, rect);
122+
await this.handleShowMenu(result.node, event.target, rect);
123+
return true;
124+
}
125+
return true;
126+
// if (href && href.startsWith("kindle:")) {
127+
// let chapterInfo = rendition.resolveChapter(href);
128+
// if (chapterInfo) {
129+
// await rendition.goToChapter(
130+
// chapterInfo.index,
131+
// chapterInfo.href,
132+
// chapterInfo.label
133+
// );
134+
// return true;
135+
// }
136+
// let result = await this.props.rendition.resolveHref(href);
137+
// if (!result.anchor) {
138+
// return false;
139+
// }
140+
// let currentPosition = rendition.getPosition();
141+
// if (result.index === parseInt(currentPosition.chapterDocIndex)) {
142+
// let doc = getIframeDoc(this.props.currentBook.format)[0];
143+
// let node = result.anchor(doc);
144+
// if (node) {
145+
// href = "#" + node.getAttribute("id");
146+
// }
147+
// } else {
148+
// this.setState({
149+
// isJump: true,
150+
// returnPosition: ConfigService.getObjectConfig(
151+
// this.props.currentBook.key,
152+
// "recordLocation",
153+
// {}
154+
// ),
155+
// });
156+
// let rect = event.target.getBoundingClientRect();
157+
// await rendition.goToChapterDocIndex(result.index);
158+
// let doc = getIframeDoc(this.props.currentBook.format)[0];
159+
// let node = result.anchor(doc);
160+
// await rendition.goToNode(node);
161+
// if (isElementFootnote(event.target)) {
162+
// await this.handleShowMenu(node, event.target, rect);
163+
// }
164+
165+
// return true;
166+
// }
167+
// }
168+
169+
// if (href && href.indexOf("#") > -1) {
170+
// let pageArea = document.getElementById("page-area");
171+
// if (!pageArea) return false;
172+
// let iframe = pageArea.getElementsByTagName("iframe")[0];
173+
// if (!iframe) return false;
174+
// let doc: any = iframe.contentDocument;
175+
// if (!doc) {
176+
// return false;
177+
// }
178+
// this.setState({ href: href });
179+
// let id = href.split("#").reverse()[0];
180+
// let node = doc.body.querySelector("#" + CSS.escape(id));
181+
// let rect = event.target.getBoundingClientRect();
182+
// console.log("find node by id", node, id);
183+
184+
// if (!node) {
185+
// if (href.indexOf("filepos") > -1 && rendition.resolveChapter(href)) {
186+
// let chapterInfo = rendition.resolveChapter(href);
187+
// await rendition.goToChapter(
188+
// chapterInfo.index,
189+
// chapterInfo.href,
190+
// chapterInfo.label
191+
// );
192+
// return true;
193+
// }
194+
// //can't find the node, go to href
195+
// if (href.indexOf("#") !== 0) {
196+
// while (href.startsWith(".")) {
197+
// href = href.substring(1);
198+
// }
199+
// let chapterInfo = rendition.resolveChapter(href.split("#")[0]);
200+
// await rendition.goToChapter(
201+
// chapterInfo.index,
202+
// chapterInfo.href,
203+
// chapterInfo.label
204+
// );
205+
// }
206+
// node = doc.body.querySelector("#" + CSS.escape(id));
207+
// if (!node) {
208+
// return false;
209+
// }
210+
// this.setState({
211+
// isJump: true,
212+
// returnPosition: ConfigService.getObjectConfig(
213+
// this.props.currentBook.key,
214+
// "recordLocation",
215+
// {}
216+
// ),
217+
// });
218+
// await rendition.goToNode(node);
219+
// }
220+
// console.log("go to node", isElementFootnote(event.target));
221+
// if (isElementFootnote(event.target)) {
222+
// await this.handleShowMenu(node, event.target, rect);
223+
// }
224+
// return true;
225+
// } else if (
226+
// href &&
227+
// rendition.resolveChapter &&
228+
// rendition.resolveChapter(href)
229+
// ) {
230+
// let chapterInfo = rendition.resolveChapter(href);
231+
// await rendition.goToChapter(
232+
// chapterInfo.index,
233+
// chapterInfo.href,
234+
// chapterInfo.label
235+
// );
236+
// return true;
237+
// } else if (
238+
// href &&
239+
// href.indexOf("../") === -1 &&
240+
// (href.indexOf("http") === 0 || href.indexOf("mailto") === 0) &&
241+
// href.indexOf("OEBPF") === -1 &&
242+
// href.indexOf("OEBPS") === -1 &&
243+
// href.indexOf("footnote") === -1 &&
244+
// href.indexOf("blob") === -1 &&
245+
// href.indexOf("data:application") === -1
246+
// ) {
247+
// openExternalUrl(href);
248+
// return true;
249+
// }
250+
// return false;
223251
};
224252

225253
showMenu = () => {

src/components/readerSettings/settingSwitch/component.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,6 @@ class SettingSwitch extends React.Component<
4040
};
4141
}
4242

43-
_handleRest = () => {
44-
BookUtil.reloadBooks();
45-
};
46-
4743
_handleChange = (stateName: string) => {
4844
this.setState({ [stateName]: !this.state[stateName] } as any, () => {
4945
ConfigService.setReaderConfig(

src/utils/common.ts

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -748,30 +748,6 @@ export const isElementFootnote = (element: HTMLElement) => {
748748

749749
return false;
750750
};
751-
export const getTargetHref = (event: any) => {
752-
let href = "";
753-
if (!event || !event.target) return href;
754-
if (event.target.innerText && event.target.innerText.startsWith("http")) {
755-
href = event.target.innerText;
756-
}
757-
// if (event.target.tagName === "IMG") {
758-
// return href;
759-
// }
760-
let currentElement = event.target;
761-
while (currentElement && currentElement.tagName !== "BODY") {
762-
if (currentElement.getAttribute) {
763-
const elementHref = currentElement.getAttribute("href");
764-
765-
if (elementHref) {
766-
href = elementHref || "";
767-
break;
768-
}
769-
}
770-
currentElement = currentElement.parentNode;
771-
}
772-
773-
return href;
774-
};
775751
export const getPdfPassword = (book: Book) => {
776752
if (book.format !== "PDF" || !book?.description) return "";
777753
// 匹配形如 protected PDF: #password# 的内容

0 commit comments

Comments
 (0)