]> source.dussan.org Git - gitea.git/commitdiff
Refactor file view & render (#30227)
authorwxiaoguang <wxiaoguang@gmail.com>
Mon, 1 Apr 2024 13:11:30 +0000 (21:11 +0800)
committerGitHub <noreply@github.com>
Mon, 1 Apr 2024 13:11:30 +0000 (21:11 +0800)
The old code is inconsistent and fragile, and the UI isn't right.

routers/web/repo/blame.go
routers/web/repo/setting/lfs.go
routers/web/repo/view.go
templates/repo/blame.tmpl
templates/repo/settings/lfs_file.tmpl
templates/repo/view_file.tmpl
templates/shared/filetoolarge.tmpl [new file with mode: 0644]

index 935e6d78fc41274ed464ede9c06ac699435f3984..1887e4d95da3df28de11dc73b6f65d56feac03e2 100644 (file)
@@ -16,6 +16,7 @@ import (
        "code.gitea.io/gitea/modules/git"
        "code.gitea.io/gitea/modules/highlight"
        "code.gitea.io/gitea/modules/log"
+       "code.gitea.io/gitea/modules/setting"
        "code.gitea.io/gitea/modules/templates"
        "code.gitea.io/gitea/modules/timeutil"
        "code.gitea.io/gitea/modules/util"
@@ -87,9 +88,16 @@ func RefBlame(ctx *context.Context) {
 
        ctx.Data["IsBlame"] = true
 
-       ctx.Data["FileSize"] = blob.Size()
+       fileSize := blob.Size()
+       ctx.Data["FileSize"] = fileSize
        ctx.Data["FileName"] = blob.Name()
 
+       if fileSize >= setting.UI.MaxDisplayFileSize {
+               ctx.Data["IsFileTooLarge"] = true
+               ctx.HTML(http.StatusOK, tplRepoHome)
+               return
+       }
+
        ctx.Data["NumLines"], err = blob.GetBlobLineCount()
        ctx.Data["NumLinesSet"] = true
 
index 32049cf0a423cefd67ed7f1c43f1e066baabbf84..6dddade066e8e4197ce561066ae5d34719814512 100644 (file)
@@ -287,22 +287,19 @@ func LFSFileGet(ctx *context.Context) {
 
        st := typesniffer.DetectContentType(buf)
        ctx.Data["IsTextFile"] = st.IsText()
-       isRepresentableAsText := st.IsRepresentableAsText()
-
-       fileSize := meta.Size
        ctx.Data["FileSize"] = meta.Size
        ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s/%s.git/info/lfs/objects/%s/%s", setting.AppURL, url.PathEscape(ctx.Repo.Repository.OwnerName), url.PathEscape(ctx.Repo.Repository.Name), url.PathEscape(meta.Oid), "direct")
        switch {
-       case isRepresentableAsText:
-               if st.IsSvgImage() {
-                       ctx.Data["IsImageFile"] = true
-               }
-
-               if fileSize >= setting.UI.MaxDisplayFileSize {
+       case st.IsRepresentableAsText():
+               if meta.Size >= setting.UI.MaxDisplayFileSize {
                        ctx.Data["IsFileTooLarge"] = true
                        break
                }
 
+               if st.IsSvgImage() {
+                       ctx.Data["IsImageFile"] = true
+               }
+
                rd := charset.ToUTF8WithFallbackReader(io.MultiReader(bytes.NewReader(buf), dataRc), charset.ConvertOpts{})
 
                // Building code view blocks with line number on server side.
@@ -338,6 +335,8 @@ func LFSFileGet(ctx *context.Context) {
                ctx.Data["IsAudioFile"] = true
        case st.IsImage() && (setting.UI.SVG.Enabled || !st.IsSvgImage()):
                ctx.Data["IsImageFile"] = true
+       default:
+               // TODO: the logic is not the same as "renderFile" in "view.go"
        }
        ctx.HTML(http.StatusOK, tplSettingsLFSFile)
 }
index 93e0f5bcbdbdf88479b9050ffe2c71ead279754c..8aa9dbb1be333b6d69b878cac80522e267ecc8eb 100644 (file)
@@ -482,17 +482,17 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
 
        switch {
        case isRepresentableAsText:
+               if fInfo.fileSize >= setting.UI.MaxDisplayFileSize {
+                       ctx.Data["IsFileTooLarge"] = true
+                       break
+               }
+
                if fInfo.st.IsSvgImage() {
                        ctx.Data["IsImageFile"] = true
                        ctx.Data["CanCopyContent"] = true
                        ctx.Data["HasSourceRenderedToggle"] = true
                }
 
-               if fInfo.fileSize >= setting.UI.MaxDisplayFileSize {
-                       ctx.Data["IsFileTooLarge"] = true
-                       break
-               }
-
                rd := charset.ToUTF8WithFallbackReader(io.MultiReader(bytes.NewReader(buf), dataRc), charset.ConvertOpts{})
 
                shouldRenderSource := ctx.FormString("display") == "source"
@@ -606,6 +606,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
                        break
                }
 
+               // TODO: this logic seems strange, it duplicates with "isRepresentableAsText=true", it is not the same as "LFSFileGet" in "lfs.go"
+               // maybe for this case, the file is a binary file, and shouldn't be rendered?
                if markupType := markup.Type(blob.Name()); markupType != "" {
                        rd := io.MultiReader(bytes.NewReader(buf), dataRc)
                        ctx.Data["IsMarkup"] = true
index 1a148a2d1cc29ba4118078c2be889308cbf34b8e..30d1a3d78d9e828cf20f596b1c4918bbf1c4d976 100644 (file)
@@ -30,6 +30,9 @@
        </h4>
        <div class="ui attached table unstackable segment">
                <div class="file-view code-view unicode-escaped">
+                       {{if .IsFileTooLarge}}
+                               {{template "shared/filetoolarge" dict "RawFileLink" .RawFileLink}}
+                       {{else}}
                        <table>
                                <tbody>
                                        {{range $row := .BlameRows}}
@@ -75,6 +78,7 @@
                                        {{end}}
                                </tbody>
                        </table>
+                       {{end}}{{/* end if .IsFileTooLarge */}}
                        <div class="code-line-menu tippy-target">
                                {{if $.Permission.CanRead $.UnitTypeIssues}}
                                        <a class="item ref-in-new-issue" role="menuitem" data-url-issue-new="{{.RepoLink}}/issues/new" data-url-param-body-link="{{.Repository.Link}}/src/commit/{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}{{if $.HasSourceRenderedToggle}}?display=source{{end}}" rel="nofollow noindex">{{ctx.Locale.Tr "repo.issues.context.reference_issue"}}</a>
index 43afba96c325f36b9d35096198760ed208c30b08..cb65236f23e50a2e5d41556553b3ee8c3d4a5ae4 100644 (file)
@@ -14,7 +14,9 @@
                        <div class="ui attached table unstackable segment">
                                {{template "repo/unicode_escape_prompt" dict "EscapeStatus" .EscapeStatus "root" $}}
                                <div class="file-view{{if .IsMarkup}} markup {{.MarkupType}}{{else if .IsPlainText}} plain-text{{else if .IsTextFile}} code-view{{end}}">
-                                       {{if .IsMarkup}}
+                                       {{if .IsFileTooLarge}}
+                                               {{template "shared/filetoolarge" dict "RawFileLink" .RawFileLink}}
+                                       {{else if .IsMarkup}}
                                                {{if .FileContent}}{{.FileContent | SafeHTML}}{{end}}
                                        {{else if .IsPlainText}}
                                                <pre>{{if .FileContent}}{{.FileContent | SafeHTML}}{{end}}</pre>
                                                        {{else if .IsPDFFile}}
                                                                <div class="pdf-content is-loading" data-src="{{$.RawFileLink}}" data-fallback-button-text="{{ctx.Locale.Tr "diff.view_file"}}"></div>
                                                        {{else}}
-                                                               <a href="{{$.RawFileLink}}" rel="nofollow">{{ctx.Locale.Tr "repo.file_view_raw"}}</a>
+                                                               <a href="{{$.RawFileLink}}" rel="nofollow" class="tw-p-4">{{ctx.Locale.Tr "repo.file_view_raw"}}</a>
                                                        {{end}}
                                                </div>
                                        {{else if .FileSize}}
                                                <table>
                                                        <tbody>
                                                                <tr>
-                                                               {{if .IsFileTooLarge}}
-                                                                       <td><strong>{{ctx.Locale.Tr "repo.file_too_large"}}</strong></td>
-                                                               {{else}}
                                                                        <td class="lines-num">{{.LineNums}}</td>
                                                                        <td class="lines-code"><pre><code class="{{.HighlightClass}}"><ol>{{.FileContent}}</ol></code></pre></td>
-                                                               {{end}}
                                                                </tr>
                                                        </tbody>
                                                </table>
index b7c1b9eeae06fe7ff639f23e0eac6f816e457b1c..9c5bd9094d1cc808a2e92c449c55ab21210a1a63 100644 (file)
@@ -89,7 +89,9 @@
                        {{template "repo/unicode_escape_prompt" dict "EscapeStatus" .EscapeStatus "root" $}}
                {{end}}
                <div class="file-view{{if .IsMarkup}} markup {{.MarkupType}}{{else if .IsPlainText}} plain-text{{else if .IsTextSource}} code-view{{end}}">
-                       {{if .IsMarkup}}
+                       {{if .IsFileTooLarge}}
+                               {{template "shared/filetoolarge" dict "RawFileLink" .RawFileLink}}
+                       {{else if .IsMarkup}}
                                {{if .FileContent}}{{.FileContent}}{{end}}
                        {{else if .IsPlainText}}
                                <pre>{{if .FileContent}}{{.FileContent}}{{end}}</pre>
                                        {{else if .IsPDFFile}}
                                                <div class="pdf-content is-loading" data-src="{{$.RawFileLink}}" data-fallback-button-text="{{ctx.Locale.Tr "repo.diff.view_file"}}"></div>
                                        {{else}}
-                                               <a href="{{$.RawFileLink}}" rel="nofollow">{{ctx.Locale.Tr "repo.file_view_raw"}}</a>
+                                               <a href="{{$.RawFileLink}}" rel="nofollow" class="tw-p-4">{{ctx.Locale.Tr "repo.file_view_raw"}}</a>
                                        {{end}}
                                </div>
                        {{else if .FileSize}}
-                               {{if .IsFileTooLarge}}
-                               <table>
-                                       <tbody>
-                                               <tr>
-                                                       <td><strong>{{ctx.Locale.Tr "repo.file_too_large"}}</strong></td>
-                                               </tr>
-                                       </tbody>
-                               </table>
-                               {{else}}
                                <table>
                                        <tbody>
                                                {{range $idx, $code := .FileContent}}
                                        <a class="item view_git_blame" role="menuitem" href="{{.Repository.Link}}/blame/commit/{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}">{{ctx.Locale.Tr "repo.view_git_blame"}}</a>
                                        <a class="item copy-line-permalink" role="menuitem" data-url="{{.Repository.Link}}/src/commit/{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}{{if $.HasSourceRenderedToggle}}?display=source{{end}}">{{ctx.Locale.Tr "repo.file_copy_permalink"}}</a>
                                </div>
-                               {{end}}
                        {{end}}
                </div>
        </div>
diff --git a/templates/shared/filetoolarge.tmpl b/templates/shared/filetoolarge.tmpl
new file mode 100644 (file)
index 0000000..8842fb1
--- /dev/null
@@ -0,0 +1,4 @@
+<div class="tw-p-4">
+       {{ctx.Locale.Tr "repo.file_too_large"}}
+       {{if .RawFileLink}}<a href="{{.RawFileLink}}" rel="nofollow">{{ctx.Locale.Tr "repo.file_view_raw"}}</a>{{end}}
+</div>