From ec2c75de33eda69a3ee8c49fecda624c3f2245d6 Mon Sep 17 00:00:00 2001 From: BlackAngelTVdev Date: Thu, 28 May 2026 19:19:46 +0200 Subject: [PATCH] fix(dl): afficher les images de release et ouvrir la page de release --- p/assets/js/downloads.js | 47 ++++++++++++++++++++++++++++++----- p/assets/styles/downloads.css | 17 +++++++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/p/assets/js/downloads.js b/p/assets/js/downloads.js index 0aaf953..0559bdb 100644 --- a/p/assets/js/downloads.js +++ b/p/assets/js/downloads.js @@ -27,6 +27,42 @@ return entry?.name || entry?.tag_name || entry?.ref || "Sans nom"; } + function getReleasePageUrl(entry, mode) { + if (mode === "releases") { + return entry?.html_url || REPO_URL; + } + + if (entry?.name) { + return `${REPO_URL}/releases/tag/${encodeURIComponent(entry.name)}`; + } + + return REPO_URL; + } + + function sanitizeReleaseHtml(html) { + const wrapper = document.createElement("div"); + wrapper.innerHTML = html || ""; + + wrapper.querySelectorAll("script, iframe, object, embed, link, style").forEach((node) => node.remove()); + wrapper.querySelectorAll("*").forEach((node) => { + Array.from(node.attributes).forEach((attribute) => { + const name = attribute.name.toLowerCase(); + const value = attribute.value || ""; + + if (name.startsWith("on")) { + node.removeAttribute(attribute.name); + return; + } + + if ((name === "href" || name === "src") && /^javascript:/i.test(value)) { + node.removeAttribute(attribute.name); + } + }); + }); + + return wrapper.innerHTML; + } + function pickDirectDownloadUrl(release) { const assets = Array.isArray(release?.assets) ? release.assets : []; const isoAsset = assets.find((asset) => /\.iso$/i.test(asset?.name || "")); @@ -79,9 +115,7 @@ li.className = "version-item"; const label = getReleaseLabel(entry); - const downloadUrl = mode === "releases" - ? pickDirectDownloadUrl(entry) - : `https://github.com/${OWNER}/${REPO}/archive/refs/tags/${encodeURIComponent(entry.name)}.zip`; + const downloadUrl = getReleasePageUrl(entry, mode); const published = formatDate(entry.published_at || entry.commit?.committer?.date); li.innerHTML = ` @@ -129,9 +163,10 @@ if (currentVersionNode) currentVersionNode.textContent = latestLabel; if (currentVersionDateNode) currentVersionDateNode.textContent = latestDate ? ` · ${latestDate}` : ""; if (currentReleaseNoteNode) { - currentReleaseNoteNode.textContent = latest.body || "Release GitHub la plus récente."; + const bodyHtml = sanitizeReleaseHtml(latest.body || ""); + currentReleaseNoteNode.innerHTML = bodyHtml || "Release GitHub la plus récente."; } - if (latestDownloadNode) latestDownloadNode.href = latestDownloadUrl; + if (latestDownloadNode) latestDownloadNode.href = latest.html_url || REPO_URL; renderList(releases, "releases"); return; @@ -146,7 +181,7 @@ if (Array.isArray(tags) && tags.length > 0) { const latestTag = tags[0]; const latestLabel = getReleaseLabel(latestTag); - const latestDownloadUrl = `https://github.com/${OWNER}/${REPO}/archive/refs/tags/${encodeURIComponent(latestTag.name)}.zip`; + const latestDownloadUrl = `${REPO_URL}/releases/tag/${encodeURIComponent(latestTag.name)}`; if (currentVersionNode) currentVersionNode.textContent = `${latestLabel} (tag)`; if (currentVersionDateNode) currentVersionDateNode.textContent = ""; diff --git a/p/assets/styles/downloads.css b/p/assets/styles/downloads.css index 52322f1..849942c 100644 --- a/p/assets/styles/downloads.css +++ b/p/assets/styles/downloads.css @@ -34,6 +34,23 @@ line-height: 1.6; } +.latest-note img { + display: block; + max-width: 100%; + height: auto; + margin: 0.75rem 0; + border-radius: 0.65rem; +} + +.latest-note a { + color: #7dd3fc; + text-decoration: none; +} + +.latest-note a:hover { + text-decoration: underline; +} + .versions-archive { margin-top: 1rem; }