mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	fix media description render for orgmode (#26895)
- In org mode you can specify an description for media via the following
syntax `[[description][media link]]`. The description is then used as
title or alt.
- This patch fixes the rendering of the description by seperating the
description and non-description cases and using `org.String()`.
- Added unit tests.
- Inspired by
6eb20dbda9/org/html_writer.go (L406-L427)
- Resolves https://codeberg.org/Codeberg/Community/issues/848
(cherry picked from commit 8b8aab83113b34bade61964e2097ed497abc39e9)
Co-authored-by: Gusted <postmaster@gusted.xyz>
			
			
This commit is contained in:
		@@ -153,18 +153,31 @@ func (r *Writer) WriteRegularLink(l org.RegularLink) {
 | 
				
			|||||||
		link = []byte(util.URLJoin(r.URLPrefix, lnk))
 | 
							link = []byte(util.URLJoin(r.URLPrefix, lnk))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	description := string(link)
 | 
						// Inspired by https://github.com/niklasfasching/go-org/blob/6eb20dbda93cb88c3503f7508dc78cbbc639378f/org/html_writer.go#L406-L427
 | 
				
			||||||
	if l.Description != nil {
 | 
					 | 
				
			||||||
		description = r.WriteNodesAsString(l.Description...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	switch l.Kind() {
 | 
						switch l.Kind() {
 | 
				
			||||||
	case "image":
 | 
						case "image":
 | 
				
			||||||
		imageSrc := getMediaURL(link)
 | 
							if l.Description == nil {
 | 
				
			||||||
		fmt.Fprintf(r, `<img src="%s" alt="%s" title="%s" />`, imageSrc, description, description)
 | 
								imageSrc := getMediaURL(link)
 | 
				
			||||||
 | 
								fmt.Fprintf(r, `<img src="%s" alt="%s" title="%s" />`, imageSrc, link, link)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								description := strings.TrimPrefix(org.String(l.Description...), "file:")
 | 
				
			||||||
 | 
								imageSrc := getMediaURL([]byte(description))
 | 
				
			||||||
 | 
								fmt.Fprintf(r, `<a href="%s"><img src="%s" alt="%s" /></a>`, link, imageSrc, imageSrc)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	case "video":
 | 
						case "video":
 | 
				
			||||||
		videoSrc := getMediaURL(link)
 | 
							if l.Description == nil {
 | 
				
			||||||
		fmt.Fprintf(r, `<video src="%s" title="%s">%s</video>`, videoSrc, description, description)
 | 
								imageSrc := getMediaURL(link)
 | 
				
			||||||
 | 
								fmt.Fprintf(r, `<video src="%s" title="%s">%s</video>`, imageSrc, link, link)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								description := strings.TrimPrefix(org.String(l.Description...), "file:")
 | 
				
			||||||
 | 
								videoSrc := getMediaURL([]byte(description))
 | 
				
			||||||
 | 
								fmt.Fprintf(r, `<a href="%s"><video src="%s" title="%s"></video></a>`, link, videoSrc, videoSrc)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
 | 
							description := string(link)
 | 
				
			||||||
 | 
							if l.Description != nil {
 | 
				
			||||||
 | 
								description = r.WriteNodesAsString(l.Description...)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		fmt.Fprintf(r, `<a href="%s" title="%s">%s</a>`, link, description, description)
 | 
							fmt.Fprintf(r, `<a href="%s" title="%s">%s</a>`, link, description, description)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,7 +42,7 @@ func TestRender_StandardLinks(t *testing.T) {
 | 
				
			|||||||
		"<p><a href=\""+lnk+"\" title=\"WikiPage\">WikiPage</a></p>")
 | 
							"<p><a href=\""+lnk+"\" title=\"WikiPage\">WikiPage</a></p>")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestRender_Images(t *testing.T) {
 | 
					func TestRender_Media(t *testing.T) {
 | 
				
			||||||
	setting.AppURL = AppURL
 | 
						setting.AppURL = AppURL
 | 
				
			||||||
	setting.AppSubURL = AppSubURL
 | 
						setting.AppSubURL = AppSubURL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -60,6 +60,18 @@ func TestRender_Images(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	test("[[file:"+url+"]]",
 | 
						test("[[file:"+url+"]]",
 | 
				
			||||||
		"<p><img src=\""+result+"\" alt=\""+result+"\" title=\""+result+"\" /></p>")
 | 
							"<p><img src=\""+result+"\" alt=\""+result+"\" title=\""+result+"\" /></p>")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// With description.
 | 
				
			||||||
 | 
						test("[[https://example.com][https://example.com/example.svg]]",
 | 
				
			||||||
 | 
							`<p><a href="https://example.com"><img src="https://example.com/example.svg" alt="https://example.com/example.svg" /></a></p>`)
 | 
				
			||||||
 | 
						test("[[https://example.com][https://example.com/example.mp4]]",
 | 
				
			||||||
 | 
							`<p><a href="https://example.com"><video src="https://example.com/example.mp4" title="https://example.com/example.mp4"></video></a></p>`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Without description.
 | 
				
			||||||
 | 
						test("[[https://example.com/example.svg]]",
 | 
				
			||||||
 | 
							`<p><img src="https://example.com/example.svg" alt="https://example.com/example.svg" title="https://example.com/example.svg" /></p>`)
 | 
				
			||||||
 | 
						test("[[https://example.com/example.mp4]]",
 | 
				
			||||||
 | 
							`<p><video src="https://example.com/example.mp4" title="https://example.com/example.mp4">https://example.com/example.mp4</video></p>`)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestRender_Source(t *testing.T) {
 | 
					func TestRender_Source(t *testing.T) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user