Files
common-server-public/bbs-go/server/internal/pkg/bbsurls/urls.go
2025-03-03 17:43:50 +08:00

78 lines
1.4 KiB
Go

package bbsurls
import (
"log/slog"
"net/url"
"strconv"
"strings"
"bbs-go/internal/pkg/config"
)
// 是否是内部链接
func IsInternalUrl(href string) bool {
if IsAnchor(href) {
return true
}
u, err := url.Parse(config.Instance.BaseUrl)
if err != nil {
slog.Error(err.Error(), slog.Any("err", err))
return false
}
return strings.Contains(href, u.Host)
}
// 是否是锚链接
func IsAnchor(href string) bool {
return strings.Index(href, "#") == 0
}
func AbsUrl(path string) string {
return config.Instance.BaseUrl + path
}
// 用户主页
func UserUrl(userId int64) string {
return AbsUrl("/user/" + strconv.FormatInt(userId, 10))
}
// 文章详情
func ArticleUrl(articleId int64) string {
return AbsUrl("/article/" + strconv.FormatInt(articleId, 10))
}
// 标签文章列表
func TagArticlesUrl(tagId int64) string {
return AbsUrl("/articles/" + strconv.FormatInt(tagId, 10))
}
// 话题详情
func TopicUrl(topicId int64) string {
return AbsUrl("/topic/" + strconv.FormatInt(topicId, 10))
}
func UrlJoin(parts ...string) string {
sep := "/"
var ss []string
for i, part := range parts {
part = strings.TrimSpace(part)
var (
from = 0
to = len(part)
)
if strings.Index(part, sep) == 0 {
from = 1
}
if strings.LastIndex(part, sep) == len(part)-1 {
to = len(part) - 1
}
part = part[from:to]
ss = append(ss, part)
if i != len(parts)-1 {
ss = append(ss, sep)
}
}
return strings.Join(ss, "")
}