Zusammenfassung-Kachel: Quellenverweise als klickbare Links

renderZusammenfassung bekommt jetzt sourcesJson und rendert
[1], [2] etc. als klickbare Links -- identisch zu renderSummary.
Dieser Commit ist enthalten in:
claude-dev
2026-04-11 22:34:04 +00:00
Ursprung db662f4538
Commit 509165484e
2 geänderte Dateien mit 19 neuen und 2 gelöschten Zeilen

Datei anzeigen

@@ -851,7 +851,7 @@ const App = {
if (incident.summary && incident.type === 'research') { if (incident.summary && incident.type === 'research') {
const { zusammenfassung, remaining } = UI.extractZusammenfassung(incident.summary); const { zusammenfassung, remaining } = UI.extractZusammenfassung(incident.summary);
if (zusammenfassung) { if (zusammenfassung) {
if (zusammenfassungText) zusammenfassungText.innerHTML = UI.renderZusammenfassung(zusammenfassung); if (zusammenfassungText) zusammenfassungText.innerHTML = UI.renderZusammenfassung(zusammenfassung, incident.sources_json);
if (zusammenfassungCard) zusammenfassungCard.style.display = ''; if (zusammenfassungCard) zusammenfassungCard.style.display = '';
summaryText.innerHTML = UI.renderSummary(remaining, incident.sources_json, incident.type); summaryText.innerHTML = UI.renderSummary(remaining, incident.sources_json, incident.type);
} else { } else {

Datei anzeigen

@@ -712,8 +712,10 @@ const UI = {
/** /**
* Rendert die Zusammenfassung als HTML (Bullet Points). * Rendert die Zusammenfassung als HTML (Bullet Points).
*/ */
renderZusammenfassung(text) { renderZusammenfassung(text, sourcesJson) {
if (!text) return '<span style="color:var(--text-disabled);">Noch keine Zusammenfassung.</span>'; if (!text) return '<span style="color:var(--text-disabled);">Noch keine Zusammenfassung.</span>';
let sources = [];
try { sources = JSON.parse(sourcesJson || '[]'); } catch(e) {}
let html = this.escape(text); let html = this.escape(text);
// Bullet points // Bullet points
html = html.replace(/^- (.+)$/gm, '<li>$1</li>'); html = html.replace(/^- (.+)$/gm, '<li>$1</li>');
@@ -721,6 +723,21 @@ const UI = {
// Zeilenumbrueche // Zeilenumbrueche
html = html.replace(/\n(?!<)/g, '<br>'); html = html.replace(/\n(?!<)/g, '<br>');
html = html.replace(/(<br>){2,}/g, '<br>'); html = html.replace(/(<br>){2,}/g, '<br>');
// 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 `<a href="${this.escape(src.url)}" target="_blank" rel="noopener" class="citation" title="${this.escape(src.name)}">[${num}]</a>`;
}
return match;
});
}
return html; return html;
}, },