From e3872a74f92e09d6cea1dc15ac002f6a63ff3767 Mon Sep 17 00:00:00 2001 From: Dmitrii Okunev Date: Fri, 15 Aug 2025 01:20:45 +0100 Subject: [PATCH] Add a function to sanitize nicknames --- pkg/xstring/to_readable.go | 20 ++++++++++++++++++++ pkg/xstring/to_readable_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 pkg/xstring/to_readable.go create mode 100644 pkg/xstring/to_readable_test.go diff --git a/pkg/xstring/to_readable.go b/pkg/xstring/to_readable.go new file mode 100644 index 0000000..8bd01c7 --- /dev/null +++ b/pkg/xstring/to_readable.go @@ -0,0 +1,20 @@ +package xstring + +import ( + "strings" + "unicode" + + "golang.org/x/text/unicode/norm" +) + +func ToReadable(s string) string { + plain := norm.NFKD.String(s) + var b strings.Builder + for _, r := range plain { + // Remove symbols (unicode.Symbol), keep everything else (including foreign letters) + if !unicode.IsSymbol(r) { + b.WriteRune(r) + } + } + return strings.Trim(b.String(), " ,\t\n\r") +} diff --git a/pkg/xstring/to_readable_test.go b/pkg/xstring/to_readable_test.go new file mode 100644 index 0000000..ad95082 --- /dev/null +++ b/pkg/xstring/to_readable_test.go @@ -0,0 +1,28 @@ +package xstring + +import ( + "testing" +) + +func TestToReadable(t *testing.T) { + tests := []struct { + input string + expected string + }{ + {"", ""}, + {"Hello, world!", "Hello, world!"}, + {"Café", "Café"}, + {"e\u0301", "é"}, + {"Go语言", "Go语言"}, + {"𝔘𝔫𝔦𝔠𝔬𝔡𝔢", "Unicode"}, + {"🥛 , 𝑚𝑖𝐼𝐊𝐞𝐔!+", "miIKeU!"}, + {"𝕱𝖗𝖆𝖓ç𝖔𝖎𝖘𝖊 & Dᵢₑ𝘴ₑ 🇫🇷", "Françoise & Diese"}, + } + + for _, tt := range tests { + result := ToReadable(tt.input) + if result != tt.expected { + t.Errorf("ToReadable(%q) = %q; want %q", tt.input, result, tt.expected) + } + } +}