Fix wiki preview links
This commit is contained in:
parent
a52cd59727
commit
b1d7348a20
3 changed files with 43 additions and 40 deletions
|
@ -19,6 +19,7 @@ import (
|
||||||
"golang.org/x/net/html"
|
"golang.org/x/net/html"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/base"
|
"code.gitea.io/gitea/modules/base"
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/markup"
|
"code.gitea.io/gitea/modules/markup"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
)
|
)
|
||||||
|
@ -213,36 +214,17 @@ func cutoutVerbosePrefix(prefix string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// URLJoin joins url components, like path.Join, but preserving contents
|
// URLJoin joins url components, like path.Join, but preserving contents
|
||||||
func URLJoin(elem ...string) string {
|
func URLJoin(base string, elems ...string) string {
|
||||||
res := ""
|
u, err := url.Parse(base)
|
||||||
last := len(elem) - 1
|
if err != nil {
|
||||||
for i, item := range elem {
|
log.Error(4, "URLJoin: Invalid base URL %s", base)
|
||||||
res += item
|
return ""
|
||||||
if i != last && !strings.HasSuffix(res, "/") {
|
|
||||||
res += "/"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
cwdIndex := strings.Index(res, "/./")
|
joinArgs := make([]string, 0, len(elems)+1)
|
||||||
for cwdIndex != -1 {
|
joinArgs = append(joinArgs, u.Path)
|
||||||
res = strings.Replace(res, "/./", "/", 1)
|
joinArgs = append(joinArgs, elems...)
|
||||||
cwdIndex = strings.Index(res, "/./")
|
u.Path = path.Join(joinArgs...)
|
||||||
}
|
return u.String()
|
||||||
upIndex := strings.Index(res, "/..")
|
|
||||||
for upIndex != -1 {
|
|
||||||
res = strings.Replace(res, "/..", "", 1)
|
|
||||||
prevStart := -1
|
|
||||||
for i := upIndex - 1; i >= 0; i-- {
|
|
||||||
if res[i] == '/' {
|
|
||||||
prevStart = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if prevStart != -1 {
|
|
||||||
res = res[:prevStart] + res[upIndex:]
|
|
||||||
}
|
|
||||||
upIndex = strings.Index(res, "/..")
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// RenderIssueIndexPattern renders issue indexes to corresponding links.
|
// RenderIssueIndexPattern renders issue indexes to corresponding links.
|
||||||
|
|
|
@ -59,6 +59,27 @@ func testRenderIssueIndexPattern(t *testing.T, input, expected string, metas map
|
||||||
string(RenderIssueIndexPattern([]byte(input), AppSubURL, metas)))
|
string(RenderIssueIndexPattern([]byte(input), AppSubURL, metas)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestURLJoin(t *testing.T) {
|
||||||
|
type test struct {
|
||||||
|
Expected string
|
||||||
|
Base string
|
||||||
|
Elements []string
|
||||||
|
}
|
||||||
|
newTest := func(expected, base string, elements ...string) test {
|
||||||
|
return test{Expected: expected, Base: base, Elements: elements}
|
||||||
|
}
|
||||||
|
for _, test := range []test{
|
||||||
|
newTest("https://try.gitea.io/a/b/c",
|
||||||
|
"https://try.gitea.io", "a/b", "c"),
|
||||||
|
newTest("https://try.gitea.io/a/b/c",
|
||||||
|
"https://try.gitea.io/", "/a/b/", "/c/"),
|
||||||
|
newTest("https://try.gitea.io/a/c",
|
||||||
|
"https://try.gitea.io/", "/a/./b/", "../c/"),
|
||||||
|
} {
|
||||||
|
assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRender_IssueIndexPattern(t *testing.T) {
|
func TestRender_IssueIndexPattern(t *testing.T) {
|
||||||
// numeric: render inputs without valid mentions
|
// numeric: render inputs without valid mentions
|
||||||
test := func(s string) {
|
test := func(s string) {
|
||||||
|
@ -641,8 +662,8 @@ func testAnswers(baseURLContent, baseURLImages string) []string {
|
||||||
`<p>Wiki! Enjoy :)</p>
|
`<p>Wiki! Enjoy :)</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="` + baseURLContent + `Links" rel="nofollow">Links, Language bindings, Engine bindings</a></li>
|
<li><a href="` + baseURLContent + `/Links" rel="nofollow">Links, Language bindings, Engine bindings</a></li>
|
||||||
<li><a href="` + baseURLContent + `Tips" rel="nofollow">Tips</a></li>
|
<li><a href="` + baseURLContent + `/Tips" rel="nofollow">Tips</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>Ideas and codes</p>
|
<p>Ideas and codes</p>
|
||||||
|
@ -650,8 +671,8 @@ func testAnswers(baseURLContent, baseURLImages string) []string {
|
||||||
<ul>
|
<ul>
|
||||||
<li>Bezier widget (by <a href="` + AppURL + `r-lyeh" rel="nofollow">@r-lyeh</a>)<a href="https://github.com/ocornut/imgui/issues/786" rel="nofollow">#786</a></li>
|
<li>Bezier widget (by <a href="` + AppURL + `r-lyeh" rel="nofollow">@r-lyeh</a>)<a href="https://github.com/ocornut/imgui/issues/786" rel="nofollow">#786</a></li>
|
||||||
<li>Node graph editors<a href="https://github.com/ocornut/imgui/issues/306" rel="nofollow">#306</a></li>
|
<li>Node graph editors<a href="https://github.com/ocornut/imgui/issues/306" rel="nofollow">#306</a></li>
|
||||||
<li><a href="` + baseURLContent + `memory_editor_example" rel="nofollow">Memory Editor</a></li>
|
<li><a href="` + baseURLContent + `/memory_editor_example" rel="nofollow">Memory Editor</a></li>
|
||||||
<li><a href="` + baseURLContent + `plot_var_example" rel="nofollow">Plot var helper</a></li>
|
<li><a href="` + baseURLContent + `/plot_var_example" rel="nofollow">Plot var helper</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
`,
|
`,
|
||||||
`<h2>What is Wine Staging?</h2>
|
`<h2>What is Wine Staging?</h2>
|
||||||
|
@ -665,15 +686,15 @@ func testAnswers(baseURLContent, baseURLImages string) []string {
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th><a href="` + baseURLImages + `images/icon-install.png" rel="nofollow"><img src="` + baseURLImages + `images/icon-install.png" alt="images/icon-install.png" title="icon-install.png"/></a></th>
|
<th><a href="` + baseURLImages + `/images/icon-install.png" rel="nofollow"><img src="` + baseURLImages + `/images/icon-install.png" alt="images/icon-install.png" title="icon-install.png"/></a></th>
|
||||||
<th><a href="` + baseURLContent + `Installation" rel="nofollow">Installation</a></th>
|
<th><a href="` + baseURLContent + `/Installation" rel="nofollow">Installation</a></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="` + baseURLImages + `images/icon-usage.png" rel="nofollow"><img src="` + baseURLImages + `images/icon-usage.png" alt="images/icon-usage.png" title="icon-usage.png"/></a></td>
|
<td><a href="` + baseURLImages + `/images/icon-usage.png" rel="nofollow"><img src="` + baseURLImages + `/images/icon-usage.png" alt="images/icon-usage.png" title="icon-usage.png"/></a></td>
|
||||||
<td><a href="` + baseURLContent + `Usage" rel="nofollow">Usage</a></td>
|
<td><a href="` + baseURLContent + `/Usage" rel="nofollow">Usage</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@ -682,9 +703,9 @@ func testAnswers(baseURLContent, baseURLImages string) []string {
|
||||||
|
|
||||||
<ol>
|
<ol>
|
||||||
<li><a href="https://github.com/libgdx/libgdx/wiki/Gradle-on-the-Commandline#packaging-for-the-desktop" rel="nofollow">Package your libGDX application</a>
|
<li><a href="https://github.com/libgdx/libgdx/wiki/Gradle-on-the-Commandline#packaging-for-the-desktop" rel="nofollow">Package your libGDX application</a>
|
||||||
<a href="` + baseURLImages + `images/1.png" rel="nofollow"><img src="` + baseURLImages + `images/1.png" alt="images/1.png" title="1.png"/></a></li>
|
<a href="` + baseURLImages + `/images/1.png" rel="nofollow"><img src="` + baseURLImages + `/images/1.png" alt="images/1.png" title="1.png"/></a></li>
|
||||||
<li>Perform a test run by hitting the Run! button.
|
<li>Perform a test run by hitting the Run! button.
|
||||||
<a href="` + baseURLImages + `images/2.png" rel="nofollow"><img src="` + baseURLImages + `images/2.png" alt="images/2.png" title="2.png"/></a></li>
|
<a href="` + baseURLImages + `/images/2.png" rel="nofollow"><img src="` + baseURLImages + `/images/2.png" alt="images/2.png" title="2.png"/></a></li>
|
||||||
</ol>
|
</ol>
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
<input name="title" value="{{.title}}" autofocus required>
|
<input name="title" value="{{.title}}" autofocus required>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<textarea id="edit_area" name="content" data-id="wiki-{{.old_title}}" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{.RepoLink}}">{{if .PageIsWikiEdit}}{{.content}}{{else}}{{.i18n.Tr "repo.wiki.welcome"}}{{end}}</textarea required>
|
<textarea id="edit_area" name="content" data-id="wiki-{{.old_title}}" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{.RepoLink}}/wiki">{{if .PageIsWikiEdit}}{{.content}}{{else}}{{.i18n.Tr "repo.wiki.welcome"}}{{end}}</textarea required>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<input name="message" placeholder="{{.i18n.Tr "repo.wiki.default_commit_message"}}">
|
<input name="message" placeholder="{{.i18n.Tr "repo.wiki.default_commit_message"}}">
|
||||||
|
|
Reference in a new issue