From 24ad95aa6c3f0b9753e64993bf24489db3dd1171 Mon Sep 17 00:00:00 2001 From: systemreliability <51009183+systemreliability@users.noreply.github.com> Date: Sat, 2 May 2026 23:54:21 +0200 Subject: [PATCH 1/4] Add client-side publication metric badges --- assets/js/publication-badges.js | 63 +++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 assets/js/publication-badges.js diff --git a/assets/js/publication-badges.js b/assets/js/publication-badges.js new file mode 100644 index 00000000..c694208a --- /dev/null +++ b/assets/js/publication-badges.js @@ -0,0 +1,63 @@ +(() => { + const getDoi = (entry) => { + const doiLink = entry.querySelector('.links a[href^="https://doi.org/"]'); + if (!doiLink) return null; + return doiLink.href.replace(/^https:\/\/doi\.org\//, '').trim(); + }; + + const ensureBadgeRow = (entry) => { + let badges = entry.querySelector('.badges'); + if (badges) return badges; + + const links = entry.querySelector('.links'); + if (!links) return null; + + badges = document.createElement('div'); + badges.className = 'badges d-inline-flex align-items-center'; + badges.style.gap = '0.35rem'; + links.insertAdjacentElement('afterend', badges); + return badges; + }; + + const addAltmetricBadge = (badges, doi) => { + if (badges.querySelector('.altmetric-embed')) return; + + const badge = document.createElement('span'); + badge.className = 'altmetric-embed'; + badge.dataset.badgeType = '2'; + badge.dataset.badgePopover = 'right'; + badge.dataset.doi = doi; + badges.prepend(badge); + }; + + const addOpenAlexBadge = (badges, doi) => { + if (badges.querySelector('.openalex-badge')) return; + + const apiUrl = `https://api.openalex.org/works/https://doi.org/${doi}?select=cited_by_count`; + const link = document.createElement('a'); + link.className = 'openalex-badge'; + link.href = `https://openalex.org/search?q=${encodeURIComponent(`doi:${doi}`)}`; + link.setAttribute('aria-label', 'OpenAlex link'); + link.setAttribute('role', 'button'); + link.rel = 'external nofollow noopener'; + link.target = '_blank'; + + const image = document.createElement('img'); + image.src = `https://img.shields.io/badge/dynamic/json?url=${encodeURIComponent(apiUrl)}&query=$.cited_by_count&label=OpenAlex&color=2f7f6f&labelColor=beige`; + image.alt = 'OpenAlex citation count'; + + link.appendChild(image); + badges.appendChild(link); + }; + + document.querySelectorAll('.bibliography li > .row > [id]').forEach((entry) => { + const doi = getDoi(entry); + if (!doi) return; + + const badges = ensureBadgeRow(entry); + if (!badges) return; + + addAltmetricBadge(badges, doi); + addOpenAlexBadge(badges, doi); + }); +})(); From f458c2cd14b26ca3004ab4077204ec3f560c4471 Mon Sep 17 00:00:00 2001 From: systemreliability <51009183+systemreliability@users.noreply.github.com> Date: Sat, 2 May 2026 23:54:32 +0200 Subject: [PATCH 2/4] Load publication badge enhancer on publications page --- _pages/publications.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_pages/publications.md b/_pages/publications.md index edef74c0..03c2f9d7 100644 --- a/_pages/publications.md +++ b/_pages/publications.md @@ -22,3 +22,5 @@ nav_order: 2 {% bibliography %} + + From 77988566cdbdeab037ab9d79767d7825482ac620 Mon Sep 17 00:00:00 2001 From: systemreliability <51009183+systemreliability@users.noreply.github.com> Date: Sat, 2 May 2026 23:58:28 +0200 Subject: [PATCH 3/4] Format publication badges script with Prettier --- assets/js/publication-badges.js | 70 ++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/assets/js/publication-badges.js b/assets/js/publication-badges.js index c694208a..eab0387e 100644 --- a/assets/js/publication-badges.js +++ b/assets/js/publication-badges.js @@ -2,62 +2,68 @@ const getDoi = (entry) => { const doiLink = entry.querySelector('.links a[href^="https://doi.org/"]'); if (!doiLink) return null; - return doiLink.href.replace(/^https:\/\/doi\.org\//, '').trim(); + return doiLink.href.replace(/^https:\/\/doi\.org\//, "").trim(); }; const ensureBadgeRow = (entry) => { - let badges = entry.querySelector('.badges'); + let badges = entry.querySelector(".badges"); if (badges) return badges; - const links = entry.querySelector('.links'); + const links = entry.querySelector(".links"); if (!links) return null; - badges = document.createElement('div'); - badges.className = 'badges d-inline-flex align-items-center'; - badges.style.gap = '0.35rem'; - links.insertAdjacentElement('afterend', badges); + badges = document.createElement("div"); + badges.className = "badges d-inline-flex align-items-center"; + badges.style.gap = "0.35rem"; + links.insertAdjacentElement("afterend", badges); return badges; }; const addAltmetricBadge = (badges, doi) => { - if (badges.querySelector('.altmetric-embed')) return; + if (badges.querySelector(".altmetric-embed")) return; - const badge = document.createElement('span'); - badge.className = 'altmetric-embed'; - badge.dataset.badgeType = '2'; - badge.dataset.badgePopover = 'right'; + const badge = document.createElement("span"); + badge.className = "altmetric-embed"; + badge.dataset.badgeType = "2"; + badge.dataset.badgePopover = "right"; badge.dataset.doi = doi; badges.prepend(badge); }; const addOpenAlexBadge = (badges, doi) => { - if (badges.querySelector('.openalex-badge')) return; + if (badges.querySelector(".openalex-badge")) return; const apiUrl = `https://api.openalex.org/works/https://doi.org/${doi}?select=cited_by_count`; - const link = document.createElement('a'); - link.className = 'openalex-badge'; - link.href = `https://openalex.org/search?q=${encodeURIComponent(`doi:${doi}`)}`; - link.setAttribute('aria-label', 'OpenAlex link'); - link.setAttribute('role', 'button'); - link.rel = 'external nofollow noopener'; - link.target = '_blank'; - - const image = document.createElement('img'); - image.src = `https://img.shields.io/badge/dynamic/json?url=${encodeURIComponent(apiUrl)}&query=$.cited_by_count&label=OpenAlex&color=2f7f6f&labelColor=beige`; - image.alt = 'OpenAlex citation count'; + const link = document.createElement("a"); + link.className = "openalex-badge"; + link.href = `https://openalex.org/search?q=${encodeURIComponent( + `doi:${doi}` + )}`; + link.setAttribute("aria-label", "OpenAlex link"); + link.setAttribute("role", "button"); + link.rel = "external nofollow noopener"; + link.target = "_blank"; + + const image = document.createElement("img"); + image.src = `https://img.shields.io/badge/dynamic/json?url=${encodeURIComponent( + apiUrl + )}&query=$.cited_by_count&label=OpenAlex&color=2f7f6f&labelColor=beige`; + image.alt = "OpenAlex citation count"; link.appendChild(image); badges.appendChild(link); }; - document.querySelectorAll('.bibliography li > .row > [id]').forEach((entry) => { - const doi = getDoi(entry); - if (!doi) return; + document + .querySelectorAll(".bibliography li > .row > [id]") + .forEach((entry) => { + const doi = getDoi(entry); + if (!doi) return; - const badges = ensureBadgeRow(entry); - if (!badges) return; + const badges = ensureBadgeRow(entry); + if (!badges) return; - addAltmetricBadge(badges, doi); - addOpenAlexBadge(badges, doi); - }); + addAltmetricBadge(badges, doi); + addOpenAlexBadge(badges, doi); + }); })(); From 8881dc686720b9b033dfe0afd22d7896b15cf5b6 Mon Sep 17 00:00:00 2001 From: systemreliability <51009183+systemreliability@users.noreply.github.com> Date: Sun, 3 May 2026 00:00:22 +0200 Subject: [PATCH 4/4] Match repository Prettier print width for badge script --- assets/js/publication-badges.js | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/assets/js/publication-badges.js b/assets/js/publication-badges.js index eab0387e..c0845790 100644 --- a/assets/js/publication-badges.js +++ b/assets/js/publication-badges.js @@ -36,9 +36,7 @@ const apiUrl = `https://api.openalex.org/works/https://doi.org/${doi}?select=cited_by_count`; const link = document.createElement("a"); link.className = "openalex-badge"; - link.href = `https://openalex.org/search?q=${encodeURIComponent( - `doi:${doi}` - )}`; + link.href = `https://openalex.org/search?q=${encodeURIComponent(`doi:${doi}`)}`; link.setAttribute("aria-label", "OpenAlex link"); link.setAttribute("role", "button"); link.rel = "external nofollow noopener"; @@ -54,16 +52,14 @@ badges.appendChild(link); }; - document - .querySelectorAll(".bibliography li > .row > [id]") - .forEach((entry) => { - const doi = getDoi(entry); - if (!doi) return; + document.querySelectorAll(".bibliography li > .row > [id]").forEach((entry) => { + const doi = getDoi(entry); + if (!doi) return; - const badges = ensureBadgeRow(entry); - if (!badges) return; + const badges = ensureBadgeRow(entry); + if (!badges) return; - addAltmetricBadge(badges, doi); - addOpenAlexBadge(badges, doi); - }); + addAltmetricBadge(badges, doi); + addOpenAlexBadge(badges, doi); + }); })();