mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Support relative paths to videos from Wiki pages (#31061)
This change fixes cases when a Wiki page refers to a video stored in the Wiki repository using relative path. It follows the similar case which has been already implemented for images. Test plan: - Create repository and Wiki page - Clone the Wiki repository - Add video to it, say `video.mp4` - Modify the markdown file to refer to the video using `<video src="video.mp4">` - Commit the Wiki page - Observe that the video is properly displayed --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		
							
								
								
									
										62
									
								
								modules/markup/html_node.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								modules/markup/html_node.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| // Copyright 2024 The Gitea Authors. All rights reserved. | ||||
| // SPDX-License-Identifier: MIT | ||||
|  | ||||
| package markup | ||||
|  | ||||
| import ( | ||||
| 	"code.gitea.io/gitea/modules/util" | ||||
|  | ||||
| 	"golang.org/x/net/html" | ||||
| ) | ||||
|  | ||||
| func visitNodeImg(ctx *RenderContext, img *html.Node) (next *html.Node) { | ||||
| 	next = img.NextSibling | ||||
| 	for i, attr := range img.Attr { | ||||
| 		if attr.Key != "src" { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		if IsNonEmptyRelativePath(attr.Val) { | ||||
| 			attr.Val = util.URLJoin(ctx.Links.ResolveMediaLink(ctx.IsWiki), attr.Val) | ||||
|  | ||||
| 			// By default, the "<img>" tag should also be clickable, | ||||
| 			// because frontend use `<img>` to paste the re-scaled image into the markdown, | ||||
| 			// so it must match the default markdown image behavior. | ||||
| 			hasParentAnchor := false | ||||
| 			for p := img.Parent; p != nil; p = p.Parent { | ||||
| 				if hasParentAnchor = p.Type == html.ElementNode && p.Data == "a"; hasParentAnchor { | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			if !hasParentAnchor { | ||||
| 				imgA := &html.Node{Type: html.ElementNode, Data: "a", Attr: []html.Attribute{ | ||||
| 					{Key: "href", Val: attr.Val}, | ||||
| 					{Key: "target", Val: "_blank"}, | ||||
| 				}} | ||||
| 				parent := img.Parent | ||||
| 				imgNext := img.NextSibling | ||||
| 				parent.RemoveChild(img) | ||||
| 				parent.InsertBefore(imgA, imgNext) | ||||
| 				imgA.AppendChild(img) | ||||
| 			} | ||||
| 		} | ||||
| 		attr.Val = camoHandleLink(attr.Val) | ||||
| 		img.Attr[i] = attr | ||||
| 	} | ||||
| 	return next | ||||
| } | ||||
|  | ||||
| func visitNodeVideo(ctx *RenderContext, node *html.Node) (next *html.Node) { | ||||
| 	next = node.NextSibling | ||||
| 	for i, attr := range node.Attr { | ||||
| 		if attr.Key != "src" { | ||||
| 			continue | ||||
| 		} | ||||
| 		if IsNonEmptyRelativePath(attr.Val) { | ||||
| 			attr.Val = util.URLJoin(ctx.Links.ResolveMediaLink(ctx.IsWiki), attr.Val) | ||||
| 		} | ||||
| 		attr.Val = camoHandleLink(attr.Val) | ||||
| 		node.Attr[i] = attr | ||||
| 	} | ||||
| 	return next | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Sergey Sharybin
					Sergey Sharybin