search.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package widget
  2. import (
  3. "fmt"
  4. "html/template"
  5. "strings"
  6. "github.com/glanceapp/glance/internal/assets"
  7. )
  8. type SearchBang struct {
  9. Title string
  10. Shortcut string
  11. URL string
  12. }
  13. type Search struct {
  14. widgetBase `yaml:",inline"`
  15. cachedHTML template.HTML `yaml:"-"`
  16. SearchEngine string `yaml:"search-engine"`
  17. Bangs []SearchBang `yaml:"bangs"`
  18. NewTab bool `yaml:"new-tab"`
  19. }
  20. func convertSearchUrl(url string) string {
  21. // Go's template is being stubborn and continues to escape the curlies in the
  22. // URL regardless of what the type of the variable is so this is my way around it
  23. return strings.ReplaceAll(url, "{QUERY}", "!QUERY!")
  24. }
  25. var searchEngines = map[string]string{
  26. "duckduckgo": "https://duckduckgo.com/?q={QUERY}",
  27. "google": "https://www.google.com/search?q={QUERY}",
  28. }
  29. func (widget *Search) Initialize() error {
  30. widget.withTitle("Search").withError(nil)
  31. if widget.SearchEngine == "" {
  32. widget.SearchEngine = "duckduckgo"
  33. }
  34. if url, ok := searchEngines[widget.SearchEngine]; ok {
  35. widget.SearchEngine = url
  36. }
  37. widget.SearchEngine = convertSearchUrl(widget.SearchEngine)
  38. for i := range widget.Bangs {
  39. if widget.Bangs[i].Shortcut == "" {
  40. return fmt.Errorf("Search bang %d has no shortcut", i+1)
  41. }
  42. if widget.Bangs[i].URL == "" {
  43. return fmt.Errorf("Search bang %d has no URL", i+1)
  44. }
  45. widget.Bangs[i].URL = convertSearchUrl(widget.Bangs[i].URL)
  46. }
  47. widget.cachedHTML = widget.render(widget, assets.SearchTemplate)
  48. return nil
  49. }
  50. func (widget *Search) Render() template.HTML {
  51. return widget.cachedHTML
  52. }