@@ -167,9 +167,9 @@ const fileInput=ref(),reader=ref(),pages=shallowRef([]),title=ref('PDFMathReader
167167const searchOpen = ref (false ),searchQuery= ref (' ' ),searchInput= ref (),searchResults= shallowRef ([]),searchIndex= ref (- 1 ),searchBusy= ref (false ),searchFailure= ref (' ' );
168168const searchPageCount = computed (()=> new Set (searchResults .value .map (hit => hit .page )).size );
169169const searchHit = computed (()=> searchResults .value [searchIndex .value ]|| null );
170- const searchTextCache = new WeakMap ();let searchGeneration= 0 ,searchTimer;
171- async function openSearch (){if (! pages .value .length )return ;settings .value = false ;searchOpen .value = true ;await nextTick ();searchInput .value ? .focus ();}
172- function closeSearch (){searchOpen .value = false ;searchResults .value = [];searchIndex .value = - 1 ;++ searchGeneration;searchBusy .value = false ;clearTimeout (searchTimer);}
170+ const searchTextCache = new WeakMap ();let searchGeneration= 0 ,searchTimer,searchOrigin = null ;
171+ async function openSearch (){if (! pages .value .length )return ;if ( ! searchOpen . value )searchOrigin = readingView (); settings .value = false ;searchOpen .value = true ;await nextTick ();searchInput .value ? .focus ();}
172+ function closeSearch (){searchOrigin = null ; searchOpen .value = false ;searchResults .value = [];searchIndex .value = - 1 ;++ searchGeneration;searchBusy .value = false ;clearTimeout (searchTimer);}
173173async function indexedText (document ,number ){let cache= searchTextCache .get (document );if (! cache){cache= new Map ();searchTextCache .set (document ,cache);}if (! cache .has (number))cache .set (number,pdfSearchSegments (await document .getPage (number)));return cache .get (number);}
174174async function runSearch (){
175175 const generation = ++ searchGeneration,token= epoch,query= searchQuery .value ;searchResults .value = [];searchIndex .value = - 1 ;searchFailure .value = ' ' ;
@@ -191,7 +191,20 @@ async function runSearch(){
191191 finally {if (generation=== searchGeneration)searchBusy .value = false ;}
192192}
193193function scheduleSearch (){clearTimeout (searchTimer);++ searchGeneration;searchBusy .value = false ;searchTimer= setTimeout (runSearch,180 );}
194- async function locateSearch (){const hit = searchHit .value ;if (! hit)return ;const token = epoch;for (const block of hit .blocks )block .translated = showTranslations .value ;await go (hit .page );if (token!== epoch|| hit!== searchHit .value )return ;const host = pageEls .get (hit .page ),el= reader .value ,box= hit .boxes [0 ];if (! host||! el||! box)return ;const bounds = el .getBoundingClientRect (),rect= host .getBoundingClientRect ();el .scrollTop += rect .top + box .y * zoom .value - bounds .top - el .clientHeight * .35 ;el .scrollLeft += rect .left + box .x * zoom .value - bounds .left - el .clientWidth * .25 ;scheduleViewport ();}
194+ async function locateSearch (){
195+ const hit = searchHit .value ,origin= searchOrigin;if (! hit)return ;
196+ const token = epoch,generation= searchGeneration,request= ++ referenceNavigation;
197+ referenceJumping= true ;referenceReturn .value = null ;
198+ try {
199+ for (const block of hit .blocks )block .translated = showTranslations .value ;
200+ await go (hit .page );
201+ if (token!== epoch|| generation!== searchGeneration|| request!== referenceNavigation|| hit!== searchHit .value ||! searchOpen .value )return ;
202+ const host = pageEls .get (hit .page ),el= reader .value ,box= hit .boxes [0 ];
203+ if (host&& el&& box){const bounds = el .getBoundingClientRect (),rect= host .getBoundingClientRect ();el .scrollTop += rect .top + box .y * zoom .value - bounds .top - el .clientHeight * .35 ;el .scrollLeft += rect .left + box .x * zoom .value - bounds .left - el .clientWidth * .25 ;}
204+ if (origin)referenceReturn .value = {origin,targetPage: hit .page };
205+ viewportPages ();scheduleViewport ();scheduleReadingSave ();
206+ }finally {if (request=== referenceNavigation)referenceJumping= false ;}
207+ }
195208function nextSearch (delta = 1 ){if (! searchResults .value .length )return ;searchIndex .value = (searchIndex .value + delta+ searchResults .value .length )% searchResults .value .length ;void locateSearch ();}
196209watch ([searchQuery,showTranslations],scheduleSearch);
197210watch (()=> searchOpen .value ? pages .value .map (p => p .blocks .map (b => b .translation || ' ' ).join (' ' )).join (' ' ): null ,scheduleSearch);
0 commit comments