hugolib: Allow relative URLs in front matter
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 31 Mar 2019 10:08:15 +0000 (12:08 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 2 Apr 2019 08:33:15 +0000 (10:33 +0200)
Before this commit you would have to do this in multilingual setups:

```
---
title: "Custom!"
url: "/jp/custom/foo"
---
```

This commit allows for relative URLs, e.g:

```
---
title: "Custom!"
url: "custom/foo"
---
```

Which is obviously easier and more portable.

The meaning of relative may change to include more in the future (e.g. role based access).

Fixes #5704

hugolib/page_permalink_test.go
hugolib/site_render.go
resources/page/page_paths.go

index ed6eb11e31e0c9b06a415bc0a1fc05853e5f01c9..9df10cd53f692d7d544e065b7abcf92cb370a067 100644 (file)
@@ -104,3 +104,43 @@ Content
        }
 
 }
+
+func TestRelativeURLInFrontMatter(t *testing.T) {
+
+       config := `
+
+defaultContentLanguage = "en"
+defaultContentLanguageInSubdir = false
+
+[Languages]
+[Languages.en]
+weight = 10
+contentDir = "content/en"
+[Languages.nn]
+weight = 20
+contentDir = "content/nn"
+
+`
+
+       pageTempl := `---
+title: "A page"
+url: %q
+---
+
+Some content.
+`
+
+       b := newTestSitesBuilder(t).WithConfigFile("toml", config)
+       b.WithContent("content/en/blog/page1.md", fmt.Sprintf(pageTempl, "myblog/p1/"))
+       b.WithContent("content/en/blog/_index.md", fmt.Sprintf(pageTempl, "this-is-my-english-blog"))
+       b.WithContent("content/nn/blog/page1.md", fmt.Sprintf(pageTempl, "myblog/p1/"))
+       b.WithContent("content/nn/blog/_index.md", fmt.Sprintf(pageTempl, "this-is-my-blog"))
+
+       b.Build(BuildCfg{})
+
+       b.AssertFileContent("public/nn/myblog/p1/index.html", "Single: A page|Hello|nn|RelPermalink: /nn/myblog/p1/|")
+       b.AssertFileContent("public/nn/this-is-my-blog/index.html", "List Page 1|A page|Hello|/nn/this-is-my-blog/|")
+       b.AssertFileContent("public/this-is-my-english-blog/index.html", "List Page 1|A page|Hello|/this-is-my-english-blog/|")
+       b.AssertFileContent("public/myblog/p1/index.html", "Single: A page|Hello|en|RelPermalink: /myblog/p1/|Permalink: /myblog/p1/|")
+
+}
index 3c0897d2ef2e81b3e8d8762029455f0706bc99fe..cf3755b925129ba43cce77fc171ba045d59da642 100644 (file)
@@ -208,7 +208,7 @@ func (s *Site) render404() error {
                s:    s,
                kind: kind404,
                urlPaths: pagemeta.URLPath{
-                       URL: path.Join(s.GetURLLanguageBasePath(), "404.html"),
+                       URL: "404.html",
                },
        },
                output.HTMLFormat,
@@ -271,7 +271,7 @@ func (s *Site) renderRobotsTXT() error {
                s:    s,
                kind: kindRobotsTXT,
                urlPaths: pagemeta.URLPath{
-                       URL: path.Join(s.GetURLLanguageBasePath(), "robots.txt"),
+                       URL: "robots.txt",
                },
        },
                output.RobotsTxtFormat)
index 160c225b12a41c3a617c5ea2db088292fe1fb268..89616d421f676af84896607b0c6dc3e232027acb 100644 (file)
@@ -124,6 +124,11 @@ func CreateTargetPaths(d TargetPathDescriptor) (tp TargetPaths) {
 
        }
 
+       if d.URL != "" && !strings.HasPrefix(d.URL, "/") {
+               // Treat this as a context relative URL
+               d.ForcePrefix = true
+       }
+
        pagePath := slash
 
        var (