forked from tangled.org/core
Monorepo for Tangled

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>

authored by a.starrysky.fyi and committed by Tangled c4e05261 1fc4863f

Changed files
+74 -5
appview
pages
templates
repo
repo
+23 -5
appview/pages/pages.go
··· 658 658 } 659 659 660 660 type RepoTreeParams struct { 661 - LoggedInUser *oauth.User 662 - RepoInfo repoinfo.RepoInfo 663 - Active string 664 - BreadCrumbs [][]string 665 - TreePath string 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 666 670 types.RepoTreeResponse 667 671 } 668 672 ··· 689 693 690 694 func (p *Pages) RepoTree(w io.Writer, params RepoTreeParams) error { 691 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 + 692 710 return p.executeRepo("repo/tree", w, params) 693 711 } 694 712
+27
appview/pages/templates/repo/tree.html
··· 88 88 </div> 89 89 </main> 90 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 447 return 448 448 } 449 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 + 450 472 // Convert XRPC response to internal types.RepoTreeResponse 451 473 files := make([]types.NiceTree, len(xrpcResp.Files)) 452 474 for i, xrpcFile := range xrpcResp.Files { ··· 508 530 BreadCrumbs: breadcrumbs, 509 531 TreePath: treePath, 510 532 RepoInfo: f.RepoInfo(user), 533 + Readme: readmeContent, 534 + ReadmeFileName: readmeFileName, 511 535 RepoTreeResponse: result, 512 536 }) 513 537 }