ref: 145b3fcce35fbac25c7033c91c1b7ae6d1179da8
parent: 01e249e97ce9a3bc145f4372a032b9da3e123a62
author: Helder Pereira <helfper@gmail.com>
date: Sun Jun 14 06:14:56 EDT 2020
Fix aliases with relativeURLs
--- a/hugolib/alias.go
+++ b/hugolib/alias.go
@@ -99,8 +99,11 @@
OutputFormat: outputFormat,
}
- return s.publisher.Publish(pd)
+ if s.Info.relativeURLs || s.Info.canonifyURLs {
+ pd.AbsURLPath = s.absURLPath(targetPath)
+ }
+ return s.publisher.Publish(pd)
}
func (a aliasHandler) targetPathAlias(src string) (string, error) {
--- a/hugolib/alias_test.go
+++ b/hugolib/alias_test.go
@@ -45,18 +45,29 @@
t.Parallel()
c := qt.New(t)
- b := newTestSitesBuilder(t)
- b.WithSimpleConfigFile().WithContent("blog/page.md", pageWithAlias)
- b.CreateSites().Build(BuildCfg{})
+ tests := []struct {
+ urlPrefix string
+ settings map[string]interface{}
+ }{
+ {"http://example.com", map[string]interface{}{"baseURL": "http://example.com"}},
+ {"http://example.com", map[string]interface{}{"baseURL": "http://example.com", "canonifyURLs": true}},
+ {"../..", map[string]interface{}{"relativeURLs": true}},
+ }
- c.Assert(len(b.H.Sites), qt.Equals, 1)
- c.Assert(len(b.H.Sites[0].RegularPages()), qt.Equals, 1)
+ for _, test := range tests {
+ b := newTestSitesBuilder(t)
+ b.WithSimpleConfigFileAndSettings(test.settings).WithContent("blog/page.md", pageWithAlias)
+ b.CreateSites().Build(BuildCfg{})
- // the real page
- b.AssertFileContent("public/blog/page/index.html", "For some moments the old man")
- // the alias redirectors
- b.AssertFileContent("public/foo/bar/index.html", "<meta http-equiv=\"refresh\" content=\"0; ")
- b.AssertFileContent("public/blog/rel/index.html", "<meta http-equiv=\"refresh\" content=\"0; ")
+ c.Assert(len(b.H.Sites), qt.Equals, 1)
+ c.Assert(len(b.H.Sites[0].RegularPages()), qt.Equals, 1)
+
+ // the real page
+ b.AssertFileContent("public/blog/page/index.html", "For some moments the old man")
+ // the alias redirectors
+ b.AssertFileContent("public/foo/bar/index.html", "<meta http-equiv=\"refresh\" content=\"0; url="+test.urlPrefix+"/blog/page/\" />")
+ b.AssertFileContent("public/blog/rel/index.html", "<meta http-equiv=\"refresh\" content=\"0; url="+test.urlPrefix+"/blog/page/\" />")
+ }
}
func TestAliasMultipleOutputFormats(t *testing.T) {
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -1540,7 +1540,21 @@
func (s *Site) permalink(link string) string {
return s.PathSpec.PermalinkForBaseURL(link, s.PathSpec.BaseURL.String())
+}
+func (s *Site) absURLPath(targetPath string) string {
+ var path string
+ if s.Info.relativeURLs {
+ path = helpers.GetDottedRelativePath(targetPath)
+ } else {
+ url := s.PathSpec.BaseURL.String()
+ if !strings.HasSuffix(url, "/") {
+ url += "/"
+ }
+ path = url
+ }
+
+ return path
}
func (s *Site) lookupLayouts(layouts ...string) tpl.Template {
@@ -1562,17 +1576,6 @@
return err
}
- var path string
- if s.Info.relativeURLs {
- path = helpers.GetDottedRelativePath(targetPath)
- } else {
- s := s.PathSpec.BaseURL.String()
- if !strings.HasSuffix(s, "/") {
- s += "/"
- }
- path = s
- }
-
pd := publisher.Descriptor{
Src: renderBuffer,
TargetPath: targetPath,
@@ -1580,14 +1583,14 @@
// For the minification part of XML,
// we currently only use the MIME type.
OutputFormat: output.RSSFormat,
- AbsURLPath: path,
+ AbsURLPath: s.absURLPath(targetPath),
}
return s.publisher.Publish(pd)
-
}
func (s *Site) renderAndWritePage(statCounter *uint64, name string, targetPath string, p *pageState, templ tpl.Template) error {
+ s.Log.DEBUG.Printf("Render %s to %q", name, targetPath)
renderBuffer := bp.GetBuffer()
defer bp.PutBuffer(renderBuffer)
@@ -1604,18 +1607,6 @@
isHTML := of.IsHTML
isRSS := of.Name == "RSS"
- var path string
-
- if s.Info.relativeURLs {
- path = helpers.GetDottedRelativePath(targetPath)
- } else if isRSS || s.Info.canonifyURLs {
- url := s.PathSpec.BaseURL.String()
- if !strings.HasSuffix(url, "/") {
- url += "/"
- }
- path = url
- }
-
pd := publisher.Descriptor{
Src: renderBuffer,
TargetPath: targetPath,
@@ -1625,10 +1616,10 @@
if isRSS {
// Always canonify URLs in RSS
- pd.AbsURLPath = path
+ pd.AbsURLPath = s.absURLPath(targetPath)
} else if isHTML {
if s.Info.relativeURLs || s.Info.canonifyURLs {
- pd.AbsURLPath = path
+ pd.AbsURLPath = s.absURLPath(targetPath)
}
if s.running() && s.Cfg.GetBool("watch") && !s.Cfg.GetBool("disableLiveReload") {
--- a/hugolib/site_render.go
+++ b/hugolib/site_render.go
@@ -383,7 +383,7 @@
if found {
mainLang := s.h.multilingual.DefaultLang
if s.Info.defaultContentLanguageInSubdir {
- mainLangURL := s.PathSpec.AbsURL(mainLang.Lang, false)
+ mainLangURL := s.PathSpec.AbsURL(mainLang.Lang+"/", false)
s.Log.DEBUG.Printf("Write redirect to main language %s: %s", mainLang, mainLangURL)
if err := s.publishDestAlias(true, "/", mainLangURL, html, nil); err != nil {
return err
--- a/hugolib/testhelpers_test.go
+++ b/hugolib/testhelpers_test.go
@@ -277,9 +277,14 @@
func (s *sitesBuilder) WithSimpleConfigFileAndBaseURL(baseURL string) *sitesBuilder {
s.T.Helper()
- config := fmt.Sprintf("baseURL = %q", baseURL)
+ return s.WithSimpleConfigFileAndSettings(map[string]interface{}{"baseURL": baseURL})
+}
- config = config + commonConfigSections
+func (s *sitesBuilder) WithSimpleConfigFileAndSettings(settings interface{}) *sitesBuilder {
+ s.T.Helper()
+ var buf bytes.Buffer
+ parser.InterfaceToConfig(settings, metadecoders.TOML, &buf)
+ config := buf.String() + commonConfigSections
return s.WithConfigFile("toml", config)
}
--- a/transform/urlreplacers/absurlreplacer.go
+++ b/transform/urlreplacers/absurlreplacer.go
@@ -69,6 +69,7 @@
return []*prefix{
{b: []byte("src="), f: checkCandidateBase},
{b: []byte("href="), f: checkCandidateBase},
+ {b: []byte("url="), f: checkCandidateBase},
{b: []byte("action="), f: checkCandidateBase},
{b: []byte("srcset="), f: checkCandidateSrcset},
}
--- a/transform/urlreplacers/absurlreplacer_test.go
+++ b/transform/urlreplacers/absurlreplacer_test.go
@@ -88,8 +88,8 @@
schemaless2: <img srcset="//img.jpg" src="//basic.jpg2> POST
`
- relPathVariations = `PRE. a href="/img/small.jpg" input action="/foo.html" POST.`
- relPathVariationsCorrect = `PRE. a href="../../img/small.jpg" input action="../../foo.html" POST.`
+ relPathVariations = `PRE. a href="/img/small.jpg" input action="/foo.html" meta url=/redirect/to/page/ POST.`
+ relPathVariationsCorrect = `PRE. a href="../../img/small.jpg" input action="../../foo.html" meta url=../../redirect/to/page/ POST.`
testBaseURL = "http://base/"
)