mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-06-11 13:58:15 +03:00
provider: replace flag emojis with country codes in removeEmojisFromTags
This commit is contained in:
@@ -289,11 +289,21 @@ func uniquifyTags(opts []option.Outbound) {
|
|||||||
|
|
||||||
func removeEmojisFromTags(opts []option.Outbound) {
|
func removeEmojisFromTags(opts []option.Outbound) {
|
||||||
for i, opt := range opts {
|
for i, opt := range opts {
|
||||||
cleaned := emojiRegex.ReplaceAllString(opt.Tag, "")
|
cleaned := flagRegex.ReplaceAllStringFunc(opt.Tag, flagToCountryCode)
|
||||||
|
cleaned = emojiRegex.ReplaceAllString(cleaned, "")
|
||||||
cleaned = multiSpaceRegex.ReplaceAllString(cleaned, " ")
|
cleaned = multiSpaceRegex.ReplaceAllString(cleaned, " ")
|
||||||
opts[i].Tag = strings.TrimSpace(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 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,}`)
|
var multiSpaceRegex = regexp.MustCompile(`\s{2,}`)
|
||||||
|
|||||||
45
adapter/provider/adapter_test.go
Normal file
45
adapter/provider/adapter_test.go
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user