78 lines
1.4 KiB
Go
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, "")
|
|
}
|