Monorepo for Tangled tangled.org

appview/pages: show README files in tree listings

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 <minion@freshlybakedca.ke>

Changed files
+74 -5
appview
pages
templates
repo
repo
+23 -5
appview/pages/pages.go
··· 658 } 659 660 type RepoTreeParams struct { 661 - LoggedInUser *oauth.User 662 - RepoInfo repoinfo.RepoInfo 663 - Active string 664 - BreadCrumbs [][]string 665 - TreePath string 666 types.RepoTreeResponse 667 } 668 ··· 689 690 func (p *Pages) RepoTree(w io.Writer, params RepoTreeParams) error { 691 params.Active = "overview" 692 return p.executeRepo("repo/tree", w, params) 693 } 694
··· 658 } 659 660 type RepoTreeParams struct { 661 + LoggedInUser *oauth.User 662 + RepoInfo repoinfo.RepoInfo 663 + Active string 664 + BreadCrumbs [][]string 665 + TreePath string 666 + Readme string 667 + ReadmeFileName string 668 + HTMLReadme template.HTML 669 + Raw bool 670 types.RepoTreeResponse 671 } 672 ··· 693 694 func (p *Pages) RepoTree(w io.Writer, params RepoTreeParams) error { 695 params.Active = "overview" 696 + 697 + if params.ReadmeFileName != "" { 698 + ext := filepath.Ext(params.ReadmeFileName) 699 + switch ext { 700 + case ".md", ".markdown", ".mdown", ".mkdn", ".mkd": 701 + params.Raw = false 702 + htmlString := p.rctx.RenderMarkdown(params.Readme) 703 + sanitized := p.rctx.SanitizeDefault(htmlString) 704 + params.HTMLReadme = template.HTML(sanitized) 705 + default: 706 + params.Raw = true 707 + } 708 + } 709 + 710 return p.executeRepo("repo/tree", w, params) 711 } 712
+27
appview/pages/templates/repo/tree.html
··· 88 </div> 89 </main> 90 {{end}}
··· 88 </div> 89 </main> 90 {{end}} 91 + 92 + {{ define "repoAfter" }} 93 + {{- if or .HTMLReadme .Readme -}} 94 + <div class="mt-4 rounded bg-white dark:bg-gray-800 drop-shadow-sm w-full mx-auto overflow-hidden"> 95 + {{- if .ReadmeFileName -}} 96 + <div class="px-4 py-2 bg-gray-50 dark:bg-gray-700 border-b border-gray-200 dark:border-gray-600 flex items-center gap-2"> 97 + {{ i "file-text" "w-4 h-4" "text-gray-600 dark:text-gray-400" }} 98 + <span class="font-mono text-sm text-gray-800 dark:text-gray-200">{{ .ReadmeFileName }}</span> 99 + </div> 100 + {{- end -}} 101 + <section 102 + class="p-6 overflow-auto {{ if not .Raw }} 103 + prose dark:prose-invert dark:[&_pre]:bg-gray-900 104 + dark:[&_code]:text-gray-300 dark:[&_pre_code]:bg-gray-900 105 + dark:[&_pre]:border dark:[&_pre]:border-gray-700 106 + {{ end }}" 107 + > 108 + <article class="{{ if .Raw }}whitespace-pre{{ end }}">{{- if .Raw -}}<pre class="dark:bg-gray-800 dark:text-white overflow-x-auto"> 109 + {{- .Readme -}} 110 + </pre> 111 + {{- else -}} 112 + {{ .HTMLReadme }} 113 + {{- end -}}</article> 114 + </section> 115 + </div> 116 + {{- end -}} 117 + {{ end }}
+24
appview/repo/repo.go
··· 447 return 448 } 449 450 // Convert XRPC response to internal types.RepoTreeResponse 451 files := make([]types.NiceTree, len(xrpcResp.Files)) 452 for i, xrpcFile := range xrpcResp.Files { ··· 508 BreadCrumbs: breadcrumbs, 509 TreePath: treePath, 510 RepoInfo: f.RepoInfo(user), 511 RepoTreeResponse: result, 512 }) 513 }
··· 447 return 448 } 449 450 + // readme content 451 + var ( 452 + readmeContent string 453 + readmeFileName string 454 + ) 455 + 456 + for _, filename := range markup.ReadmeFilenames { 457 + path := fmt.Sprintf("%s/%s", treePath, filename) 458 + blobResp, err := tangled.RepoBlob(r.Context(), xrpcc, path, false, ref, repo) 459 + if err != nil { 460 + continue 461 + } 462 + 463 + if blobResp == nil { 464 + continue 465 + } 466 + 467 + readmeContent = blobResp.Content 468 + readmeFileName = path 469 + break 470 + } 471 + 472 // Convert XRPC response to internal types.RepoTreeResponse 473 files := make([]types.NiceTree, len(xrpcResp.Files)) 474 for i, xrpcFile := range xrpcResp.Files { ··· 530 BreadCrumbs: breadcrumbs, 531 TreePath: treePath, 532 RepoInfo: f.RepoInfo(user), 533 + Readme: readmeContent, 534 + ReadmeFileName: readmeFileName, 535 RepoTreeResponse: result, 536 }) 537 }