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,