{{if .Results}} {{range .Results}} + {{if eq .Template "videos"}} + {{template "video_item" .}} + {{else}} {{template "result_item" .}} {{end}} + {{end}} {{else if not .Answers}}

No results found.

diff --git a/internal/views/templates/video_item.html b/internal/views/templates/video_item.html new file mode 100644 index 0000000..0ca0109 --- /dev/null +++ b/internal/views/templates/video_item.html @@ -0,0 +1,22 @@ +{{define "video_item"}} +
+ {{if .Thumbnail}} +
+ + {{.Title}} + +
+ {{end}} +
+

+ {{.Title}} +

+ {{if .Content}} +

{{.Content}}

+ {{end}} + {{if .Engine}} +
{{.Engine}}
+ {{end}} +
+
+{{end}} diff --git a/internal/views/views.go b/internal/views/views.go index 4b5c292..58ef2eb 100644 --- a/internal/views/views.go +++ b/internal/views/views.go @@ -32,10 +32,16 @@ type PageData struct { Infoboxes []InfoboxView UnresponsiveEngines [][2]string PageNumbers []PageNumber + ShowHeader bool } // ResultView is a template-friendly wrapper around a MainResult. -type ResultView contracts.MainResult +type ResultView struct { + contracts.MainResult + // TemplateName is the actual template to dispatch to, computed from Template. + // "videos" maps to "video_item", everything else maps to "result_item". + TemplateName string +} // PageNumber represents a numbered pagination button. type PageNumber struct { @@ -65,13 +71,13 @@ func init() { } tmplFull = template.Must(template.New("").Funcs(funcMap).ParseFS(tmplFS, - "base.html", "results.html", "results_inner.html", "result_item.html", + "base.html", "results.html", "results_inner.html", "result_item.html", "video_item.html", )) tmplIndex = template.Must(template.New("").Funcs(funcMap).ParseFS(tmplFS, "base.html", "index.html", )) tmplFragment = template.Must(template.New("").Funcs(funcMap).ParseFS(tmplFS, - "results_inner.html", "result_item.html", + "results_inner.html", "result_item.html", "video_item.html", )) } @@ -104,7 +110,11 @@ func FromResponse(resp contracts.SearchResponse, query string, pageno int) PageD // Convert results. pd.Results = make([]ResultView, len(resp.Results)) for i, r := range resp.Results { - pd.Results[i] = ResultView(r) + tmplName := "result_item" + if r.Template == "videos" { + tmplName = "video_item" + } + pd.Results[i] = ResultView{MainResult: r, TemplateName: tmplName} } // Convert answers (they're map[string]any — extract string values). @@ -163,12 +173,13 @@ func FromResponse(resp contracts.SearchResponse, query string, pageno int) PageD // RenderIndex renders the homepage (search box only). func RenderIndex(w http.ResponseWriter) error { w.Header().Set("Content-Type", "text/html; charset=utf-8") - return tmplIndex.ExecuteTemplate(w, "base", PageData{}) + return tmplIndex.ExecuteTemplate(w, "base", PageData{ShowHeader: true}) } // RenderSearch renders the full search results page (with base layout). func RenderSearch(w http.ResponseWriter, data PageData) error { w.Header().Set("Content-Type", "text/html; charset=utf-8") + data.ShowHeader = true return tmplFull.ExecuteTemplate(w, "base", data) }