Skip to content

Commit 3c19b6a

Browse files
committed
feat: return search jumps to the search opening position
1 parent 325396f commit 3c19b6a

1 file changed

Lines changed: 17 additions & 4 deletions

File tree

‎src/App.vue‎

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,9 @@ const fileInput=ref(),reader=ref(),pages=shallowRef([]),title=ref('PDFMathReader
167167
const searchOpen=ref(false),searchQuery=ref(''),searchInput=ref(),searchResults=shallowRef([]),searchIndex=ref(-1),searchBusy=ref(false),searchFailure=ref('');
168168
const searchPageCount=computed(()=>new Set(searchResults.value.map(hit=>hit.page)).size);
169169
const 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);}
173173
async 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);}
174174
async 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
}
193193
function 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+
}
195208
function nextSearch(delta=1){if(!searchResults.value.length)return;searchIndex.value=(searchIndex.value+delta+searchResults.value.length)%searchResults.value.length;void locateSearch();}
196209
watch([searchQuery,showTranslations],scheduleSearch);
197210
watch(()=>searchOpen.value?pages.value.map(p=>p.blocks.map(b=>b.translation||'').join('')).join(''):null,scheduleSearch);

0 commit comments

Comments
 (0)