From d7e1cae5c95bbb139f0f8ddea6023dca134927c9 Mon Sep 17 00:00:00 2001 From: Amolith Date: Sat, 18 Oct 2025 10:06:02 -0600 Subject: [PATCH] feat: add page titles and meta descriptions Add Title and Description fields to BaseData for proper HTML title and meta description support. Update base.html template to use these fields instead of deriving them from Repo and ServerName. Implement page-specific titles: - About: "About | {server name}" - Home: "{server name}" - Overview: "{project name or repo}" with description - Commits: "Commits in {ref} | {project or repo}" - Commit: "{subject} | Commit {hash} | {project or repo}" - Tags: "Tags | {project or repo}" - Branches: "Branches | {project or repo}" - Files: "Files | {project or repo}" - Blob: "{filename} | {project or repo}" Fix shortHash template function to use 7 characters instead of 8 for consistency with git standards. Implements: bug-972b30b Implements: bug-7778d23 Co-Authored-By: Crush --- pkg/web/templates/base.html | 4 ++-- pkg/web/webui.go | 10 ++++++---- pkg/web/webui_about.go | 1 + pkg/web/webui_blob.go | 7 +++++++ pkg/web/webui_branches.go | 6 ++++++ pkg/web/webui_commit.go | 29 +++++++++++++++++++++++++++-- pkg/web/webui_commits.go | 6 ++++++ pkg/web/webui_home.go | 1 + pkg/web/webui_overview.go | 11 +++++++++-- pkg/web/webui_tags.go | 6 ++++++ pkg/web/webui_tree.go | 6 ++++++ 11 files changed, 77 insertions(+), 10 deletions(-) diff --git a/pkg/web/templates/base.html b/pkg/web/templates/base.html index 51a8f9b6291c4e00b99f1d3496e98e0d00a7cb15..d5eb8cddd23e65d242ef1dd3ecaf4b70190dc648 100644 --- a/pkg/web/templates/base.html +++ b/pkg/web/templates/base.html @@ -5,8 +5,8 @@ - {{if .Repo}}{{if .Repo.ProjectName}}{{.Repo.ProjectName}}{{else}}{{.Repo.Name}}{{end}}{{else}}{{.ServerName}}{{end}} - {{if .Repo}}{{if .Repo.Description}}{{end}}{{end}} + {{.Title}} + {{if .Description}}{{end}} diff --git a/pkg/web/webui.go b/pkg/web/webui.go index c2e8ad45c8cf8b412a69af475f3dd3761e22e966..56c6595a12d3db9aaaa09e53ea85199348be50b2 100644 --- a/pkg/web/webui.go +++ b/pkg/web/webui.go @@ -39,8 +39,10 @@ const ( // BaseData contains common fields for all web UI pages. type BaseData struct { - ServerName string - ActiveTab string + ServerName string + ActiveTab string + Title string + Description string } // RepoBaseData contains common fields for repository-specific pages. @@ -103,8 +105,8 @@ var templateFuncs = template.FuncMap{ default: hashStr = fmt.Sprintf("%v", hash) } - if len(hashStr) > 8 { - return hashStr[:8] + if len(hashStr) > 7 { + return hashStr[:7] } return hashStr }, diff --git a/pkg/web/webui_about.go b/pkg/web/webui_about.go index cf7942df26106a21f9f591365dda3d5c992e5efe..e737627725fde85c91cc244291732ff43955fb08 100644 --- a/pkg/web/webui_about.go +++ b/pkg/web/webui_about.go @@ -37,6 +37,7 @@ func about(w http.ResponseWriter, r *http.Request) { BaseData: BaseData{ ServerName: cfg.Name, ActiveTab: "about", + Title: "About | " + cfg.Name, }, ReadmeHTML: readmeHTML, } diff --git a/pkg/web/webui_blob.go b/pkg/web/webui_blob.go index a3e2177fee8b8ce9d0b3e775254c98b2602fd8ac..843eff380c88c8c023d7c0a173ad0e38ad3a6317 100644 --- a/pkg/web/webui_blob.go +++ b/pkg/web/webui_blob.go @@ -99,11 +99,18 @@ func repoBlob(w http.ResponseWriter, r *http.Request) { renderedHTML = highlightCode(path, content) } + repoDisplayName := repo.ProjectName() + if repoDisplayName == "" { + repoDisplayName = repo.Name() + } + fileName := filepath.Base(path) + data := BlobData{ RepoBaseData: RepoBaseData{ BaseData: BaseData{ ServerName: cfg.Name, ActiveTab: "tree", + Title: fileName + " | " + repoDisplayName, }, Repo: repo, DefaultBranch: defaultBranch, diff --git a/pkg/web/webui_branches.go b/pkg/web/webui_branches.go index 73f8f58fecaac5090c36932eb23d6d76418bd653..1d632443fbc7275395ce4708be4822990c86b247 100644 --- a/pkg/web/webui_branches.go +++ b/pkg/web/webui_branches.go @@ -88,11 +88,17 @@ func repoBranches(w http.ResponseWriter, r *http.Request) { }) } + repoDisplayName := repo.ProjectName() + if repoDisplayName == "" { + repoDisplayName = repo.Name() + } + data := BranchesData{ RepoBaseData: RepoBaseData{ BaseData: BaseData{ ServerName: cfg.Name, ActiveTab: "branches", + Title: "Branches | " + repoDisplayName, }, Repo: repo, DefaultBranch: defaultBranch, diff --git a/pkg/web/webui_commit.go b/pkg/web/webui_commit.go index 869d759de13d730ca54aebae737e463aa035de5c..4a63672a8bea57df73eb5900efbfad63ae197ad2 100644 --- a/pkg/web/webui_commit.go +++ b/pkg/web/webui_commit.go @@ -2,6 +2,7 @@ package web import ( "net/http" + "strings" "github.com/charmbracelet/log/v2" "github.com/charmbracelet/soft-serve/git" @@ -57,11 +58,35 @@ func repoCommit(w http.ResponseWriter, r *http.Request) { } } + commitSubject := commit.Message + commitBody := "" + if lines := strings.Split(commit.Message, "\n"); len(lines) > 0 { + commitSubject = lines[0] + if len(lines) > 1 { + commitBody = strings.TrimSpace(strings.Join(lines[1:], "\n")) + if len(commitBody) > 200 { + commitBody = commitBody[:200] + "..." + } + } + } + + repoDisplayName := repo.ProjectName() + if repoDisplayName == "" { + repoDisplayName = repo.Name() + } + + shortHash := hash + if len(hash) > 7 { + shortHash = hash[:7] + } + data := CommitData{ RepoBaseData: RepoBaseData{ BaseData: BaseData{ - ServerName: cfg.Name, - ActiveTab: "commits", + ServerName: cfg.Name, + ActiveTab: "commits", + Title: commitSubject + " | Commit " + shortHash + " | " + repoDisplayName, + Description: commitBody, }, Repo: repo, DefaultBranch: defaultBranch, diff --git a/pkg/web/webui_commits.go b/pkg/web/webui_commits.go index 26f534ff6d847d2552778abb4271b9b707213a0d..46cf892fd07965a933981852e239e6f3caabffe9 100644 --- a/pkg/web/webui_commits.go +++ b/pkg/web/webui_commits.go @@ -82,11 +82,17 @@ func repoCommits(w http.ResponseWriter, r *http.Request) { defaultBranch := getDefaultBranch(gr) + repoDisplayName := repo.ProjectName() + if repoDisplayName == "" { + repoDisplayName = repo.Name() + } + data := CommitsData{ RepoBaseData: RepoBaseData{ BaseData: BaseData{ ServerName: cfg.Name, ActiveTab: "commits", + Title: "Commits in " + ref + " | " + repoDisplayName, }, Repo: repo, DefaultBranch: defaultBranch, diff --git a/pkg/web/webui_home.go b/pkg/web/webui_home.go index 956f1060efb342884bb41f6bcfcdbd6b1b765561..c8130acb0b02e5c11fdbd6be2b82b863b6b04951 100644 --- a/pkg/web/webui_home.go +++ b/pkg/web/webui_home.go @@ -154,6 +154,7 @@ func home(w http.ResponseWriter, r *http.Request) { BaseData: BaseData{ ServerName: cfg.Name, ActiveTab: "repositories", + Title: cfg.Name, }, PaginationData: PaginationData{ Page: page, diff --git a/pkg/web/webui_overview.go b/pkg/web/webui_overview.go index 0def6bc6db7abd72c8b3b7a5b9eaefc118101e3f..7b14bc97f29038e66a916da635a4ff2029129807 100644 --- a/pkg/web/webui_overview.go +++ b/pkg/web/webui_overview.go @@ -50,11 +50,18 @@ func repoOverview(w http.ResponseWriter, r *http.Request) { } } + repoDisplayName := repo.ProjectName() + if repoDisplayName == "" { + repoDisplayName = repo.Name() + } + data := OverviewData{ RepoBaseData: RepoBaseData{ BaseData: BaseData{ - ServerName: cfg.Name, - ActiveTab: "overview", + ServerName: cfg.Name, + ActiveTab: "overview", + Title: repoDisplayName, + Description: repo.Description(), }, Repo: repo, DefaultBranch: defaultBranch, diff --git a/pkg/web/webui_tags.go b/pkg/web/webui_tags.go index 4e92606369261b014f659dcce406cae92bb95361..032faa2929772517b15260762853c2c2808ea128 100644 --- a/pkg/web/webui_tags.go +++ b/pkg/web/webui_tags.go @@ -108,11 +108,17 @@ func repoTags(w http.ResponseWriter, r *http.Request) { }) } + repoDisplayName := repo.ProjectName() + if repoDisplayName == "" { + repoDisplayName = repo.Name() + } + data := TagsData{ RepoBaseData: RepoBaseData{ BaseData: BaseData{ ServerName: cfg.Name, ActiveTab: "tags", + Title: "Tags | " + repoDisplayName, }, Repo: repo, DefaultBranch: defaultBranch, diff --git a/pkg/web/webui_tree.go b/pkg/web/webui_tree.go index d9ecbe1488d5e3ffda9811b8825a8c89561db998..edccf39439c77a260492c5ccf621d9d444124df4 100644 --- a/pkg/web/webui_tree.go +++ b/pkg/web/webui_tree.go @@ -72,11 +72,17 @@ func repoTree(w http.ResponseWriter, r *http.Request) { defaultBranch := getDefaultBranch(gr) + repoDisplayName := repo.ProjectName() + if repoDisplayName == "" { + repoDisplayName = repo.Name() + } + data := TreeData{ RepoBaseData: RepoBaseData{ BaseData: BaseData{ ServerName: cfg.Name, ActiveTab: "tree", + Title: "Files | " + repoDisplayName, }, Repo: repo, DefaultBranch: defaultBranch,