all repos — searchix @ 9728e17d1b90757b74e9a15e41578b0db758b8c9

Search engine for NixOS, nix-darwin, home-manager and NUR users

feat: add page information to title

Alan Pearce
commit

9728e17d1b90757b74e9a15e41578b0db758b8c9

parent

8d3952dfe6d6c2d0f77a8af6b0c33e5dc0de2767

M frontend/static/search.jsfrontend/static/search.js
@@ -5,6 +5,8 @@ const dialog = document.getElementById("dialog");
const results = document.getElementById("results"); let pagination = document.getElementById("pagination"); let facets = document.querySelector(".facets"); +let titleParts = document.title.split(/ [\p{Dash}] /u) +let siteTitle = titleParts.slice(0, -1).join(" ‐ "); const resultsRange = new Range(); resultsRange.setStart(results, 0);
@@ -17,6 +19,7 @@
let urlLocation = new URL(location); let state = history.state || { url: urlLocation.toString(), + title: document.title, input: urlLocation.searchParams.get("query"), results: resultsRange.cloneContents().innerHTML || null, };
@@ -76,6 +79,23 @@ .forEach((child) => child.addEventListener("click", updateSearch));
} /** + * + * @param {string|null} title + * @param {boolean} updateState + */ +function updateTitle(title, updateState) { + if (title) { + title = title.replaceAll("‐", "\u2010") + document.title = title + " " + siteTitle + if (updateState) { + state.title = title + } + } else { + document.title = state.title + } +} + +/** * @param {string} html */ function renderResults(html) {
@@ -110,6 +130,7 @@ headers: {
fetch: "true", }, }); + updateTitle(res.headers.get("title"), true) // render errors sent as HTML as well as OK responses if (res.headers.get("content-type").startsWith("text/html")) {
@@ -188,6 +209,7 @@ }
dialog.addEventListener("close", function (event) { detailsRange.deleteContents(); + updateTitle(state.title, false) }); dialog.querySelector("button").addEventListener("click", function () {
@@ -206,6 +228,7 @@ headers: {
fetch: "true", }, }); + updateTitle(res.headers.get("title")); // render errors sent as HTML as well as OK responses if (res.headers.get("content-type").startsWith("text/html")) {
@@ -232,11 +255,13 @@
addEventListener("popstate", function (ev) { if (ev.state != null) { url = new URL(ev.state.url); + document.title = ev.state.title || siteTitle; if (ev.state.results !== null) { queryInput.value = ev.state.input; renderResults(ev.state.results); } } else { + document.title = siteTitle; resultsRange.deleteContents(); search.reset(); }
M internal/components/data.gointernal/components/data.go
@@ -18,6 +18,7 @@ Query string
ExtraHeadHTML string Code int Message string + Title string Assets *frontend.AssetCollection SearchNav SearchNav }
M internal/components/page.gointernal/components/page.go
@@ -18,7 +18,10 @@ Lang("en-GB"),
Head( Meta(Charset("utf-8")), Meta(Name("viewport"), Content("width=device-width, initial-scale=1")), - TitleEl(g.Text("Searchix"), g.If(config.DevMode, g.Text(" (Dev)"))), + TitleEl( + g.Raw(tdata.Title), + g.Text("Searchix"), g.If(config.DevMode, g.Text(" (Dev)")), + ), g.Map(tdata.Assets.Stylesheets, css), g.Raw(tdata.ExtraHeadHTML), g.If(len(tdata.Sources) > 0,
M internal/server/global.gointernal/server/global.go
@@ -30,6 +30,17 @@
errorHandler func(w http.ResponseWriter, r *http.Request, message string, statusCode int) } +func (g *GlobalHandler) getTitle(source config.Source, query string) (title string) { + if query != "" { + title = query + " ‐ " + } + if source.Importer != config.All { + title += source.Name + " ‐ " + } + + return +} + func (g *GlobalHandler) NewSourceHandler(source config.Source) *SourceHandler { h := &SourceHandler{ global: g,
@@ -115,6 +126,7 @@ Source: source,
Sources: sources, Assets: g.assets, Query: qs, + Title: g.getTitle(source, qs), SearchNav: components.NewSearchNav(*r.URL).WithPagination(page), }, Query: qs,
@@ -127,6 +139,7 @@ w.Header().Add("Vary", "Fetch")
var baseErr error if r.Header.Get("Fetch") == "true" { w.Header().Add("Content-Type", "text/html; charset=utf-8") + w.Header().Add("Title", g.getTitle(source, qs)) baseErr = components.Results(tdata).Render(w) } else { baseErr = components.ResultsPage(tdata).Render(w)
@@ -142,6 +155,7 @@ components.TemplateData{
ExtraHeadHTML: g.cfg.Web.ExtraHeadHTML, Sources: sources, Source: source, + Title: g.getTitle(source, ""), Assets: g.assets, }, components.ResultData{},
M internal/server/source.gointernal/server/source.go
@@ -9,6 +9,7 @@ "github.com/Southclaws/fault/ftag"
"alin.ovh/searchix/internal/components" "alin.ovh/searchix/internal/config" + "alin.ovh/searchix/internal/index" "alin.ovh/searchix/internal/opensearch" )
@@ -16,6 +17,17 @@ type SourceHandler struct {
global *GlobalHandler source config.Source mux *http.ServeMux +} + +func (h *SourceHandler) getTitle(doc index.Indexable) string { + title := "" + if doc != nil { + title = doc.GetName() + " ‐ " + } + + title += h.source.Name + " ‐ " + + return title } func (h *SourceHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -66,10 +78,12 @@ ExtraHeadHTML: h.global.cfg.Web.ExtraHeadHTML,
Source: h.source, Sources: sources, Assets: h.global.assets, + Title: h.getTitle(doc), } var baseErr error if r.Header.Get("Fetch") == "true" { w.Header().Add("Content-Type", "text/html; charset=utf-8") + w.Header().Add("Title", h.getTitle(doc)) baseErr = components.Detail(doc).Render(w) } else { baseErr = components.DetailPage(tdata, doc).Render(w)