summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--helpers/url.go11
-rw-r--r--helpers/url_test.go23
-rw-r--r--tpl/template_funcs.go1
3 files changed, 34 insertions, 1 deletions
diff --git a/helpers/url.go b/helpers/url.go
index c780579d6..502d64a6c 100644
--- a/helpers/url.go
+++ b/helpers/url.go
@@ -138,13 +138,22 @@ func MakePermalink(host, plink string) *url.URL {
base.Path = path.Join(base.Path, p.Path)
// path.Join will strip off the last /, so put it back if it was there.
- if strings.HasSuffix(p.Path, "/") && !strings.HasSuffix(base.Path, "/") {
+ hadTrailingSlash := (plink == "" && strings.HasSuffix(host, "/")) || strings.HasSuffix(p.Path, "/")
+ if hadTrailingSlash && !strings.HasSuffix(base.Path, "/") {
base.Path = base.Path + "/"
}
return base
}
+// AbsURL creates a absolute URL from the relative path given and the BaseURL set in config.
+func AbsURL(path string) string {
+ if strings.HasPrefix(path, "http") || strings.HasPrefix(path, "//") {
+ return path
+ }
+ return MakePermalink(string(viper.GetString("BaseURL")), path).String()
+}
+
// AddContextRoot adds the context root to an URL if it's not already set.
// For relative URL entries on sites with a base url with a context root set (i.e. http://example.com/mysite),
// relative URLs must not include the context root if canonifyURLs is enabled. But if it's disabled, it must be set.
diff --git a/helpers/url_test.go b/helpers/url_test.go
index 1dabda273..3286c0f37 100644
--- a/helpers/url_test.go
+++ b/helpers/url_test.go
@@ -1,6 +1,7 @@
package helpers
import (
+ "github.com/spf13/viper"
"github.com/stretchr/testify/assert"
"strings"
"testing"
@@ -26,6 +27,28 @@ func TestURLize(t *testing.T) {
}
}
+func TestAbsURL(t *testing.T) {
+ tests := []struct {
+ input string
+ baseURL string
+ expected string
+ }{
+ {"/test/foo", "http://base/", "http://base/test/foo"},
+ {"", "http://base/ace/", "http://base/ace/"},
+ {"/test/2/foo/", "http://base", "http://base/test/2/foo/"},
+ {"http://abs", "http://base/", "http://abs"},
+ {"//schemaless", "http://base/", "//schemaless"},
+ }
+
+ for _, test := range tests {
+ viper.Set("BaseURL", test.baseURL)
+ output := AbsURL(test.input)
+ if output != test.expected {
+ t.Errorf("Expected %#v, got %#v\n", test.expected, output)
+ }
+ }
+}
+
func TestSanitizeURL(t *testing.T) {
tests := []struct {
input string
diff --git a/tpl/template_funcs.go b/tpl/template_funcs.go
index 5b0e919a9..dea33254c 100644
--- a/tpl/template_funcs.go
+++ b/tpl/template_funcs.go
@@ -1196,6 +1196,7 @@ func init() {
"safeHTML": SafeHTML,
"safeCSS": SafeCSS,
"safeURL": SafeURL,
+ "absURL": func(a string) template.HTML { return template.HTML(helpers.AbsURL(a)) },
"markdownify": Markdownify,
"first": First,
"where": Where,