54 lines
1.3 KiB
Go
54 lines
1.3 KiB
Go
package common
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
// Regexp to locate relative URLs in HTML code.
|
|
reRelativeLink = regexp.MustCompile(` (src|href|poster)=(['"])/([^'"]+)['"]`)
|
|
|
|
// Regexp to detect common URL schemes.
|
|
reURLScheme = regexp.MustCompile(`^https?://`)
|
|
)
|
|
|
|
// ReplaceRelativeLinksToAbsolute searches an HTML snippet for relative links
|
|
// and replaces them with absolute ones using the given base URL.
|
|
func ReplaceRelativeLinksToAbsolute(baseURL string, html string) string {
|
|
if baseURL == "" {
|
|
return html
|
|
}
|
|
|
|
matches := reRelativeLink.FindAllStringSubmatch(html, -1)
|
|
for _, match := range matches {
|
|
var (
|
|
attr = match[1]
|
|
quote = match[2]
|
|
uri = match[3]
|
|
absURI = strings.TrimSuffix(baseURL, "/") + "/" + uri
|
|
replace = fmt.Sprintf(" %s%s%s%s",
|
|
attr, quote, absURI, quote,
|
|
)
|
|
)
|
|
html = strings.Replace(html, match[0], replace, 1)
|
|
}
|
|
|
|
return html
|
|
}
|
|
|
|
// ToAbsoluteURL converts a URL to an absolute one. If the URL is already
|
|
// absolute, it is returned as-is.
|
|
func ToAbsoluteURL(uri string, baseURL string) string {
|
|
match := reURLScheme.FindStringSubmatch(uri)
|
|
if len(match) > 0 {
|
|
return uri
|
|
}
|
|
|
|
if strings.HasPrefix(uri, "/") {
|
|
return strings.TrimSuffix(baseURL, "/") + uri
|
|
}
|
|
return strings.TrimSuffix(baseURL, "/") + "/" + uri
|
|
}
|