mirror of
https://github.com/go-gitea/gitea.git
synced 2025-07-17 00:01:00 -04:00
Compare commits
7 Commits
390d270064
...
6886706f5a
Author | SHA1 | Date | |
---|---|---|---|
|
6886706f5a | ||
|
ce43208c6a | ||
|
4de80392bc | ||
|
ea7f0d6fcf | ||
|
21a1d76911 | ||
|
e8935606f5 | ||
|
5d621fe9a7 |
@ -47,6 +47,8 @@ We recommend [Google HTML/CSS Style Guide](https://google.github.io/styleguide/h
|
||||
7. Clarify variable types, prefer `elem.disabled = true` instead of `elem.setAttribute('disabled', 'anything')`, prefer `$el.prop('checked', var === 'yes')` instead of `$el.prop('checked', var)`.
|
||||
8. Use semantic elements, prefer `<button class="ui button">` instead of `<div class="ui button">`.
|
||||
9. Avoid unnecessary `!important` in CSS, add comments to explain why it's necessary if it can't be avoided.
|
||||
10. Avoid mixing different events in one event listener, prefer to use individual event listeners for every event.
|
||||
11. Custom event names are recommended to use `ce-` prefix.
|
||||
|
||||
### Accessibility / ARIA
|
||||
|
||||
@ -109,6 +111,22 @@ However, there are still some special cases, so the current guideline is:
|
||||
* Vue components are recommended to use `v-if` and `v-show` to show/hide elements.
|
||||
* Go template code should use Gitea's `.gt-hidden` and `showElem()/hideElem()/toggleElem()`, see more details in `.gt-hidden`'s comment.
|
||||
|
||||
### Styles and Attributes in Go HTML Template
|
||||
|
||||
It's recommended to use:
|
||||
|
||||
```html
|
||||
<div class="gt-name1 gt-name2 {{if .IsFoo}}gt-foo{{end}}" {{if .IsFoo}}data-foo{{end}}></div>
|
||||
```
|
||||
|
||||
instead of:
|
||||
|
||||
```html
|
||||
<div class="gt-name1 gt-name2{{if .IsFoo}} gt-foo{{end}}"{{if .IsFoo}} data-foo{{end}}></div>
|
||||
```
|
||||
|
||||
to make the code more readable.
|
||||
|
||||
### Legacy Code
|
||||
|
||||
A lot of legacy code already existed before this document's written. It's recommended to refactor legacy code to follow the guidelines.
|
||||
|
42
docs/content/doc/usage/labels.en-us.md
Normal file
42
docs/content/doc/usage/labels.en-us.md
Normal file
@ -0,0 +1,42 @@
|
||||
---
|
||||
date: "2023-03-04T19:00:00+00:00"
|
||||
title: "Usage: Labels"
|
||||
slug: "labels"
|
||||
weight: 13
|
||||
toc: false
|
||||
draft: false
|
||||
menu:
|
||||
sidebar:
|
||||
parent: "usage"
|
||||
name: "Labels"
|
||||
weight: 13
|
||||
identifier: "labels"
|
||||
---
|
||||
|
||||
# Labels
|
||||
|
||||
You can use labels to classify issues and pull requests and to improve your overview over them.
|
||||
|
||||
## Creating Labels
|
||||
|
||||
For repositories, labels can be created by going to `Issues` and clicking on `Labels`.
|
||||
|
||||
For organizations, you can define organization-wide labels that are shared with all organization repositories, including both already-existing repositories as well as newly created ones. Organization-wide labels can be created in the organization `Settings`.
|
||||
|
||||
Labels have a mandatory name, a mandatory color, an optional description, and must either be exclusive or not (see `Scoped labels` below).
|
||||
|
||||
When you create a repository, you can ensure certain labels exist by using the `Issue Labels` option. This option lists a number of available label sets that are [configured globally on your instance](../customizing-gitea/#labels). Its contained labels will all be created as well while creating the repository.
|
||||
|
||||
## Scoped Labels
|
||||
|
||||
A scoped label is a label that contains `/` in its name (not at either end of the name). For example labels `kind/bug` and `kind/enhancement` both have scope `kind`. Such labels will display the scope with slightly darker color.
|
||||
|
||||
The scope of a label is determined based on the **last** `/`, so for example the scope of label `scope/subscope/item` is `scope/subscope`.
|
||||
|
||||
Scoped labels can be marked as exclusive. This ensures at most a single label with the same scope is assigned to an issue or pull request. For example, if `kind/bug` and `kind/enhancement` are marked exclusive, an issue can only be classified as a bug or an enhancement.
|
||||
|
||||
## Filtering by Label
|
||||
|
||||
Issue and pull request lists can be filtered by label. Selecting multiple labels shows issues and pull requests that have all selected labels assigned.
|
||||
|
||||
By holding alt to click the label, issues and pull requests with the chosen label are excluded from the list.
|
@ -11,6 +11,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/markup"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
@ -229,7 +230,10 @@ John Doe john@doe.com This,note,had,a,lot,of,commas,to,test,delimiters`,
|
||||
}
|
||||
|
||||
for n, c := range cases {
|
||||
delimiter := determineDelimiter(&markup.RenderContext{RelativePath: c.filename}, []byte(decodeSlashes(t, c.csv)))
|
||||
delimiter := determineDelimiter(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
RelativePath: c.filename,
|
||||
}, []byte(decodeSlashes(t, c.csv)))
|
||||
assert.EqualValues(t, c.expectedDelimiter, delimiter, "case %d: delimiter should be equal, expected '%c' got '%c'", n, c.expectedDelimiter, delimiter)
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/markup"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
@ -23,7 +24,8 @@ func TestRenderConsole(t *testing.T) {
|
||||
canRender := render.CanRender("test", strings.NewReader(k))
|
||||
assert.True(t, canRender)
|
||||
|
||||
err := render.Render(&markup.RenderContext{}, strings.NewReader(k), &buf)
|
||||
err := render.Render(&markup.RenderContext{Ctx: git.DefaultContext},
|
||||
strings.NewReader(k), &buf)
|
||||
assert.NoError(t, err)
|
||||
assert.EqualValues(t, v, buf.String())
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/markup"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
@ -23,7 +24,8 @@ func TestRenderCSV(t *testing.T) {
|
||||
|
||||
for k, v := range kases {
|
||||
var buf strings.Builder
|
||||
err := render.Render(&markup.RenderContext{}, strings.NewReader(k), &buf)
|
||||
err := render.Render(&markup.RenderContext{Ctx: git.DefaultContext},
|
||||
strings.NewReader(k), &buf)
|
||||
assert.NoError(t, err)
|
||||
assert.EqualValues(t, v, buf.String())
|
||||
}
|
||||
|
@ -291,9 +291,10 @@ func RenderDescriptionHTML(
|
||||
// RenderEmoji for when we want to just process emoji and shortcodes
|
||||
// in various places it isn't already run through the normal markdown processor
|
||||
func RenderEmoji(
|
||||
ctx *RenderContext,
|
||||
content string,
|
||||
) (string, error) {
|
||||
return renderProcessString(&RenderContext{}, emojiProcessors, content)
|
||||
return renderProcessString(ctx, emojiProcessors, content)
|
||||
}
|
||||
|
||||
var (
|
||||
|
@ -9,6 +9,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
|
||||
@ -70,8 +71,13 @@ var localMetas = map[string]string{
|
||||
func TestRender_IssueIndexPattern(t *testing.T) {
|
||||
// numeric: render inputs without valid mentions
|
||||
test := func(s string) {
|
||||
testRenderIssueIndexPattern(t, s, s, &RenderContext{})
|
||||
testRenderIssueIndexPattern(t, s, s, &RenderContext{Metas: numericMetas})
|
||||
testRenderIssueIndexPattern(t, s, s, &RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
})
|
||||
testRenderIssueIndexPattern(t, s, s, &RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
Metas: numericMetas,
|
||||
})
|
||||
}
|
||||
|
||||
// should not render anything when there are no mentions
|
||||
@ -119,7 +125,10 @@ func TestRender_IssueIndexPattern2(t *testing.T) {
|
||||
links[i] = numericIssueLink(util.URLJoin(TestRepoURL, path), "ref-issue", index, marker)
|
||||
}
|
||||
expectedNil := fmt.Sprintf(expectedFmt, links...)
|
||||
testRenderIssueIndexPattern(t, s, expectedNil, &RenderContext{Metas: localMetas})
|
||||
testRenderIssueIndexPattern(t, s, expectedNil, &RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
Metas: localMetas,
|
||||
})
|
||||
|
||||
class := "ref-issue"
|
||||
if isExternal {
|
||||
@ -130,7 +139,10 @@ func TestRender_IssueIndexPattern2(t *testing.T) {
|
||||
links[i] = numericIssueLink(prefix, class, index, marker)
|
||||
}
|
||||
expectedNum := fmt.Sprintf(expectedFmt, links...)
|
||||
testRenderIssueIndexPattern(t, s, expectedNum, &RenderContext{Metas: numericMetas})
|
||||
testRenderIssueIndexPattern(t, s, expectedNum, &RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
Metas: numericMetas,
|
||||
})
|
||||
}
|
||||
|
||||
// should render freestanding mentions
|
||||
@ -164,7 +176,10 @@ func TestRender_IssueIndexPattern3(t *testing.T) {
|
||||
|
||||
// alphanumeric: render inputs without valid mentions
|
||||
test := func(s string) {
|
||||
testRenderIssueIndexPattern(t, s, s, &RenderContext{Metas: alphanumericMetas})
|
||||
testRenderIssueIndexPattern(t, s, s, &RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
Metas: alphanumericMetas,
|
||||
})
|
||||
}
|
||||
test("")
|
||||
test("this is a test")
|
||||
@ -194,7 +209,10 @@ func TestRender_IssueIndexPattern4(t *testing.T) {
|
||||
links[i] = externalIssueLink("https://someurl.com/someUser/someRepo/", "ref-issue ref-external-issue", name)
|
||||
}
|
||||
expected := fmt.Sprintf(expectedFmt, links...)
|
||||
testRenderIssueIndexPattern(t, s, expected, &RenderContext{Metas: alphanumericMetas})
|
||||
testRenderIssueIndexPattern(t, s, expected, &RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
Metas: alphanumericMetas,
|
||||
})
|
||||
}
|
||||
test("OTT-1234 test", "%s test", "OTT-1234")
|
||||
test("test T-12 issue", "test %s issue", "T-12")
|
||||
@ -214,7 +232,10 @@ func TestRender_IssueIndexPattern5(t *testing.T) {
|
||||
}
|
||||
|
||||
expected := fmt.Sprintf(expectedFmt, links...)
|
||||
testRenderIssueIndexPattern(t, s, expected, &RenderContext{Metas: metas})
|
||||
testRenderIssueIndexPattern(t, s, expected, &RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
Metas: metas,
|
||||
})
|
||||
}
|
||||
|
||||
test("abc ISSUE-123 def", "abc %s def",
|
||||
@ -235,7 +256,10 @@ func TestRender_IssueIndexPattern5(t *testing.T) {
|
||||
[]string{"ISSUE-123"},
|
||||
)
|
||||
|
||||
testRenderIssueIndexPattern(t, "will not match", "will not match", &RenderContext{Metas: regexpMetas})
|
||||
testRenderIssueIndexPattern(t, "will not match", "will not match", &RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
Metas: regexpMetas,
|
||||
})
|
||||
}
|
||||
|
||||
func testRenderIssueIndexPattern(t *testing.T, input, expected string, ctx *RenderContext) {
|
||||
@ -255,6 +279,7 @@ func TestRender_AutoLink(t *testing.T) {
|
||||
test := func(input, expected string) {
|
||||
var buffer strings.Builder
|
||||
err := PostProcess(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: TestRepoURL,
|
||||
Metas: localMetas,
|
||||
}, strings.NewReader(input), &buffer)
|
||||
@ -263,6 +288,7 @@ func TestRender_AutoLink(t *testing.T) {
|
||||
|
||||
buffer.Reset()
|
||||
err = PostProcess(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: TestRepoURL,
|
||||
Metas: localMetas,
|
||||
IsWiki: true,
|
||||
@ -292,6 +318,7 @@ func TestRender_FullIssueURLs(t *testing.T) {
|
||||
test := func(input, expected string) {
|
||||
var result strings.Builder
|
||||
err := postProcess(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: TestRepoURL,
|
||||
Metas: localMetas,
|
||||
}, []processor{fullIssuePatternProcessor}, strings.NewReader(input), &result)
|
||||
|
@ -91,6 +91,7 @@ func TestRender_CrossReferences(t *testing.T) {
|
||||
|
||||
test := func(input, expected string) {
|
||||
buffer, err := RenderString(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
RelativePath: "a.md",
|
||||
URLPrefix: setting.AppSubURL,
|
||||
Metas: localMetas,
|
||||
@ -135,6 +136,7 @@ func TestRender_links(t *testing.T) {
|
||||
|
||||
test := func(input, expected string) {
|
||||
buffer, err := RenderString(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
RelativePath: "a.md",
|
||||
URLPrefix: TestRepoURL,
|
||||
}, input)
|
||||
@ -234,6 +236,7 @@ func TestRender_email(t *testing.T) {
|
||||
|
||||
test := func(input, expected string) {
|
||||
res, err := RenderString(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
RelativePath: "a.md",
|
||||
URLPrefix: TestRepoURL,
|
||||
}, input)
|
||||
@ -292,6 +295,7 @@ func TestRender_emoji(t *testing.T) {
|
||||
test := func(input, expected string) {
|
||||
expected = strings.ReplaceAll(expected, "&", "&")
|
||||
buffer, err := RenderString(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
RelativePath: "a.md",
|
||||
URLPrefix: TestRepoURL,
|
||||
}, input)
|
||||
@ -355,11 +359,13 @@ func TestRender_ShortLinks(t *testing.T) {
|
||||
|
||||
test := func(input, expected, expectedWiki string) {
|
||||
buffer, err := markdown.RenderString(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: tree,
|
||||
}, input)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
||||
buffer, err = markdown.RenderString(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: TestRepoURL,
|
||||
Metas: localMetas,
|
||||
IsWiki: true,
|
||||
@ -461,12 +467,14 @@ func TestRender_RelativeImages(t *testing.T) {
|
||||
|
||||
test := func(input, expected, expectedWiki string) {
|
||||
buffer, err := markdown.RenderString(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: tree,
|
||||
Metas: localMetas,
|
||||
}, input)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
||||
buffer, err = markdown.RenderString(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: TestRepoURL,
|
||||
Metas: localMetas,
|
||||
IsWiki: true,
|
||||
@ -501,6 +509,7 @@ func Test_ParseClusterFuzz(t *testing.T) {
|
||||
|
||||
var res strings.Builder
|
||||
err := PostProcess(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: "https://example.com",
|
||||
Metas: localMetas,
|
||||
}, strings.NewReader(data), &res)
|
||||
@ -511,6 +520,7 @@ func Test_ParseClusterFuzz(t *testing.T) {
|
||||
|
||||
res.Reset()
|
||||
err = PostProcess(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: "https://example.com",
|
||||
Metas: localMetas,
|
||||
}, strings.NewReader(data), &res)
|
||||
@ -531,6 +541,7 @@ func TestIssue16020(t *testing.T) {
|
||||
|
||||
var res strings.Builder
|
||||
err := PostProcess(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: "https://example.com",
|
||||
Metas: localMetas,
|
||||
}, strings.NewReader(data), &res)
|
||||
@ -547,6 +558,7 @@ func BenchmarkEmojiPostprocess(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
var res strings.Builder
|
||||
err := PostProcess(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: "https://example.com",
|
||||
Metas: localMetas,
|
||||
}, strings.NewReader(data), &res)
|
||||
@ -557,6 +569,7 @@ func BenchmarkEmojiPostprocess(b *testing.B) {
|
||||
func TestFuzz(t *testing.T) {
|
||||
s := "t/l/issues/8#/../../a"
|
||||
renderContext := RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: "https://example.com/go-gitea/gitea",
|
||||
Metas: map[string]string{
|
||||
"user": "go-gitea",
|
||||
@ -574,6 +587,7 @@ func TestIssue18471(t *testing.T) {
|
||||
|
||||
var res strings.Builder
|
||||
err := PostProcess(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: "https://example.com",
|
||||
Metas: localMetas,
|
||||
}, strings.NewReader(data), &res)
|
||||
|
@ -52,12 +52,14 @@ func TestRender_StandardLinks(t *testing.T) {
|
||||
|
||||
test := func(input, expected, expectedWiki string) {
|
||||
buffer, err := RenderString(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: setting.AppSubURL,
|
||||
}, input)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
||||
|
||||
buffer, err = RenderString(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: setting.AppSubURL,
|
||||
IsWiki: true,
|
||||
}, input)
|
||||
@ -81,6 +83,7 @@ func TestRender_Images(t *testing.T) {
|
||||
|
||||
test := func(input, expected string) {
|
||||
buffer, err := RenderString(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: setting.AppSubURL,
|
||||
}, input)
|
||||
assert.NoError(t, err)
|
||||
@ -311,6 +314,7 @@ func TestTotal_RenderWiki(t *testing.T) {
|
||||
|
||||
for i := 0; i < len(testCases); i += 2 {
|
||||
line, err := RenderString(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: AppSubURL,
|
||||
IsWiki: true,
|
||||
}, testCases[i])
|
||||
@ -339,6 +343,7 @@ func TestTotal_RenderString(t *testing.T) {
|
||||
|
||||
for i := 0; i < len(testCases); i += 2 {
|
||||
line, err := RenderString(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: AppSubURL,
|
||||
}, testCases[i])
|
||||
assert.NoError(t, err)
|
||||
@ -348,17 +353,17 @@ func TestTotal_RenderString(t *testing.T) {
|
||||
|
||||
func TestRender_RenderParagraphs(t *testing.T) {
|
||||
test := func(t *testing.T, str string, cnt int) {
|
||||
res, err := RenderRawString(&markup.RenderContext{}, str)
|
||||
res, err := RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, str)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, cnt, strings.Count(res, "<p"), "Rendered result for unix should have %d paragraph(s) but has %d:\n%s\n", cnt, strings.Count(res, "<p"), res)
|
||||
|
||||
mac := strings.ReplaceAll(str, "\n", "\r")
|
||||
res, err = RenderRawString(&markup.RenderContext{}, mac)
|
||||
res, err = RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, mac)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, cnt, strings.Count(res, "<p"), "Rendered result for mac should have %d paragraph(s) but has %d:\n%s\n", cnt, strings.Count(res, "<p"), res)
|
||||
|
||||
dos := strings.ReplaceAll(str, "\n", "\r\n")
|
||||
res, err = RenderRawString(&markup.RenderContext{}, dos)
|
||||
res, err = RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, dos)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, cnt, strings.Count(res, "<p"), "Rendered result for windows should have %d paragraph(s) but has %d:\n%s\n", cnt, strings.Count(res, "<p"), res)
|
||||
}
|
||||
@ -386,7 +391,7 @@ func TestMarkdownRenderRaw(t *testing.T) {
|
||||
|
||||
for _, testcase := range testcases {
|
||||
log.Info("Test markdown render error with fuzzy data: %x, the following errors can be recovered", testcase)
|
||||
_, err := RenderRawString(&markup.RenderContext{}, string(testcase))
|
||||
_, err := RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, string(testcase))
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
}
|
||||
@ -398,7 +403,7 @@ func TestRenderSiblingImages_Issue12925(t *testing.T) {
|
||||
expected := `<p><a href="/image1" target="_blank" rel="nofollow noopener"><img src="/image1" alt="image1"></a><br>
|
||||
<a href="/image2" target="_blank" rel="nofollow noopener"><img src="/image2" alt="image2"></a></p>
|
||||
`
|
||||
res, err := RenderRawString(&markup.RenderContext{}, testcase)
|
||||
res, err := RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, expected, res)
|
||||
}
|
||||
@ -407,7 +412,7 @@ func TestRenderEmojiInLinks_Issue12331(t *testing.T) {
|
||||
testcase := `[Link with emoji :moon: in text](https://gitea.io)`
|
||||
expected := `<p><a href="https://gitea.io" rel="nofollow">Link with emoji <span class="emoji" aria-label="waxing gibbous moon">🌔</span> in text</a></p>
|
||||
`
|
||||
res, err := RenderString(&markup.RenderContext{}, testcase)
|
||||
res, err := RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, expected, res)
|
||||
}
|
||||
@ -441,7 +446,7 @@ func TestColorPreview(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, test := range positiveTests {
|
||||
res, err := RenderString(&markup.RenderContext{}, test.testcase)
|
||||
res, err := RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, test.testcase)
|
||||
assert.NoError(t, err, "Unexpected error in testcase: %q", test.testcase)
|
||||
assert.Equal(t, test.expected, res, "Unexpected result in testcase %q", test.testcase)
|
||||
|
||||
@ -461,7 +466,7 @@ func TestColorPreview(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, test := range negativeTests {
|
||||
res, err := RenderString(&markup.RenderContext{}, test)
|
||||
res, err := RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, test)
|
||||
assert.NoError(t, err, "Unexpected error in testcase: %q", test)
|
||||
assert.NotContains(t, res, `<span class="color-preview" style="background-color: `, "Unexpected result in testcase %q", test)
|
||||
}
|
||||
@ -508,7 +513,7 @@ func TestMathBlock(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, test := range testcases {
|
||||
res, err := RenderString(&markup.RenderContext{}, test.testcase)
|
||||
res, err := RenderString(&markup.RenderContext{Ctx: git.DefaultContext}, test.testcase)
|
||||
assert.NoError(t, err, "Unexpected error in testcase: %q", test.testcase)
|
||||
assert.Equal(t, test.expected, res, "Unexpected result in testcase %q", test.testcase)
|
||||
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/markup"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
@ -26,6 +27,7 @@ func TestRender_StandardLinks(t *testing.T) {
|
||||
|
||||
test := func(input, expected string) {
|
||||
buffer, err := RenderString(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: setting.AppSubURL,
|
||||
}, input)
|
||||
assert.NoError(t, err)
|
||||
@ -46,6 +48,7 @@ func TestRender_Images(t *testing.T) {
|
||||
|
||||
test := func(input, expected string) {
|
||||
buffer, err := RenderString(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: setting.AppSubURL,
|
||||
}, input)
|
||||
assert.NoError(t, err)
|
||||
@ -65,6 +68,7 @@ func TestRender_Source(t *testing.T) {
|
||||
|
||||
test := func(input, expected string) {
|
||||
buffer, err := RenderString(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
URLPrefix: setting.AppSubURL,
|
||||
}, input)
|
||||
assert.NoError(t, err)
|
||||
|
@ -385,10 +385,10 @@ func NewFuncMap() []template.FuncMap {
|
||||
// the table is NOT sorted with this header
|
||||
return ""
|
||||
},
|
||||
"RenderLabel": func(label *issues_model.Label) template.HTML {
|
||||
return template.HTML(RenderLabel(label))
|
||||
"RenderLabel": func(ctx context.Context, label *issues_model.Label) template.HTML {
|
||||
return template.HTML(RenderLabel(ctx, label))
|
||||
},
|
||||
"RenderLabels": func(labels []*issues_model.Label, repoLink string) template.HTML {
|
||||
"RenderLabels": func(ctx context.Context, labels []*issues_model.Label, repoLink string) template.HTML {
|
||||
htmlCode := `<span class="labels-list">`
|
||||
for _, label := range labels {
|
||||
// Protect against nil value in labels - shouldn't happen but would cause a panic if so
|
||||
@ -396,7 +396,7 @@ func NewFuncMap() []template.FuncMap {
|
||||
continue
|
||||
}
|
||||
htmlCode += fmt.Sprintf("<a href='%s/issues?labels=%d'>%s</a> ",
|
||||
repoLink, label.ID, RenderLabel(label))
|
||||
repoLink, label.ID, RenderLabel(ctx, label))
|
||||
}
|
||||
htmlCode += "</span>"
|
||||
return template.HTML(htmlCode)
|
||||
@ -808,7 +808,7 @@ func RenderIssueTitle(ctx context.Context, text, urlPrefix string, metas map[str
|
||||
}
|
||||
|
||||
// RenderLabel renders a label
|
||||
func RenderLabel(label *issues_model.Label) string {
|
||||
func RenderLabel(ctx context.Context, label *issues_model.Label) string {
|
||||
labelScope := label.ExclusiveScope()
|
||||
|
||||
textColor := "#111"
|
||||
@ -821,12 +821,12 @@ func RenderLabel(label *issues_model.Label) string {
|
||||
if labelScope == "" {
|
||||
// Regular label
|
||||
return fmt.Sprintf("<div class='ui label' style='color: %s !important; background-color: %s !important' title='%s'>%s</div>",
|
||||
textColor, label.Color, description, RenderEmoji(label.Name))
|
||||
textColor, label.Color, description, RenderEmoji(ctx, label.Name))
|
||||
}
|
||||
|
||||
// Scoped label
|
||||
scopeText := RenderEmoji(labelScope)
|
||||
itemText := RenderEmoji(label.Name[len(labelScope)+1:])
|
||||
scopeText := RenderEmoji(ctx, labelScope)
|
||||
itemText := RenderEmoji(ctx, label.Name[len(labelScope)+1:])
|
||||
|
||||
itemColor := label.Color
|
||||
scopeColor := label.Color
|
||||
@ -869,8 +869,9 @@ func RenderLabel(label *issues_model.Label) string {
|
||||
}
|
||||
|
||||
// RenderEmoji renders html text with emoji post processors
|
||||
func RenderEmoji(text string) template.HTML {
|
||||
renderedText, err := markup.RenderEmoji(template.HTMLEscapeString(text))
|
||||
func RenderEmoji(ctx context.Context, text string) template.HTML {
|
||||
renderedText, err := markup.RenderEmoji(&markup.RenderContext{Ctx: ctx},
|
||||
template.HTMLEscapeString(text))
|
||||
if err != nil {
|
||||
log.Error("RenderEmoji: %v", err)
|
||||
return template.HTML("")
|
||||
|
@ -228,7 +228,6 @@ internal_token_failed=Fehler beim Generieren des internen Tokens: %v
|
||||
secret_key_failed=Fehler beim Generieren des geheimen Schlüssels: %v
|
||||
save_config_failed=Fehler beim Speichern der Konfiguration: %v
|
||||
invalid_admin_setting=Administrator-Konto Einstellungen sind ungültig: %v
|
||||
install_success=Willkommen! Danke, dass du Gitea gewählt hast. Viel Spaß!
|
||||
invalid_log_root_path=Pfad zum Log-Verzeichnis ist ungültig: %v
|
||||
default_keep_email_private=E-Mail-Adressen standardmäßig verbergen
|
||||
default_keep_email_private_popup=E-Mail-Adressen von neuen Benutzern standardmäßig verbergen.
|
||||
|
@ -230,7 +230,6 @@ internal_token_failed=Αποτυχία δημιουργίας εσωτερικο
|
||||
secret_key_failed=Αποτυχία δημιουργίας μυστικού κλειδιού: %v
|
||||
save_config_failed=Αποτυχία αποθήκευσης ρυθμίσεων: %v
|
||||
invalid_admin_setting=Η ρύθμιση λογαριασμού διαχειριστή δεν είναι έγκυρη: %v
|
||||
install_success=Καλώς ορίσατε! Σας ευχαριστούμε που επιλέξατε το Gitea. Διασκεδάστε το και να είστε καλά!
|
||||
invalid_log_root_path=Η διαδρομή της καταγραφής δεν είναι έγκυρη: %v
|
||||
default_keep_email_private=Απόκρυψη διευθύνσεων email από προεπιλογή
|
||||
default_keep_email_private_popup=Απόκρυψη διευθύνσεων email των νέων λογαριασμών χρήστη σαν προεπιλογή.
|
||||
|
@ -230,7 +230,6 @@ internal_token_failed=Fallo al generar el INTERNAL_TOKEN: %v
|
||||
secret_key_failed=Fallo al generar el SECRET_KEY: %v
|
||||
save_config_failed=Error al guardar la configuración: %v
|
||||
invalid_admin_setting=La configuración de la cuenta de administración no es válida: %v
|
||||
install_success=¡Bienvenido! Gracias por elegir Gitea. ¡Diviértete y cuidate!
|
||||
invalid_log_root_path=La ruta para los registros no es válida: %v
|
||||
default_keep_email_private=Ocultar direcciones de correo electrónico por defecto
|
||||
default_keep_email_private_popup=Ocultar direcciones de correo electrónico de nuevas cuentas de usuario por defecto.
|
||||
|
@ -207,7 +207,6 @@ internal_token_failed=کد داخلی ایجاد نشد: %v
|
||||
secret_key_failed=کلید مخفی ایجاد نشد: %v
|
||||
save_config_failed=تنظیمات ذخیره نشد: %v
|
||||
invalid_admin_setting=تنظیمات حساب مدیر نامعتبر است: %v
|
||||
install_success=خوش آمدی! از شما به خاطر انتخاب گیتی یا گیتگو تشکر میکنیم. لذت ببرید و مراقب باشید!
|
||||
invalid_log_root_path=مسیر گزارش معتبر نیست: %v
|
||||
default_keep_email_private=مخفی کردن نشانی های ایمیل به صورت پیش فرض
|
||||
default_keep_email_private_popup=مخفی کردن نشانی های ایمیل از حساب های کاربر جدید به صورت پیش فرض.
|
||||
|
@ -220,7 +220,6 @@ invalid_repo_path=Repojen juuri polku on virheellinen: %v
|
||||
invalid_app_data_path=Sovelluksen datapolku on virheellinen: %v
|
||||
internal_token_failed=Sisäisen pääsymerkin luonti epäonnistui: %v
|
||||
save_config_failed=Asetusten tallentaminen epäonnistui: %v
|
||||
install_success=Tervetuloa! Kiitos kun valitsit Gitean. Pidä hauskaa!
|
||||
default_keep_email_private=Piilota sähköpostiosoitteet oletuksena
|
||||
default_keep_email_private_popup=Piilota oletusarvoisesti uusien käyttäjätilien sähköpostiosoitteet.
|
||||
default_enable_timetracking=Ota ajan seuranta oletusarvoisesti käyttöön
|
||||
|
@ -228,7 +228,6 @@ internal_token_failed=Impossible de générer le jeton interne : %v
|
||||
secret_key_failed=Impossible de générer la clé secrète : %v
|
||||
save_config_failed=L'enregistrement de la configuration %v a échoué
|
||||
invalid_admin_setting=Paramètres du compte administrateur invalides : %v
|
||||
install_success=Bienvenue et merci d'avoir choisi Gitea. Profitez-en bien !
|
||||
invalid_log_root_path=Le répertoire des fichiers de journalisation est invalide : %v
|
||||
default_keep_email_private=Masquer les adresses e-mail par défaut
|
||||
default_keep_email_private_popup=Masquer les adresses e-mail des nouveaux comptes utilisateurs par défaut.
|
||||
|
@ -180,7 +180,6 @@ invalid_repo_path=Repository gyökérkönyvtára helytelen: %v
|
||||
run_user_not_match=Futtató felhasználó más, mint az aktuális felhasználó: %s -> %s
|
||||
save_config_failed=Hiba történt a konfiguráció mentése közben: %v
|
||||
invalid_admin_setting=Hibás a rendszergazdai fiók beállítása: %v
|
||||
install_success=Üdvözlünk! Köszönjük, hogy a Gitea-t választottad és jó szórakozást kívánunk a használatához!
|
||||
invalid_log_root_path=Naplózás gyökérmappa érvénytelen: %v
|
||||
default_keep_email_private=E-mail címek elrejtése alapértelmezetten
|
||||
default_keep_email_private_popup=Az új felhasználói fiókok e-mail címeinek elrejtése alapértelmezetten.
|
||||
|
@ -228,7 +228,6 @@ internal_token_failed=Generazione del token interno non riuscita: %v
|
||||
secret_key_failed=Generazione della chiave segreta non riuscita: %v
|
||||
save_config_failed=Salvataggio della configurazione non riuscito: %v
|
||||
invalid_admin_setting=Le impostazioni dell'account amministratore sono invalide: %v
|
||||
install_success=Benvenuto! Grazie per aver scelto Gitea. Attenzione e buon divertimento!
|
||||
invalid_log_root_path=Il percorso del log non è valido: %v
|
||||
default_keep_email_private=Nascondi Indirizzo Email di Default
|
||||
default_keep_email_private_popup=Nasconi l'indirizzo email dei nuovi account utente di default.
|
||||
|
@ -237,7 +237,6 @@ internal_token_failed=内部トークンの生成に失敗しました: %v
|
||||
secret_key_failed=シークレットキーの生成に失敗しました: %v
|
||||
save_config_failed=設定ファイルの保存に失敗しました: %v
|
||||
invalid_admin_setting=管理者アカウントの設定が無効です: %v
|
||||
install_success=ようこそ! Giteaを選択していただき、ありがとうございます。楽しんでください!
|
||||
invalid_log_root_path=ログの保存先パスが無効です: %v
|
||||
default_keep_email_private=デフォルトでメールアドレスを隠す
|
||||
default_keep_email_private_popup=新しいユーザーアカウントで、デフォルトでメールアドレスを隠す設定にします。
|
||||
|
@ -170,7 +170,6 @@ invalid_repo_path=저장소(레파지토리) 의 경로가 올바르지 않습
|
||||
run_user_not_match=실행 사용자명이 현재 사용자명과 다릅니다.: %s -> %s
|
||||
save_config_failed=설정을 저장할 수 없습니다: %v
|
||||
invalid_admin_setting=관리자 계정 설정이 올바르지 않습니다: %v
|
||||
install_success=환영합니다! Gitea를 찾아주셔서 감사합니다. 즐거운 시간 보내세요!
|
||||
invalid_log_root_path=로그(Log) 의 경로가 올바르지 않습니다: %v
|
||||
default_keep_email_private=이메일 주소 숨김처리를 기본값으로 설정합니다.
|
||||
default_keep_email_private_popup=새 사용자에 대한 이메일 주소 숨김처리를 기본값으로 설정합니다.
|
||||
|
@ -227,7 +227,6 @@ internal_token_failed=Neizdevās uzģenerēt iekšējās saziņas talonu: %v
|
||||
secret_key_failed=Neizdevās uzģenerēt drošības atslēgu: %v
|
||||
save_config_failed=Neizdevās saglabāt konfigurāciju: %v
|
||||
invalid_admin_setting=Nederīgs administratora iestatījums: %v
|
||||
install_success=Laipni lūdzam! Paldies, ka izvēlējāties Gitea, patīkamu lietošanu!
|
||||
invalid_log_root_path=Nederīgs žurnalizēšanas ceļš: %v
|
||||
default_keep_email_private=Pēc noklusējuma slēpt e-pasta adreses
|
||||
default_keep_email_private_popup=Šī ir noklusētā pazīme, lai noteiktu lietotāja e-pasta adreses redzamību. Atzīmējot to e-pasta adrese visiem jaunajiem lietotājiem nebūs redzama līdz lietotājs neizmainīs to savos iestatījumos.
|
||||
|
@ -228,7 +228,6 @@ internal_token_failed=Interne token genereren mislukt: %v
|
||||
secret_key_failed=Geheime sleutel genereren mislukt: %v
|
||||
save_config_failed=Kan de configuratie niet opslaan: %v
|
||||
invalid_admin_setting=Instelling van de administrator-account is ongeldig: %v
|
||||
install_success=Welkom! Bedankt dat u voor Gitea heeft gekozen. Veel plezier en succes ermee!
|
||||
invalid_log_root_path=Ongeldig log-pad: %v
|
||||
default_keep_email_private=Verberg standaard alle e-mailadressen
|
||||
default_keep_email_private_popup=Verberg standaard de email-adressen van nieuwe gebruikers.
|
||||
|
@ -226,7 +226,6 @@ internal_token_failed=Nie udało się wygenerować tokenu wewnętrznego: %v
|
||||
secret_key_failed=Nie udało się wygenerować tajnego klucza: %v
|
||||
save_config_failed=Nie udało się zapisać konfiguracji: %v
|
||||
invalid_admin_setting=Nieprawidłowe ustawienia konta administratora: %v
|
||||
install_success=Witaj! Dziękujemy za wybranie Gitea. Miłej zabawy i trzymaj się!
|
||||
invalid_log_root_path=Ścieżka dla logów jest niepoprawna: %v
|
||||
default_keep_email_private=Domyślne ukrywanie adresów e-mail
|
||||
default_keep_email_private_popup=Domyślnie ukrywaj adresy e-mail nowych kont użytkowników.
|
||||
|
@ -237,7 +237,6 @@ internal_token_failed=Falha ao gerar o token interno: %v
|
||||
secret_key_failed=Falha ao gerar a chave secreta: %v
|
||||
save_config_failed=Falha ao salvar a configuração: %v
|
||||
invalid_admin_setting=Configuração da conta de administrador está inválida: %v
|
||||
install_success=Bem-vindo! Obrigado por escolher Gitea. Divertir-se. E, tome cuidado!
|
||||
invalid_log_root_path=Pasta raíz do log está inválida: %v
|
||||
default_keep_email_private=Ocultar endereços de e-mail por padrão
|
||||
default_keep_email_private_popup=Ocultar endereços de e-mail de novas contas de usuário por padrão.
|
||||
|
@ -237,7 +237,6 @@ internal_token_failed=Falha ao gerar o código interno: %v
|
||||
secret_key_failed=Falha ao gerar a chave secreta: %v
|
||||
save_config_failed=Falhou ao guardar a configuração: %v
|
||||
invalid_admin_setting=A configuração da conta de administrador é inválida: %v
|
||||
install_success=Bem-vindo(a)! Obrigado por escolher o Gitea. Divirta-se e aproveite!
|
||||
invalid_log_root_path=A localização dos registos é inválida: %v
|
||||
default_keep_email_private=Esconder, por norma, os endereços de email
|
||||
default_keep_email_private_popup=Esconder, por norma, os endereços de email de novos utilizadores.
|
||||
@ -248,6 +247,7 @@ default_enable_timetracking_popup=Habilitar, por norma, a contagem do tempo nos
|
||||
no_reply_address=Domínio dos emails ocultos
|
||||
no_reply_address_helper=Nome de domínio para utilizadores com um endereço de email oculto. Por exemplo, o nome de utilizador 'silva' será registado no Git como 'silva@semresposta.exemplo.org' se o domínio de email oculto estiver definido como 'semresposta.exemplo.org'.
|
||||
password_algorithm=Algoritmo de Hash da Senha
|
||||
invalid_password_algorithm=Algoritmo de hash da senha inválido
|
||||
password_algorithm_helper=Definir o algoritmo de hash da senha. Os algoritmos têm requisitos e resistência distintos. `argon2`, embora tenha boas características, usa muita memória e pode ser inapropriado para sistemas pequenos.
|
||||
enable_update_checker=Habilitar verificador de novidades
|
||||
enable_update_checker_helper=Verifica, periodicamente, se foi lançada alguma versão nova, fazendo uma ligação ao gitea.io.
|
||||
|
@ -226,7 +226,6 @@ internal_token_failed=Не удалось создать внутренний т
|
||||
secret_key_failed=Не удалось создать секретный ключ: %v
|
||||
save_config_failed=Не удалось сохранить конфигурацию: %v
|
||||
invalid_admin_setting=Некорректные настройки учётной записи администратора: %v
|
||||
install_success=Добро пожаловать! Благодарим вас за выбор Gitea, пользуйтесь с удовольствием!
|
||||
invalid_log_root_path=Недопустимый путь для логов: %v
|
||||
default_keep_email_private=Скрывать адреса электронной почты по умолчанию
|
||||
default_keep_email_private_popup=Скрывать адреса электронной почты новых учетных записей по умолчанию.
|
||||
|
@ -196,7 +196,6 @@ invalid_repo_path=නිධි මූල මාර්ගය අවලංගු
|
||||
run_user_not_match='ලෙස ධාවනය කරන්න' පරිශීලක නාමය වත්මන් පරිශීලක නාමය නොවේ: %s -> %s
|
||||
save_config_failed=වින්යාසය සුරැකීමට අසමත් විය: %v
|
||||
invalid_admin_setting=පරිපාලක ගිණුම් සැකසුම අවලංගුයි: %v
|
||||
install_success=සාදරයෙන් පිළිගනිමු! ගිටියා තෝරා ගැනීම ගැන ස්තූතියි. විනෝද වන්න!
|
||||
invalid_log_root_path=ලොග් මාර්ගය අවලංගුයි: %v
|
||||
default_keep_email_private=පෙරනිමියෙන් ඊමේල් ලිපින සඟවන්න
|
||||
default_keep_email_private_popup=පෙරනිමියෙන් නව පරිශීලක ගිණුම්වල විද්යුත් තැපැල් ලිපින සඟවන්න.
|
||||
|
@ -227,7 +227,6 @@ internal_token_failed=Nepodarilo sa vygenerovať interný token: %v
|
||||
secret_key_failed=Nepodarilo sa vygenerovať tajný kľúč: %v
|
||||
save_config_failed=Nepodarilo sa uložiť konfiguráciu: %v
|
||||
invalid_admin_setting=Nastavenie administrátorského účtu je neplatné: %v
|
||||
install_success=Vitajte! Ďakujeme že ste si vybrali Gitea. Veľa zábavy a opatrujte sa!
|
||||
invalid_log_root_path=Cesta k logom je neplatná: %v
|
||||
default_keep_email_private=Skrývanie e-mail adries ako predvolené
|
||||
default_keep_email_private_popup=Predvolene skryť e-mailové adresy nových používateľských účtov.
|
||||
|
@ -184,7 +184,6 @@ invalid_repo_path=Utvecklingskatalogens rotsökväg är ogiltig: %v
|
||||
run_user_not_match=Systemtjänstanvändaren är inte den nuvarande användaren: %s -> %s
|
||||
save_config_failed=Misslyckades att spara konfigurationen: %v
|
||||
invalid_admin_setting=Inställning för administartörskontot är ogiltig: %v
|
||||
install_success=Välkommen! Tack för att du valt Gitea. Ha det så roligt, väl mött!
|
||||
invalid_log_root_path=Sökvägen för loggar är ogiltig: %v
|
||||
default_keep_email_private=Dölj mailadresser som standard
|
||||
default_keep_email_private_popup=Dölj mailadresser för nya användarkonton som standard.
|
||||
|
@ -230,7 +230,6 @@ internal_token_failed=Dahili belirteç oluşturulamadı: %v
|
||||
secret_key_failed=Gizli anahtar oluşturulamadı: %v
|
||||
save_config_failed=%v Yapılandırması kaydedilirken hata oluştu
|
||||
invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v
|
||||
install_success=Hoşgeldiniz! Gitea'yı seçtiğiniz için teşekkür ederiz. Eğlenin ve kendinize iyi bakın!
|
||||
invalid_log_root_path=Log dosya yolu geçersiz: %v
|
||||
default_keep_email_private=E-posta adreslerini varsayılan olarak gizle
|
||||
default_keep_email_private_popup=Yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
|
||||
|
@ -210,7 +210,6 @@ internal_token_failed=Не вдалося згенерувати внутріш
|
||||
secret_key_failed=Не вдалося згенерувати секретний ключ: %v
|
||||
save_config_failed=Не в змозі зберегти конфігурацію: %v
|
||||
invalid_admin_setting=Неприпустимі налаштування облікового запису адміністратора: %v
|
||||
install_success=Ласкаво просимо! Дякуємо вам за вибір Gitea. Розважайтеся, і будьте обережні!
|
||||
invalid_log_root_path=Неприпустимий шлях для логів: %v
|
||||
default_keep_email_private=Приховати адресу електронної пошти за замовчуванням
|
||||
default_keep_email_private_popup=Приховати адресу електронної пошти нових облікових записів за замовчуванням.
|
||||
|
@ -237,7 +237,6 @@ internal_token_failed=生成内部令牌失败: %v
|
||||
secret_key_failed=生成密钥失败: %v
|
||||
save_config_failed=应用配置保存失败:%v
|
||||
invalid_admin_setting=管理员帐户设置无效: %v
|
||||
install_success=欢迎 !非常感谢您选择 Gitea,玩得开心。
|
||||
invalid_log_root_path=日志路径无效: %v
|
||||
default_keep_email_private=默认情况下隐藏电子邮件地址
|
||||
default_keep_email_private_popup=默认情况下, 隐藏新用户帐户的电子邮件地址。
|
||||
@ -248,6 +247,7 @@ default_enable_timetracking_popup=默认情况下启用新仓库的时间跟踪
|
||||
no_reply_address=隐藏电子邮件
|
||||
no_reply_address_helper=具有隐藏电子邮件地址的用户的域名。例如, 用户名 "joe" 将以 "joe@noreply.example.org" 的身份登录到 Git 中. 如果隐藏的电子邮件域设置为 "noreply.example.org"。
|
||||
password_algorithm=密码哈希算法
|
||||
invalid_password_algorithm=无效的密码哈希算法
|
||||
password_algorithm_helper=设置密码哈希算法。 算法具有不同的要求和强度。 具有良好特性的`argon2`却会占用大量内存,可能不适用于小型系统。
|
||||
enable_update_checker=启用更新检查
|
||||
enable_update_checker_helper=通过连接到 gitea.io 定期检查新版本发布。
|
||||
|
@ -228,7 +228,6 @@ internal_token_failed=產生內部 Token 失敗:%v
|
||||
secret_key_failed=產生密鑰失敗:%v
|
||||
save_config_failed=儲存設定失敗:%v
|
||||
invalid_admin_setting=管理員帳戶設定不正確:%v
|
||||
install_success=歡迎!非常感謝您選擇 Gitea,祝你一切順利。
|
||||
invalid_log_root_path=日誌根目錄設定不正確: %v
|
||||
default_keep_email_private=預設隱藏電子信箱
|
||||
default_keep_email_private_popup=預設隱藏新使用者的電子信箱。
|
||||
|
@ -474,7 +474,7 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader, ski
|
||||
sb := strings.Builder{}
|
||||
|
||||
// OK let's set a reasonable buffer size.
|
||||
// This should be let's say at least the size of maxLineCharacters or 4096 whichever is larger.
|
||||
// This should be at least the size of maxLineCharacters or 4096 whichever is larger.
|
||||
readerSize := maxLineCharacters
|
||||
if readerSize < 4096 {
|
||||
readerSize = 4096
|
||||
|
@ -234,7 +234,7 @@
|
||||
{{if or .Labels .Assignees}}
|
||||
<div class="extra content labels-list gt-p-0 gt-pt-2">
|
||||
{{range .Labels}}
|
||||
<a target="_blank" href="{{$.RepoLink}}/issues?labels={{.ID}}">{{RenderLabel .}}</a>
|
||||
<a target="_blank" href="{{$.RepoLink}}/issues?labels={{.ID}}">{{RenderLabel $.Context .}}</a>
|
||||
{{end}}
|
||||
<div class="right floated">
|
||||
{{range .Assignees}}
|
||||
|
@ -129,7 +129,7 @@
|
||||
<span class="ui green label">{{$.locale.Tr "repo.activity.published_release_label"}}</span>
|
||||
{{.TagName}}
|
||||
{{if not .IsTag}}
|
||||
<a class="title" href="{{$.RepoLink}}/src/{{.TagName | PathEscapeSegments}}">{{.Title | RenderEmoji}}</a>
|
||||
<a class="title" href="{{$.RepoLink}}/src/{{.TagName | PathEscapeSegments}}">{{.Title | RenderEmoji $.Context}}</a>
|
||||
{{end}}
|
||||
{{TimeSinceUnix .CreatedUnix $.locale}}
|
||||
</p>
|
||||
@ -149,7 +149,7 @@
|
||||
{{range .Activity.MergedPRs}}
|
||||
<p class="desc">
|
||||
<span class="ui purple label">{{$.locale.Tr "repo.activity.merged_prs_label"}}</span>
|
||||
#{{.Index}} <a class="title" href="{{$.RepoLink}}/pulls/{{.Index}}">{{.Issue.Title | RenderEmoji}}</a>
|
||||
#{{.Index}} <a class="title" href="{{$.RepoLink}}/pulls/{{.Index}}">{{.Issue.Title | RenderEmoji $.Context}}</a>
|
||||
{{TimeSinceUnix .MergedUnix $.locale}}
|
||||
</p>
|
||||
{{end}}
|
||||
@ -168,7 +168,7 @@
|
||||
{{range .Activity.OpenedPRs}}
|
||||
<p class="desc">
|
||||
<span class="ui green label">{{$.locale.Tr "repo.activity.opened_prs_label"}}</span>
|
||||
#{{.Index}} <a class="title" href="{{$.RepoLink}}/pulls/{{.Index}}">{{.Issue.Title | RenderEmoji}}</a>
|
||||
#{{.Index}} <a class="title" href="{{$.RepoLink}}/pulls/{{.Index}}">{{.Issue.Title | RenderEmoji $.Context}}</a>
|
||||
{{TimeSinceUnix .Issue.CreatedUnix $.locale}}
|
||||
</p>
|
||||
{{end}}
|
||||
@ -187,7 +187,7 @@
|
||||
{{range .Activity.ClosedIssues}}
|
||||
<p class="desc">
|
||||
<span class="ui red label">{{$.locale.Tr "repo.activity.closed_issue_label"}}</span>
|
||||
#{{.Index}} <a class="title" href="{{$.RepoLink}}/issues/{{.Index}}">{{.Title | RenderEmoji}}</a>
|
||||
#{{.Index}} <a class="title" href="{{$.RepoLink}}/issues/{{.Index}}">{{.Title | RenderEmoji $.Context}}</a>
|
||||
{{TimeSinceUnix .ClosedUnix $.locale}}
|
||||
</p>
|
||||
{{end}}
|
||||
@ -206,7 +206,7 @@
|
||||
{{range .Activity.OpenedIssues}}
|
||||
<p class="desc">
|
||||
<span class="ui green label">{{$.locale.Tr "repo.activity.new_issue_label"}}</span>
|
||||
#{{.Index}} <a class="title" href="{{$.RepoLink}}/issues/{{.Index}}">{{.Title | RenderEmoji}}</a>
|
||||
#{{.Index}} <a class="title" href="{{$.RepoLink}}/issues/{{.Index}}">{{.Title | RenderEmoji $.Context}}</a>
|
||||
{{TimeSinceUnix .CreatedUnix $.locale}}
|
||||
</p>
|
||||
{{end}}
|
||||
@ -227,9 +227,9 @@
|
||||
<span class="ui green label">{{$.locale.Tr "repo.activity.unresolved_conv_label"}}</span>
|
||||
#{{.Index}}
|
||||
{{if .IsPull}}
|
||||
<a class="title" href="{{$.RepoLink}}/pulls/{{.Index}}">{{.Title | RenderEmoji}}</a>
|
||||
<a class="title" href="{{$.RepoLink}}/pulls/{{.Index}}">{{.Title | RenderEmoji $.Context}}</a>
|
||||
{{else}}
|
||||
<a class="title" href="{{$.RepoLink}}/issues/{{.Index}}">{{.Title | RenderEmoji}}</a>
|
||||
<a class="title" href="{{$.RepoLink}}/issues/{{.Index}}">{{.Title | RenderEmoji $.Context}}</a>
|
||||
{{end}}
|
||||
{{TimeSinceUnix .UpdatedUnix $.locale}}
|
||||
</p>
|
||||
|
@ -61,7 +61,7 @@
|
||||
<td class="message">
|
||||
<span class="message-wrapper">
|
||||
{{if $.PageIsWiki}}
|
||||
<span class="commit-summary {{if gt .ParentCount 1}} grey text{{end}}" title="{{.Summary}}">{{.Summary | RenderEmoji}}</span>
|
||||
<span class="commit-summary {{if gt .ParentCount 1}} grey text{{end}}" title="{{.Summary}}">{{.Summary | RenderEmoji $.Context}}</span>
|
||||
{{else}}
|
||||
{{$commitLink:= printf "%s/commit/%s" $commitRepoLink (PathEscape .ID.String)}}
|
||||
<span class="commit-summary {{if gt .ParentCount 1}} grey text{{end}}" title="{{.Summary}}">{{RenderCommitMessageLinkSubject $.Context .Message $commitRepoLink $commitLink $.Repository.ComposeMetas}}</span>
|
||||
|
@ -1,9 +1,9 @@
|
||||
{{$file := .file}}
|
||||
{{range $j, $section := $file.Sections}}
|
||||
{{range $k, $line := $section.Lines}}
|
||||
{{if or $.root.AfterCommitID (ne .GetType 4)}}
|
||||
<tr class="{{DiffLineTypeToStr .GetType}}-code nl-{{$k}} ol-{{$k}}" data-line-type="{{DiffLineTypeToStr .GetType}}">
|
||||
{{if eq .GetType 4}}
|
||||
<tr class="{{DiffLineTypeToStr .GetType}}-code nl-{{$k}} ol-{{$k}}" data-line-type="{{DiffLineTypeToStr .GetType}}">
|
||||
{{if eq .GetType 4}}
|
||||
{{if $.root.AfterCommitID}}
|
||||
<td colspan="2" class="lines-num">
|
||||
{{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 5)}}
|
||||
<a role="button" class="blob-excerpt" data-url="{{$.root.RepoLink}}/blob_excerpt/{{PathEscape $.root.AfterCommitID}}" data-query="{{$line.GetBlobExcerptQuery}}&style=unified&direction=down&wiki={{$.root.PageIsWiki}}" data-anchor="diff-{{$file.NameHash}}K{{$line.SectionInfo.RightIdx}}">
|
||||
@ -22,35 +22,38 @@
|
||||
{{end}}
|
||||
</td>
|
||||
{{else}}
|
||||
<td class="lines-num lines-num-old" data-line-num="{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}"><span rel="{{if $line.LeftIdx}}diff-{{$file.NameHash}}L{{$line.LeftIdx}}{{end}}"></span></td>
|
||||
<td class="lines-num lines-num-new" data-line-num="{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}"><span rel="{{if $line.RightIdx}}diff-{{$file.NameHash}}R{{$line.RightIdx}}{{end}}"></span></td>
|
||||
{{/* for code file preview page or comment diffs on pull comment pages, do not show the expansion arrows */}}
|
||||
<td colspan="2" class="lines-num"></td>
|
||||
{{end}}
|
||||
{{$inlineDiff := $section.GetComputedInlineDiffFor $line $.root.locale -}}
|
||||
<td class="lines-escape">{{if $inlineDiff.EscapeStatus.Escaped}}<a href="" class="toggle-escape-button" title="{{template "repo/diff/escape_title" dict "diff" $inlineDiff "locale" $.root.locale}}"></a>{{end}}</td>
|
||||
<td class="lines-type-marker"><span class="gt-mono" data-type-marker="{{$line.GetLineTypeMarker}}"></span></td>
|
||||
{{if eq .GetType 4}}
|
||||
<td class="chroma lines-code blob-hunk">{{/*
|
||||
*/}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/*
|
||||
*/}}</td>
|
||||
{{else}}
|
||||
<td class="chroma lines-code{{if (not $line.RightIdx)}} lines-code-old{{end}}">{{/*
|
||||
*/}}{{if and $.root.SignedUserID $.root.PageIsPullFiles}}{{/*
|
||||
*/}}<a class="ui primary button add-code-comment add-code-comment-{{if $line.RightIdx}}right{{else}}left{{end}}{{if (not $line.CanComment)}} invisible{{end}}" data-side="{{if $line.RightIdx}}right{{else}}left{{end}}" data-idx="{{if $line.RightIdx}}{{$line.RightIdx}}{{else}}{{$line.LeftIdx}}{{end}}">{{/*
|
||||
*/}}{{svg "octicon-plus"}}{{/*
|
||||
*/}}</a>{{/*
|
||||
*/}}{{end}}{{/*
|
||||
*/}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/*
|
||||
*/}}</td>
|
||||
{{end}}
|
||||
</tr>
|
||||
{{if gt (len $line.Comments) 0}}
|
||||
<tr class="add-comment" data-line-type="{{DiffLineTypeToStr .GetType}}">
|
||||
<td colspan="3" class="lines-num"></td>
|
||||
<td class="add-comment-left add-comment-right" colspan="5">
|
||||
{{template "repo/diff/conversation" mergeinto $.root "comments" $line.Comments}}
|
||||
</td>
|
||||
</tr>
|
||||
{{else}}
|
||||
<td class="lines-num lines-num-old" data-line-num="{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}"><span rel="{{if $line.LeftIdx}}diff-{{$file.NameHash}}L{{$line.LeftIdx}}{{end}}"></span></td>
|
||||
<td class="lines-num lines-num-new" data-line-num="{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}"><span rel="{{if $line.RightIdx}}diff-{{$file.NameHash}}R{{$line.RightIdx}}{{end}}"></span></td>
|
||||
{{end}}
|
||||
{{$inlineDiff := $section.GetComputedInlineDiffFor $line $.root.locale -}}
|
||||
<td class="lines-escape">{{if $inlineDiff.EscapeStatus.Escaped}}<a href="" class="toggle-escape-button" title="{{template "repo/diff/escape_title" dict "diff" $inlineDiff "locale" $.root.locale}}"></a>{{end}}</td>
|
||||
<td class="lines-type-marker"><span class="gt-mono" data-type-marker="{{$line.GetLineTypeMarker}}"></span></td>
|
||||
{{if eq .GetType 4}}
|
||||
<td class="chroma lines-code blob-hunk">{{/*
|
||||
*/}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/*
|
||||
*/}}</td>
|
||||
{{else}}
|
||||
<td class="chroma lines-code{{if (not $line.RightIdx)}} lines-code-old{{end}}">{{/*
|
||||
*/}}{{if and $.root.SignedUserID $.root.PageIsPullFiles}}{{/*
|
||||
*/}}<a class="ui primary button add-code-comment add-code-comment-{{if $line.RightIdx}}right{{else}}left{{end}}{{if (not $line.CanComment)}} invisible{{end}}" data-side="{{if $line.RightIdx}}right{{else}}left{{end}}" data-idx="{{if $line.RightIdx}}{{$line.RightIdx}}{{else}}{{$line.LeftIdx}}{{end}}">{{/*
|
||||
*/}}{{svg "octicon-plus"}}{{/*
|
||||
*/}}</a>{{/*
|
||||
*/}}{{end}}{{/*
|
||||
*/}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/*
|
||||
*/}}</td>
|
||||
{{end}}
|
||||
</tr>
|
||||
{{if gt (len $line.Comments) 0}}
|
||||
<tr class="add-comment" data-line-type="{{DiffLineTypeToStr .GetType}}">
|
||||
<td colspan="3" class="lines-num"></td>
|
||||
<td class="add-comment-left add-comment-right" colspan="5">
|
||||
{{template "repo/diff/conversation" mergeinto $.root "comments" $line.Comments}}
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
<div class="diff-file-box">
|
||||
<div class="ui attached table segment">
|
||||
<div class="file-body file-code code-view code-diff-unified unicode-escaped">
|
||||
<div class="file-body file-code code-diff code-diff-unified unicode-escaped">
|
||||
<table>
|
||||
<tbody>
|
||||
{{template "repo/diff/section_unified" dict "file" .File "root" $}}
|
||||
|
@ -3,5 +3,5 @@
|
||||
id="label_{{.label.ID}}"
|
||||
href="{{.root.RepoLink}}/{{if or .root.IsPull .root.Issue.IsPull}}pulls{{else}}issues{{end}}?labels={{.label.ID}}"{{/* FIXME: use .root.Issue.Link or create .root.Link */}}
|
||||
>
|
||||
{{RenderLabel .label}}
|
||||
{{RenderLabel $.Context .label}}
|
||||
</a>
|
||||
|
@ -31,8 +31,8 @@
|
||||
<li class="item">
|
||||
<div class="ui grid middle aligned">
|
||||
<div class="nine wide column">
|
||||
{{RenderLabel .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji}}</small>{{end}}
|
||||
{{RenderLabel $.Context .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji $.Context}}</small>{{end}}
|
||||
</div>
|
||||
<div class="four wide column">
|
||||
{{if $.PageIsOrgSettingsLabels}}
|
||||
@ -70,8 +70,8 @@
|
||||
<li class="item">
|
||||
<div class="ui grid middle aligned">
|
||||
<div class="nine wide column">
|
||||
{{RenderLabel .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji}}</small>{{end}}
|
||||
{{RenderLabel $.Context .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji $.Context}}</small>{{end}}
|
||||
</div>
|
||||
<div class="four wide column">
|
||||
<a class="ui left open-issues" href="{{$.RepoLink}}/issues?labels={{.ID}}">{{svg "octicon-issue-opened"}} {{$.locale.Tr "repo.issues.label_open_issues" .NumOpenRepoIssues}}</a>
|
||||
|
@ -57,7 +57,7 @@
|
||||
<div class="ui divider"></div>
|
||||
{{end}}
|
||||
{{$previousExclusiveScope = $exclusiveScope}}
|
||||
<a class="item label-filter-item" href="{{$.Link}}?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.QueryString}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}" data-label-id="{{.ID}}">{{if .IsExcluded}}{{svg "octicon-circle-slash"}}{{else if .IsSelected}}{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}{{end}} {{RenderLabel .}}</a>
|
||||
<a class="item label-filter-item" href="{{$.Link}}?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.QueryString}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}" data-label-id="{{.ID}}">{{if .IsExcluded}}{{svg "octicon-circle-slash"}}{{else if .IsSelected}}{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}{{end}} {{RenderLabel $.Context .}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
@ -232,7 +232,7 @@
|
||||
{{end}}
|
||||
{{$previousExclusiveScope = $exclusiveScope}}
|
||||
<div class="item issue-action" data-action="toggle" data-element-id="{{.ID}}" data-url="{{$.RepoLink}}/issues/labels">
|
||||
{{if contain $.SelLabelIDs .ID}}{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}{{end}} {{RenderLabel .}}
|
||||
{{if contain $.SelLabelIDs .ID}}{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}{{end}} {{RenderLabel $.Context .}}
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
|
@ -58,7 +58,7 @@
|
||||
<span class="info">{{.locale.Tr "repo.issues.filter_label_exclude" | Safe}}</span>
|
||||
<a class="item" href="{{$.Link}}?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_label_no_select"}}</a>
|
||||
{{range .Labels}}
|
||||
<a class="item label-filter-item" href="{{$.Link}}?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.QueryString}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}" data-label-id="{{.ID}}">{{if .IsExcluded}}{{svg "octicon-circle-slash"}}{{else if contain $.SelLabelIDs .ID}}{{svg "octicon-check"}}{{end}} {{RenderLabel .}}</a>
|
||||
<a class="item label-filter-item" href="{{$.Link}}?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.QueryString}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}" data-label-id="{{.ID}}">{{if .IsExcluded}}{{svg "octicon-circle-slash"}}{{else if contain $.SelLabelIDs .ID}}{{svg "octicon-check"}}{{end}} {{RenderLabel $.Context .}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
@ -162,7 +162,7 @@
|
||||
<div class="menu">
|
||||
{{range .Labels}}
|
||||
<div class="item issue-action" data-action="toggle" data-element-id="{{.ID}}" data-url="{{$.RepoLink}}/issues/labels">
|
||||
{{if contain $.SelLabelIDs .ID}}{{svg "octicon-check"}}{{end}} {{RenderLabel .}}
|
||||
{{if contain $.SelLabelIDs .ID}}{{svg "octicon-check"}}{{end}} {{RenderLabel $.Context .}}
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
|
@ -60,8 +60,8 @@
|
||||
<div class="ui divider"></div>
|
||||
{{end}}
|
||||
{{$previousExclusiveScope = $exclusiveScope}}
|
||||
<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}invisible{{end}}">{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}</span> {{RenderLabel .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji}}</small>{{end}}</a>
|
||||
<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}invisible{{end}}">{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}</span> {{RenderLabel $.Context .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji $.Context}}</small>{{end}}</a>
|
||||
{{end}}
|
||||
|
||||
<div class="ui divider"></div>
|
||||
@ -72,8 +72,8 @@
|
||||
<div class="ui divider"></div>
|
||||
{{end}}
|
||||
{{$previousExclusiveScope = $exclusiveScope}}
|
||||
<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}invisible{{end}}">{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}</span> {{RenderLabel .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji}}</small>{{end}}</a>
|
||||
<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}invisible{{end}}">{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}</span> {{RenderLabel $.Context .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji $.Context}}</small>{{end}}</a>
|
||||
{{end}}
|
||||
{{else}}
|
||||
<div class="header" style="text-transform: none;font-size:14px;">{{.locale.Tr "repo.issues.new.no_items"}}</div>
|
||||
|
@ -180,11 +180,11 @@
|
||||
<span class="text grey muted-links">
|
||||
{{template "shared/user/authorlink" .Poster}}
|
||||
{{if and .AddedLabels (not .RemovedLabels)}}
|
||||
{{$.locale.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels .AddedLabels $.RepoLink) $createdStr | Safe}}
|
||||
{{$.locale.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels $.Context .AddedLabels $.RepoLink) $createdStr | Safe}}
|
||||
{{else if and (not .AddedLabels) .RemovedLabels}}
|
||||
{{$.locale.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels .RemovedLabels $.RepoLink) $createdStr | Safe}}
|
||||
{{$.locale.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels $.Context .RemovedLabels $.RepoLink) $createdStr | Safe}}
|
||||
{{else}}
|
||||
{{$.locale.Tr "repo.issues.add_remove_labels" (RenderLabels .AddedLabels $.RepoLink) (RenderLabels .RemovedLabels $.RepoLink) $createdStr | Safe}}
|
||||
{{$.locale.Tr "repo.issues.add_remove_labels" (RenderLabels $.Context .AddedLabels $.RepoLink) (RenderLabels $.Context .RemovedLabels $.RepoLink) $createdStr | Safe}}
|
||||
{{end}}
|
||||
</span>
|
||||
</div>
|
||||
@ -231,7 +231,7 @@
|
||||
{{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}}
|
||||
<span class="text grey muted-links">
|
||||
{{template "shared/user/authorlink" .Poster}}
|
||||
{{$.locale.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji) (.NewTitle|RenderEmoji) $createdStr | Safe}}
|
||||
{{$.locale.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji $.Context) (.NewTitle|RenderEmoji $.Context) $createdStr | Safe}}
|
||||
</span>
|
||||
</div>
|
||||
{{else if eq .Type 11}}
|
||||
|
@ -130,8 +130,8 @@
|
||||
<div class="ui divider"></div>
|
||||
{{end}}
|
||||
{{$previousExclusiveScope = $exclusiveScope}}
|
||||
<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}invisible{{end}}">{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}</span> {{RenderLabel .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji}}</small>{{end}}</a>
|
||||
<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}invisible{{end}}">{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}</span> {{RenderLabel $.Context .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji $.Context}}</small>{{end}}</a>
|
||||
{{end}}
|
||||
<div class="ui divider"></div>
|
||||
{{$previousExclusiveScope := "_no_scope"}}
|
||||
@ -141,8 +141,8 @@
|
||||
<div class="ui divider"></div>
|
||||
{{end}}
|
||||
{{$previousExclusiveScope = $exclusiveScope}}
|
||||
<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}invisible{{end}}">{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}</span> {{RenderLabel .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji}}</small>{{end}}</a>
|
||||
<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}invisible{{end}}">{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}</span> {{RenderLabel $.Context .}}
|
||||
{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji $.Context}}</small>{{end}}</a>
|
||||
{{end}}
|
||||
{{else}}
|
||||
<div class="header" style="text-transform: none;font-size:14px;">{{.locale.Tr "repo.issues.new.no_items"}}</div>
|
||||
@ -487,8 +487,8 @@
|
||||
{{range .BlockingDependencies}}
|
||||
<div class="item dependency{{if .Issue.IsClosed}} is-closed{{end}} gt-df gt-ac gt-sb">
|
||||
<div class="item-left gt-df gt-jc gt-fc gt-f1">
|
||||
<a class="title tooltip" href="{{.Issue.Link}}" data-content="#{{.Issue.Index}} {{.Issue.Title | RenderEmoji}}">
|
||||
#{{.Issue.Index}} {{.Issue.Title | RenderEmoji}}
|
||||
<a class="title tooltip" href="{{.Issue.Link}}" data-content="#{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}">
|
||||
#{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}
|
||||
</a>
|
||||
<div class="text small">
|
||||
{{.Repository.OwnerName}}/{{.Repository.Name}}
|
||||
@ -514,8 +514,8 @@
|
||||
{{range .BlockedByDependencies}}
|
||||
<div class="item dependency{{if .Issue.IsClosed}} is-closed{{end}} gt-df gt-ac gt-sb">
|
||||
<div class="item-left gt-df gt-jc gt-fc gt-f1">
|
||||
<a class="title tooltip" href="{{.Issue.Link}}" data-content="#{{.Issue.Index}} {{.Issue.Title | RenderEmoji}}">
|
||||
#{{.Issue.Index}} {{.Issue.Title | RenderEmoji}}
|
||||
<a class="title tooltip" href="{{.Issue.Link}}" data-content="#{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}">
|
||||
#{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}
|
||||
</a>
|
||||
<div class="text small">
|
||||
{{.Repository.OwnerName}}/{{.Repository.Name}}
|
||||
|
@ -245,7 +245,7 @@
|
||||
{{if or .Labels .Assignees}}
|
||||
<div class="extra content labels-list gt-p-0 gt-pt-2">
|
||||
{{range .Labels}}
|
||||
<a target="_blank" href="{{$.RepoLink}}/issues?labels={{.ID}}">{{RenderLabel .}}</a>
|
||||
<a target="_blank" href="{{$.RepoLink}}/issues?labels={{.ID}}">{{RenderLabel $.Context .}}</a>
|
||||
{{end}}
|
||||
<div class="right floated">
|
||||
{{range .Assignees}}
|
||||
|
@ -19,7 +19,7 @@
|
||||
<td class="message">
|
||||
<span class="truncate">
|
||||
<a href="{{$.RepoLink}}/commit/{{.SHA}}" title="{{.Summary | RenderEmojiPlain}}">
|
||||
{{.Summary | RenderEmoji}}
|
||||
{{.Summary | RenderEmoji $.Context}}
|
||||
</a>
|
||||
</span>
|
||||
</td>
|
||||
|
@ -34,7 +34,7 @@
|
||||
</div>
|
||||
<div class="issue-item-main gt-f1 gt-fc gt-df">
|
||||
<div class="issue-item-top-row">
|
||||
<a class="title gt-tdn issue-title" href="{{if .Link}}{{.Link}}{{else}}{{$.Link}}/{{.Index}}{{end}}">{{RenderEmoji .Title | RenderCodeBlock}}</a>
|
||||
<a class="title gt-tdn issue-title" href="{{if .Link}}{{.Link}}{{else}}{{$.Link}}/{{.Index}}{{end}}">{{RenderEmoji $.Context .Title | RenderCodeBlock}}</a>
|
||||
{{if .IsPull}}
|
||||
{{if (index $.CommitStatuses .PullRequest.ID)}}
|
||||
{{template "repo/commit_statuses" dict "Status" (index $.CommitLastStatus .PullRequest.ID) "Statuses" (index $.CommitStatuses .PullRequest.ID) "root" $}}
|
||||
@ -42,7 +42,7 @@
|
||||
{{end}}
|
||||
<span class="labels-list gt-ml-2">
|
||||
{{range .Labels}}
|
||||
<a href="{{$.Link}}?q={{$.Keyword}}&type={{$.ViewType}}&state={{$.State}}&labels={{.ID}}{{if ne $.listType "milestone"}}&milestone={{$.MilestoneID}}{{end}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{RenderLabel .}}</a>
|
||||
<a href="{{$.Link}}?q={{$.Keyword}}&type={{$.ViewType}}&state={{$.State}}&labels={{.ID}}{{if ne $.listType "milestone"}}&milestone={{$.MilestoneID}}{{end}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{RenderLabel $.Context .}}</a>
|
||||
{{end}}
|
||||
</span>
|
||||
</div>
|
||||
|
@ -72,7 +72,7 @@
|
||||
{{$index := index .GetIssueInfos 0}}
|
||||
{{$.locale.Tr "action.comment_pull" ((printf "%s/pulls/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}}
|
||||
{{else if eq .GetOpType 24}}
|
||||
{{$linkText := .Content | RenderEmoji}}
|
||||
{{$linkText := .Content | RenderEmoji $.Context}}
|
||||
{{$.locale.Tr "action.publish_release" (.GetRepoLink|Escape) ((printf "%s/releases/tag/%s" .GetRepoLink .GetTag)|Escape) (.ShortRepoPath|Escape) $linkText | Str2html}}
|
||||
{{else if eq .GetOpType 25}}
|
||||
{{$index := index .GetIssueInfos 0}}
|
||||
@ -99,20 +99,20 @@
|
||||
</ul>
|
||||
</div>
|
||||
{{else if eq .GetOpType 6}}
|
||||
<span class="text truncate issue title">{{index .GetIssueInfos 1 | RenderEmoji | RenderCodeBlock}}</span>
|
||||
<span class="text truncate issue title">{{index .GetIssueInfos 1 | RenderEmoji $.Context | RenderCodeBlock}}</span>
|
||||
{{else if eq .GetOpType 7}}
|
||||
<span class="text truncate issue title">{{index .GetIssueInfos 1 | RenderEmoji | RenderCodeBlock}}</span>
|
||||
<span class="text truncate issue title">{{index .GetIssueInfos 1 | RenderEmoji $.Context | RenderCodeBlock}}</span>
|
||||
{{else if or (eq .GetOpType 10) (eq .GetOpType 21) (eq .GetOpType 22) (eq .GetOpType 23)}}
|
||||
<a href="{{.GetCommentLink}}" class="text truncate issue title">{{.GetIssueTitle | RenderEmoji | RenderCodeBlock}}</a>
|
||||
<a href="{{.GetCommentLink}}" class="text truncate issue title">{{.GetIssueTitle | RenderEmoji $.Context | RenderCodeBlock}}</a>
|
||||
{{$comment := index .GetIssueInfos 1}}
|
||||
{{if gt (len $comment) 0}}<p class="text light grey">{{$comment | RenderEmoji}}</p>{{end}}
|
||||
{{if gt (len $comment) 0}}<p class="text light grey">{{$comment | RenderEmoji $.Context}}</p>{{end}}
|
||||
{{else if eq .GetOpType 11}}
|
||||
<p class="text light grey">{{index .GetIssueInfos 1}}</p>
|
||||
{{else if or (eq .GetOpType 12) (eq .GetOpType 13) (eq .GetOpType 14) (eq .GetOpType 15)}}
|
||||
<span class="text truncate issue title">{{.GetIssueTitle | RenderEmoji | RenderCodeBlock}}</span>
|
||||
<span class="text truncate issue title">{{.GetIssueTitle | RenderEmoji $.Context | RenderCodeBlock}}</span>
|
||||
{{else if eq .GetOpType 25}}
|
||||
<p class="text light grey">{{$.locale.Tr "action.review_dismissed_reason"}}</p>
|
||||
<p class="text light grey">{{index .GetIssueInfos 2 | RenderEmoji}}</p>
|
||||
<p class="text light grey">{{index .GetIssueInfos 2 | RenderEmoji $.Context}}</p>
|
||||
{{end}}
|
||||
<p class="text italic light grey">{{TimeSince .GetCreate $.locale}}</p>
|
||||
</div>
|
||||
|
@ -87,7 +87,7 @@ export default {
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$refs.root.addEventListener('us-load-context-popup', (e) => {
|
||||
this.$refs.root.addEventListener('ce-load-context-popup', (e) => {
|
||||
const data = e.detail;
|
||||
if (!this.loading && this.issue === null) {
|
||||
this.load(data);
|
||||
|
@ -13,6 +13,7 @@ function updateExclusiveLabelEdit(form) {
|
||||
|
||||
if (isExclusiveScopeName(nameInput.val())) {
|
||||
exclusiveField.removeClass('muted');
|
||||
exclusiveField.removeAttr('aria-disabled');
|
||||
if (exclusiveCheckbox.prop('checked') && exclusiveCheckbox.data('exclusive-warn')) {
|
||||
exclusiveWarning.removeClass('gt-hidden');
|
||||
} else {
|
||||
@ -20,6 +21,7 @@ function updateExclusiveLabelEdit(form) {
|
||||
}
|
||||
} else {
|
||||
exclusiveField.addClass('muted');
|
||||
exclusiveField.attr('aria-disabled', 'true');
|
||||
exclusiveWarning.addClass('gt-hidden');
|
||||
}
|
||||
}
|
||||
|
@ -31,8 +31,9 @@ export function initContextPopups() {
|
||||
createTippy(this, {
|
||||
content: el,
|
||||
interactive: true,
|
||||
interactiveBorder: 5,
|
||||
onShow: () => {
|
||||
el.firstChild.dispatchEvent(new CustomEvent('us-load-context-popup', {detail: {owner, repo, index}}));
|
||||
el.firstChild.dispatchEvent(new CustomEvent('ce-load-context-popup', {detail: {owner, repo, index}}));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user