mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 21:16:26 +01:00 
			
		
		
		
	* Fix #33972 * Use consistent path resolving for links and medias. * No need to make the markup renders to resolve the paths, instead, the paths are all correctly resolved in the "post process" step. * Fix #33274 * Since 1.23, all paths starting with "/" are relative to current render context (for example: the current repo branch) * Introduce `/:root/path-relative-to-root`, then the path will be rendered as relative to "ROOT_URL"
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2024 The Gitea Authors. All rights reserved.
 | 
						|
// SPDX-License-Identifier: MIT
 | 
						|
 | 
						|
package markup
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"code.gitea.io/gitea/modules/httplib"
 | 
						|
	"code.gitea.io/gitea/modules/setting"
 | 
						|
	"code.gitea.io/gitea/modules/util"
 | 
						|
)
 | 
						|
 | 
						|
func resolveLinkRelative(ctx context.Context, base, cur, link string, absolute bool) (finalLink string) {
 | 
						|
	if IsFullURLString(link) {
 | 
						|
		return link
 | 
						|
	}
 | 
						|
	if strings.HasPrefix(link, "/") {
 | 
						|
		if strings.HasPrefix(link, base) && strings.Count(base, "/") >= 4 {
 | 
						|
			// a trick to tolerate that some users were using absolut paths (the old gitea's behavior)
 | 
						|
			finalLink = link
 | 
						|
		} else {
 | 
						|
			finalLink = util.URLJoin(base, "./", link)
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		finalLink = util.URLJoin(base, "./", cur, link)
 | 
						|
	}
 | 
						|
	finalLink = strings.TrimSuffix(finalLink, "/")
 | 
						|
	if absolute {
 | 
						|
		finalLink = httplib.MakeAbsoluteURL(ctx, finalLink)
 | 
						|
	}
 | 
						|
	return finalLink
 | 
						|
}
 | 
						|
 | 
						|
func (ctx *RenderContext) ResolveLinkRelative(base, cur, link string) string {
 | 
						|
	if strings.HasPrefix(link, "/:") {
 | 
						|
		setting.PanicInDevOrTesting("invalid link %q, forgot to cut?", link)
 | 
						|
	}
 | 
						|
	return resolveLinkRelative(ctx, base, cur, link, ctx.RenderOptions.UseAbsoluteLink)
 | 
						|
}
 | 
						|
 | 
						|
func (ctx *RenderContext) ResolveLinkRoot(link string) string {
 | 
						|
	return ctx.ResolveLinkRelative(setting.AppSubURL+"/", "", link)
 | 
						|
}
 | 
						|
 | 
						|
func ParseRenderedLink(s, preferLinkType string) (linkType, link string) {
 | 
						|
	if strings.HasPrefix(s, "/:") {
 | 
						|
		p := strings.IndexByte(s[1:], '/')
 | 
						|
		if p == -1 {
 | 
						|
			return s, ""
 | 
						|
		}
 | 
						|
		return s[:p+1], s[p+2:]
 | 
						|
	}
 | 
						|
	return preferLinkType, s
 | 
						|
}
 |