From 7d469cf8c5dccc0f0789e9090c99a65a724b4563 Mon Sep 17 00:00:00 2001 From: prosolis <5590409+prosolis@users.noreply.github.com> Date: Tue, 26 May 2026 23:02:46 -0700 Subject: [PATCH] Fix glued-together RSS ledes; parse per-item language Two ingestion changes: - extractLede replaced HTML tags with empty string, so adjacent block tags like
fused words across paragraphs. Replace
tags with a space and collapse whitespace.
- Pull each item's ]+src=["']([^"']+)["']`)
)
@@ -59,6 +61,7 @@ func FetchFeed(feedURL string) ([]FeedItem, error) {
Lede: extractLede(item.Description),
ImageURL: NormalizeImageURL(extractImageURL(item)),
ArticleURL: strings.TrimSpace(item.Link),
+ Language: itemLanguage(item),
PublishedAt: itemPublished(item),
}
if fi.GUID == "" || fi.ArticleURL == "" {
@@ -71,6 +74,22 @@ func FetchFeed(feedURL string) ([]FeedItem, error) {
return items, nil
}
+// itemLanguage returns the per-item language tag if the feed provides one.
+// Politico Europe puts a raw
don't fuse words. + text := htmlTagRe.ReplaceAllString(desc, " ") text = html.UnescapeString(text) + text = wsRe.ReplaceAllString(text, " ") return strings.TrimSpace(text) } diff --git a/internal/ingestion/parser_test.go b/internal/ingestion/parser_test.go index 54a36eb..62b7d71 100644 --- a/internal/ingestion/parser_test.go +++ b/internal/ingestion/parser_test.go @@ -48,6 +48,11 @@ func TestExtractLede(t *testing.T) { "It's a new era—one of change.", "It's a new era\u2014one of change.", }, + { + "adjacent block tags inject a space", + "
...end of moments
Clarence B Jones, a former...
", + "...end of moments Clarence B Jones, a former...", + }, { "tags and entities combined", "Oil prices rose & gas fell by >5%.
",