From 509165484ea3246217843b4a2bb8236e6b8915d8 Mon Sep 17 00:00:00 2001 From: claude-dev Date: Sat, 11 Apr 2026 22:34:04 +0000 Subject: [PATCH] Zusammenfassung-Kachel: Quellenverweise als klickbare Links renderZusammenfassung bekommt jetzt sourcesJson und rendert [1], [2] etc. als klickbare Links -- identisch zu renderSummary. --- src/static/js/app.js | 2 +- src/static/js/components.js | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/static/js/app.js b/src/static/js/app.js index d01ab82..e592016 100644 --- a/src/static/js/app.js +++ b/src/static/js/app.js @@ -851,7 +851,7 @@ const App = { if (incident.summary && incident.type === 'research') { const { zusammenfassung, remaining } = UI.extractZusammenfassung(incident.summary); if (zusammenfassung) { - if (zusammenfassungText) zusammenfassungText.innerHTML = UI.renderZusammenfassung(zusammenfassung); + if (zusammenfassungText) zusammenfassungText.innerHTML = UI.renderZusammenfassung(zusammenfassung, incident.sources_json); if (zusammenfassungCard) zusammenfassungCard.style.display = ''; summaryText.innerHTML = UI.renderSummary(remaining, incident.sources_json, incident.type); } else { diff --git a/src/static/js/components.js b/src/static/js/components.js index e989f2d..d2f4b38 100644 --- a/src/static/js/components.js +++ b/src/static/js/components.js @@ -712,8 +712,10 @@ const UI = { /** * Rendert die Zusammenfassung als HTML (Bullet Points). */ - renderZusammenfassung(text) { + renderZusammenfassung(text, sourcesJson) { if (!text) return 'Noch keine Zusammenfassung.'; + let sources = []; + try { sources = JSON.parse(sourcesJson || '[]'); } catch(e) {} let html = this.escape(text); // Bullet points html = html.replace(/^- (.+)$/gm, '
  • $1
  • '); @@ -721,6 +723,21 @@ const UI = { // Zeilenumbrueche html = html.replace(/\n(?!<)/g, '
    '); html = html.replace(/(
    ){2,}/g, '
    '); + // Inline-Zitate als klickbare Links + if (sources.length > 0) { + html = html.replace(/\[(\d+[a-z]?)\]/g, (match, num) => { + let src = sources.find(s => String(s.nr) === num || Number(s.nr) === Number(num)); + if ((!src || !src.url) && /[a-z]$/.test(num)) { + const baseNum = num.replace(/[a-z]$/, ''); + const baseSrc = sources.find(s => String(s.nr) === baseNum || Number(s.nr) === Number(baseNum)); + if (baseSrc && baseSrc.url) src = baseSrc; + } + if (src && src.url) { + return `[${num}]`; + } + return match; + }); + } return html; },