gitea源码

view_file.tmpl 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <div {{if .ReadmeInList}}id="readme"{{end}} class="{{TabSizeClass .Editorconfig .FileTreePath}} non-diff-file-content"
  2. data-global-init="initRepoFileView" data-raw-file-link="{{.RawFileLink}}">
  3. {{- if .FileError}}
  4. <div class="ui error message">
  5. <div class="text left tw-whitespace-pre">{{.FileError}}</div>
  6. </div>
  7. {{end}}
  8. {{- if .FileWarning}}
  9. <div class="ui warning message">
  10. <div class="text left tw-whitespace-pre">{{.FileWarning}}</div>
  11. </div>
  12. {{end}}
  13. {{if not .ReadmeInList}}
  14. <div id="repo-file-commit-box" class="ui segment list-header tw-mb-4 tw-flex tw-justify-between">
  15. {{template "repo/latest_commit" .}}
  16. {{if .LatestCommit}}
  17. {{if .LatestCommit.Committer}}
  18. <div class="text grey age flex-text-block">
  19. {{DateUtils.TimeSince .LatestCommit.Committer.When}}
  20. </div>
  21. {{end}}
  22. {{end}}
  23. </div>
  24. {{end}}
  25. <h4 class="file-header ui top attached header tw-flex tw-items-center tw-justify-between tw-flex-wrap">
  26. <div class="file-header-left tw-flex tw-items-center tw-py-2 tw-pr-4">
  27. {{if .ReadmeInList}}
  28. {{svg "octicon-book" 16 "tw-mr-2"}}
  29. <strong><a class="muted" href="#readme">{{.ReadmeInList}}</a></strong>
  30. {{else}}
  31. {{template "repo/file_info" .}}
  32. {{end}}
  33. </div>
  34. <div class="file-header-right file-actions flex-text-block tw-flex-wrap">
  35. {{/* this componment is also controlled by frontend plugin renders */}}
  36. <div class="ui compact icon buttons file-view-toggle-buttons {{Iif .HasSourceRenderedToggle "" "tw-hidden"}}">
  37. {{if .IsRepresentableAsText}}
  38. <a href="?display=source" class="ui mini basic button file-view-toggle-source {{if .IsDisplayingSource}}active{{end}}" data-tooltip-content="{{ctx.Locale.Tr "repo.file_view_source"}}">{{svg "octicon-code" 15}}</a>
  39. {{end}}
  40. <a href="?display=rendered" class="ui mini basic button file-view-toggle-rendered {{if not .IsDisplayingSource}}active{{end}}" data-tooltip-content="{{ctx.Locale.Tr "repo.file_view_rendered"}}">{{svg "octicon-file" 15}}</a>
  41. </div>
  42. {{if not .ReadmeInList}}
  43. <div class="ui buttons tw-mr-1">
  44. <a class="ui mini basic button" href="{{$.RawFileLink}}">{{ctx.Locale.Tr "repo.file_raw"}}</a>
  45. {{if or .RefFullName.IsBranch .RefFullName.IsTag}}
  46. <a class="ui mini basic button" href="{{.RepoLink}}/src/commit/{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}">{{ctx.Locale.Tr "repo.file_permalink"}}</a>
  47. {{end}}
  48. {{if .IsRepresentableAsText}}
  49. <a class="ui mini basic button" href="{{.RepoLink}}/blame/{{.RefTypeNameSubURL}}/{{PathEscapeSegments .TreePath}}">{{ctx.Locale.Tr "repo.blame"}}</a>
  50. {{end}}
  51. <a class="ui mini basic button" href="{{.RepoLink}}/commits/{{.RefTypeNameSubURL}}/{{PathEscapeSegments .TreePath}}">{{ctx.Locale.Tr "repo.file_history"}}</a>
  52. {{if .EscapeStatus.Escaped}}
  53. <button class="ui mini basic button unescape-button tw-hidden">{{ctx.Locale.Tr "repo.unescape_control_characters"}}</button>
  54. <button class="ui mini basic button escape-button">{{ctx.Locale.Tr "repo.escape_control_characters"}}</button>
  55. {{end}}
  56. </div>
  57. <a download class="btn-octicon" data-tooltip-content="{{ctx.Locale.Tr "repo.download_file"}}" href="{{$.RawFileLink}}">{{svg "octicon-download"}}</a>
  58. <a class="btn-octicon {{if not .CanCopyContent}}disabled{{end}}" data-global-click="onCopyContentButtonClick"
  59. {{if not .IsDisplayingSource}}data-raw-file-link="{{$.RawFileLink}}"{{end}}
  60. data-tooltip-content="{{if .CanCopyContent}}{{ctx.Locale.Tr "copy_content"}}{{else}}{{ctx.Locale.Tr "copy_type_unsupported"}}{{end}}"
  61. >{{svg "octicon-copy"}}</a>
  62. {{if .EnableFeed}}
  63. <a class="btn-octicon" href="{{$.RepoLink}}/rss/{{$.RefTypeNameSubURL}}/{{PathEscapeSegments .TreePath}}" data-tooltip-content="{{ctx.Locale.Tr "rss_feed"}}">
  64. {{svg "octicon-rss"}}
  65. </a>
  66. {{end}}
  67. {{if .Repository.CanEnableEditor}}
  68. {{if .CanEditFile}}
  69. <a class="btn-octicon" data-tooltip-content="{{.EditFileTooltip}}" href="{{.RepoLink}}/_edit/{{PathEscapeSegments .BranchName}}/{{PathEscapeSegments .TreePath}}">{{svg "octicon-pencil"}}</a>
  70. {{else}}
  71. <span class="btn-octicon disabled" data-tooltip-content="{{.EditFileTooltip}}">{{svg "octicon-pencil"}}</span>
  72. {{end}}
  73. {{if .CanDeleteFile}}
  74. <a class="btn-octicon btn-octicon-danger" data-tooltip-content="{{.DeleteFileTooltip}}" href="{{.RepoLink}}/_delete/{{PathEscapeSegments .BranchName}}/{{PathEscapeSegments .TreePath}}">{{svg "octicon-trash"}}</a>
  75. {{else}}
  76. <span class="btn-octicon disabled" data-tooltip-content="{{.DeleteFileTooltip}}">{{svg "octicon-trash"}}</span>
  77. {{end}}
  78. {{end}}
  79. {{else if .EscapeStatus.Escaped}}
  80. <button class="ui mini basic button unescape-button tw-mr-1 tw-hidden">{{ctx.Locale.Tr "repo.unescape_control_characters"}}</button>
  81. <button class="ui mini basic button escape-button tw-mr-1">{{ctx.Locale.Tr "repo.escape_control_characters"}}</button>
  82. {{end}}
  83. {{if and .ReadmeInList .CanEditReadmeFile}}
  84. <a class="btn-octicon" data-tooltip-content="{{ctx.Locale.Tr "repo.editor.edit_this_file"}}" href="{{.RepoLink}}/_edit/{{PathEscapeSegments .BranchName}}/{{PathEscapeSegments .FileTreePath}}">{{svg "octicon-pencil"}}</a>
  85. {{end}}
  86. </div>
  87. </h4>
  88. <div class="ui bottom attached table unstackable segment">
  89. {{if not .IsMarkup}}
  90. {{template "repo/unicode_escape_prompt" dict "EscapeStatus" .EscapeStatus}}
  91. {{end}}
  92. <div class="file-view {{if .IsMarkup}}markup {{.MarkupType}}{{else if .IsPlainText}}plain-text{{else if .IsDisplayingSource}}code-view{{end}}">
  93. {{if .IsFileTooLarge}}
  94. {{template "shared/filetoolarge" dict "RawFileLink" .RawFileLink}}
  95. {{else if not .FileSize}}
  96. {{template "shared/fileisempty"}}
  97. {{else if .IsMarkup}}
  98. {{.FileContent}}
  99. {{else if .IsPlainText}}
  100. <pre>{{if .FileContent}}{{.FileContent}}{{end}}</pre>
  101. {{else if .FileContent}}
  102. <table>
  103. <tbody>
  104. {{range $idx, $code := .FileContent}}
  105. {{$line := Eval $idx "+" 1}}
  106. <tr>
  107. <td class="lines-num"><span id="L{{$line}}" data-line-number="{{$line}}"></span></td>
  108. {{if $.EscapeStatus.Escaped}}
  109. <td class="lines-escape">{{if (index $.LineEscapeStatus $idx).Escaped}}<button class="toggle-escape-button btn interact-bg" title="{{if (index $.LineEscapeStatus $idx).HasInvisible}}{{ctx.Locale.Tr "repo.invisible_runes_line"}} {{end}}{{if (index $.LineEscapeStatus $idx).HasAmbiguous}}{{ctx.Locale.Tr "repo.ambiguous_runes_line"}}{{end}}"></button>{{end}}</td>
  110. {{end}}
  111. <td rel="L{{$line}}" class="lines-code chroma"><code class="code-inner">{{$code}}</code></td>
  112. </tr>
  113. {{end}}
  114. </tbody>
  115. </table>
  116. {{else}}
  117. <div class="view-raw">
  118. {{if .IsImageFile}}
  119. <img alt="{{$.RawFileLink}}" src="{{$.RawFileLink}}">
  120. {{else if .IsVideoFile}}
  121. <video controls src="{{$.RawFileLink}}">
  122. <strong>{{ctx.Locale.Tr "repo.video_not_supported_in_browser"}}</strong>
  123. </video>
  124. {{else if .IsAudioFile}}
  125. <audio controls src="{{$.RawFileLink}}">
  126. <strong>{{ctx.Locale.Tr "repo.audio_not_supported_in_browser"}}</strong>
  127. </audio>
  128. {{else}}
  129. <div class="file-view-render-container">
  130. <div class="file-view-raw-prompt tw-p-4">
  131. <a href="{{$.RawFileLink}}" rel="nofollow">{{ctx.Locale.Tr "repo.file_view_raw"}}</a>
  132. </div>
  133. </div>
  134. {{end}}
  135. </div>
  136. {{end}}
  137. </div>
  138. <div class="code-line-menu tippy-target">
  139. {{if $.Permission.CanRead ctx.Consts.RepoUnitTypeIssues}}
  140. <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>
  141. {{end}}
  142. <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>
  143. <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>
  144. </div>
  145. </div>
  146. </div>