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
					
				| 
						 | 
				
			
			@ -364,7 +364,7 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node, visitText
 | 
			
		|||
		}
 | 
			
		||||
	case html.ElementNode:
 | 
			
		||||
		if node.Data == "img" {
 | 
			
		||||
			for _, attr := range node.Attr {
 | 
			
		||||
			for i, attr := range node.Attr {
 | 
			
		||||
				if attr.Key != "src" {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -377,6 +377,7 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node, visitText
 | 
			
		|||
 | 
			
		||||
					attr.Val = util.URLJoin(prefix, attr.Val)
 | 
			
		||||
				}
 | 
			
		||||
				node.Attr[i] = attr
 | 
			
		||||
			}
 | 
			
		||||
		} else if node.Data == "a" {
 | 
			
		||||
			visitText = false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,6 +425,41 @@ func TestRender_ShortLinks(t *testing.T) {
 | 
			
		|||
		`<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) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue