provider: replace flag emojis with country codes in removeEmojisFromTags

This commit is contained in:
Shtorm
2026-06-05 00:28:09 +03:00
parent a59e9ec9e3
commit 6cddffd546
3 changed files with 57 additions and 2 deletions
+11 -1
View File
@@ -289,11 +289,21 @@ func uniquifyTags(opts []option.Outbound) {
func removeEmojisFromTags(opts []option.Outbound) {
for i, opt := range opts {
cleaned := emojiRegex.ReplaceAllString(opt.Tag, "")
cleaned := flagRegex.ReplaceAllStringFunc(opt.Tag, flagToCountryCode)
cleaned = emojiRegex.ReplaceAllString(cleaned, "")
cleaned = multiSpaceRegex.ReplaceAllString(cleaned, " ")
opts[i].Tag = strings.TrimSpace(cleaned)
}
}
func flagToCountryCode(flag string) string {
runes := []rune(flag)
if len(runes) == 2 {
return string(rune(runes[0]-0x1F1E6+'A')) + string(rune(runes[1]-0x1F1E6+'A')) + " "
}
return ""
}
var flagRegex = regexp.MustCompile(`[\x{1F1E6}-\x{1F1FF}]{2}`)
var emojiRegex = regexp.MustCompile(`[\x{1F1E0}-\x{1F1FF}\x{1F300}-\x{1F9FF}\x{2600}-\x{27BF}\x{FE00}-\x{FE0F}\x{200D}]+`)
var multiSpaceRegex = regexp.MustCompile(`\s{2,}`)
+45
View File
@@ -0,0 +1,45 @@
package provider
import (
"testing"
"github.com/sagernet/sing-box/option"
)
func TestFlagToCountryCodeAllFlags(t *testing.T) {
for first := 'A'; first <= 'Z'; first++ {
for second := 'A'; second <= 'Z'; second++ {
flag := string(rune(0x1F1E6+(first-'A'))) + string(rune(0x1F1E6+(second-'A')))
expected := string(first) + string(second)
result := flagToCountryCode(flag)
// flagToCountryCode appends a space
if result != expected+" " {
t.Errorf("flagToCountryCode(%q) = %q, want %q", expected, result, expected+" ")
}
}
}
}
func TestRemoveEmojisFromTags(t *testing.T) {
tests := []struct {
input string
expected string
}{
{"๐Ÿ‡บ๐Ÿ‡ธ United States", "US United States"},
{"๐Ÿ‡ท๐Ÿ‡บ ะ ะพััะธั", "RU ะ ะพััะธั"},
{"๐Ÿ‡ฉ๐Ÿ‡ช Germany ๐Ÿš€", "DE Germany"},
{"๐Ÿ‡ซ๐Ÿ‡ท๐Ÿ‡ฌ๐Ÿ‡ง France-UK", "FR GB France-UK"},
{"No emojis here", "No emojis here"},
{"๐ŸŒ World", "World"},
{"๐Ÿ‡ฏ๐Ÿ‡ต Tokyo โšก Fast", "JP Tokyo Fast"},
{"Germany ๐Ÿ‡ฉ๐Ÿ‡ช", "Germany DE"},
{"Server ๐Ÿ‡บ๐Ÿ‡ธ Node", "Server US Node"},
}
for _, tt := range tests {
opts := []option.Outbound{{Tag: tt.input}}
removeEmojisFromTags(opts)
if opts[0].Tag != tt.expected {
t.Errorf("removeEmojisFromTags(%q) = %q, want %q", tt.input, opts[0].Tag, tt.expected)
}
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
module github.com/sagernet/sing-box
go 1.26.1
go 1.26.4
require (
github.com/AliRizaAynaci/gorl/v2 v2.2.0