|
| 1 | +// News feed functions |
| 2 | + |
| 3 | +function formatAMPM(date) { |
| 4 | + var hours = date.getUTCHours(); |
| 5 | + var minutes = date.getUTCMinutes(); |
| 6 | + var ampm = hours >= 12 ? 'PM' : 'AM'; |
| 7 | + hours = hours % 12; |
| 8 | + hours = hours ? hours : 12; // the hour '0' should be '12' |
| 9 | + minutes = minutes < 10 ? '0'+minutes : minutes; |
| 10 | + var strTime = hours + ':' + minutes + ' ' + ampm; |
| 11 | + return strTime; |
| 12 | +} |
| 13 | + |
| 14 | +function formatDate(date) { |
| 15 | + const year = date.getUTCFullYear(); |
| 16 | + const months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; |
| 17 | + const month = months[date.getUTCMonth()]; |
| 18 | + const day = date.getUTCDate().toString().padStart(2, '0'); |
| 19 | + const timestr = formatAMPM(date); |
| 20 | + return `${month} ${day}, ${year} ${timestr} UTC`; |
| 21 | +} |
| 22 | + |
| 23 | +async function fetchPostsFromFeeds(urls) { |
| 24 | + const posts = []; |
| 25 | + for (let i = 0 ; i < urls.length ; ++i) { |
| 26 | + |
| 27 | + let response = await fetch(urls[i], { |
| 28 | + method: "GET", |
| 29 | + }); |
| 30 | + |
| 31 | + const text = await response.text(); |
| 32 | + const parser = new DOMParser(); |
| 33 | + const doc = parser.parseFromString(text, "text/xml"); |
| 34 | + const items = doc.getElementsByTagName("item"); |
| 35 | + for (let ii = 0 ; ii < items.length ; ++ii) { |
| 36 | + |
| 37 | + date = new Date(items[ii].querySelector("pubDate").textContent); |
| 38 | + |
| 39 | + |
| 40 | + newpost = {title: items[ii].querySelector("title").textContent, |
| 41 | + link: items[ii].querySelector("link").textContent, |
| 42 | + ts: date, |
| 43 | + date: formatDate(date), |
| 44 | + desc: items[ii].querySelector("description").textContent |
| 45 | + } |
| 46 | + posts.push(newpost); |
| 47 | + }; |
| 48 | + }; |
| 49 | + return posts.sort((a, b) => b.ts - a.ts); |
| 50 | +} |
| 51 | + |
| 52 | +async function refreshNewslist(urls) { |
| 53 | + let posts = await fetchPostsFromFeeds(urls); |
| 54 | + $("#newslist").empty(); |
| 55 | + posts.forEach((post, i) => { |
| 56 | + $("#newslist").append( |
| 57 | + `<li class="ps-2 pb-2 refreshed"> |
| 58 | + <h3><a class="list-group-item newslink p-2" href="${posts[i].link}">${posts[i].title}</a></h3> |
| 59 | + <small class="ps-2 text-secondary-emphasis">${posts[i].date}</small> |
| 60 | + <div class="ps-2 pt-2">${posts[i].desc}</div> |
| 61 | + </li>` |
| 62 | + ) |
| 63 | + }); |
| 64 | +} |
| 65 | +async function refreshNewslinks(urls) { |
| 66 | + let posts = await fetchPostsFromFeeds(urls); |
| 67 | + $("#newslinks ul").empty(); |
| 68 | + posts.forEach((post, i) => { |
| 69 | + if (i <= ( 5 - 1 )) { |
| 70 | + $("#newslinks ul").append( |
| 71 | + `<li class="ps-2 refreshed"> |
| 72 | + <a class="list-group-item newslink lh-base p-2" href="${posts[i].link}">${posts[i].title}</a> |
| 73 | + <small class="ps-2 text-secondary-emphasis">${posts[i].date}</small> |
| 74 | + </li>` |
| 75 | + ) |
| 76 | + } |
| 77 | + }); |
| 78 | +} |
0 commit comments