ref: d572071784f54f083ab7918c5029d2f88bc64016
parent: f0b91852ea5e5d3ec985286751f17e34bfc6c7bc
author: Bjørn Erik Pedersen <[email protected]>
date: Thu Aug 4 16:41:30 EDT 2016
Redirect to main language from root See #2312 See #2309
--- a/hugolib/hugo_sites_test.go
+++ b/hugolib/hugo_sites_test.go
@@ -14,10 +14,10 @@
"github.com/spf13/hugo/helpers"
"github.com/spf13/hugo/hugofs"
"github.com/spf13/hugo/source"
+ jww "github.com/spf13/jwalterweatherman"
"github.com/spf13/viper"
"github.com/stretchr/testify/assert"
-
- jww "github.com/spf13/jwalterweatherman"
+ "github.com/stretchr/testify/require"
)
func init() {
@@ -52,7 +52,7 @@
sites := createMultiTestSites(t)
- err := sites.Build(BuildCfg{skipRender: true})
+ err := sites.Build(BuildCfg{})
if err != nil {
t.Fatalf("Failed to build sites: %s", err)
@@ -126,6 +126,11 @@
assert.Equal(t, "fr", frenchPage.Lang())
}
+ languageRedirect := readDestination(t, "public/index.html")
+
+ // French is the main content language
+ require.True(t, strings.Contains(languageRedirect, "0; url=http://example.com/blog/fr"), languageRedirect)
+
}
func TestMultiSitesRebuild(t *testing.T) {
@@ -498,7 +503,7 @@
// Print some debug info
root := strings.Split(filename, helpers.FilePathSeparator)[0]
afero.Walk(fs, root, func(path string, info os.FileInfo, err error) error {
- if !info.IsDir() {
+ if info != nil && !info.IsDir() {
fmt.Println(" ", path)
}
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -134,10 +134,11 @@
}
type targetList struct {
- page target.Output
- pageUgly target.Output
- file target.Output
- alias target.AliasPublisher
+ page target.Output
+ pageUgly target.Output
+ file target.Output
+ alias target.AliasPublisher
+ languageAlias target.AliasPublisher
}
type SiteInfo struct {
@@ -1398,6 +1399,16 @@
}
}
}
+
+ if s.Multilingual.enabled() {
+ mainLang := s.Multilingual.DefaultLang.Lang
+ mainLangURL := helpers.AbsURL(mainLang)
+ jww.DEBUG.Printf("Write redirect to main language %s: %s", mainLang, mainLangURL)
+ if err := s.publishDestAlias(s.languageAliasTarget(), "/", mainLangURL); err != nil {
+ return err
+ }
+ }
+
return nil
}
@@ -2161,6 +2172,11 @@
return s.targets.alias
}
+func (s *Site) languageAliasTarget() target.AliasPublisher {
+ s.initTargetList()
+ return s.targets.languageAlias
+}
+
func (s *Site) initTargetList() {
s.targetListInit.Do(func() {
if s.targets.page == nil {
@@ -2185,6 +2201,12 @@
PublishDir: s.absPublishDir(),
}
}
+ if s.targets.languageAlias == nil {
+ s.targets.languageAlias = &target.HTMLRedirectAlias{
+ PublishDir: s.absPublishDir(),
+ AllowRoot: true,
+ }
+ }
})
}
@@ -2198,7 +2220,12 @@
return publisher.Publish(path, reader)
}
+// AliasPublisher
func (s *Site) writeDestAlias(path string, permalink string) (err error) {
+ return s.publishDestAlias(s.aliasTarget(), path, permalink)
+}
+
+func (s *Site) publishDestAlias(aliasPublisher target.AliasPublisher, path string, permalink string) (err error) {
if viper.GetBool("RelativeURLs") {
// convert `permalink` into URI relative to location of `path`
baseURL := helpers.SanitizeURLKeepTrailingSlash(viper.GetString("BaseURL"))
@@ -2212,7 +2239,7 @@
permalink = filepath.ToSlash(permalink)
}
jww.DEBUG.Println("creating alias:", path, "redirecting to", permalink)
- return s.aliasTarget().Publish(path, permalink)
+ return aliasPublisher.Publish(path, permalink)
}
func (s *Site) draftStats() string {
--- a/target/htmlredirect.go
+++ b/target/htmlredirect.go
@@ -45,6 +45,7 @@
type HTMLRedirectAlias struct {
PublishDir string
Templates *template.Template
+ AllowRoot bool // for the language redirects
}
func (h *HTMLRedirectAlias) Translate(alias string) (aliasPath string, err error) {
@@ -56,7 +57,7 @@
alias = filepath.Clean(alias)
components := strings.Split(alias, helpers.FilePathSeparator)
- if alias == helpers.FilePathSeparator {
+ if !h.AllowRoot && alias == helpers.FilePathSeparator {
return "", fmt.Errorf("Alias \"%s\" resolves to website root directory", originalAlias)
}