summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/plugins/search.go
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/plugins/search.go')
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/plugins/search.go91
1 files changed, 91 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/plugins/search.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/plugins/search.go
new file mode 100644
index 0000000..833158f
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/plugins/search.go
@@ -0,0 +1,91 @@
+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 {
+ if plugins[i].Featured != plugins[j].Featured {
+ return plugins[i].Featured
+ }
+ 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
+}