Fix aliases with relativeURLs
authorHelder Pereira <helfper@gmail.com>
Sun, 14 Jun 2020 09:14:56 +0000 (10:14 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 14 Jun 2020 12:08:41 +0000 (14:08 +0200)
hugolib/alias.go
hugolib/alias_test.go
hugolib/site.go
hugolib/site_render.go
hugolib/testhelpers_test.go
transform/urlreplacers/absurlreplacer.go
transform/urlreplacers/absurlreplacer_test.go

index b97094ecc12a0900028a2e39b7175d8d1a05a3cb..c1f668d41f00cb89c08494b392ad70cd169a0f8e 100644 (file)
@@ -99,8 +99,11 @@ func (s *Site) publishDestAlias(allowRoot bool, path, permalink string, outputFo
                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) {
index b0491c13e45e021b35ba3e276d48ddd79f19582f..17c66349620e7a86941b9c3fe648e8ff6e20f9d9 100644 (file)
@@ -45,18 +45,29 @@ func TestAlias(t *testing.T) {
        t.Parallel()
        c := qt.New(t)
 
-       b := newTestSitesBuilder(t)
-       b.WithSimpleConfigFile().WithContent("blog/page.md", pageWithAlias)
-       b.CreateSites().Build(BuildCfg{})
-
-       c.Assert(len(b.H.Sites), qt.Equals, 1)
-       c.Assert(len(b.H.Sites[0].RegularPages()), qt.Equals, 1)
+       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}},
+       }
 
-       // 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; ")
+       for _, test := range tests {
+               b := newTestSitesBuilder(t)
+               b.WithSimpleConfigFileAndSettings(test.settings).WithContent("blog/page.md", pageWithAlias)
+               b.CreateSites().Build(BuildCfg{})
+
+               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) {
index 34671443e5172065c8681b7c7e59afe2b5559bf3..d544cb095718de3576207510e097e8a0f61e0844 100644 (file)
@@ -1540,7 +1540,21 @@ func (s *SiteInfo) GetPage(ref ...string) (page.Page, error) {
 
 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 @@ func (s *Site) renderAndWriteXML(statCounter *uint64, name string, targetPath st
                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 @@ func (s *Site) renderAndWriteXML(statCounter *uint64, name string, targetPath st
                // 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 @@ func (s *Site) renderAndWritePage(statCounter *uint64, name string, targetPath s
        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 @@ func (s *Site) renderAndWritePage(statCounter *uint64, name string, targetPath s
 
        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") {
index 1debcbef6f7f5bcef6d9d26f3f7a10bcfdebe0a7..5377babef557b785c3b9646285a522696d55bee9 100644 (file)
@@ -383,7 +383,7 @@ func (s *Site) renderMainLanguageRedirect() error {
        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
index 67e2caee9abbf44d36686daf5502967c4eecbc64..eace35c971e708d2974eb07a66367dd86bd07b75 100644 (file)
@@ -277,9 +277,14 @@ func (s *sitesBuilder) WithSimpleConfigFile() *sitesBuilder {
 
 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)
 }
 
index 3fef013fb1b21ba2f2fb52845ee318e6f962a278..7bac716fbc23d077e76e6da6325c3990d06a359a 100644 (file)
@@ -69,6 +69,7 @@ func newPrefixState() []*prefix {
        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},
        }
index 3c2dbf777901dcdc9cbd49a9df0832cec7282834..8e8fdc561f8eba95d01d95d18ee89bffa2e2d927 100644 (file)
@@ -88,8 +88,8 @@ schemaless: &lt;img srcset=&#39;//img.jpg&#39; src=&#39;//basic.jpg&#39;&gt;
 schemaless2: &lt;img srcset=&quot;//img.jpg&quot; src=&quot;//basic.jpg2&gt; 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/"
 )