From 5521173ea0e05bda93096b51f67c5e813cb1d87e Mon Sep 17 00:00:00 2001
From: Alan Pearce
Date: Wed, 15 May 2024 20:17:06 +0200
Subject: feat: add browser search engines via opensearch description
https://developer.mozilla.org/en-US/docs/Web/OpenSearch
---
frontend/templates/blocks/search.gotmpl | 2 +-
frontend/templates/index.gotmpl | 10 ++++++++-
frontend/templates/opensearch.xml.gotmpl | 16 ++++++++++++++
internal/server/mux.go | 36 ++++++++++++++++++++++++++++++++
internal/server/templates.go | 16 +++++++++++++-
5 files changed, 77 insertions(+), 3 deletions(-)
create mode 100644 frontend/templates/opensearch.xml.gotmpl
diff --git a/frontend/templates/blocks/search.gotmpl b/frontend/templates/blocks/search.gotmpl
index 3ad05bf..6f47df3 100644
--- a/frontend/templates/blocks/search.gotmpl
+++ b/frontend/templates/blocks/search.gotmpl
@@ -11,6 +11,6 @@
{{- end }}
{{- end }}
-{{- define "js" }}
+{{- define "head" }}
{{- end }}
diff --git a/frontend/templates/index.gotmpl b/frontend/templates/index.gotmpl
index 6db4cc2..90f875b 100644
--- a/frontend/templates/index.gotmpl
+++ b/frontend/templates/index.gotmpl
@@ -6,9 +6,17 @@
Searchix
- {{ block "js" . }}
+ {{ block "head" . }}
{{ end }}
{{ .ExtraHeadHTML }}
+ {{- range $key, $value := .Sources }}
+
+ {{- end }}
diff --git a/frontend/templates/opensearch.xml.gotmpl b/frontend/templates/opensearch.xml.gotmpl
new file mode 100644
index 0000000..8d978ea
--- /dev/null
+++ b/frontend/templates/opensearch.xml.gotmpl
@@ -0,0 +1,16 @@
+
+ Searchix {{ .Source.Name }}
+ Search {{ .Source.Name }} options with Searchix
+ Search options {{ .Source.Name }}
+
+ {{ .BaseURL }}/options/{{ .Source.Key }}/search
+
diff --git a/internal/server/mux.go b/internal/server/mux.go
index f9eaf03..e15535f 100644
--- a/internal/server/mux.go
+++ b/internal/server/mux.go
@@ -229,6 +229,42 @@ func NewMux(
}
})
+ mux.HandleFunc(
+ "/options/{source}/opensearch.xml",
+ func(w http.ResponseWriter, r *http.Request) {
+ type openSearchData struct {
+ BaseURL string
+ Source *config.Source
+ }
+
+ sourceKey := r.PathValue("source")
+ source := cfg.Importer.Sources[sourceKey]
+ if source == nil {
+ errorHandler(w, r, "Source not found", http.StatusNotFound)
+
+ return
+ }
+
+ w.Header().Set("Content-Type", "application/opensearchdescription+xml")
+ err := templates["opensearch.xml"].ExecuteTemplate(
+ w,
+ "opensearch.xml.gotmpl",
+ openSearchData{
+ BaseURL: cfg.Web.BaseURL.String(),
+ Source: source,
+ },
+ )
+ if err != nil {
+ // no errorHandler; HTML does not make sense here
+ http.Error(
+ w,
+ fmt.Sprintf("Template render error: %v", err),
+ http.StatusInternalServerError,
+ )
+ }
+ },
+ )
+
mux.Handle("/static/", http.FileServer(http.FS(frontend.Files)))
if liveReload {
diff --git a/internal/server/templates.go b/internal/server/templates.go
index d8ffcf5..1837665 100644
--- a/internal/server/templates.go
+++ b/internal/server/templates.go
@@ -81,8 +81,22 @@ func loadTemplates() (TemplateCollection, error) {
}
templates["index"] = index
- glob := path.Join(templateDir, "blocks", "*.gotmpl")
+ glob := path.Join(templateDir, "*.gotmpl")
templatePaths, err := fs.Glob(frontend.Files, glob)
+ if err != nil {
+ return nil, errors.WithMessage(err, "could not glob main templates")
+ }
+ for _, fullname := range templatePaths {
+ tpl, err := loadTemplate(layoutFile, fullname)
+ if err != nil {
+ return nil, err
+ }
+ name, _ := strings.CutSuffix(path.Base(fullname), ".gotmpl")
+ templates[name] = tpl
+ }
+
+ glob = path.Join(templateDir, "blocks", "*.gotmpl")
+ templatePaths, err = fs.Glob(frontend.Files, glob)
if err != nil {
return nil, errors.WithMessage(err, "could not glob block templates")
}
--
cgit 1.4.1