From a8636855b137129c03fd3e2e83432b715449b959 Mon Sep 17 00:00:00 2001 From: Skyler Grey Date: Sat, 20 Sep 2025 12:19:35 +0000 Subject: [PATCH] appview/pages: show README files in tree listings Change-Id: ozxopzuztrxmwnynkqnqnmnquqxmokkt We have README files displayed on the main page of a repository, but we don't do that on subfolders. Since xrpc was added, we can call it for every file in the list of potential README file names and pick out if any are present in the directory we're listing out Signed-off-by: Skyler Grey --- appview/pages/pages.go | 28 +++++++++++++++++++++----- appview/pages/templates/repo/tree.html | 27 +++++++++++++++++++++++++ appview/repo/repo.go | 24 ++++++++++++++++++++++ 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 6d80f96..7501a19 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -658,11 +658,15 @@ func (p *Pages) RepoCommit(w io.Writer, params RepoCommitParams) error { } type RepoTreeParams struct { - LoggedInUser *oauth.User - RepoInfo repoinfo.RepoInfo - Active string - BreadCrumbs [][]string - TreePath string + LoggedInUser *oauth.User + RepoInfo repoinfo.RepoInfo + Active string + BreadCrumbs [][]string + TreePath string + Readme string + ReadmeFileName string + HTMLReadme template.HTML + Raw bool types.RepoTreeResponse } @@ -689,6 +693,20 @@ func (r RepoTreeParams) TreeStats() RepoTreeStats { func (p *Pages) RepoTree(w io.Writer, params RepoTreeParams) error { params.Active = "overview" + + if params.ReadmeFileName != "" { + ext := filepath.Ext(params.ReadmeFileName) + switch ext { + case ".md", ".markdown", ".mdown", ".mkdn", ".mkd": + params.Raw = false + htmlString := p.rctx.RenderMarkdown(params.Readme) + sanitized := p.rctx.SanitizeDefault(htmlString) + params.HTMLReadme = template.HTML(sanitized) + default: + params.Raw = true + } + } + return p.executeRepo("repo/tree", w, params) } diff --git a/appview/pages/templates/repo/tree.html b/appview/pages/templates/repo/tree.html index 53d1487..6c6e179 100644 --- a/appview/pages/templates/repo/tree.html +++ b/appview/pages/templates/repo/tree.html @@ -88,3 +88,30 @@ {{end}} + +{{ define "repoAfter" }} + {{- if or .HTMLReadme .Readme -}} +
+ {{- if .ReadmeFileName -}} +
+ {{ i "file-text" "w-4 h-4" "text-gray-600 dark:text-gray-400" }} + {{ .ReadmeFileName }} +
+ {{- end -}} +
+
{{- if .Raw -}}
+                            {{- .Readme -}}
+                        
+ {{- else -}} + {{ .HTMLReadme }} + {{- end -}}
+
+
+ {{- end -}} +{{ end }} diff --git a/appview/repo/repo.go b/appview/repo/repo.go index ba8e98c..3e8953b 100644 --- a/appview/repo/repo.go +++ b/appview/repo/repo.go @@ -447,6 +447,28 @@ func (rp *Repo) RepoTree(w http.ResponseWriter, r *http.Request) { return } + // readme content + var ( + readmeContent string + readmeFileName string + ) + + for _, filename := range markup.ReadmeFilenames { + path := fmt.Sprintf("%s/%s", treePath, filename) + blobResp, err := tangled.RepoBlob(r.Context(), xrpcc, path, false, ref, repo) + if err != nil { + continue + } + + if blobResp == nil { + continue + } + + readmeContent = blobResp.Content + readmeFileName = path + break + } + // Convert XRPC response to internal types.RepoTreeResponse files := make([]types.NiceTree, len(xrpcResp.Files)) for i, xrpcFile := range xrpcResp.Files { @@ -508,6 +530,8 @@ func (rp *Repo) RepoTree(w http.ResponseWriter, r *http.Request) { BreadCrumbs: breadcrumbs, TreePath: treePath, RepoInfo: f.RepoInfo(user), + Readme: readmeContent, + ReadmeFileName: readmeFileName, RepoTreeResponse: result, }) } -- 2.43.0