aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/conf/name.go
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-05-05 17:38:04 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2019-05-05 17:38:04 +0200
commit61da208c9571f3348eb0e11400fa54365d49a366 (patch)
treed6384ce455a01a0799d531020d6f7a2532435651 /conf/name.go
parentui: attach shortcuts to their windows (diff)
downloadwireguard-windows-61da208c9571f3348eb0e11400fa54365d49a366.tar.xz
wireguard-windows-61da208c9571f3348eb0e11400fa54365d49a366.zip
ui: use natural sorting order
Diffstat (limited to 'conf/name.go')
-rw-r--r--conf/name.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/conf/name.go b/conf/name.go
index 00479c04..87c463af 100644
--- a/conf/name.go
+++ b/conf/name.go
@@ -7,6 +7,7 @@ package conf
import (
"regexp"
+ "strconv"
"strings"
)
@@ -49,3 +50,63 @@ func TunnelNameIsValid(name string) bool {
}
return allowedNameFormat.MatchString(name)
}
+
+type naturalSortToken struct {
+ maybeString string
+ maybeNumber int
+}
+type naturalSortString struct {
+ originalString string
+ tokens []naturalSortToken
+}
+
+var naturalSortDigitFinder = regexp.MustCompile(`\d+|\D+`)
+
+func newNaturalSortString(s string) (t naturalSortString) {
+ t.originalString = s
+ s = strings.ToLower(strings.Join(strings.Fields(s), " "))
+ x := naturalSortDigitFinder.FindAllString(s, -1)
+ t.tokens = make([]naturalSortToken, len(x))
+ for i, s := range x {
+ if n, err := strconv.Atoi(s); err == nil {
+ t.tokens[i].maybeNumber = n
+ } else {
+ t.tokens[i].maybeString = s
+ }
+ }
+ return
+}
+
+func (f1 naturalSortToken) Cmp(f2 naturalSortToken) int {
+ if len(f1.maybeString) == 0 {
+ if len(f2.maybeString) > 0 || f1.maybeNumber < f2.maybeNumber {
+ return -1
+ } else if f1.maybeNumber > f2.maybeNumber {
+ return 1
+ }
+ } else if len(f2.maybeString) == 0 || f1.maybeString > f2.maybeString {
+ return 1
+ } else if f1.maybeString < f2.maybeString {
+ return -1
+ }
+ return 0
+}
+
+func TunnelNameIsLess(a, b string) bool {
+ if a == b {
+ return false
+ }
+ na, nb := newNaturalSortString(a), newNaturalSortString(b)
+ for i, t := range nb.tokens {
+ if i == len(na.tokens) {
+ return true
+ }
+ switch na.tokens[i].Cmp(t) {
+ case -1:
+ return true
+ case 1:
+ return false
+ }
+ }
+ return false
+}