mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-28 22:19:59 +02:00
Fix Permalink for resource, baseURL with path and canonifyURLs set
Fixes #5226
This commit is contained in:
@@ -45,177 +45,184 @@ func TestPageBundlerSiteRegular(t *testing.T) {
|
||||
baseBaseURL := "https://example.com"
|
||||
|
||||
for _, baseURLPath := range []string{"", "/hugo"} {
|
||||
for _, ugly := range []bool{false, true} {
|
||||
t.Run(fmt.Sprintf("ugly=%t,path=%s", ugly, baseURLPath),
|
||||
func(t *testing.T) {
|
||||
baseURL := baseBaseURL + baseURLPath
|
||||
assert := require.New(t)
|
||||
fs, cfg := newTestBundleSources(t)
|
||||
cfg.Set("baseURL", baseURL)
|
||||
assert.NoError(loadDefaultSettingsFor(cfg))
|
||||
assert.NoError(loadLanguageSettings(cfg, nil))
|
||||
for _, canonify := range []bool{false, true} {
|
||||
for _, ugly := range []bool{false, true} {
|
||||
t.Run(fmt.Sprintf("ugly=%t,canonify=%t,path=%s", ugly, canonify, baseURLPath),
|
||||
func(t *testing.T) {
|
||||
baseURL := baseBaseURL + baseURLPath
|
||||
relURLBase := baseURLPath
|
||||
if canonify {
|
||||
relURLBase = ""
|
||||
}
|
||||
assert := require.New(t)
|
||||
fs, cfg := newTestBundleSources(t)
|
||||
cfg.Set("baseURL", baseURL)
|
||||
cfg.Set("canonifyURLs", canonify)
|
||||
assert.NoError(loadDefaultSettingsFor(cfg))
|
||||
assert.NoError(loadLanguageSettings(cfg, nil))
|
||||
|
||||
cfg.Set("permalinks", map[string]string{
|
||||
"a": ":sections/:filename",
|
||||
"b": ":year/:slug/",
|
||||
"c": ":sections/:slug",
|
||||
"": ":filename/",
|
||||
})
|
||||
|
||||
cfg.Set("outputFormats", map[string]interface{}{
|
||||
"CUSTOMO": map[string]interface{}{
|
||||
"mediaType": media.HTMLType,
|
||||
"baseName": "cindex",
|
||||
"path": "cpath",
|
||||
},
|
||||
})
|
||||
|
||||
cfg.Set("outputs", map[string]interface{}{
|
||||
"home": []string{"HTML", "CUSTOMO"},
|
||||
"page": []string{"HTML", "CUSTOMO"},
|
||||
"section": []string{"HTML", "CUSTOMO"},
|
||||
})
|
||||
|
||||
cfg.Set("uglyURLs", ugly)
|
||||
|
||||
s := buildSingleSite(t, deps.DepsCfg{Logger: loggers.NewWarningLogger(), Fs: fs, Cfg: cfg}, BuildCfg{})
|
||||
|
||||
th := testHelper{s.Cfg, s.Fs, t}
|
||||
|
||||
assert.Len(s.RegularPages, 8)
|
||||
|
||||
singlePage := s.getPage(KindPage, "a/1.md")
|
||||
assert.Equal("", singlePage.BundleType())
|
||||
|
||||
assert.NotNil(singlePage)
|
||||
assert.Equal(singlePage, s.getPage("page", "a/1"))
|
||||
assert.Equal(singlePage, s.getPage("page", "1"))
|
||||
|
||||
assert.Contains(singlePage.content(), "TheContent")
|
||||
|
||||
if ugly {
|
||||
assert.Equal(relURLBase+"/a/1.html", singlePage.RelPermalink())
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/a/1.html"), "TheContent")
|
||||
|
||||
} else {
|
||||
assert.Equal(relURLBase+"/a/1/", singlePage.RelPermalink())
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/a/1/index.html"), "TheContent")
|
||||
}
|
||||
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/images/hugo-logo.png"), "content")
|
||||
|
||||
// This should be just copied to destination.
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/assets/pic1.png"), "content")
|
||||
|
||||
leafBundle1 := s.getPage(KindPage, "b/my-bundle/index.md")
|
||||
assert.NotNil(leafBundle1)
|
||||
assert.Equal("leaf", leafBundle1.BundleType())
|
||||
assert.Equal("b", leafBundle1.Section())
|
||||
sectionB := s.getPage(KindSection, "b")
|
||||
assert.NotNil(sectionB)
|
||||
home, _ := s.Info.Home()
|
||||
assert.Equal("branch", home.BundleType())
|
||||
|
||||
// This is a root bundle and should live in the "home section"
|
||||
// See https://github.com/gohugoio/hugo/issues/4332
|
||||
rootBundle := s.getPage(KindPage, "root")
|
||||
assert.NotNil(rootBundle)
|
||||
assert.True(rootBundle.Parent().IsHome())
|
||||
if ugly {
|
||||
assert.Equal(relURLBase+"/root.html", rootBundle.RelPermalink())
|
||||
} else {
|
||||
assert.Equal(relURLBase+"/root/", rootBundle.RelPermalink())
|
||||
}
|
||||
|
||||
leafBundle2 := s.getPage(KindPage, "a/b/index.md")
|
||||
assert.NotNil(leafBundle2)
|
||||
unicodeBundle := s.getPage(KindPage, "c/bundle/index.md")
|
||||
assert.NotNil(unicodeBundle)
|
||||
|
||||
pageResources := leafBundle1.Resources.ByType(pageResourceType)
|
||||
assert.Len(pageResources, 2)
|
||||
firstPage := pageResources[0].(*Page)
|
||||
secondPage := pageResources[1].(*Page)
|
||||
assert.Equal(filepath.FromSlash("/work/base/b/my-bundle/1.md"), firstPage.pathOrTitle(), secondPage.pathOrTitle())
|
||||
assert.Contains(firstPage.content(), "TheContent")
|
||||
assert.Equal(6, len(leafBundle1.Resources))
|
||||
|
||||
// Verify shortcode in bundled page
|
||||
assert.Contains(secondPage.content(), filepath.FromSlash("MyShort in b/my-bundle/2.md"))
|
||||
|
||||
// https://github.com/gohugoio/hugo/issues/4582
|
||||
assert.Equal(leafBundle1, firstPage.Parent())
|
||||
assert.Equal(leafBundle1, secondPage.Parent())
|
||||
|
||||
assert.Equal(firstPage, pageResources.GetMatch("1*"))
|
||||
assert.Equal(secondPage, pageResources.GetMatch("2*"))
|
||||
assert.Nil(pageResources.GetMatch("doesnotexist*"))
|
||||
|
||||
imageResources := leafBundle1.Resources.ByType("image")
|
||||
assert.Equal(3, len(imageResources))
|
||||
image := imageResources[0]
|
||||
|
||||
altFormat := leafBundle1.OutputFormats().Get("CUSTOMO")
|
||||
assert.NotNil(altFormat)
|
||||
|
||||
assert.Equal(baseURL+"/2017/pageslug/c/logo.png", image.Permalink())
|
||||
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/2017/pageslug/c/logo.png"), "content")
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/cpath/2017/pageslug/c/logo.png"), "content")
|
||||
|
||||
// Custom media type defined in site config.
|
||||
assert.Len(leafBundle1.Resources.ByType("bepsays"), 1)
|
||||
|
||||
relPermalinker := func(s string) string {
|
||||
return fmt.Sprintf(s, relURLBase)
|
||||
}
|
||||
|
||||
permalinker := func(s string) string {
|
||||
return fmt.Sprintf(s, baseURL)
|
||||
}
|
||||
|
||||
if permalinker == nil {
|
||||
}
|
||||
|
||||
if ugly {
|
||||
assert.Equal(relURLBase+"/2017/pageslug.html", leafBundle1.RelPermalink())
|
||||
assert.Equal(baseURL+"/2017/pageslug.html", leafBundle1.Permalink())
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/2017/pageslug.html"),
|
||||
"TheContent",
|
||||
relPermalinker("Sunset RelPermalink: %s/2017/pageslug/sunset1.jpg"),
|
||||
permalinker("Sunset Permalink: %s/2017/pageslug/sunset1.jpg"),
|
||||
"Thumb Width: 123",
|
||||
"Thumb Name: my-sunset-1",
|
||||
relPermalinker("Short Sunset RelPermalink: %s/2017/pageslug/sunset2.jpg"),
|
||||
"Short Thumb Width: 56",
|
||||
"1: Image Title: Sunset Galore 1",
|
||||
"1: Image Params: map[myparam:My Sunny Param]",
|
||||
"2: Image Title: Sunset Galore 2",
|
||||
"2: Image Params: map[myparam:My Sunny Param]",
|
||||
"1: Image myParam: Lower: My Sunny Param Caps: My Sunny Param",
|
||||
)
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/cpath/2017/pageslug.html"), "TheContent")
|
||||
|
||||
assert.Equal(relURLBase+"/a/b.html", leafBundle2.RelPermalink())
|
||||
|
||||
// 은행
|
||||
assert.Equal(relURLBase+"/c/%EC%9D%80%ED%96%89.html", unicodeBundle.RelPermalink())
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/c/은행.html"), "Content for 은행")
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/c/은행/logo-은행.png"), "은행 PNG")
|
||||
|
||||
} else {
|
||||
assert.Equal(relURLBase+"/2017/pageslug/", leafBundle1.RelPermalink())
|
||||
assert.Equal(baseURL+"/2017/pageslug/", leafBundle1.Permalink())
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/2017/pageslug/index.html"), "TheContent")
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/cpath/2017/pageslug/cindex.html"), "TheContent")
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/2017/pageslug/index.html"), "Single Title")
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/root/index.html"), "Single Title")
|
||||
|
||||
assert.Equal(relURLBase+"/a/b/", leafBundle2.RelPermalink())
|
||||
|
||||
}
|
||||
|
||||
cfg.Set("permalinks", map[string]string{
|
||||
"a": ":sections/:filename",
|
||||
"b": ":year/:slug/",
|
||||
"c": ":sections/:slug",
|
||||
"": ":filename/",
|
||||
})
|
||||
|
||||
cfg.Set("outputFormats", map[string]interface{}{
|
||||
"CUSTOMO": map[string]interface{}{
|
||||
"mediaType": media.HTMLType,
|
||||
"baseName": "cindex",
|
||||
"path": "cpath",
|
||||
},
|
||||
})
|
||||
|
||||
cfg.Set("outputs", map[string]interface{}{
|
||||
"home": []string{"HTML", "CUSTOMO"},
|
||||
"page": []string{"HTML", "CUSTOMO"},
|
||||
"section": []string{"HTML", "CUSTOMO"},
|
||||
})
|
||||
|
||||
cfg.Set("uglyURLs", ugly)
|
||||
|
||||
s := buildSingleSite(t, deps.DepsCfg{Logger: loggers.NewWarningLogger(), Fs: fs, Cfg: cfg}, BuildCfg{})
|
||||
|
||||
th := testHelper{s.Cfg, s.Fs, t}
|
||||
|
||||
assert.Len(s.RegularPages, 8)
|
||||
|
||||
singlePage := s.getPage(KindPage, "a/1.md")
|
||||
assert.Equal("", singlePage.BundleType())
|
||||
|
||||
assert.NotNil(singlePage)
|
||||
assert.Equal(singlePage, s.getPage("page", "a/1"))
|
||||
assert.Equal(singlePage, s.getPage("page", "1"))
|
||||
|
||||
assert.Contains(singlePage.content(), "TheContent")
|
||||
|
||||
if ugly {
|
||||
assert.Equal(baseURLPath+"/a/1.html", singlePage.RelPermalink())
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/a/1.html"), "TheContent")
|
||||
|
||||
} else {
|
||||
assert.Equal(baseURLPath+"/a/1/", singlePage.RelPermalink())
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/a/1/index.html"), "TheContent")
|
||||
}
|
||||
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/images/hugo-logo.png"), "content")
|
||||
|
||||
// This should be just copied to destination.
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/assets/pic1.png"), "content")
|
||||
|
||||
leafBundle1 := s.getPage(KindPage, "b/my-bundle/index.md")
|
||||
assert.NotNil(leafBundle1)
|
||||
assert.Equal("leaf", leafBundle1.BundleType())
|
||||
assert.Equal("b", leafBundle1.Section())
|
||||
sectionB := s.getPage(KindSection, "b")
|
||||
assert.NotNil(sectionB)
|
||||
home, _ := s.Info.Home()
|
||||
assert.Equal("branch", home.BundleType())
|
||||
|
||||
// This is a root bundle and should live in the "home section"
|
||||
// See https://github.com/gohugoio/hugo/issues/4332
|
||||
rootBundle := s.getPage(KindPage, "root")
|
||||
assert.NotNil(rootBundle)
|
||||
assert.True(rootBundle.Parent().IsHome())
|
||||
if ugly {
|
||||
assert.Equal(baseURLPath+"/root.html", rootBundle.RelPermalink())
|
||||
} else {
|
||||
assert.Equal(baseURLPath+"/root/", rootBundle.RelPermalink())
|
||||
}
|
||||
|
||||
leafBundle2 := s.getPage(KindPage, "a/b/index.md")
|
||||
assert.NotNil(leafBundle2)
|
||||
unicodeBundle := s.getPage(KindPage, "c/bundle/index.md")
|
||||
assert.NotNil(unicodeBundle)
|
||||
|
||||
pageResources := leafBundle1.Resources.ByType(pageResourceType)
|
||||
assert.Len(pageResources, 2)
|
||||
firstPage := pageResources[0].(*Page)
|
||||
secondPage := pageResources[1].(*Page)
|
||||
assert.Equal(filepath.FromSlash("/work/base/b/my-bundle/1.md"), firstPage.pathOrTitle(), secondPage.pathOrTitle())
|
||||
assert.Contains(firstPage.content(), "TheContent")
|
||||
assert.Equal(6, len(leafBundle1.Resources))
|
||||
|
||||
// Verify shortcode in bundled page
|
||||
assert.Contains(secondPage.content(), filepath.FromSlash("MyShort in b/my-bundle/2.md"))
|
||||
|
||||
// https://github.com/gohugoio/hugo/issues/4582
|
||||
assert.Equal(leafBundle1, firstPage.Parent())
|
||||
assert.Equal(leafBundle1, secondPage.Parent())
|
||||
|
||||
assert.Equal(firstPage, pageResources.GetMatch("1*"))
|
||||
assert.Equal(secondPage, pageResources.GetMatch("2*"))
|
||||
assert.Nil(pageResources.GetMatch("doesnotexist*"))
|
||||
|
||||
imageResources := leafBundle1.Resources.ByType("image")
|
||||
assert.Equal(3, len(imageResources))
|
||||
image := imageResources[0]
|
||||
|
||||
altFormat := leafBundle1.OutputFormats().Get("CUSTOMO")
|
||||
assert.NotNil(altFormat)
|
||||
|
||||
assert.Equal(baseURL+"/2017/pageslug/c/logo.png", image.Permalink())
|
||||
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/2017/pageslug/c/logo.png"), "content")
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/cpath/2017/pageslug/c/logo.png"), "content")
|
||||
|
||||
// Custom media type defined in site config.
|
||||
assert.Len(leafBundle1.Resources.ByType("bepsays"), 1)
|
||||
|
||||
relPermalinker := func(s string) string {
|
||||
return fmt.Sprintf(s, baseURLPath)
|
||||
}
|
||||
|
||||
permalinker := func(s string) string {
|
||||
return fmt.Sprintf(s, baseURL)
|
||||
}
|
||||
|
||||
if permalinker == nil {
|
||||
}
|
||||
|
||||
if ugly {
|
||||
assert.Equal(baseURLPath+"/2017/pageslug.html", leafBundle1.RelPermalink())
|
||||
assert.Equal(baseURL+"/2017/pageslug.html", leafBundle1.Permalink())
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/2017/pageslug.html"),
|
||||
"TheContent",
|
||||
relPermalinker("Sunset RelPermalink: %s/2017/pageslug/sunset1.jpg"),
|
||||
permalinker("Sunset Permalink: %s/2017/pageslug/sunset1.jpg"),
|
||||
"Thumb Width: 123",
|
||||
"Thumb Name: my-sunset-1",
|
||||
relPermalinker("Short Sunset RelPermalink: %s/2017/pageslug/sunset2.jpg"),
|
||||
"Short Thumb Width: 56",
|
||||
"1: Image Title: Sunset Galore 1",
|
||||
"1: Image Params: map[myparam:My Sunny Param]",
|
||||
"2: Image Title: Sunset Galore 2",
|
||||
"2: Image Params: map[myparam:My Sunny Param]",
|
||||
"1: Image myParam: Lower: My Sunny Param Caps: My Sunny Param",
|
||||
)
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/cpath/2017/pageslug.html"), "TheContent")
|
||||
|
||||
assert.Equal(baseURLPath+"/a/b.html", leafBundle2.RelPermalink())
|
||||
|
||||
// 은행
|
||||
assert.Equal(baseURLPath+"/c/%EC%9D%80%ED%96%89.html", unicodeBundle.RelPermalink())
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/c/은행.html"), "Content for 은행")
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/c/은행/logo-은행.png"), "은행 PNG")
|
||||
|
||||
} else {
|
||||
assert.Equal(baseURLPath+"/2017/pageslug/", leafBundle1.RelPermalink())
|
||||
assert.Equal(baseURL+"/2017/pageslug/", leafBundle1.Permalink())
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/2017/pageslug/index.html"), "TheContent")
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/cpath/2017/pageslug/cindex.html"), "TheContent")
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/2017/pageslug/index.html"), "Single Title")
|
||||
th.assertFileContent(filepath.FromSlash("/work/public/root/index.html"), "Single Title")
|
||||
|
||||
assert.Equal(baseURLPath+"/a/b/", leafBundle2.RelPermalink())
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user