diff --git a/internal/explainer/explainer.go b/internal/explainer/explainer.go index bc70da0..40840d5 100644 --- a/internal/explainer/explainer.go +++ b/internal/explainer/explainer.go @@ -139,29 +139,36 @@ func (e *Explainer) summarize(headline, body string) (string, error) { func formatSummary(raw string) (plain, htmlBody string) { lines := strings.Split(raw, "\n") var bullets []string + sawMarker := false for _, line := range lines { line = strings.TrimSpace(line) if line == "" { continue } - // Normalize common bullet markers - for _, prefix := range []string{"- ", "* ", "• ", "·"} { - if strings.HasPrefix(line, prefix) { - line = strings.TrimSpace(line[len(prefix):]) - break - } - } // Skip header-ish lines the model sometimes adds low := strings.ToLower(line) if strings.HasPrefix(low, "summary:") || strings.HasPrefix(low, "tl;dr") { continue } + // Normalize common bullet markers; only count this line if it had one. + hadMarker := false + for _, prefix := range []string{"- ", "* ", "• ", "·"} { + if strings.HasPrefix(line, prefix) { + line = strings.TrimSpace(line[len(prefix):]) + hadMarker = true + break + } + } + if !hadMarker { + continue + } + sawMarker = true if line == "" { continue } bullets = append(bullets, line) } - if len(bullets) == 0 { + if !sawMarker || len(bullets) == 0 { // Model produced something but we couldn't parse bullets — pass through. return raw, "
" + html.EscapeString(raw) + "" } diff --git a/internal/explainer/explainer_test.go b/internal/explainer/explainer_test.go new file mode 100644 index 0000000..4d1b5d4 --- /dev/null +++ b/internal/explainer/explainer_test.go @@ -0,0 +1,110 @@ +package explainer + +import ( + "strings" + "testing" +) + +func TestFormatSummary(t *testing.T) { + cases := []struct { + name string + in string + wantPlain string + wantHTML string + }{ + { + name: "dash bullets", + in: "- First point.\n- Second point.\n- Third point.", + wantPlain: "• First point.\n• Second point.\n• Third point.", + wantHTML: "
") || !strings.HasSuffix(htmlBody, "") { + t.Errorf("html should wrap raw in
, got %q", htmlBody)
+ }
+ if !strings.Contains(htmlBody, "single paragraph") {
+ t.Errorf("html should contain the body text, got %q", htmlBody)
+ }
+}
+
+func TestIsQuestionReaction(t *testing.T) {
+ want := []string{"❓", "❔", "⁉", "⁉️", "🤔", "?", "?"}
+ for _, k := range want {
+ if !IsQuestionReaction(k) {
+ t.Errorf("expected %q to trigger explain", k)
+ }
+ }
+ notQuestion := []string{"👍", "👎", "🔥", "", "??", "❤️"}
+ for _, k := range notQuestion {
+ if IsQuestionReaction(k) {
+ t.Errorf("expected %q to NOT trigger explain", k)
+ }
+ }
+}