<script>
$(".smalltext")
.contents()
.filter(function () {
return this.nodeType === 3
})
.remove()
const loaderSection = document.querySelector(".loader")
const articleLatestSection = document.querySelector("#latest-article")
const articlesRestSection = document.querySelector(".rest-av-articles")
articleLatestSection.style.display = "none"
articlesRestSection.style.display = "none"
const allCards = (container, ARTICLE_LABEL) => {
try {
for (const article of container) {
const labelHolders = article.querySelectorAll(".aui-label > a")
const labelList = Array.from(labelHolders)
const labelsContainer = article.querySelector(".labels-container")
const labelNames = isArticleValid(ARTICLE_LABEL, labelList)
setLabels(labelsContainer, labelNames)
const articleLabels = labelsContainer.getAttribute("data-labels")
article.setAttribute("article-tags", articleLabels)
}
} catch (error) {
console.error("An error occurred:", error)
}
}
const isArticleValid = (ARTICLE_LABEL, labelList) => {
const labelNames = labelList.map((label) => label.textContent.trim())
const found = labelNames.some((label) => label === ARTICLE_LABEL)
if (found) {
const index = labelNames.indexOf(ARTICLE_LABEL)
if (index !== -1) {
labelNames.splice(index, 1)
}
}
return labelNames
}
const setLabels = (labelsContainer, labelNames) => {
labelsContainer.setAttribute("data-labels", labelNames.join(","))
for (const val of labelNames) {
if ( val !== 'news') {
const div = document.createElement("div")
const anchor = document.createElement("a")
anchor.setAttribute(
"href",
`https://ec.europa.eu/digital-building-blocks/sites/display/EBSI/articles?category=${val}`
)
anchor.textContent = constructLabel(val)
div.appendChild(anchor)
labelsContainer.appendChild(div)
}
}
}
const constructLabel = (val) => {
let result = null
const storage = [
{ ede: "EDE" },
{ contextbroker: "Context Broker" },
{ bdti: "BDTI" },
{ success_stories: "Success Stories" },
{ earchiving: "eArchiving" },
{ einvoicing: "eInvoicing" },
{ etranslation: "eTranslation" },
{ esignature: "eSignature" },
{ edelivery: "eDelivery" },
{ eid: "eID" },
{ ssi: "SSI (Self-Sovereign Identity)" },
{ degov: "DeGov" },
{ did: "DID" },
{ w3c: "W3C" },
{ dlt: "DLT" },
{ cef: "CEF" },
{ apis: "APIs" },
{ "early-adopters-programme": "Early Adopters programme" },
{ ebsi: "EBSI" },
{ "smart-contracts": "Smart Contracts" },
{ "ebip": "EBIP" },
{ "esspass": "ESSPASS"},
{ "xp-center": 'EBSI Experience Center' },
{ "edic": "EDIC"},
{ "europeum-edic": "EUROPEUM-EDIC"},
{ "open-source": "Open Source" }
]
storage.find(function (obj) {
const [key, value] = Object.entries(obj)[0]
if (key === val) {
result = value
return true
}
})
if (result === null) {
result = val
.replace(/-/g, " ")
.replace(/\b\w/g, (match) => match.toUpperCase())
}
return result
}
const addHTMLlink = (container) => {
container.forEach((card) => {
const anchorLink = card.querySelector(".details > a").getAttribute("href")
const articleWrapper = card.querySelector(".article-wrapper")
const div = document.createElement("div")
div.classList.add("card-content-footer")
const p = document.createElement("p")
const anchor = document.createElement("a")
anchor.classList.add("link-cta", "text-secondary")
anchor.setAttribute("aria-label", "Read the article")
anchor.setAttribute("href", anchorLink)
const span = document.createElement("span")
span.textContent = "Read the article"
anchor.appendChild(span)
p.appendChild(anchor)
div.appendChild(p)
articleWrapper
? articleWrapper.appendChild(div)
: console.log("Article's pool not found")
})
}
const seperateNewest = (cardArticles, latestArticleContainer) => {
const allArticles = Array.from(cardArticles)
const newestArticle = cardArticles[0]
const newestArticleData2 = newestArticle.cloneNode(true)
const newestArticleData = {
title: newestArticle.querySelector(".ext-article-heading").cloneNode(true),
publication: newestArticle
.querySelector(".article-publication")
.cloneNode(true),
img: newestArticle
.querySelector(".article-preview > img")
.getAttribute("src"),
}
const restArticles = []
for (let i = 0; i < cardArticles.length; i++) {
//i === 0 ? latestArticleContainer.appendChild(cardArticles[i]) : restArticles.push(cardArticles[i])
i === 0
? appendData(latestArticleContainer, cardArticles[i], newestArticleData2)
: restArticles.push(cardArticles[i])
}
const restructuredNewestArticle = document.querySelector(
".content-by-label-ii > li"
)
return { restructuredNewestArticle, restArticles, allArticles }
}
const appendData = (
latestArticleContainer,
firstArticle,
newestArticleData2
) => {
latestArticleContainer.appendChild(newestArticleData2)
firstArticle.remove()
}
const cardArticleModifier = (cardArticles) => {
for (const article of cardArticles) {
const h4 = document.createElement("h3")
const strong = document.createElement("strong")
const anchor = article.querySelector(".ext-article-heading > a")
strong.textContent = constructLabel(anchor.textContent)
h4.appendChild(strong)
anchor.parentNode.replaceChild(h4, anchor)
}
}
const pagination = (cardArticles) => {
const loadCTA = document.querySelector(".loadmore-cta")
const cardsLimit = 8
const showOnLoad = () => {
cardArticles.forEach((article, index) => {
index > cardsLimit
? (article.style.display = "none")
: (article.style.display = "block")
index > cardsLimit
? (loadCTA.style.display = "flex")
: (loadCTA.style.display = "none")
})
}
showOnLoad()
}
const loadNextArticles = () => {
const loadCTA = document.querySelector(".loadmore-cta")
const hiddenCards = Array.from(
document.querySelectorAll(".content-by-label > li")
).filter(function (liElement) {
return window.getComputedStyle(liElement).display === "none"
})
if (hiddenCards.length <= 6) {
loadCTA.style.display = "none"
hiddenCards.forEach((article) => {
article.style.display = "block"
})
} else {
const nextArray = hiddenCards.slice(0, 6)
nextArray.forEach((article) => {
article.style.display = "block"
})
}
}
const articleIds = (cardArticles) => {
const result = []
for (const article of cardArticles) {
const id = article.querySelector(".article-publication").getAttribute("id")
result.push(id)
}
return result
}
document.addEventListener("DOMContentLoaded", function () {
const ARTICLE_LABEL = "newsv2"
const latestArticleContainer = document.querySelector(
"#latest-article > .content-by-label-ii"
)
const cardArticles = document.querySelectorAll(".content-by-label > li")
allCards(cardArticles, ARTICLE_LABEL)
const partition = seperateNewest(cardArticles, latestArticleContainer)
cardArticleModifier([partition.restructuredNewestArticle])
cardArticleModifier(partition.restArticles)
addHTMLlink([partition.restructuredNewestArticle])
addHTMLlink(partition.restArticles)
const loadCTA = document.querySelector(".loadmore-cta")
loadCTA.addEventListener("click", loadNextArticles)
pagination(partition.restArticles)
const IDs = articleIds(cardArticles)
for (const id of IDs) {
readingTime(id)
}
})
//---------
async function readingTime(id) {
try {
const response = await fetch(
`https://ec.europa.eu/digital-building-blocks/sites/rest/api/content/${id}?expand=body.view`
)
const data = await response.json()
const pageContent = data.body.view.value
const parser = new DOMParser()
const htmlDoc = parser.parseFromString(pageContent, "text/html")
const allText = htmlDoc.body.innerText
const allWords = allText.split(/\s+/).filter((word) => word.trim() !== "")
const numWords = allWords.length - 50
const cardArticle = document.getElementById(id)
cardArticle.querySelector(
".reading-time > span"
).textContent = `${Math.ceil(numWords / 200)}`
loaderSection.style.display = "none"
articleLatestSection.style.display = "block"
articlesRestSection.style.display = "block"
} catch (error) {
console.log(error)
}
}
</script> |