From 3e9ba0ad2702b686ceee2e310933a036b9718847 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sat, 21 Dec 2024 01:53:28 +0100 Subject: [PATCH] Use a home-made implementation of `Titelize` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The implementation is equivalent to `cases.Title(language.English).String(strings.ToLower(…))`, and this is the only place in miniflux where "golang.org/x/text/cases" and "golang.org/x/text/language" are (directly) used. This reduces the binary size from 27015590 to 26686112 on my machine. Kudos to https://gsa.zxilly.dev for making it straightforward to catch things like this. --- go.mod | 2 +- internal/reader/rewrite/rewriter.go | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 50c78a06cba..38341a407d4 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,6 @@ require ( golang.org/x/net v0.33.0 golang.org/x/oauth2 v0.24.0 golang.org/x/term v0.27.0 - golang.org/x/text v0.21.0 ) require ( @@ -42,6 +41,7 @@ require ( github.com/tdewolff/parse/v2 v2.7.19 // indirect github.com/x448/float16 v0.8.4 // indirect golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/protobuf v1.34.2 // indirect ) diff --git a/internal/reader/rewrite/rewriter.go b/internal/reader/rewrite/rewriter.go index 4f8ee9512c6..ca6df986247 100644 --- a/internal/reader/rewrite/rewriter.go +++ b/internal/reader/rewrite/rewriter.go @@ -8,12 +8,10 @@ import ( "strconv" "strings" "text/scanner" + "unicode" "miniflux.app/v2/internal/model" "miniflux.app/v2/internal/urllib" - - "golang.org/x/text/cases" - "golang.org/x/text/language" ) type rule struct { @@ -94,10 +92,28 @@ func (rule rule) applyRule(entryURL string, entry *model.Entry) { case "remove_tables": entry.Content = removeTables(entry.Content) case "remove_clickbait": - entry.Title = cases.Title(language.English).String(strings.ToLower(entry.Title)) + entry.Title = titlelize(entry.Title) } } +// titlelize returns a copy of the string s with all Unicode letters that begin words +// mapped to their Unicode title case. +func titlelize(s string) string { + // A closure is used here to remember the previous character + // so that we can check if there is a space preceding the current + // character. + previous := ' ' + return strings.Map( + func(current rune) rune { + if unicode.IsSpace(previous) { + previous = current + return unicode.ToTitle(current) + } + previous = current + return current + }, strings.ToLower(s)) +} + // Rewriter modify item contents with a set of rewriting rules. func Rewriter(entryURL string, entry *model.Entry, customRewriteRules string) { rulesList := getPredefinedRewriteRules(entryURL)