You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

view_file.tmpl 8.1KB

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