diff --git a/internal/app/card_manifest_deck.go b/internal/app/card_manifest_deck.go index efb760b..b73a6ab 100644 --- a/internal/app/card_manifest_deck.go +++ b/internal/app/card_manifest_deck.go @@ -98,7 +98,7 @@ func buildCardManifestDeckJSON(data []byte) (string, error) { CTA: cardManifestCoverCTA(manifest.SourceApp), }, Content: deck.PageContent{ - Title: strings.TrimSpace(manifest.Document.Title), + Title: cardManifestCoverTitle(manifest.Document), Subtitle: cardManifestCoverSubtitle(manifest.Document), }, }) @@ -153,6 +153,15 @@ func cardManifestItemPage(item cardManifestItem, pageNumber int, pageCount int) }, nil } +func cardManifestCoverTitle(document cardManifestDocument) string { + title := strings.TrimSpace(document.Title) + before, after, ok := strings.Cut(title, "|") + if ok && strings.Contains(before, "电子榨菜") && strings.TrimSpace(after) != "" { + return strings.TrimSpace(before) + "\n" + strings.TrimSpace(after) + } + return title +} + func cardManifestCoverSubtitle(document cardManifestDocument) string { bullets := make([]string, 0, minInt(len(document.Summary), cardManifestCoverSummaryMaxItems)) for _, item := range document.Summary { diff --git a/internal/app/service_test.go b/internal/app/service_test.go index b012d1f..ab17502 100644 --- a/internal/app/service_test.go +++ b/internal/app/service_test.go @@ -284,6 +284,28 @@ func TestServiceGeneratePreviewBuildsCardManifestDeckWithoutAI(t *testing.T) { } } +func TestBuildCardManifestDeckWrapsElectronicPicklesCoverTitle(t *testing.T) { + deckJSON, err := buildCardManifestDeckJSON([]byte(`{ + "schema_version":"card-article-manifest/v1", + "source_app":"vidtrace", + "document":{"title":"每日电子榨菜|2026-06-16"}, + "items":[ + {"id":"BV111","category":"B站热门","title":"第一条","sections":[{"label":"内容概览","body":"第一条内容。"}]}, + {"id":"BV222","category":"B站热门","title":"第二条","sections":[{"label":"内容概览","body":"第二条内容。"}]} + ] + }`)) + if err != nil { + t.Fatalf("buildCardManifestDeckJSON() error = %v", err) + } + var got deck.Deck + if err := json.Unmarshal([]byte(deckJSON), &got); err != nil { + t.Fatalf("Unmarshal(deckJSON) error = %v", err) + } + if got.Pages[0].Content.Title != "每日电子榨菜\n2026-06-16" { + t.Fatalf("cover title = %q, want natural line break", got.Pages[0].Content.Title) + } +} + func TestServiceGeneratePreviewBuildsNoImageCardManifestItemsAsTextCaption(t *testing.T) { root := t.TempDir() manifestPath := filepath.Join(root, "manifest.json")