vendor: 3,140 bytes, lines 1-102
1/* global KEEP */ 2 3function homePageHandler() { 4 const { post_datetime, post_datetime_format, announcement } = KEEP.theme_config?.home || {} 5 const fsc = KEEP.theme_config?.first_screen || {} 6 7 // reset home post update datetime 8 const resetHomePostUpdateDate = () => { 9 if (post_datetime === 'updated' && post_datetime_format) { 10 const datetimeDoms = document.querySelectorAll('.post-meta-info .home-post-history') 11 datetimeDoms.forEach((datetimeDom) => { 12 const updated = new Date(datetimeDom.dataset.updated).getTime() 13 const format = post_datetime_format || KEEP.themeInfo.defaultDatetimeFormat 14 datetimeDom.innerHTML = KEEP.utils.formatDatetime(format, updated) 15 }) 16 } 17 } 18 19 // set how long age in home post block 20 const setHowLongAgoInHome = () => { 21 if (post_datetime_format && post_datetime_format !== 'ago') { 22 return 23 } 24 const datetimeDoms = document.querySelectorAll('.post-meta-info .home-post-history') 25 datetimeDoms.forEach((v) => { 26 const nowTimestamp = Date.now() 27 const updatedTimestamp = new Date(v.dataset.updated).getTime() 28 v.innerHTML = KEEP.utils.getHowLongAgo(Math.floor((nowTimestamp - updatedTimestamp) / 1000)) 29 }) 30 } 31 32 // close website announcement 33 const closeWebsiteAnnouncement = () => { 34 if (announcement) { 35 const waDom = document.querySelector('.home-content-container .website-announcement') 36 if (waDom) { 37 const closeDom = waDom.querySelector('.close') 38 closeDom.addEventListener('click', () => { 39 waDom.style.display = 'none' 40 }) 41 } 42 } 43 } 44 45 // first screen typewriter 46 const initTypewriter = () => { 47 const isHitokoto = fsc?.hitokoto === true 48 49 if (fsc?.enable !== true) { 50 return 51 } 52 53 if (fsc?.enable === true && !isHitokoto && !fsc?.description) { 54 return 55 } 56 57 const descBox = document.querySelector('.first-screen-content .description') 58 if (descBox) { 59 descBox.style.opacity = '0' 60 61 setTimeout( 62 () => { 63 descBox.style.opacity = '1' 64 const descItemList = descBox.querySelectorAll('.desc-item') 65 descItemList.forEach((descItem) => { 66 const desc = descItem.querySelector('.desc') 67 const cursor = descItem.querySelector('.cursor') 68 const text = desc.innerHTML 69 desc.innerHTML = '' 70 let charIndex = 0 71 72 if (text) { 73 const typewriter = () => { 74 if (charIndex < text.length) { 75 desc.textContent += text.charAt(charIndex) 76 charIndex++ 77 setTimeout(typewriter, 100) 78 } else { 79 cursor.style.display = 'none' 80 } 81 } 82 83 typewriter() 84 } 85 }) 86 }, 87 isHitokoto ? 400 : 300 88 ) 89 } 90 } 91 92 resetHomePostUpdateDate() 93 setHowLongAgoInHome() 94 closeWebsiteAnnouncement() 95 initTypewriter() 96} 97 98if (KEEP.theme_config?.pjax?.enable === true && KEEP.utils) { 99 homePageHandler() 100} else { 101 window.addEventListener('DOMContentLoaded', homePageHandler) 102}
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.