2015-11-27 13:24:24 +08:00
{{ template "base/head" . }}
2023-02-02 06:56:10 +08:00
<div role="main" aria-label=" {{ .Title }} " class="page-content repository wiki view">
2015-11-27 13:24:24 +08:00
{{ template "repo/header" . }}
2022-08-31 23:58:54 +08:00
{{ $ title : = .title }}
2015-12-08 06:30:52 +08:00
<div class="ui container">
2023-02-14 01:59:59 +08:00
<div class="repo-button-row gt-df gt-ac gt-sb gt-fw">
<div class="gt-df gt-ac">
2015-12-08 06:30:52 +08:00
<div class="choose page">
2022-06-28 04:58:46 +08:00
<div class="ui floating filter dropdown" data-no-results=" {{ .locale .Tr "repo.pulls.no_results" }} ">
2015-12-08 06:30:52 +08:00
<div class="ui basic small button">
<span class="text">
2022-06-28 04:58:46 +08:00
{{ .locale .Tr "repo.wiki.page" }} :
2017-02-16 07:05:02 +08:00
<strong> {{ $ title }} </strong>
2015-12-08 06:30:52 +08:00
</span>
2020-11-01 06:15:11 +08:00
{{ svg "octicon-triangle-down" 1 4 "dropdown icon" }}
2015-12-08 06:30:52 +08:00
</div>
<div class="menu">
<div class="ui icon search input">
2023-02-14 01:59:59 +08:00
<i class="icon gt-df gt-ac gt-jc gt-m-0"> {{ svg "octicon-filter" 1 6 }} </i>
2022-06-28 04:58:46 +08:00
<input name="search" placeholder=" {{ .locale .Tr "repo.wiki.filter_page" }} ...">
2015-12-08 06:30:52 +08:00
</div>
2015-12-09 13:32:53 +08:00
<div class="scrolling menu">
2015-12-08 06:30:52 +08:00
{{ range .Pages }}
2017-11-28 17:43:51 +08:00
<div class="item {{ if eq $ .Title .Name }} selected {{ end }} " data-url=" {{ $ .RepoLink }} /wiki/ {{ .SubURL }} "> {{ .Name }} </div>
2015-12-08 06:30:52 +08:00
{{ end }}
</div>
</div>
</div>
</div>
</div>
2023-02-14 01:59:59 +08:00
<div class="gt-df gt-ac">
2015-12-08 06:30:52 +08:00
<div class="ui action small input" id="clone-panel">
2020-12-29 02:30:06 +08:00
{{ template "repo/clone_buttons" . }}
2022-08-01 02:29:55 +08:00
{{ template "repo/clone_script" . }}
2015-12-08 06:30:52 +08:00
</div>
</div>
</div>
2017-02-16 07:05:02 +08:00
<div class="ui dividing header">
2017-12-31 08:47:52 +08:00
<div class="ui stackable grid">
<div class="eight wide column">
2022-06-28 04:58:46 +08:00
<a class="file-revisions-btn ui basic button" title=" {{ .locale .Tr "repo.wiki.file_revision" }} " href=" {{ .RepoLink }} /wiki/ {{ .PageURL }} ?action=_revision" ><span> {{ .CommitCount }} </span> {{ svg "octicon-history" }} </a>
2017-12-31 08:47:52 +08:00
{{ $ title }}
<div class="ui sub header">
2022-06-28 04:58:46 +08:00
{{ $ timeSince : = TimeSince .Author .When $ .locale }}
{{ .locale .Tr "repo.wiki.last_commit_info" .Author .Name $ timeSince | Safe }}
2017-12-31 08:47:52 +08:00
</div>
</div>
<div class="eight wide right aligned column">
2022-01-07 09:18:52 +08:00
{{ if .EscapeStatus .Escaped }}
2023-02-19 12:06:14 +08:00
<a class="ui small button unescape-button gt-hidden"> {{ .locale .Tr "repo.unescape_control_characters" }} </a>
2022-06-28 04:58:46 +08:00
<a class="ui small button escape-button"> {{ .locale .Tr "repo.escape_control_characters" }} </a>
2022-01-07 09:18:52 +08:00
{{ end }}
2018-11-28 19:26:14 +08:00
{{ if and .CanWriteWiki ( not .Repository .IsMirror ) }}
2017-12-31 08:47:52 +08:00
<div class="ui right">
2022-06-28 04:58:46 +08:00
<a class="ui small button" href=" {{ .RepoLink }} /wiki/ {{ .PageURL }} ?action=_edit"> {{ .locale .Tr "repo.wiki.edit_page_button" }} </a>
<a class="ui green small button" href=" {{ .RepoLink }} /wiki?action=_new"> {{ .locale .Tr "repo.wiki.new_page_button" }} </a>
<a class="ui red small button delete-button" href="" data-url=" {{ .RepoLink }} /wiki/ {{ .PageURL }} ?action=_delete" data-id=" {{ .PageURL }} "> {{ .locale .Tr "repo.wiki.delete_page_button" }} </a>
2017-12-31 08:47:52 +08:00
</div>
{{ end }}
2015-12-08 06:30:52 +08:00
</div>
</div>
</div>
2017-02-14 09:13:59 +08:00
{{ if .FormatWarning }}
<div class="ui negative message">
<p> {{ .FormatWarning }} </p>
</div>
{{ end }}
2023-04-08 05:30:04 +08:00
<div class="ui gt-mt-0 {{ if or .sidebarPresent .toc }} grid equal width {{ end }} ">
<div class="ui {{ if or .sidebarPresent .toc }} eleven wide column {{ else }} gt-ml-0 {{ end }} segment markup wiki-content-main">
2022-01-07 09:18:52 +08:00
{{ template "repo/unicode_escape_prompt" dict "EscapeStatus" .EscapeStatus "root" $ }}
{{ .content | Safe }}
2017-02-14 09:13:59 +08:00
</div>
2022-06-08 16:59:16 +08:00
{{ if or .sidebarPresent .toc }}
2017-02-14 09:13:59 +08:00
<div class="column" style="padding-top: 0;">
2022-06-08 16:59:16 +08:00
{{ if .toc }}
<div class="ui segment wiki-content-toc">
<details open>
<summary>
2022-06-28 04:58:46 +08:00
<div class="ui header"> {{ .locale .Tr "toc" }} </div>
2022-06-08 16:59:16 +08:00
</summary>
{{ $ level : = 0 }}
{{ range .toc }}
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 21:25:49 +08:00
{{ if lt $ level .Level }} {{ range Iterate ( Eval .Level "-" $ level ) }} <ul> {{ end }} {{ end }}
{{ if gt $ level .Level }} {{ range Iterate ( Eval $ level "-" .Level ) }} </ul> {{ end }} {{ end }}
2022-06-08 16:59:16 +08:00
{{ $ level = .Level }}
<li><a href="# {{ .ID }} "> {{ .Text }} </a></li>
{{ end }}
{{ range Iterate $ level }} </ul> {{ end }}
</details>
</div>
{{ end }}
{{ if .sidebarPresent }}
<div class="ui segment wiki-content-sidebar">
{{ if and .CanWriteWiki ( not .Repository .IsMirror ) }}
2022-06-28 04:58:46 +08:00
<a class="ui right floated muted" href=" {{ .RepoLink }} /wiki/_Sidebar?action=_edit" aria-label=" {{ .locale .Tr "repo.wiki.edit_page_button" }} "> {{ svg "octicon-pencil" }} </a>
2022-06-08 16:59:16 +08:00
{{ end }}
{{ template "repo/unicode_escape_prompt" dict "EscapeStatus" .sidebarEscapeStatus "root" $ }}
{{ .sidebarContent | Safe }}
</div>
{{ end }}
2017-02-14 09:13:59 +08:00
</div>
{{ end }}
</div>
{{ if .footerPresent }}
2022-01-07 09:18:52 +08:00
<div class="ui segment wiki-content-footer">
{{ if and .CanWriteWiki ( not .Repository .IsMirror ) }}
2022-06-28 04:58:46 +08:00
<a class="ui right floated muted" href=" {{ .RepoLink }} /wiki/_Footer?action=_edit" aria-label=" {{ .locale .Tr "repo.wiki.edit_page_button" }} "> {{ svg "octicon-pencil" }} </a>
2022-01-07 09:18:52 +08:00
{{ end }}
{{ template "repo/unicode_escape_prompt" dict "footerEscapeStatus" .sidebarEscapeStatus "root" $ }}
{{ .footerContent | Safe }}
2015-11-27 13:24:24 +08:00
</div>
2017-02-14 09:13:59 +08:00
{{ end }}
2015-11-27 13:24:24 +08:00
</div>
</div>
2016-03-04 06:06:50 +08:00
<div class="ui small basic delete modal">
<div class="ui icon header">
2021-03-22 12:04:19 +08:00
{{ svg "octicon-trash" }}
2022-06-28 04:58:46 +08:00
{{ .locale .Tr "repo.wiki.delete_page_button" }}
2016-03-04 06:06:50 +08:00
</div>
<div class="content">
2022-06-28 04:58:46 +08:00
<p> {{ .locale .Tr "repo.wiki.delete_page_notice_1" ( $ title | Escape ) | Safe }} </p>
2016-03-04 06:06:50 +08:00
</div>
{{ template "base/delete_modal_actions" . }}
</div>
2015-12-08 06:30:52 +08:00
{{ template "base/footer" . }}