@@ -3,7 +3,6 @@ import "./popupRefer.css";
33import { PopupReferProps , PopupReferStates } from "./interface" ;
44import { getIframeDoc } from "../../../utils/reader/docUtil" ;
55import {
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 = ( ) => {
0 commit comments