56 lines
1.0 KiB
Go
56 lines
1.0 KiB
Go
package activewindow
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
func matchKeyword(text string, keywords []string) string {
|
|
if text == "" {
|
|
return ""
|
|
}
|
|
lower := strings.ToLower(text)
|
|
for _, kw := range keywords {
|
|
trimmed := strings.TrimSpace(kw)
|
|
if trimmed == "" {
|
|
continue
|
|
}
|
|
if strings.HasPrefix(trimmed, "/") {
|
|
re, ok := parseRegexKeyword(trimmed)
|
|
if ok && re.MatchString(text) {
|
|
return kw
|
|
}
|
|
} else {
|
|
if strings.Contains(lower, strings.ToLower(trimmed)) {
|
|
return kw
|
|
}
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func parseRegexKeyword(kw string) (*regexp.Regexp, bool) {
|
|
if !strings.HasPrefix(kw, "/") {
|
|
return nil, false
|
|
}
|
|
rest := kw[1:]
|
|
lastSlash := strings.LastIndex(rest, "/")
|
|
if lastSlash < 0 {
|
|
return nil, false
|
|
}
|
|
pattern := rest[:lastSlash]
|
|
flags := rest[lastSlash+1:]
|
|
if pattern == "" {
|
|
return nil, false
|
|
}
|
|
regexStr := pattern
|
|
if strings.ContainsRune(flags, 'i') {
|
|
regexStr = "(?i)" + pattern
|
|
}
|
|
re, err := regexp.Compile(regexStr)
|
|
if err != nil {
|
|
return nil, false
|
|
}
|
|
return re, true
|
|
}
|