+23
-5
appview/pages/pages.go
+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
+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
+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
}