shithub: hugo

Download patch

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: &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/"
 )