Fix markdown image with link (#4675)
* Fix markdown image with link * Add gitea copyright notice * add a test for markdown image with link * remove svg related variables
This commit is contained in:
		
							parent
							
								
									10370651fc
								
							
						
					
					
						commit
						b686bd0c94
					
				
					 2 changed files with 21 additions and 22 deletions
				
			
		|  | @ -1,4 +1,5 @@ | ||||||
| // Copyright 2014 The Gogs Authors. All rights reserved.
 | // Copyright 2014 The Gogs Authors. All rights reserved.
 | ||||||
|  | // Copyright 2018 The Gitea Authors. All rights reserved.
 | ||||||
| // Use of this source code is governed by a MIT-style
 | // Use of this source code is governed by a MIT-style
 | ||||||
| // license that can be found in the LICENSE file.
 | // license that can be found in the LICENSE file.
 | ||||||
| 
 | 
 | ||||||
|  | @ -38,7 +39,16 @@ func (r *Renderer) Link(out *bytes.Buffer, link []byte, title []byte, content [] | ||||||
| 		link = []byte(mLink) | 		link = []byte(mLink) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	r.Renderer.Link(out, link, title, content) | 	if len(content) > 10 && string(content[0:9]) == "<a href=\"" && bytes.Contains(content[9:], []byte("<img")) { | ||||||
|  | 		// Image with link case: markdown `[![]()]()`
 | ||||||
|  | 		// If the content is an image, then we change the original href around it
 | ||||||
|  | 		// which points to itself to a new address "link"
 | ||||||
|  | 		rightQuote := bytes.Index(content[9:], []byte("\"")) | ||||||
|  | 		content = bytes.Replace(content, content[9:9+rightQuote], link, 1) | ||||||
|  | 		out.Write(content) | ||||||
|  | 	} else { | ||||||
|  | 		r.Renderer.Link(out, link, title, content) | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // List renders markdown bullet or digit lists to HTML
 | // List renders markdown bullet or digit lists to HTML
 | ||||||
|  | @ -90,13 +100,6 @@ func (r *Renderer) ListItem(out *bytes.Buffer, text []byte, flags int) { | ||||||
| 	r.Renderer.ListItem(out, text, flags) | 	r.Renderer.ListItem(out, text, flags) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Note: this section is for purpose of increase performance and
 |  | ||||||
| // reduce memory allocation at runtime since they are constant literals.
 |  | ||||||
| var ( |  | ||||||
| 	svgSuffix         = []byte(".svg") |  | ||||||
| 	svgSuffixWithMark = []byte(".svg?") |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Image defines how images should be processed to produce corresponding HTML elements.
 | // Image defines how images should be processed to produce corresponding HTML elements.
 | ||||||
| func (r *Renderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) { | func (r *Renderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) { | ||||||
| 	prefix := r.URLPrefix | 	prefix := r.URLPrefix | ||||||
|  | @ -104,22 +107,14 @@ func (r *Renderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byt | ||||||
| 		prefix = util.URLJoin(prefix, "wiki", "raw") | 		prefix = util.URLJoin(prefix, "wiki", "raw") | ||||||
| 	} | 	} | ||||||
| 	prefix = strings.Replace(prefix, "/src/", "/raw/", 1) | 	prefix = strings.Replace(prefix, "/src/", "/raw/", 1) | ||||||
| 	if len(link) > 0 { | 	if len(link) > 0 && !markup.IsLink(link) { | ||||||
| 		if markup.IsLink(link) { | 		lnk := string(link) | ||||||
| 			// External link with .svg suffix usually means CI status.
 | 		lnk = util.URLJoin(prefix, lnk) | ||||||
| 			// TODO: define a keyword to allow non-svg images render as external link.
 | 		lnk = strings.Replace(lnk, " ", "+", -1) | ||||||
| 			if bytes.HasSuffix(link, svgSuffix) || bytes.Contains(link, svgSuffixWithMark) { | 		link = []byte(lnk) | ||||||
| 				r.Renderer.Image(out, link, title, alt) |  | ||||||
| 				return |  | ||||||
| 			} |  | ||||||
| 		} else { |  | ||||||
| 			lnk := string(link) |  | ||||||
| 			lnk = util.URLJoin(prefix, lnk) |  | ||||||
| 			lnk = strings.Replace(lnk, " ", "+", -1) |  | ||||||
| 			link = []byte(lnk) |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Put a link around it pointing to itself by default
 | ||||||
| 	out.WriteString(`<a href="`) | 	out.WriteString(`<a href="`) | ||||||
| 	out.Write(link) | 	out.Write(link) | ||||||
| 	out.WriteString(`">`) | 	out.WriteString(`">`) | ||||||
|  |  | ||||||
|  | @ -73,6 +73,7 @@ func TestRender_Images(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 	url := "../../.images/src/02/train.jpg" | 	url := "../../.images/src/02/train.jpg" | ||||||
| 	title := "Train" | 	title := "Train" | ||||||
|  | 	href := "https://gitea.io" | ||||||
| 	result := util.URLJoin(AppSubURL, url) | 	result := util.URLJoin(AppSubURL, url) | ||||||
| 
 | 
 | ||||||
| 	test( | 	test( | ||||||
|  | @ -82,6 +83,9 @@ func TestRender_Images(t *testing.T) { | ||||||
| 	test( | 	test( | ||||||
| 		"[["+title+"|"+url+"]]", | 		"[["+title+"|"+url+"]]", | ||||||
| 		`<p><a href="`+result+`" rel="nofollow"><img src="`+result+`" title="`+title+`" alt="`+title+`"/></a></p>`) | 		`<p><a href="`+result+`" rel="nofollow"><img src="`+result+`" title="`+title+`" alt="`+title+`"/></a></p>`) | ||||||
|  | 	test( | ||||||
|  | 		"[]("+href+")", | ||||||
|  | 		`<p><a href="`+href+`" rel="nofollow"><img src="`+result+`" alt="`+title+`"/></a></p>`) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func testAnswers(baseURLContent, baseURLImages string) []string { | func testAnswers(baseURLContent, baseURLImages string) []string { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue