mirror of https://github.com/go-gitea/gitea
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>pull/31454/head
parent
996037fb6a
commit
49b8716c40
@ -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 |
||||
} |
Loading…
Reference in new issue