Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).

appview/pages: rework blob template to work with models.BlobView

Signed-off-by: oppiliappan <me@oppi.li>

authored by oppi.li and committed by

Tangled 496e8e02 1473ec3e

+72 -94
+10 -55
appview/pages/pages.go
··· 744 744 func (r RepoTreeParams) TreeStats() RepoTreeStats { 745 745 numFolders, numFiles := 0, 0 746 746 for _, f := range r.Files { 747 - if !f.IsFile { 747 + if !f.IsFile() { 748 748 numFolders += 1 749 - } else if f.IsFile { 749 + } else if f.IsFile() { 750 750 numFiles += 1 751 751 } 752 752 } ··· 817 817 } 818 818 819 819 type RepoBlobParams struct { 820 - LoggedInUser *oauth.User 821 - RepoInfo repoinfo.RepoInfo 822 - Active string 823 - Unsupported bool 824 - IsImage bool 825 - IsVideo bool 826 - ContentSrc string 827 - BreadCrumbs [][]string 828 - ShowRendered bool 829 - RenderToggle bool 830 - RenderedContents template.HTML 820 + LoggedInUser *oauth.User 821 + RepoInfo repoinfo.RepoInfo 822 + Active string 823 + BreadCrumbs [][]string 824 + BlobView models.BlobView 831 825 *tangled.RepoBlob_Output 832 - // Computed fields for template compatibility 833 - Contents string 834 - Lines int 835 - SizeHint uint64 836 - IsBinary bool 837 826 } 838 827 839 828 func (p *Pages) RepoBlob(w io.Writer, params RepoBlobParams) error { 840 - var style *chroma.Style = styles.Get("catpuccin-latte") 841 - 842 - if params.ShowRendered { 843 - switch markup.GetFormat(params.Path) { 844 - case markup.FormatMarkdown: 845 - p.rctx.RepoInfo = params.RepoInfo 846 - p.rctx.RendererType = markup.RendererTypeRepoMarkdown 847 - htmlString := p.rctx.RenderMarkdown(params.Contents) 848 - sanitized := p.rctx.SanitizeDefault(htmlString) 849 - params.RenderedContents = template.HTML(sanitized) 850 - } 829 + switch params.BlobView.ContentType { 830 + case models.BlobContentTypeMarkup: 831 + p.rctx.RepoInfo = params.RepoInfo 851 832 } 852 833 853 - c := params.Contents 854 - formatter := chromahtml.New( 855 - chromahtml.InlineCode(false), 856 - chromahtml.WithLineNumbers(true), 857 - chromahtml.WithLinkableLineNumbers(true, "L"), 858 - chromahtml.Standalone(false), 859 - chromahtml.WithClasses(true), 860 - ) 861 - 862 - lexer := lexers.Get(filepath.Base(params.Path)) 863 - if lexer == nil { 864 - lexer = lexers.Fallback 865 - } 866 - 867 - iterator, err := lexer.Tokenise(nil, c) 868 - if err != nil { 869 - return fmt.Errorf("chroma tokenize: %w", err) 870 - } 871 - 872 - var code bytes.Buffer 873 - err = formatter.Format(&code, style, iterator) 874 - if err != nil { 875 - return fmt.Errorf("chroma format: %w", err) 876 - } 877 - 878 - params.Contents = code.String() 879 834 params.Active = "overview" 880 835 return p.executeRepo("repo/blob", w, params) 881 836 }
+62 -39
appview/pages/templates/repo/blob.html
··· 11 11 {{ end }} 12 12 13 13 {{ define "repoContent" }} 14 - {{ $lines := split .Contents }} 15 - {{ $tot_lines := len $lines }} 16 - {{ $tot_chars := len (printf "%d" $tot_lines) }} 17 - {{ $code_number_style := "text-gray-400 dark:text-gray-500 left-0 bg-white dark:bg-gray-800 text-right mr-6 select-none inline-block w-12" }} 18 14 {{ $linkstyle := "no-underline hover:underline" }} 19 15 <div class="pb-2 mb-3 text-base border-b border-gray-200 dark:border-gray-700"> 20 16 <div class="flex flex-col md:flex-row md:justify-between gap-2"> ··· 32 36 </div> 33 37 <div id="file-info" class="text-gray-500 dark:text-gray-400 text-xs md:text-sm flex flex-wrap items-center gap-1 md:gap-0"> 34 38 <span>at <a href="/{{ .RepoInfo.FullName }}/tree/{{ .Ref }}">{{ .Ref }}</a></span> 35 - <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span> 36 - <span>{{ .Lines }} lines</span> 37 - <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span> 38 - <span>{{ byteFmt .SizeHint }}</span> 39 - <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span> 40 - <a href="/{{ .RepoInfo.FullName }}/raw/{{ .Ref }}/{{ .Path }}">view raw</a> 41 - {{ if .RenderToggle }} 42 - <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span> 43 - <a 44 - href="/{{ .RepoInfo.FullName }}/blob/{{ .Ref }}/{{ .Path }}?code={{ .ShowRendered }}" 45 - hx-boost="true" 46 - >view {{ if .ShowRendered }}code{{ else }}rendered{{ end }}</a> 39 + 40 + {{ if .BlobView.ShowingText }} 41 + <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span> 42 + <span>{{ .Lines }} lines</span> 43 + {{ end }} 44 + 45 + {{ if .BlobView.SizeHint }} 46 + <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span> 47 + <span>{{ byteFmt .BlobView.SizeHint }}</span> 48 + {{ end }} 49 + 50 + {{ if .BlobView.HasRawView }} 51 + <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span> 52 + <a href="/{{ .RepoInfo.FullName }}/raw/{{ .Ref }}/{{ .Path }}">view raw</a> 53 + {{ end }} 54 + 55 + {{ if .BlobView.ShowToggle }} 56 + <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span> 57 + <a href="/{{ .RepoInfo.FullName }}/blob/{{ .Ref }}/{{ .Path }}?code={{ .BlobView.ShowingRendered }}" hx-boost="true"> 58 + view {{ if .BlobView.ShowingRendered }}code{{ else }}rendered{{ end }} 59 + </a> 47 60 {{ end }} 48 61 </div> 49 62 </div> 50 63 </div> 51 - {{ if and .IsBinary .Unsupported }} 52 - <p class="text-center text-gray-400 dark:text-gray-500"> 53 - Previews are not supported for this file type. 54 - </p> 55 - {{ else if .IsBinary }} 56 - <div class="text-center"> 57 - {{ if .IsImage }} 58 - <img src="{{ .ContentSrc }}" 59 - alt="{{ .Path }}" 60 - class="max-w-full h-auto mx-auto border border-gray-200 dark:border-gray-700 rounded" /> 61 - {{ else if .IsVideo }} 62 - <video controls class="max-w-full h-auto mx-auto border border-gray-200 dark:border-gray-700 rounded"> 63 - <source src="{{ .ContentSrc }}"> 64 - Your browser does not support the video tag. 65 - </video> 66 - {{ end }} 67 - </div> 68 - {{ else }} 69 - <div class="overflow-auto relative"> 70 - {{ if .ShowRendered }} 71 - <div id="blob-contents" class="prose dark:prose-invert">{{ .RenderedContents }}</div> 64 + {{ if .BlobView.IsUnsupported }} 65 + <p class="text-center text-gray-400 dark:text-gray-500"> 66 + Previews are not supported for this file type. 67 + </p> 68 + {{ else if .BlobView.ContentType.IsSubmodule }} 69 + <p class="text-center text-gray-400 dark:text-gray-500"> 70 + This directory is a git submodule of <a href="{{ .BlobView.ContentSrc }}">{{ .BlobView.ContentSrc }}</a>. 71 + </p> 72 + {{ else if .BlobView.ContentType.IsImage }} 73 + <div class="text-center"> 74 + <img src="{{ .BlobView.ContentSrc }}" 75 + alt="{{ .Path }}" 76 + class="max-w-full h-auto mx-auto border border-gray-200 dark:border-gray-700 rounded" /> 77 + </div> 78 + {{ else if .BlobView.ContentType.IsVideo }} 79 + <div class="text-center"> 80 + <video controls class="max-w-full h-auto mx-auto border border-gray-200 dark:border-gray-700 rounded"> 81 + <source src="{{ .BlobView.ContentSrc }}"> 82 + Your browser does not support the video tag. 83 + </video> 84 + </div> 85 + {{ else if .BlobView.ContentType.IsSvg }} 86 + <div class="overflow-auto relative"> 87 + {{ if .BlobView.ShowingRendered }} 88 + <div class="text-center"> 89 + <img src="{{ .BlobView.ContentSrc }}" 90 + alt="{{ .Path }}" 91 + class="max-w-full h-auto mx-auto border border-gray-200 dark:border-gray-700 rounded" /> 92 + </div> 72 93 {{ else }} 73 - <div id="blob-contents" class="whitespace-pre peer-target:bg-yellow-200 dark:peer-target:bg-yellow-900">{{ $.Contents | escapeHtml }}</div> 94 + <div id="blob-contents" class="whitespace-pre peer-target:bg-yellow-200 dark:peer-target:bg-yellow-900">{{ code .BlobView.Contents .Path | escapeHtml }}</div> 74 95 {{ end }} 75 - </div> 96 + </div> 97 + {{ else if .BlobView.ContentType.IsMarkup }} 98 + <div class="overflow-auto relative"> 99 + {{ if .BlobView.ShowingRendered }} 100 + <div id="blob-contents" class="prose dark:prose-invert">{{ .BlobView.Contents | readme }}</div> 101 + {{ else }} 102 + <div id="blob-contents" class="whitespace-pre peer-target:bg-yellow-200 dark:peer-target:bg-yellow-900">{{ code .BlobView.Contents .Path | escapeHtml }}</div> 103 + {{ end }} 104 + </div> 105 + {{ else if .BlobView.ContentType.IsCode }} 106 + <div id="blob-contents" class="whitespace-pre peer-target:bg-yellow-200 dark:peer-target:bg-yellow-900">{{ code .BlobView.Contents .Path | escapeHtml }}</div> 76 107 {{ end }} 77 108 {{ template "fragments/multiline-select" }} 78 109 {{ end }}