dt_automate/vendor/github.com/playwright-community/playwright-go/glob.go
2025-02-19 18:30:19 +08:00

93 lines
1.8 KiB
Go

package playwright
import (
"regexp"
"strings"
)
var escapedChars = map[rune]bool{
'$': true,
'^': true,
'+': true,
'.': true,
'*': true,
'(': true,
')': true,
'|': true,
'\\': true,
'?': true,
'{': true,
'}': true,
'[': true,
']': true,
}
func globMustToRegex(glob string) *regexp.Regexp {
tokens := []string{"^"}
inGroup := false
for i := 0; i < len(glob); i++ {
c := rune(glob[i])
if c == '\\' && i+1 < len(glob) {
char := rune(glob[i+1])
if _, ok := escapedChars[char]; ok {
tokens = append(tokens, "\\"+string(char))
} else {
tokens = append(tokens, string(char))
}
i++
} else if c == '*' {
beforeDeep := rune(0)
if i > 0 {
beforeDeep = rune(glob[i-1])
}
starCount := 1
for i+1 < len(glob) && glob[i+1] == '*' {
starCount++
i++
}
afterDeep := rune(0)
if i+1 < len(glob) {
afterDeep = rune(glob[i+1])
}
isDeep := starCount > 1 && (beforeDeep == '/' || beforeDeep == 0) && (afterDeep == '/' || afterDeep == 0)
if isDeep {
tokens = append(tokens, "((?:[^/]*(?:/|$))*)")
i++
} else {
tokens = append(tokens, "([^/]*)")
}
} else {
switch c {
case '?':
tokens = append(tokens, ".")
case '[':
tokens = append(tokens, "[")
case ']':
tokens = append(tokens, "]")
case '{':
inGroup = true
tokens = append(tokens, "(")
case '}':
inGroup = false
tokens = append(tokens, ")")
case ',':
if inGroup {
tokens = append(tokens, "|")
} else {
tokens = append(tokens, string(c))
}
default:
if _, ok := escapedChars[c]; ok {
tokens = append(tokens, "\\"+string(c))
} else {
tokens = append(tokens, string(c))
}
}
}
}
tokens = append(tokens, "$")
return regexp.MustCompile(strings.Join(tokens, ""))
}