mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-01-24 21:42:51 -05:00
89 lines
2.3 KiB
Go
89 lines
2.3 KiB
Go
package plugins
|
|
|
|
import (
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/utils"
|
|
)
|
|
|
|
func FuzzySearch(query string, plugins []Plugin) []Plugin {
|
|
if query == "" {
|
|
return plugins
|
|
}
|
|
|
|
queryLower := strings.ToLower(query)
|
|
return utils.Filter(plugins, func(p Plugin) bool {
|
|
return fuzzyMatch(queryLower, strings.ToLower(p.Name)) ||
|
|
fuzzyMatch(queryLower, strings.ToLower(p.Category)) ||
|
|
fuzzyMatch(queryLower, strings.ToLower(p.Description)) ||
|
|
fuzzyMatch(queryLower, strings.ToLower(p.Author))
|
|
})
|
|
}
|
|
|
|
func fuzzyMatch(query, text string) bool {
|
|
queryIdx := 0
|
|
for _, char := range text {
|
|
if queryIdx < len(query) && char == rune(query[queryIdx]) {
|
|
queryIdx++
|
|
}
|
|
}
|
|
return queryIdx == len(query)
|
|
}
|
|
|
|
func FilterByCategory(category string, plugins []Plugin) []Plugin {
|
|
if category == "" {
|
|
return plugins
|
|
}
|
|
categoryLower := strings.ToLower(category)
|
|
return utils.Filter(plugins, func(p Plugin) bool {
|
|
return strings.ToLower(p.Category) == categoryLower
|
|
})
|
|
}
|
|
|
|
func FilterByCompositor(compositor string, plugins []Plugin) []Plugin {
|
|
if compositor == "" {
|
|
return plugins
|
|
}
|
|
compositorLower := strings.ToLower(compositor)
|
|
return utils.Filter(plugins, func(p Plugin) bool {
|
|
return utils.Any(p.Compositors, func(c string) bool {
|
|
return strings.ToLower(c) == compositorLower
|
|
})
|
|
})
|
|
}
|
|
|
|
func FilterByCapability(capability string, plugins []Plugin) []Plugin {
|
|
if capability == "" {
|
|
return plugins
|
|
}
|
|
capabilityLower := strings.ToLower(capability)
|
|
return utils.Filter(plugins, func(p Plugin) bool {
|
|
return utils.Any(p.Capabilities, func(c string) bool {
|
|
return strings.ToLower(c) == capabilityLower
|
|
})
|
|
})
|
|
}
|
|
|
|
func SortByFirstParty(plugins []Plugin) []Plugin {
|
|
sort.SliceStable(plugins, func(i, j int) bool {
|
|
isFirstPartyI := strings.HasPrefix(plugins[i].Repo, "https://github.com/AvengeMedia")
|
|
isFirstPartyJ := strings.HasPrefix(plugins[j].Repo, "https://github.com/AvengeMedia")
|
|
if isFirstPartyI != isFirstPartyJ {
|
|
return isFirstPartyI
|
|
}
|
|
return false
|
|
})
|
|
return plugins
|
|
}
|
|
|
|
func FindByIDOrName(idOrName string, plugins []Plugin) *Plugin {
|
|
if p, found := utils.Find(plugins, func(p Plugin) bool { return p.ID == idOrName }); found {
|
|
return &p
|
|
}
|
|
if p, found := utils.Find(plugins, func(p Plugin) bool { return p.Name == idOrName }); found {
|
|
return &p
|
|
}
|
|
return nil
|
|
}
|