PageSourceSearch

https://tyeyeah.github.io/js/page/home-page.js

js tyeyeah.github.io collected 2026-10-03 10:06:44 UTC 3,140 bytes, 102 lines download raw bytes

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.