Refactor string sanitization logic to remove invisible characters from news data.

This commit is contained in:
2026-08-01 20:15:53 +02:00
parent d4e3b6252b
commit 032bb8b26f
+34 -18
View File
@@ -7,21 +7,11 @@ import (
"log" "log"
"net/http" "net/http"
"strings" "strings"
"unicode"
) )
const apiBaseURL = "https://newsapi.org/v2/top-headlines" const apiBaseURL = "https://newsapi.org/v2/top-headlines"
var forbiddenStrings = []string{
"\r", "\\r", "\ufeff", "\u00A0", "\u200b", "\u200c",
"\u200d", // Zero Width Joiner
"\u200e", // Left-to-Right Mark
"\u200f", // Right-to-Left Mark
"\u2060", // Word Joiner
"\ufe0f", // Variation Selector-16
"\u2028",
"\u2029",
}
type configFile struct { type configFile struct {
News newsConfig News newsConfig
} }
@@ -91,19 +81,45 @@ func FetchNews() News {
news := News{} news := News{}
err = json.Unmarshal([]byte(removeForbiddenStrings(string(respBody))), &news) err = json.Unmarshal(respBody, &news)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
sanitizeNews(&news)
return news return news
} }
func removeForbiddenStrings(s string) string { func sanitizeNews(news *News) {
result := s news.Status = removeInvisibleCharacters(news.Status)
for _, forbidden := range forbiddenStrings {
result = strings.ReplaceAll(result, forbidden, "") for i := range news.Articles {
news.Articles[i].Author = removeInvisibleCharacters(news.Articles[i].Author)
news.Articles[i].Title = removeInvisibleCharacters(news.Articles[i].Title)
news.Articles[i].Description = removeInvisibleCharacters(news.Articles[i].Description)
news.Articles[i].URL = removeInvisibleCharacters(news.Articles[i].URL)
news.Articles[i].URLToImage = removeInvisibleCharacters(news.Articles[i].URLToImage)
news.Articles[i].PublishedAt = removeInvisibleCharacters(news.Articles[i].PublishedAt)
news.Articles[i].Content = removeInvisibleCharacters(news.Articles[i].Content)
news.Articles[i].Source.ID = removeInvisibleCharacters(news.Articles[i].Source.ID)
news.Articles[i].Source.Name = removeInvisibleCharacters(news.Articles[i].Source.Name)
} }
return result }
func removeInvisibleCharacters(s string) string {
return strings.Map(func(r rune) rune {
switch r {
case '\u00A0':
return ' '
case '\r', '\u2028', '\u2029':
return ' '
}
if unicode.Is(unicode.Cf, r) {
return ' '
}
return r
}, s)
} }