PageSourceSearch

https://elvis85-bookrank.hf.space/static/dist/index.729c7532.min.js

js elvis85-bookrank.hf.space collected 2026-10-03 16:50:46 UTC 23,112 bytes, 56 lines download raw bytes

1let booksData=[],currentCategory="";(function(){var n=document.getElementById("initial-books-data");if(n)try{booksData=JSON.parse(n.textContent||"[]")}catch(a){console.warn("initModuleState: \u89E3\u6790 initial-books-data \u5931\u8D25",a)}window.APP_CONFIG&&window.APP_CONFIG.currentCategory&&(currentCategory=window.APP_CONFIG.currentCategory)})();let currentLanguage=localStorage.getItem("app_language")||localStorage.getItem("bookrank_language")||"en";function coverToSrc(e){if(window.BookRankCover&&typeof window.BookRankCover.toSrc=="function")return window.BookRankCover.toSrc(e);const n=e==null?"":String(e).trim();return n?n.indexOf("/static/")===0||n.indexOf("/cache/images/")===0||n.indexOf("/cover")===0?n:"/cover?src="+encodeURIComponent(n):""}function updateLanguageButtons(e){const n=document.getElementById("lang-zh"),a=document.getElementById("lang-en");n&&(n.classList.toggle("active",e==="zh"),n.setAttribute("aria-pressed",e==="zh")),a&&(a.classList.toggle("active",e==="en"),a.setAttribute("aria-pressed",e==="en"))}function saveSearchHistory(e){if(!(!e||!e.trim()))try{let n=JSON.parse(localStorage.getItem("bookrank_search_history")||"[]");n=n.filter(a=>a.query!==e.trim()),n.unshift({query:e.trim(),timestamp:Date.now()}),n=n.slice(0,20),localStorage.setItem("bookrank_search_history",JSON.stringify(n))}catch(n){console.error("\u4FDD\u5B58\u641C\u7D22\u5386\u53F2\u5931\u8D25:",n)}}
1function renderSearchSuggestions(){const e=document.getElementById("search-suggestions"),n=document.getElementById("search-input");if(!e||!n)return;const a=n.value.trim();let r=[];try{r=JSON.parse(localStorage.getItem("bookrank_search_history")||"[]")}catch{}if(a){const l=(window.booksData||[]).filter(o=>`${o.title} ${o.title_zh||""} ${o.author} ${o.description||""}`.toLowerCase().includes(a.toLowerCase())).slice(0,5);if(l.length===0&&r.length===0){e.style.display="none";return}let s="";l.length>0&&(s+='<div class="suggestions-header">\u56FE\u4E66\u7ED3\u679C</div>',s+='<ul class="suggestions-list">',l.forEach(o=>{const u=currentLanguage==="zh"&&o.title_zh||o.title;s+=`
2                    <li class="suggestion-item" data-search-query="${esc(o.title)}">
3                        <svg class="icon" width="16" height="16"><use href="#icon-search"/></svg>
4                        <span>${esc(u)}</span>
5                    </li>`}),s+="</ul>"),r.length>0&&(s+='<div class="suggestions-header">\u641C\u7D22\u5386\u53F2</div>',s+='<ul class="suggestions-list">',r.slice(0,5).forEach(o=>{s+=`
6                    <li class="suggestion-item" data-search-query="${esc(o.query)}">
7                        <svg class="icon" width="16" height="16"><use href="#icon-clock"/></svg>
8                        <span>${esc(o.query)}</span>
9                        <svg class="icon delete-history" width="14" height="14" data-delete-query="${esc(o.query)}"><use href="#icon-x"/></svg>
10                    </li>`}),s+="</ul>"),e.innerHTML=s,e.style.display="block"}else if(r.length>0){let c='<div class="suggestions-header">\u641C\u7D22\u5386\u53F2</div>';c+='<ul class="suggestions-list">',r.slice(0,10).forEach(l=>{c+=`
11                <li class="suggestion-item" data-search-query="${esc(l.query)}">
12                    <svg class="icon" width="16" height="16"><use href="#icon-clock"/></svg>
13                    <span>${esc(l.query)}</span>
14                    <svg class="icon delete-history" width="14" height="14" data-delete-query="${esc(l.query)}"><use href="#icon-x"/></svg>
15                </li>`}),c+="</ul>",e.innerHTML=c,e.style.display="block"}else e.style.display="none"}function deleteHistoryItem(e){try{let n=JSON.parse(localStorage.getItem("bookrank_search_history")||"[]");n=n.filter(a=>a.query!==e),localStorage.setItem("bookrank_search_history",JSON.stringify(n)),renderSearchSuggestions()}catch(n){console.error("\u5220\u9664\u641C\u7D22\u5386\u53F2\u5931\u8D25:",n)}}function applySearch(e){const n=document.getElementById("search-input");n&&(n.value=e);const a=document.getElementById("search-suggestions");a&&(a.style.display="none"),saveSearchHistory(e),applyFilters()}function shareBook(e,n){if(navigator.share)navigator.share({title:`${e} - BookRank`,text:`\u6211\u5728 BookRank \u53D1\u73B0\u4E86\u597D\u4E66: ${e} (${n})`,url:window.location.href}).catch(()=>{});else{const a=`${e} - ${n}`;navigator.clipboard.writeText(a).then(()=>{showToast("\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F","success")}).catch(()=>{showToast("\u590D\u5236\u5931\u8D25","error")})}}function getCategoryLabel(e,n){return typeof window<"u"&&window.CATEGORIES&&window.CATEGORIES.getLabel?window.CATEGORIES.getLabel(e,n):e}function buildSkeletonCardsHTML(e){for(var n=e||8,a="",r=0;r<n;r++)a+='<article class="card card-skeleton" aria-hidden="true">    <div class="skeleton skeleton-image"></div>    <div class="skeleton-content">        <div class="skeleton skeleton-title"></div>        <div class="skeleton skeleton-author"></div>        <div class="skeleton skeleton-tag"></div>    </div></article>';return a}function showSkeleton(){var e=document.getElementById("books-grid");e&&(e.innerHTML=buildSkeletonCardsHTML(8))}function hideSkeleton(){var e=document.querySelectorAll(".card-skeleton");e.forEach(function(n){n.parentNode&&n.parentNode.removeChild(n)})}function showLoading(e){const n=document.getElementById("loading-overlay"),a=document.getElementById("loading-text");n&&(n.style.display="flex"),a&&e&&(a.textContent=e)}function hideLoading(){const e=document.getElementById("loading-overlay");e&&(e.style.display="none")}document.addEventListener("DOMContentLoaded",function(){updateLanguageButtons(currentLanguage),currentLanguage==="zh"&&typeof BookI18n<"u"&&BookI18n.applyLanguage("zh")});const _memoryCategoryCache=new Map,categoryCache={get:function(e){if(_memoryCategoryCache.has(e))return _memoryCategoryCache.get(e);try{const n=`bookrank_category_${e}`,a=localStorage.getItem(n);if(a){const r=JSON.parse(a),c=["updateTime","updateFrequency","listPublishedDate"].every(l=>Object.prototype.hasOwnProperty.call(r,l));if(Date.now()-r.timestamp<864e5&&Array.isArray(r.books)&&c)return _memoryCategoryCache.set(e,r),r;localStorage.removeItem(n)}}catch{}return null},set:function(e,n,a,r,c){const l={timestamp:Date.now(),books:n,updateTime:a,updateFrequency:r,listPublishedDate:c};_memoryCategoryCache.set(e,l);try{const s=`bookrank_category_${e}`;localStorage.setItem(s,JSON.stringify(l))}catch{}}};function hasActiveSearchOrErrorState(){return window.APP_CONFIG&&window.APP_CONFIG.searchQuery?!0:!!document.querySelector('.search-state[data-search-state="empty"],.search-state[data-search-state="partial"],.search-state[data-search-state="failed"],.
15search-state[data-search-state="load-failed"]')}async function changeCategory(e){if(hasActiveSearchOrErrorState()){const a=new URLSearchParams;a.set("category",e),window.location.href=window.location.pathname+"?"+a.toString();return}if(e===window.currentCategory)return;const n=categoryCache.get(e);if(n&&Array.isArray(n.books)&&n.books.length>0){const a=n.books;window.currentCategory=e,window.booksData=a,currentCategory=e,booksData=a,typeof BookI18n<"u"&&(BookI18n.clear(),BookI18n.registerAll(a)),updateBooksOnPage(a,e,n.updateTime,n.updateFrequency,n.listPublishedDate);const r=new URLSearchParams;r.set("category",e);const c=window.location.pathname+"?"+r.toString();window.history.pushState({category:e},"",c),currentLanguage==="zh"&&typeof BookI18n<"u"&&BookI18n.applyLanguage("zh");return}showSkeleton(),showLoading("\u52A0\u8F7D\u4E2D...");try{const a=await fetch(`/api/category-books?category=${encodeURIComponent(e)}`,{headers:{"X-Requested-With":"XMLHttpRequest"}});if(!a.ok)throw new Error("\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25");const r=await a.json();if(!r.success)throw new Error(r.message||r.error||"\u52A0\u8F7D\u5931\u8D25");const c=r.data||r,l=c.books||[];categoryCache.set(e,l,c.update_time,c.update_frequency,c.list_published_date),window.currentCategory=e,window.booksData=l,currentCategory=e,booksData=l,typeof BookI18n<"u"&&(BookI18n.clear(),BookI18n.registerAll(l)),updateBooksOnPage(l,e,c.update_time,c.update_frequency,c.list_published_date);const s=new URLSearchParams;s.set("category",e);const o=window.location.pathname+"?"+s.toString();window.history.pushState({category:e},"",o),hideLoading(),currentLanguage==="zh"&&typeof BookI18n<"u"&&BookI18n.applyLanguage("zh")}catch(a){console.error("\u5206\u7C7B\u5207\u6362\u5931\u8D25:",a),showToast(t("toast_category_load_failed",currentLanguage),"error"),hideSkeleton(),hideLoading(),document.getElementById("category-select").value=window.currentCategory}}function resolveCategoryLabel(e,n,a){return a==="zh"?e.category_name||(typeof getCategoryLabel=="function"?getCategoryLabel(n,"zh"):null)||"\u865A\u6784\u7C7B":e.list_name||e.category_name||(typeof getCategoryLabel=="function"?getCategoryLabel(n,"en"):null)||"Fiction"}function rerenderCurrentBooks(e){var n=booksData;if(!Array.isArray(n)||n.length===0){var a=document.getElementById("initial-books-data");if(a)try{n=JSON.parse(a.textContent||"[]")}catch{n=[]}}if(!(!Array.isArray(n)||n.length===0)){var r=currentCategory||window.APP_CONFIG&&window.APP_CONFIG.currentCategory||"hardcover-fiction",c=document.querySelector(".page-subtitle time"),l=c?c.getAttribute("datetime"):null;try{updateBooksOnPage(n,r,l)}catch(s){console.error("[rerenderCurrentBooks] FAILED:",s.message)}}}function updateCategorySelectOptions(e){var n=document.getElementById("category-select");!n||typeof getCategoryLabel!="function"||Array.from(n.options).forEach(function(a){a.textContent=getCategoryLabel(a.value,e)})}function formatLocalTime(e,n){if(!e)return"";if(n==="zh")return e;var a=String(e).match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{1,2}):(\d{2})(?::(\d{2}))?$/);if(!a)return e;var r=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],c=a[1],l=r[parseInt(a[2],10)-1]||a[2],s=parseInt(a[3],10),o=parseInt(a[4],10),u=a[5],p=o>=12?"PM":"AM",g=o%12||12;return l+" "+s+", "+c+" "+g+":"+u+" "+p}function getCategoryUpdateFrequency(e,n){return n?String(n).toLowerCase():(window.APP_CONFIG&&Array.isArray(window.APP_CONFIG.monthlyCategories)?window.APP_CONFIG.monthlyCategories:[]).includes(e)?"monthly":"weekly"}function getListPublishedDate(e,n){if(n)return n;if(!Array.isArray(e))return"";const a=e.find(r=>r&&r.published_date&&r.published_date!=="Unknown");return a?a.published_date:""}function updateMonthlyListHint(e,n,a,r,c){const l=document.getElementById("monthly-list-hint");if(!l)return;if(getCategoryUpdateFrequency(e,a)!=="monthly"){l.hidden=!0,l.textContent="";return}const o=getListPublishedDate(n,r);l.textContent=o?t("monthly_list_with_date",c,{date:o}):t("monthly_list",c),l.hidden=!1}function renderRankChange(e,n,a,r){const c=Number(e.previous_rank??e.rank_last_week??0);if(c>0){const s=c-n;
15if(s===0){const i=a==="zh"?"\u6392\u540D\u6301\u5E73":"Rank unchanged",y=a==="zh"?"\u2014 \u6301\u5E73":"\u2014 Unchanged";return`<span class="${r} stable" data-zh="\u2014 \u6301\u5E73" data-en="\u2014 Unchanged" aria-label="${esc(i)}">${y}</span>`}const o=s>0?"up":"down",u=Math.abs(s),p=t(s>0?"card_rank_up_aria":"card_rank_down_aria",a,{n:u}),g=a==="zh"?`${s>0?"\u2191":"\u2193"} ${s>0?"\u4E0A\u5347":"\u4E0B\u964D"} ${u}`:`${s>0?"\u2191":"\u2193"} ${s>0?"Up":"Down"} ${u}`,I=s>0?`\u2191 \u4E0A\u5347 ${u}`:`\u2193 \u4E0B\u964D ${u}`,f=s>0?`\u2191 Up ${u}`:`\u2193 Down ${u}`;return`<span class="${r} ${o}" data-zh="${esc(I)}" data-en="${esc(f)}" aria-label="${esc(p)}">${g}</span>`}const l=Number(e.weeks_on_list)||0;if(e.is_new??(c===0&&l===1)){const s=a==="zh"?"+ \u65B0":"+ NEW";return`<span class="${r} new" data-zh="+ \u65B0" data-en="+ NEW" aria-label="${esc(t("card_new_aria",a))}">${s}</span>`}if(e.is_returning??(c===0&&l>1)){const s=a==="zh"?"\u91CD\u8FD4\u699C\u5355":"Returning to the list",o=a==="zh"?"\u21A9 \u91CD\u8FD4":"\u21A9 RETURN";return`<span class="${r} returning" data-zh="\u21A9 \u91CD\u8FD4" data-en="\u21A9 RETURN" aria-label="${esc(s)}">${o}</span>`}return""}function renderCoverWeeks(e,n){const a=Number(e.weeks_on_list)||0;if(a<=0)return"";const r=t("weeks_on_list",n),l=t("card_weeks_suffix",n,{n:a}).replace(String(a),"").trim();return`<span class="cover-weeks" role="img" aria-label="${esc(r)}: ${a}${esc(l)}">
16                <span class="cover-weeks-value"><strong>${a}</strong><span>${esc(l)}</span></span>
17            </span>`}function renderCardIsbn(e){return e.isbn13?`<span class="card-pub-isbn-item isbn" title="ISBN-13: ${esc(e.isbn13)}">${esc(e.isbn13)}</span>`:e.isbn10?`<span class="card-pub-isbn-item isbn" title="ISBN-10: ${esc(e.isbn10)}">${esc(e.isbn10)}</span>`:""}function updateBooksOnPage(e,n,a,r,c){const l=currentLanguage==="zh",s=window.APP_CONFIG.defaultCover,o=currentLanguage,u=document.getElementById("category-select");u&&(u.value=n);const p=document.querySelector(".page-subtitle .update-time-wrap"),g=document.querySelector(".page-subtitle time");p&&g&&(a?(g.setAttribute("datetime",a),g.textContent=t("time_updated_at",o,{time:formatLocalTime(a,o)}),p.hidden=!1):(g.removeAttribute("datetime"),g.textContent="",p.hidden=!0)),updateMonthlyListHint(n,e,r,c,o);const I=document.getElementById("books-grid");I&&(I.innerHTML=e.map((i,y)=>{const h=Number(i.rank)||y+1,m=i.source_index??h-1,d=i.source_category||n,v=`/book/${encodeURIComponent(m)}?category=${encodeURIComponent(d)}&lang=${encodeURIComponent((function(){var _=new URLSearchParams(window.location.search).get("lang");return _!=="zh"&&_!=="en"&&(_=window.__APP_LANG__==="zh"||window.__APP_LANG__==="en"?window.__APP_LANG__:""),!_&&typeof currentLanguage=="string"&&(currentLanguage==="zh"||currentLanguage==="en")&&(_=currentLanguage),_||"en"})())}&return_to=${encodeURIComponent(window.location.pathname+window.location.search)}`,k=i.cover&&i.cover!==s?i.cover:i._original_cover||s,w=l&&i.title_zh||i.title,b=l?i.description_zh||i.description||"":i.description||"",$=resolveCategoryLabel(i,n,o),C=coverToSrc(i._original_cover);return`
18            <article class="card card-animate"
19                     data-isbn="${esc(i.isbn13||i.isbn10||"")}"
20                     data-index="${m}"
21                     data-category="${esc(d)}"
22                     aria-label="${esc(w)} - ${esc(t("card_rank_aria",o,{n:h}))}">
23                <a class="card-link" href="${v}">
24                <div class="card-image">
25                    <div class="cover-frame">
26                        <img src="${esc(coverToSrc(k)||s)}"
27                             alt="${esc(t("card_cover_alt",o,{title:w}))}"
28                             loading="lazy"
29                             width="280"
30                             height="240"
31                             data-original="${esc(C)}"
32                             data-fallback="${s}">
33                        ${renderCoverWeeks(i,o)}
34                    </div>
35                    <span class="card-category-tag">${esc($)}</span>
36                    <span class="card-badge ${h===1?"gold":h===2?"silver":h===3?"bronze":"other"}"
37                          aria-label="${esc(t("card_badge_aria",o,{n:h}))}">
38                        ${h}
39                    </span>
40                    ${renderRankChange(i,h,o,"rank-change")}
41                    </div>
42                    <div class="card-content">
43                    <h3 class="card-title" title="${esc(w)}">${esc(w)}</h3>
44          ${l&&i.title_zh&&i.title&&i.title_zh!==i.title?`<p class="card-original-title">${esc(i.title)}</p>`:""}
45                    <p class="card-author">${esc(i.author)}</p>
46                    ${i.publisher||i.isbn13||i.isbn10||i.weeks_on_list?`
47                    <p class="card-pub-isbn">
48                        ${i.publisher&&["Unknown","Unknown Publisher","\u672A\u77E5","\u672A\u77E5\u51FA\u7248\u793E"].indexOf(i.publisher)===-1?`<span class="card-pub-isbn-item publisher" title="${esc(t("book_publisher",o))}: ${esc(i.publisher)}">${esc(i.publisher)}</span>`:""}
49                        ${renderCardIsbn(i)}
50                        ${i.weeks_on_list?`<span class="card-pub-isbn-item weeks" title="${esc(t("weeks_on_list",o))}">${esc(t("card_weeks_suffix",o,{n:i.weeks_on_list}))}</span>`:""}
51                    </p>`:""}
52                    ${b?`<p class="card-desc">${esc(b)}</p>`:""}
53                </div>
54                </a>
55            </article>
56        `}).join(""));const f=document.querySelector(".home-toolbar");if(f){const i=f.querySelector(".export-info");if(i){const y=t("books_count",o,{count:e.length});i.innerHTML=y.replace(/(\d+)/,"<strong>$1</strong>")}}}window.addEventListener("popstate",function(){window.location.reload()}),document.addEventListener("DOMContentLoaded",function(){const e=document.getElementById("search-input"),n=document.getElementById("search-clear-btn");e&&(e.addEventListener("input",function(){n&&(n.style.display=this.value?"flex":"none");const a=document.getElementById("search-suggestions");a&&(a.style.display="none")}),n&&n.addEventListener("click",function(){e.value="",n.style.display="none",e.focus(),renderSearchSuggestions()}),e.addEventListener("focus",function(){setTimeout(()=>renderSearchSuggestions(),100)}),e.addEventListener("keydown",function(a){a.key==="Enter"&&(a.preventDefault(),this.value.trim()&&(saveSearchHistory(this.value.trim()),applyFilters()))})),document.addEventListener("click",function(a){const r=document.getElementById("search-suggestions"),c=document.getElementById("search-input");r&&c&&!a.target.closest(".search-box")&&(r.style.display="none")}),initOnDemandTranslation()});function refreshData(){showLoading("\u5237\u65B0\u4E2D..."),window.location.href=window.location.pathname+"?refresh=1"}function exportBooks(e){showToast("\u6B63\u5728\u5BFC\u51FA...","info"),window.location.href=`/api/export/${encodeURIComponent(e)}`}const booksGrid=document.getElementById("books-grid");function handleCardClick(e){const n=e.target.closest(".btn-favorite");if(n){e.stopPropagation();const s=n.getAttribute("data-isbn");typeof window.toggleFavorite=="function"&&window.toggleFavorite(n,s);return}const a=e.target.closest(".btn-share");if(a){e.stopPropagation();const s=a.getAttribute("data-title"),o=a.getAttribute("data-author");typeof shareBook=="function"&&shareBook(s,o);return}if(e.target.closest("a[href]"))return;const r=e.target.closest(".card[data-index], .list-item[data-index]");if(!r)return;const c=r.getAttribute("data-index"),l=r.getAttribute("data-category")||window.currentCategory||window.APP_CONFIG.currentCategory;window.location.href=`/book/${encodeURIComponent(c)}?category=${encodeURIComponent(l)}&lang=${encodeURIComponent((function(){var s=new URLSearchParams(window.location.search).get("lang");return s!=="zh"&&s!=="en"&&(s=window.__APP_LANG__==="zh"||window.__APP_LANG__==="en"?window.__APP_LANG__:""),!s&&typeof currentLanguage=="string"&&(currentLanguage==="zh"||currentLanguage==="en")&&(s=currentLanguage),s||"en"})())}&return_to=${encodeURIComponent(window.location.pathname+window.location.search)}`}booksGrid&&booksGrid.addEventListener("click",handleCardClick);function handleCardKeydown(e){if(!e.target.closest("a[href]")&&(e.key==="Enter"||e.key===" ")){const n=e.target.closest(".card[data-index], .list-item[data-index]");n&&(e.preventDefault(),n.click())}}booksGrid&&booksGrid.addEventListener("keydown",handleCardKeydown);const categorySelect=document.getElementById("category-select");categorySelect&&categorySelect.addEventListener("change",function(){changeCategory(this.value)});const btnSearch=document.getElementById("btn-search"),btnClear=document.getElementById("btn-clear"),btnExportAll=document.getElementById("btn-export-all"),refreshDataLink=document.getElementById("refresh-data-link");btnSearch&&btnSearch.addEventListener("click",()=>{typeof applyFilters=="function"&&applyFilters()}
56),btnClear&&btnClear.addEventListener("click",()=>{typeof clearFilters=="function"&&clearFilters()}),btnExportAll&&btnExportAll.addEventListener("click",()=>{typeof exportBooks=="function"&&exportBooks("all")}),refreshDataLink&&refreshDataLink.addEventListener("click",()=>{typeof refreshData=="function"&&refreshData()});const searchSuggestions=document.getElementById("search-suggestions");searchSuggestions&&searchSuggestions.addEventListener("click",function(e){const n=e.target.closest(".delete-history");if(n){e.stopPropagation();const r=n.getAttribute("data-delete-query");typeof deleteHistoryItem=="function"&&deleteHistoryItem(r);return}const a=e.target.closest(".suggestion-item[data-search-query]");if(a){const r=a.getAttribute("data-search-query");typeof applySearch=="function"&&applySearch(r)}}),window.addEventListener("languagechange",function(e){var n=e.detail.language;if(currentLanguage=n,typeof applyPageTranslation=="function"&&applyPageTranslation(n),typeof updateCategorySelectOptions=="function")try{updateCategorySelectOptions(n)}catch(a){console.warn("updateCategorySelectOptions:",a)}if(typeof rerenderCurrentBooks=="function")try{rerenderCurrentBooks(n)}catch(a){console.warn("rerenderCurrentBooks:",a)}if(typeof BookI18n<"u"&&BookI18n.size()>0)try{BookI18n.applyLanguage(n)}catch(a){console.warn("BookI18n error:",a)}});function initOnDemandTranslation(){try{let f=function(){c&&(c.textContent="\u6B63\u5728\u7FFB\u8BD1... ("+o+"/"+s+")"),l&&(l.style.width=Math.round(o/s*100)+"%"),o>=s&&r&&(r.style.display="none")},i=function(){if(u||!a.length){f();return}var h=a.shift(),m=(h.getAttribute("data-isbn")||"").replace(/[^0-9Xx]/g,"");if(!m){o+=1,f(),i();return}fetch("/api/translate/book/"+encodeURIComponent(m),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}).then(function(d){if(!d.ok)throw(d.status===401||d.status===500||d.status===429)&&(u=!0),new Error("http "+d.status);return d.json()}).then(function(d){var v=d&&d.data&&d.data.book;v&&y(h,v),h.removeAttribute("data-needs-translation"),o+=1,f(),i()}).catch(function(){o+=1,f(),i()})},y=function(h,m){var d=m.title_zh;if(d){var v=h.querySelector("h3.list-item-title a");if(v)v.textContent=d;else{var k=h.querySelector("h3.card-title");k&&(k.textContent=d,k.setAttribute("title",d))}}var w=m.description_zh;if(w){var b=h.querySelector("p.card-desc, p.list-item-desc");b&&(b.textContent=w)}try{if(typeof BookI18n<"u"&&BookI18n.updateBatch){var $=(h.getAttribute("data-isbn")||"").replace(/[^0-9Xx]/g,"");BookI18n.updateBatch([{isbn:$,language:"zh",data:{title:d,description:w}}])}}catch{}};var p=f,g=i,I=y,e=document.documentElement.getAttribute("lang")||"",n=null;try{n=localStorage.getItem("app_language")||localStorage.getItem("bookrank_language")}catch{}if(n){if(n!=="zh")return}else if(e&&e.toLowerCase().indexOf("zh")!==0)return;var a=Array.prototype.slice.call(document.querySelectorAll('article[data-needs-translation="1"][data-isbn]')).slice(0,15);if(!a.length){hideTranslationProgress();return}var r=document.getElementById("translation-progress"),c=r?r.querySelector(".progress-text"):null,l=r?r.querySelector(".progress-fill"):null,s=a.length,o=0,u=!1;f(),setTimeout(i,1500)}catch{}}function hideTranslationProgress(){var e=document.getElementById("translation-progress");e&&(e.style.display="none")}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.