diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 6d80f96d..7501a198 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 53d1487e..6c6e1795 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 ba8e98c2..3e8953b8 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, }) }