feat(gui): Abschnittstitel der Zusammenfassung fett

Die Section-Zusammenfassung kommt als "Titel:\nFliesstext"-Bloecke zurueck, wurde aber
als flache Textwand gerendert. renderSummary() setzt Titelzeilen jetzt fett.

Im Renderer statt in der DB, damit es sofort fuer alle vorhandenen Zusammenfassungen
gilt, ohne 22 Aufnahmen je 20 Minuten neu zu analysieren.

Regel /^[^.!?]{3,90}:$/ = kurze, alleinstehende Zeile mit Doppelpunkt am Ende. Gegen
die echten Zusammenfassungen #85/#79/#74 geprueft: 37 Titel erkannt, keine
Fliesstextzeile falsch fett, keine Doppelpunkt-Zeile uebersehen.
This commit is contained in:
2026-07-31 13:43:54 +00:00
parent d5b9733e78
commit 914ab2ddc8
3 changed files with 44 additions and 1 deletions
+17 -1
View File
@@ -754,7 +754,7 @@ async function openRecording(id) {
</div>`; </div>`;
const mods = { const mods = {
analyse: ` analyse: `
${r.summary ? `<p class="summary">${escapeHtml(r.summary)}</p>` : '<div class="muted">Noch keine Zusammenfassung.</div>'} ${r.summary ? `<p class="summary">${renderSummary(r.summary)}</p>` : '<div class="muted">Noch keine Zusammenfassung.</div>'}
${(r.participants && r.participants.length) ? `<h3>Teilnehmer</h3><ul class="parts">${r.participants.map(p => `<li>👤 ${escapeHtml(p)}</li>`).join('')}</ul>` : ''} ${(r.participants && r.participants.length) ? `<h3>Teilnehmer</h3><ul class="parts">${r.participants.map(p => `<li>👤 ${escapeHtml(p)}</li>`).join('')}</ul>` : ''}
${markersHtml}`, ${markersHtml}`,
todos: (r.todos && r.todos.length) ? `<ul class="todos">${r.todos.map(t => `<li>${escapeHtml(t)}</li>`).join('')}</ul>` : '<div class="muted">Keine ToDos erkannt.</div>', todos: (r.todos && r.todos.length) ? `<ul class="todos">${r.todos.map(t => `<li>${escapeHtml(t)}</li>`).join('')}</ul>` : '<div class="muted">Keine ToDos erkannt.</div>',
@@ -1143,6 +1143,22 @@ async function openRecording(id) {
function escapeHtml(s) { return (s || '').replace(/[&<>"]/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c])); } function escapeHtml(s) { return (s || '').replace(/[&<>"]/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c])); }
// The section summary comes back as "Abschnittstitel:\nFließtext…" blocks (see
// llm.js analyzeLong). Flat, that reads as one wall of text, so the title lines
// get set in bold. Done at RENDER time on purpose, not stored in the database:
// it applies to every summary that already exists, without re-running a
// 20-minute analysis on 22 recordings.
function renderSummary(text) {
return escapeHtml(text || '').split('\n').map(line => {
const t = line.trim();
// A heading is a SHORT, STANDALONE line ending in a colon. Both conditions
// matter: prose like "…die Struktur der Projektberichterstattung: kurze
// Einordnung, aktueller Stand…" has the colon mid-line and keeps running,
// and excluding . ! ? stops a full sentence that happens to end in a colon.
return /^[^.!?]{3,90}:$/.test(t) ? `<strong class="sum-head">${t}</strong>` : line;
}).join('\n');
}
// ---- Konferenztisch-Ansicht ---- // ---- Konferenztisch-Ansicht ----
// Seat positions (person center, % of scene) per participant count, arranged // Seat positions (person center, % of scene) per participant count, arranged
// around the rectangular table; each seat knows which bubble-arrow side points // around the rectangular table; each seat knows which bubble-arrow side points
+8
View File
@@ -493,3 +493,11 @@ body.resizing { cursor: col-resize; user-select: none; }
.search-page.landing { padding-top: 6vh; } .search-page.landing { padding-top: 6vh; }
.search-go { padding: .55rem .8rem; } .search-go { padding: .55rem .8rem; }
} }
/* Abschnittstitel in der Zusammenfassung ("Neuer Projektleiter vorgestellt:").
Etwas Luft darüber, damit die Blöcke optisch trennen — der Text steht in
white-space: pre-line, die Zeilenumbrüche kommen also aus dem Text selbst. */
.summary .sum-head {
font-weight: 700;
color: var(--fg);
line-height: 2.2;
}
+19
View File
@@ -3,6 +3,25 @@
Chronik der Entwicklungsschritte. **Regel: jede zukünftige Änderung bekommt hier einen Eintrag** (Datum, Chronik der Entwicklungsschritte. **Regel: jede zukünftige Änderung bekommt hier einen Eintrag** (Datum,
Was, Warum, betroffene Dateien/Backups). Was, Warum, betroffene Dateien/Backups).
## 2026-07-31 (nachmittags) — Abschnittstitel in der Zusammenfassung fett
Die Section-Zusammenfassung kommt als `Abschnittstitel:\nFließtext…`-Blöcke zurück (llm.js/analyzeLong),
wurde aber als eine flache Textwand gerendert. Titelzeilen erscheinen jetzt fett.
**Bewusst im Renderer, nicht in der Datenbank:** so gilt es sofort für alle bereits vorhandenen
Zusammenfassungen, ohne auf 22 Aufnahmen je eine 20-Minuten-Analyse neu zu fahren.
Erkennungsregel in `renderSummary()` (`main.js`): eine **kurze, alleinstehende** Zeile, die auf einen
Doppelpunkt endet und kein `.` `!` `?` enthält — `/^[^.!?]{3,90}:$/`. Beide Bedingungen sind nötig: Fließtext
wie „…die Struktur der Projektberichterstattung: kurze Einordnung, aktueller Stand…" hat den Doppelpunkt
mitten in der Zeile und läuft weiter.
**Gegen echte Daten geprüft** (Zusammenfassungen #85, #79, #74): 37 Titel erkannt, keine Fließtextzeile
fälschlich fett, keine Doppelpunkt-Zeile übersehen.
Dateien: `app/web/src/main.js`, `app/web/src/style.css` (`.summary .sum-head`).
Board-Backups: `.bak-sumhead`.
## 2026-07-31 — Inhaltssuche, Papierkorb, Titel umbenennen (+ WLAN-Ausfall behoben) ## 2026-07-31 — Inhaltssuche, Papierkorb, Titel umbenennen (+ WLAN-Ausfall behoben)
Drei Funktionen auf Wunsch des Nutzers, dazu die Störung vom Vormittag. Details: Drei Funktionen auf Wunsch des Nutzers, dazu die Störung vom Vormittag. Details: