From 914ab2ddc88d8e3415f5a0183b42e8535aace32e Mon Sep 17 00:00:00 2001 From: Aime Board Date: Fri, 31 Jul 2026 13:43:54 +0000 Subject: [PATCH] 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. --- app/web/src/main.js | 18 +++++++++++++++++- app/web/src/style.css | 8 ++++++++ docs/08-changelog.md | 19 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/app/web/src/main.js b/app/web/src/main.js index 853114b..aeaa779 100644 --- a/app/web/src/main.js +++ b/app/web/src/main.js @@ -754,7 +754,7 @@ async function openRecording(id) { `; const mods = { analyse: ` - ${r.summary ? `

${escapeHtml(r.summary)}

` : '
Noch keine Zusammenfassung.
'} + ${r.summary ? `

${renderSummary(r.summary)}

` : '
Noch keine Zusammenfassung.
'} ${(r.participants && r.participants.length) ? `

Teilnehmer

` : ''} ${markersHtml}`, todos: (r.todos && r.todos.length) ? `` : '
Keine ToDos erkannt.
', @@ -1143,6 +1143,22 @@ async function openRecording(id) { function escapeHtml(s) { return (s || '').replace(/[&<>"]/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"' }[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) ? `${t}` : line; + }).join('\n'); +} + // ---- Konferenztisch-Ansicht ---- // Seat positions (person center, % of scene) per participant count, arranged // around the rectangular table; each seat knows which bubble-arrow side points diff --git a/app/web/src/style.css b/app/web/src/style.css index 4709051..bae6e52 100644 --- a/app/web/src/style.css +++ b/app/web/src/style.css @@ -492,4 +492,12 @@ body.resizing { cursor: col-resize; user-select: none; } @media (max-width: 640px) { .search-page.landing { padding-top: 6vh; } .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; } \ No newline at end of file diff --git a/docs/08-changelog.md b/docs/08-changelog.md index d845812..2ac68a3 100644 --- a/docs/08-changelog.md +++ b/docs/08-changelog.md @@ -3,6 +3,25 @@ Chronik der Entwicklungsschritte. **Regel: jede zukünftige Änderung bekommt hier einen Eintrag** (Datum, 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) Drei Funktionen auf Wunsch des Nutzers, dazu die Störung vom Vormittag. Details: