93 lines
1.8 KiB
Go
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, ""))
|
|
}
|