diff --git a/helpers/url.go b/helpers/url.go index ffafe7af0..d7f99f4f5 100644 --- a/helpers/url.go +++ b/helpers/url.go @@ -16,8 +16,18 @@ package helpers import ( "net/url" "path" + + "github.com/PuerkitoBio/purell" ) +func SanitizeUrl(in string) string { + url, err := purell.NormalizeURLString(in, purell.FlagsUsuallySafeGreedy|purell.FlagRemoveDuplicateSlashes|purell.FlagRemoveUnnecessaryHostDots|purell.FlagRemoveEmptyPortSeparator) + if err != nil { + return in + } + return url +} + // Similar to MakePath, but with Unicode handling // Example: // uri: Vim (text editor) @@ -55,6 +65,7 @@ func MakePermalink(host, plink string) *url.URL { } func UrlPrep(ugly bool, in string) string { + in = SanitizeUrl(in) if ugly { return Uglify(in) } else { diff --git a/hugolib/site.go b/hugolib/site.go index f653a2441..cd3109fd7 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -227,7 +227,7 @@ func (s *Site) initializeSiteInfo() { } s.Info = SiteInfo{ - BaseUrl: template.URL(viper.GetString("BaseUrl")), + BaseUrl: template.URL(helpers.SanitizeUrl(viper.GetString("BaseUrl"))), Title: viper.GetString("Title"), Recent: &s.Pages, Params: params, diff --git a/template/bundle/template.go b/template/bundle/template.go index d7e135b89..5d34bbf80 100644 --- a/template/bundle/template.go +++ b/template/bundle/template.go @@ -2,8 +2,6 @@ package bundle import ( "errors" - "github.com/eknkc/amber" - "github.com/spf13/hugo/helpers" "html" "html/template" "io" @@ -13,6 +11,9 @@ import ( "reflect" "strconv" "strings" + + "github.com/eknkc/amber" + "github.com/spf13/hugo/helpers" ) func Gt(a interface{}, b interface{}) bool { @@ -159,22 +160,23 @@ func NewTemplate() Template { } funcMap := template.FuncMap{ - "urlize": helpers.Urlize, - "gt": Gt, - "isset": IsSet, - "echoParam": ReturnWhenSet, - "safeHtml": SafeHtml, - "first": First, - "highlight": Highlight, - "add": func(a, b int) int { return a + b }, - "sub": func(a, b int) int { return a - b }, - "div": func(a, b int) int { return a / b }, - "mod": func(a, b int) int { return a % b }, - "mul": func(a, b int) int { return a * b }, - "modBool": func(a, b int) bool { return a%b == 0 }, - "lower": func(a string) string { return strings.ToLower(a) }, - "upper": func(a string) string { return strings.ToUpper(a) }, - "title": func(a string) string { return strings.Title(a) }, + "urlize": helpers.Urlize, + "sanitizeurl": helpers.SanitizeUrl, + "gt": Gt, + "isset": IsSet, + "echoParam": ReturnWhenSet, + "safeHtml": SafeHtml, + "first": First, + "highlight": Highlight, + "add": func(a, b int) int { return a + b }, + "sub": func(a, b int) int { return a - b }, + "div": func(a, b int) int { return a / b }, + "mod": func(a, b int) int { return a % b }, + "mul": func(a, b int) int { return a * b }, + "modBool": func(a, b int) bool { return a%b == 0 }, + "lower": func(a string) string { return strings.ToLower(a) }, + "upper": func(a string) string { return strings.ToUpper(a) }, + "title": func(a string) string { return strings.Title(a) }, } templates.Funcs(funcMap)