Skip to content

Commit 10c3c30

Browse files
committed
Deduplicate news js, make it handle multiple feeds
1 parent ee086cc commit 10c3c30

File tree

4 files changed

+87
-99
lines changed

4 files changed

+87
-99
lines changed

config.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ publishDir = "../website"
6262
background = "img/pyramids.jpg"
6363

6464
newslimit = 5
65+
feeds = [
66+
"https://softwareheritage.org/tag/codemeta/feed/"
67+
]
6568

6669
date_format = "Mon, Jan 2, 2006"
6770
description = "A Rosetta Stone for Software Metadata"

layouts/shortcodes/news.md

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -26,55 +26,8 @@
2626
</li>
2727
{{ end }}
2828
</ul>
29+
<script src="../js/news.js"></script>
2930
<script>
30-
31-
function formatAMPM(date) {
32-
var hours = date.getUTCHours();
33-
var minutes = date.getUTCMinutes();
34-
var ampm = hours >= 12 ? 'PM' : 'AM';
35-
hours = hours % 12;
36-
hours = hours ? hours : 12; // the hour '0' should be '12'
37-
minutes = minutes < 10 ? '0'+minutes : minutes;
38-
var strTime = hours + ':' + minutes + ' ' + ampm;
39-
return strTime;
40-
}
41-
42-
async function fetchCodeMetaPostsFromSWHWordPress() {
43-
let url = `https://softwareheritage.org/tag/codemeta/feed/`;
44-
let response = await fetch(url, {
45-
method: "GET",
46-
});
47-
48-
const text = await response.text();
49-
const parser = new DOMParser();
50-
const doc = parser.parseFromString(text, "text/xml");
51-
const items = doc.getElementsByTagName("item");
52-
53-
$("#newslist").empty();
54-
for (let i = 0 ; i < items.length ; ++i) {
55-
56-
const title = items[i].querySelector("title").textContent;
57-
const link = items[i].querySelector("link").textContent;
58-
const date = new Date(items[i].querySelector("pubDate").textContent);
59-
const desc = items[i].querySelector("description").textContent;
60-
61-
const year = date.getUTCFullYear();
62-
const months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
63-
const month = months[date.getUTCMonth()];
64-
const day = date.getUTCDate().toString().padStart(2, '0');
65-
const timestr = formatAMPM(date);
66-
67-
const utc = `${month} ${day}, ${year} ${timestr} UTC`
68-
69-
$("#newslist").append(
70-
`<li class="ps-2 pb-2 refreshed">
71-
<h3><a class="list-group-item newslink p-2" href="${link}">${title}</a></h3>
72-
<small class="ps-2 text-secondary-emphasis">${utc}</small>
73-
<div class="ps-2 pt-2">${desc}</div>
74-
</li>`
75-
)
76-
};
77-
}
78-
79-
fetchCodeMetaPostsFromSWHWordPress();
31+
let urls = {{ .Site.Params.feeds | jsonify | safeJS }}
32+
refreshNewslist(urls);
8033
</script>

themes/CodeMeta-Pyramids/layouts/partials/news.html

Lines changed: 3 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -38,54 +38,8 @@ <h3 class="ms-3">News</h3>
3838
</ul>
3939
{{ if .IsHome }}<div class="text-center"><small class="mw-100 text-secondary-emphasis"><a href="/news">Full news feed</a></small></div>{{ end }}
4040
</div>
41+
<script src="../js/news.js"></script>
4142
<script>
42-
43-
function formatAMPM(date) {
44-
var hours = date.getUTCHours();
45-
var minutes = date.getUTCMinutes();
46-
var ampm = hours >= 12 ? 'PM' : 'AM';
47-
hours = hours % 12;
48-
hours = hours ? hours : 12; // the hour '0' should be '12'
49-
minutes = minutes < 10 ? '0'+minutes : minutes;
50-
var strTime = hours + ':' + minutes + ' ' + ampm;
51-
return strTime;
52-
}
53-
54-
async function fetchCodeMetaPostsFromSWHWordPress() {
55-
let url = `https://softwareheritage.org/tag/codemeta/feed/`;
56-
let response = await fetch(url, {
57-
method: "GET",
58-
});
59-
60-
const text = await response.text();
61-
const parser = new DOMParser();
62-
const doc = parser.parseFromString(text, "text/xml");
63-
const items = doc.getElementsByTagName("item");
64-
65-
$("#newslinks ul").empty();
66-
for (let i = 0 ; i < items.length ; ++i) {
67-
const title = items[i].querySelector("title").textContent;
68-
const link = items[i].querySelector("link").textContent;
69-
const date = new Date(items[i].querySelector("pubDate").textContent);
70-
const desc = items[i].querySelector("description").textContent;
71-
72-
const year = date.getUTCFullYear();
73-
const months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
74-
const month = months[date.getUTCMonth()];
75-
const day = date.getUTCDate().toString().padStart(2, '0');
76-
const timestr = formatAMPM(date);
77-
78-
const utc = `${month} ${day}, ${year} ${timestr} UTC`
79-
80-
if (i <= ({{ .Site.Params.newslimit }} - 1 ))
81-
$("#newslinks ul").append(
82-
`<li class="ps-2 refreshed">
83-
<a class="list-group-item newslink lh-base p-2" href="${link}">${title}</a>
84-
<small class="p-2 text-secondary-emphasis">${utc}</small>
85-
</li>`
86-
)
87-
};
88-
}
89-
90-
fetchCodeMetaPostsFromSWHWordPress();
43+
let urls = {{ .Site.Params.feeds | jsonify | safeJS }};
44+
refreshNewslinks(urls);
9145
</script>
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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

Comments
 (0)