2023-10-19 01:59:46 +03:00
<div {{ if .ReadmeInList }} id="readme" {{ end }} class=" {{ TabSizeClass .Editorconfig .FileName }} non-diff-file-content">
2022-09-12 01:16:56 +03:00
{{ - if .FileError }}
2023-04-06 23:01:20 +03:00
<div class="ui error message">
2024-03-04 06:33:20 +03:00
<div class="text left tw-whitespace-pre"> {{ .FileError }} </div>
2023-04-06 23:01:20 +03:00
</div>
{{ end }}
{{ - if .FileWarning }}
2022-09-12 01:16:56 +03:00
<div class="ui warning message">
2024-03-04 06:33:20 +03:00
<div class="text left tw-whitespace-pre"> {{ .FileWarning }} </div>
2022-09-12 01:16:56 +03:00
</div>
{{ end }}
2024-01-15 19:42:15 +03:00
{{ if not .ReadmeInList }}
2024-04-18 11:34:23 +03:00
<div id="repo-file-commit-box" class="ui segment list-header tw-mb-4 tw-flex tw-justify-between">
2024-04-10 09:13:22 +03:00
<div class="latest-commit">
2024-01-15 19:42:15 +03:00
{{ template "repo/latest_commit" . }}
</div>
{{ if .LatestCommit }}
{{ if .LatestCommit .Committer }}
2024-04-10 09:13:22 +03:00
<div class="text grey age">
2024-11-04 14:30:00 +03:00
{{ DateUtils .TimeSince .LatestCommit .Committer .When }}
2024-01-15 19:42:15 +03:00
</div>
{{ end }}
{{ end }}
</div>
{{ end }}
2024-03-22 22:51:29 +03:00
<h4 class="file-header ui top attached header tw-flex tw-items-center tw-justify-between tw-flex-wrap">
Migrate margin and padding helpers to tailwind (#30043)
This will conclude the refactor of 1:1 class replacements to tailwind,
except `gt-hidden`. Commands ran:
```bash
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-0#tw-$1$2-0#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-1#tw-$1$2-0.5#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-2#tw-$1$2-1#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-3#tw-$1$2-2#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-4#tw-$1$2-4#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-5#tw-$1$2-8#g' {web_src/js,templates,routers,services}/**/*
```
2024-03-24 19:42:49 +03:00
<div class="file-header-left tw-flex tw-items-center tw-py-2 tw-pr-4">
2019-10-07 07:59:17 +03:00
{{ if .ReadmeInList }}
Migrate margin and padding helpers to tailwind (#30043)
This will conclude the refactor of 1:1 class replacements to tailwind,
except `gt-hidden`. Commands ran:
```bash
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-0#tw-$1$2-0#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-1#tw-$1$2-0.5#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-2#tw-$1$2-1#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-3#tw-$1$2-2#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-4#tw-$1$2-4#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-5#tw-$1$2-8#g' {web_src/js,templates,routers,services}/**/*
```
2024-03-24 19:42:49 +03:00
{{ svg "octicon-book" 1 6 "tw-mr-2" }}
2024-11-16 11:41:44 +03:00
<strong><a class="muted" href="#readme"> {{ .FileName }} </a></strong>
2019-10-07 07:59:17 +03:00
{{ else }}
2022-11-19 14:08:06 +03:00
{{ template "repo/file_info" . }}
2019-10-07 07:59:17 +03:00
{{ end }}
</div>
2024-03-22 22:51:29 +03:00
<div class="file-header-right file-actions tw-flex tw-items-center tw-flex-wrap">
2021-01-13 06:45:19 +03:00
{{ if .HasSourceRenderedToggle }}
2023-09-04 13:22:46 +03:00
<div class="ui compact icon buttons">
2024-03-20 08:56:42 +03:00
<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" 1 5 }} </a>
2023-09-25 11:56:50 +03:00
<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" 1 5 }} </a>
2021-01-13 06:45:19 +03:00
</div>
{{ end }}
2022-01-07 04:18:52 +03:00
{{ if not .ReadmeInList }}
Migrate margin and padding helpers to tailwind (#30043)
This will conclude the refactor of 1:1 class replacements to tailwind,
except `gt-hidden`. Commands ran:
```bash
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-0#tw-$1$2-0#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-1#tw-$1$2-0.5#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-2#tw-$1$2-1#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-3#tw-$1$2-2#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-4#tw-$1$2-4#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-5#tw-$1$2-8#g' {web_src/js,templates,routers,services}/**/*
```
2024-03-24 19:42:49 +03:00
<div class="ui buttons tw-mr-1">
2023-09-25 11:56:50 +03:00
<a class="ui mini basic button" href=" {{ $ .RawFileLink }} "> {{ ctx .Locale .Tr "repo.file_raw" }} </a>
2022-01-07 04:18:52 +03:00
{{ if not .IsViewCommit }}
2023-09-25 11:56:50 +03:00
<a class="ui mini basic button" href=" {{ .RepoLink }} /src/commit/ {{ PathEscape .CommitID }} / {{ PathEscapeSegments .TreePath }} "> {{ ctx .Locale .Tr "repo.file_permalink" }} </a>
2022-01-07 04:18:52 +03:00
{{ end }}
{{ if .IsRepresentableAsText }}
2023-09-25 11:56:50 +03:00
<a class="ui mini basic button" href=" {{ .RepoLink }} /blame/ {{ .BranchNameSubURL }} / {{ PathEscapeSegments .TreePath }} "> {{ ctx .Locale .Tr "repo.blame" }} </a>
2022-01-07 04:18:52 +03:00
{{ end }}
2023-09-25 11:56:50 +03:00
<a class="ui mini basic button" href=" {{ .RepoLink }} /commits/ {{ .BranchNameSubURL }} / {{ PathEscapeSegments .TreePath }} "> {{ ctx .Locale .Tr "repo.file_history" }} </a>
2022-01-07 04:18:52 +03:00
{{ if .EscapeStatus .Escaped }}
2024-03-24 21:23:38 +03:00
<button class="ui mini basic button unescape-button tw-hidden"> {{ ctx .Locale .Tr "repo.unescape_control_characters" }} </button>
2023-09-25 11:56:50 +03:00
<button class="ui mini basic button escape-button"> {{ ctx .Locale .Tr "repo.escape_control_characters" }} </button>
2022-01-07 04:18:52 +03:00
{{ end }}
</div>
2023-09-25 11:56:50 +03:00
<a download href=" {{ $ .RawFileLink }} "><span class="btn-octicon" data-tooltip-content=" {{ ctx .Locale .Tr "repo.download_file" }} "> {{ svg "octicon-download" }} </span></a>
2023-09-25 15:42:40 +03:00
<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" 1 4 }} </a>
2023-04-25 17:08:29 +03:00
{{ if .EnableFeed }}
2023-12-06 23:29:26 +03:00
<a class="btn-octicon" href=" {{ $ .FeedURL }} /rss/ {{ $ .BranchNameSubURL }} / {{ PathEscapeSegments .TreePath }} " data-tooltip-content=" {{ ctx .Locale .Tr "rss_feed" }} ">
{{ svg "octicon-rss" 1 4 }}
</a>
2023-04-25 17:08:29 +03:00
{{ end }}
2022-01-07 04:18:52 +03:00
{{ if .Repository .CanEnableEditor }}
{{ if .CanEditFile }}
2023-03-24 13:35:38 +03:00
<a href=" {{ .RepoLink }} /_edit/ {{ PathEscapeSegments .BranchName }} / {{ PathEscapeSegments .TreePath }} "><span class="btn-octicon" data-tooltip-content=" {{ .EditFileTooltip }} "> {{ svg "octicon-pencil" }} </span></a>
2022-01-07 04:18:52 +03:00
{{ else }}
2023-03-24 13:35:38 +03:00
<span class="btn-octicon disabled" data-tooltip-content=" {{ .EditFileTooltip }} "> {{ svg "octicon-pencil" }} </span>
2022-01-07 04:18:52 +03:00
{{ end }}
{{ if .CanDeleteFile }}
2023-03-24 13:35:38 +03:00
<a href=" {{ .RepoLink }} /_delete/ {{ PathEscapeSegments .BranchName }} / {{ PathEscapeSegments .TreePath }} "><span class="btn-octicon btn-octicon-danger" data-tooltip-content=" {{ .DeleteFileTooltip }} "> {{ svg "octicon-trash" }} </span></a>
2022-01-07 04:18:52 +03:00
{{ else }}
2023-03-24 13:35:38 +03:00
<span class="btn-octicon disabled" data-tooltip-content=" {{ .DeleteFileTooltip }} "> {{ svg "octicon-trash" }} </span>
2022-01-07 04:18:52 +03:00
{{ end }}
2020-11-01 23:04:26 +03:00
{{ end }}
2022-01-07 04:18:52 +03:00
{{ else if .EscapeStatus .Escaped }}
2024-03-24 21:23:38 +03:00
<button class="ui mini basic button unescape-button tw-mr-1 tw-hidden"> {{ ctx .Locale .Tr "repo.unescape_control_characters" }} </button>
Migrate margin and padding helpers to tailwind (#30043)
This will conclude the refactor of 1:1 class replacements to tailwind,
except `gt-hidden`. Commands ran:
```bash
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-0#tw-$1$2-0#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-1#tw-$1$2-0.5#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-2#tw-$1$2-1#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-3#tw-$1$2-2#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-4#tw-$1$2-4#g' {web_src/js,templates,routers,services}/**/*
perl -p -i -e 's#gt-(p|m)([lrtbxy])?-5#tw-$1$2-8#g' {web_src/js,templates,routers,services}/**/*
```
2024-03-24 19:42:49 +03:00
<button class="ui mini basic button escape-button tw-mr-1"> {{ ctx .Locale .Tr "repo.escape_control_characters" }} </button>
2020-11-01 23:04:26 +03:00
{{ end }}
2023-11-20 14:47:55 +03:00
{{ if and .ReadmeInList .CanEditReadmeFile }}
<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>
{{ end }}
2017-12-31 03:47:52 +03:00
</div>
2015-12-08 01:30:52 +03:00
</h4>
2024-04-18 11:34:23 +03:00
<div class="ui bottom attached table unstackable segment">
2022-12-03 18:47:00 +03:00
{{ if not ( or .IsMarkup .IsRenderedHTML ) }}
{{ template "repo/unicode_escape_prompt" dict "EscapeStatus" .EscapeStatus "root" $ }}
{{ end }}
2022-12-17 23:22:25 +03:00
<div class="file-view {{ if .IsMarkup }} markup {{ .MarkupType }} {{ else if .IsPlainText }} plain-text {{ else if .IsTextSource }} code-view {{ end }} ">
2024-04-01 16:11:30 +03:00
{{ if .IsFileTooLarge }}
{{ template "shared/filetoolarge" dict "RawFileLink" .RawFileLink }}
2024-06-13 04:06:46 +03:00
{{ else if not .FileSize }}
{{ template "shared/fileisempty" }}
2024-04-01 16:11:30 +03:00
{{ else if .IsMarkup }}
2023-12-17 17:38:54 +03:00
{{ if .FileContent }} {{ .FileContent }} {{ end }}
2022-12-17 23:22:25 +03:00
{{ else if .IsPlainText }}
2023-12-17 17:38:54 +03:00
<pre> {{ if .FileContent }} {{ .FileContent }} {{ end }} </pre>
2021-01-13 06:45:19 +03:00
{{ else if not .IsTextSource }}
2023-05-29 15:10:00 +03:00
<div class="view-raw">
2015-12-08 01:30:52 +03:00
{{ if .IsImageFile }}
2021-11-16 21:18:25 +03:00
<img src=" {{ $ .RawFileLink }} ">
2016-12-20 11:09:11 +03:00
{{ else if .IsVideoFile }}
2021-11-16 21:18:25 +03:00
<video controls src=" {{ $ .RawFileLink }} ">
2023-09-25 11:56:50 +03:00
<strong> {{ ctx .Locale .Tr "repo.video_not_supported_in_browser" }} </strong>
2016-12-20 11:09:11 +03:00
</video>
2018-10-30 05:17:26 +03:00
{{ else if .IsAudioFile }}
2021-11-16 21:18:25 +03:00
<audio controls src=" {{ $ .RawFileLink }} ">
2023-09-25 11:56:50 +03:00
<strong> {{ ctx .Locale .Tr "repo.audio_not_supported_in_browser" }} </strong>
2018-10-30 05:17:26 +03:00
</audio>
2016-04-27 04:48:44 +03:00
{{ else if .IsPDFFile }}
2023-09-25 11:56:50 +03:00
<div class="pdf-content is-loading" data-src=" {{ $ .RawFileLink }} " data-fallback-button-text=" {{ ctx .Locale .Tr "repo.diff.view_file" }} "></div>
2015-12-08 01:30:52 +03:00
{{ else }}
2024-04-01 16:11:30 +03:00
<a href=" {{ $ .RawFileLink }} " rel="nofollow" class="tw-p-4"> {{ ctx .Locale .Tr "repo.file_view_raw" }} </a>
2015-12-08 01:30:52 +03:00
{{ end }}
</div>
{{ else if .FileSize }}
2020-07-01 00:34:03 +03:00
<table>
<tbody>
2021-08-24 00:23:39 +03:00
{{ range $ idx , $ code : = .FileContent }}
Use a general Eval function for expressions in templates. (#23927)
One of the proposals in #23328
This PR introduces a simple expression calculator
(templates/eval/eval.go), it can do basic expression calculations.
Many untested template helper functions like `Mul` `Add` can be replaced
by this new approach.
Then these `Add` / `Mul` / `percentage` / `Subtract` / `DiffStatsWidth`
could all use this `Eval`.
And it provides enhancements for Golang templates, and improves
readability.
Some examples:
----
* Before: `{{Add (Mul $glyph.Row 12) 12}}`
* After: `{{Eval $glyph.Row "*" 12 "+" 12}}`
----
* Before: `{{if lt (Add $i 1) (len $.Topics)}}`
* After: `{{if Eval $i "+" 1 "<" (len $.Topics)}}`
## FAQ
### Why not use an existing expression package?
We need a highly customized expression engine:
* do the calculation on the fly, without pre-compiling
* deal with int/int64/float64 types, to make the result could be used in
Golang template.
* make the syntax could be used in the Golang template directly
* do not introduce too much complex or strange syntax, we just need a
simple calculator.
* it needs to strictly follow Golang template's behavior, for example,
Golang template treats all non-zero values as truth, but many 3rd
packages don't do so.
### What's the benefit?
* Developers don't need to add more `Add`/`Mul`/`Sub`-like functions,
they were getting more and more.
Now, only one `Eval` is enough for all cases.
* The new code reads better than old `{{Add (Mul $glyph.Row 12) 12}}`,
the old one isn't familiar to most procedural programming developers
(eg, the Golang expression syntax).
* The `Eval` is fully covered by tests, many old `Add`/`Mul`-like
functions were never tested.
### The performance?
It doesn't use `reflect`, it doesn't need to parse or compile when used
in Golang template, the performance is as fast as native Go template.
### Is it too complex? Could it be unstable?
The expression calculator program is a common homework for computer
science students, and it's widely used as a teaching and practicing
purpose for developers. The algorithm is pretty well-known.
The behavior can be clearly defined, it is stable.
2023-04-07 16:25:49 +03:00
{{ $ line : = Eval $ idx "+" 1 }}
2020-07-01 00:34:03 +03:00
<tr>
2021-11-30 01:01:56 +03:00
<td id="L {{ $ line }} " class="lines-num"><span id="L {{ $ line }} " data-line-number=" {{ $ line }} "></span></td>
2022-01-07 04:18:52 +03:00
{{ if $ .EscapeStatus .Escaped }}
2023-09-25 11:56:50 +03:00
<td class="lines-escape"> {{ if ( in dex $ .LineEscapeStatus $ idx ) .Escaped }} <button class="toggle-escape-button btn interact-bg" title=" {{ if ( in dex $ .LineEscapeStatus $ idx ) .HasInvisible }} {{ ctx .Locale .Tr "repo.invisible_runes_line" }} {{ end }} {{ if ( in dex $ .LineEscapeStatus $ idx ) .HasAmbiguous }} {{ ctx .Locale .Tr "repo.ambiguous_runes_line" }} {{ end }} "></button> {{ end }} </td>
2022-01-07 04:18:52 +03:00
{{ end }}
2023-12-17 17:38:54 +03:00
<td rel="L {{ $ line }} " class="lines-code chroma"><code class="code-inner"> {{ $ code }} </code></td>
2020-07-01 00:34:03 +03:00
</tr>
{{ end }}
</tbody>
</table>
2024-03-15 05:05:31 +03:00
<div class="code-line-menu tippy-target">
2024-04-17 11:31:37 +03:00
{{ if $ .Permission .CanRead ctx .Consts .RepoUnitTypeIssues }}
2024-03-15 05:05:31 +03:00
<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>
2022-08-09 15:37:34 +03:00
{{ end }}
2024-03-15 05:05:31 +03:00
<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>
2021-10-02 10:46:43 +03:00
</div>
2015-12-08 01:30:52 +03:00
{{ end }}
</div>
</div>
</div>