Fix relative links in postprocessed images (#16334)
If a pre-post-processed file contains relative img tags these need to be updated and joined correctly with the prefix. Finally, the node attributes need to be updated. Fix #16308 Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
parent
fae07cbc8f
commit
32fd11395b
2 changed files with 37 additions and 1 deletions
|
@ -364,7 +364,7 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node, visitText
|
||||||
}
|
}
|
||||||
case html.ElementNode:
|
case html.ElementNode:
|
||||||
if node.Data == "img" {
|
if node.Data == "img" {
|
||||||
for _, attr := range node.Attr {
|
for i, attr := range node.Attr {
|
||||||
if attr.Key != "src" {
|
if attr.Key != "src" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -377,6 +377,7 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node, visitText
|
||||||
|
|
||||||
attr.Val = util.URLJoin(prefix, attr.Val)
|
attr.Val = util.URLJoin(prefix, attr.Val)
|
||||||
}
|
}
|
||||||
|
node.Attr[i] = attr
|
||||||
}
|
}
|
||||||
} else if node.Data == "a" {
|
} else if node.Data == "a" {
|
||||||
visitText = false
|
visitText = false
|
||||||
|
|
|
@ -425,6 +425,41 @@ func TestRender_ShortLinks(t *testing.T) {
|
||||||
`<p><a href="https://example.org" rel="nofollow">[[foobar]]</a></p>`)
|
`<p><a href="https://example.org" rel="nofollow">[[foobar]]</a></p>`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRender_RelativeImages(t *testing.T) {
|
||||||
|
setting.AppURL = AppURL
|
||||||
|
setting.AppSubURL = AppSubURL
|
||||||
|
tree := util.URLJoin(AppSubURL, "src", "master")
|
||||||
|
|
||||||
|
test := func(input, expected, expectedWiki string) {
|
||||||
|
buffer, err := markdown.RenderString(&RenderContext{
|
||||||
|
URLPrefix: tree,
|
||||||
|
Metas: localMetas,
|
||||||
|
}, input)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
||||||
|
buffer, err = markdown.RenderString(&RenderContext{
|
||||||
|
URLPrefix: setting.AppSubURL,
|
||||||
|
Metas: localMetas,
|
||||||
|
IsWiki: true,
|
||||||
|
}, input)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(buffer))
|
||||||
|
}
|
||||||
|
|
||||||
|
rawwiki := util.URLJoin(AppSubURL, "wiki", "raw")
|
||||||
|
mediatree := util.URLJoin(AppSubURL, "media", "master")
|
||||||
|
|
||||||
|
test(
|
||||||
|
`<img src="Link">`,
|
||||||
|
`<img src="`+util.URLJoin(mediatree, "Link")+`"/>`,
|
||||||
|
`<img src="`+util.URLJoin(rawwiki, "Link")+`"/>`)
|
||||||
|
|
||||||
|
test(
|
||||||
|
`<img src="./icon.png">`,
|
||||||
|
`<img src="`+util.URLJoin(mediatree, "icon.png")+`"/>`,
|
||||||
|
`<img src="`+util.URLJoin(rawwiki, "icon.png")+`"/>`)
|
||||||
|
}
|
||||||
|
|
||||||
func Test_ParseClusterFuzz(t *testing.T) {
|
func Test_ParseClusterFuzz(t *testing.T) {
|
||||||
setting.AppURL = AppURL
|
setting.AppURL = AppURL
|
||||||
setting.AppSubURL = AppSubURL
|
setting.AppSubURL = AppSubURL
|
||||||
|
|
Loading…
Reference in a new issue