summaryrefslogtreecommitdiffstats
path: root/hugolib
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2016-08-07 22:01:55 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2016-09-06 18:32:18 +0300
commit54141f71dd0ffbd2af326581b78ecafe7f054f51 (patch)
treea814b50027d9c9a439aa43eeb734f97e189ed968 /hugolib
parent2079a23dd89734cea39e523faf46e44201151279 (diff)
Improve language handling in URLs
The current "rendering language" is needed outside of Site. This commit moves the Language type to the helpers package, and then used to get correct correct language configuration in the markdownify template func. This commit also adds two new template funcs: relLangURL and absLangURL. See #2309
Diffstat (limited to 'hugolib')
-rw-r--r--hugolib/handler_test.go2
-rw-r--r--hugolib/hugo_sites.go8
-rw-r--r--hugolib/menu_test.go4
-rw-r--r--hugolib/multilingual.go119
-rw-r--r--hugolib/node.go4
-rw-r--r--hugolib/robotstxt_test.go2
-rw-r--r--hugolib/rss_test.go2
-rw-r--r--hugolib/shortcode_test.go2
-rw-r--r--hugolib/site.go25
-rw-r--r--hugolib/site_show_plan_test.go2
-rw-r--r--hugolib/site_test.go22
-rw-r--r--hugolib/site_url_test.go4
-rw-r--r--hugolib/sitemap_test.go2
13 files changed, 71 insertions, 127 deletions
diff --git a/hugolib/handler_test.go b/hugolib/handler_test.go
index fce29df44..0e59510d3 100644
--- a/hugolib/handler_test.go
+++ b/hugolib/handler_test.go
@@ -46,7 +46,7 @@ func TestDefaultHandler(t *testing.T) {
s := &Site{
Source: &source.InMemorySource{ByteSource: sources},
targets: targetList{page: &target.PagePub{UglyURLs: true, PublishDir: "public"}},
- Language: NewLanguage("en"),
+ Language: helpers.NewLanguage("en"),
}
if err := buildAndRenderSite(s,
diff --git a/hugolib/hugo_sites.go b/hugolib/hugo_sites.go
index 8fd2a63b9..561c43a3a 100644
--- a/hugolib/hugo_sites.go
+++ b/hugolib/hugo_sites.go
@@ -63,7 +63,7 @@ func createSitesFromConfig() ([]*Site, error) {
multilingual := viper.GetStringMap("Languages")
if len(multilingual) == 0 {
// TODO(bep) multilingo langConfigsList = append(langConfigsList, NewLanguage("en"))
- sites = append(sites, newSite(NewLanguage("en")))
+ sites = append(sites, newSite(helpers.NewLanguage("en")))
}
if len(multilingual) > 0 {
@@ -481,7 +481,7 @@ func doBuildSite(s *Site, render bool, additionalTemplates ...string) error {
}
// Convenience func used in tests.
-func newHugoSitesFromSourceAndLanguages(input []source.ByteSource, languages Languages) (*HugoSites, error) {
+func newHugoSitesFromSourceAndLanguages(input []source.ByteSource, languages helpers.Languages) (*HugoSites, error) {
if len(languages) == 0 {
panic("Must provide at least one language")
}
@@ -504,10 +504,10 @@ func newHugoSitesFromSourceAndLanguages(input []source.ByteSource, languages Lan
}
// Convenience func used in tests.
-func newHugoSitesFromLanguages(languages Languages) (*HugoSites, error) {
+func newHugoSitesFromLanguages(languages helpers.Languages) (*HugoSites, error) {
return newHugoSitesFromSourceAndLanguages(nil, languages)
}
func newHugoSitesDefaultLanguage() (*HugoSites, error) {
- return newHugoSitesFromSourceAndLanguages(nil, Languages{newDefaultLanguage()})
+ return newHugoSitesFromSourceAndLanguages(nil, helpers.Languages{helpers.NewDefaultLanguage()})
}
diff --git a/hugolib/menu_test.go b/hugolib/menu_test.go
index 9ef4d09ad..4eafba47e 100644
--- a/hugolib/menu_test.go
+++ b/hugolib/menu_test.go
@@ -18,6 +18,8 @@ import (
"strings"
"testing"
+ "github.com/spf13/hugo/helpers"
+
"path/filepath"
toml "github.com/pelletier/go-toml"
@@ -673,7 +675,7 @@ func createTestSite(pageSources []source.ByteSource) *Site {
return &Site{
Source: &source.InMemorySource{ByteSource: pageSources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
}
diff --git a/hugolib/multilingual.go b/hugolib/multilingual.go
index 9c5342f99..610587659 100644
--- a/hugolib/multilingual.go
+++ b/hugolib/multilingual.go
@@ -1,3 +1,16 @@
+// Copyright 2016-present The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
package hugolib
import (
@@ -10,58 +23,21 @@ import (
"fmt"
"github.com/spf13/cast"
- "github.com/spf13/viper"
+ "github.com/spf13/hugo/helpers"
)
-type Language struct {
- Lang string
- Title string
- Weight int
- params map[string]interface{}
- paramsInit sync.Once
-}
-
-func NewLanguage(lang string) *Language {
- return &Language{Lang: lang, params: make(map[string]interface{})}
-}
-
-func newDefaultLanguage() *Language {
- defaultLang := viper.GetString("DefaultContentLanguage")
-
- if defaultLang == "" {
- defaultLang = "en"
- }
-
- return NewLanguage(defaultLang)
-}
-
-type Languages []*Language
-
-func NewLanguages(l ...*Language) Languages {
- languages := make(Languages, len(l))
- for i := 0; i < len(l); i++ {
- languages[i] = l[i]
- }
- sort.Sort(languages)
- return languages
-}
-
-func (l Languages) Len() int { return len(l) }
-func (l Languages) Less(i, j int) bool { return l[i].Weight < l[j].Weight }
-func (l Languages) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
-
type Multilingual struct {
- Languages Languages
+ Languages helpers.Languages
- DefaultLang *Language
+ DefaultLang *helpers.Language
- langMap map[string]*Language
+ langMap map[string]*helpers.Language
langMapInit sync.Once
}
-func (ml *Multilingual) Language(lang string) *Language {
+func (ml *Multilingual) Language(lang string) *helpers.Language {
ml.langMapInit.Do(func() {
- ml.langMap = make(map[string]*Language)
+ ml.langMap = make(map[string]*helpers.Language)
for _, l := range ml.Languages {
ml.langMap[l.Lang] = l
}
@@ -70,7 +46,7 @@ func (ml *Multilingual) Language(lang string) *Language {
}
func newMultiLingualFromSites(sites ...*Site) (*Multilingual, error) {
- languages := make(Languages, len(sites))
+ languages := make(helpers.Languages, len(sites))
for i, s := range sites {
if s.Language == nil {
@@ -79,61 +55,22 @@ func newMultiLingualFromSites(sites ...*Site) (*Multilingual, error) {
languages[i] = s.Language
}
- return &Multilingual{Languages: languages, DefaultLang: newDefaultLanguage()}, nil
+ return &Multilingual{Languages: languages, DefaultLang: helpers.NewDefaultLanguage()}, nil
}
func newMultiLingualDefaultLanguage() *Multilingual {
- return newMultiLingualForLanguage(newDefaultLanguage())
+ return newMultiLingualForLanguage(helpers.NewDefaultLanguage())
}
-func newMultiLingualForLanguage(language *Language) *Multilingual {
- languages := Languages{language}
+func newMultiLingualForLanguage(language *helpers.Language) *Multilingual {
+ languages := helpers.Languages{language}
return &Multilingual{Languages: languages, DefaultLang: language}
}
func (ml *Multilingual) enabled() bool {
return len(ml.Languages) > 1
}
-func (l *Language) Params() map[string]interface{} {
- l.paramsInit.Do(func() {
- // Merge with global config.
- // TODO(bep) consider making this part of a constructor func.
-
- globalParams := viper.GetStringMap("Params")
- for k, v := range globalParams {
- if _, ok := l.params[k]; !ok {
- l.params[k] = v
- }
- }
- })
- return l.params
-}
-
-func (l *Language) SetParam(k string, v interface{}) {
- l.params[k] = v
-}
-
-func (l *Language) GetString(key string) string { return cast.ToString(l.Get(key)) }
-func (ml *Language) GetStringMap(key string) map[string]interface{} {
- return cast.ToStringMap(ml.Get(key))
-}
-
-func (l *Language) GetStringMapString(key string) map[string]string {
- return cast.ToStringMapString(l.Get(key))
-}
-
-func (l *Language) Get(key string) interface{} {
- if l == nil {
- panic("language not set")
- }
- key = strings.ToLower(key)
- if v, ok := l.params[key]; ok {
- return v
- }
- return viper.Get(key)
-}
-
func (s *Site) multilingualEnabled() bool {
return s.Multilingual != nil && s.Multilingual.enabled()
}
@@ -143,12 +80,12 @@ func (s *Site) currentLanguageString() string {
return s.currentLanguage().Lang
}
-func (s *Site) currentLanguage() *Language {
+func (s *Site) currentLanguage() *helpers.Language {
return s.Language
}
-func toSortedLanguages(l map[string]interface{}) (Languages, error) {
- langs := make(Languages, len(l))
+func toSortedLanguages(l map[string]interface{}) (helpers.Languages, error) {
+ langs := make(helpers.Languages, len(l))
i := 0
for lang, langConf := range l {
@@ -158,7 +95,7 @@ func toSortedLanguages(l map[string]interface{}) (Languages, error) {
return nil, fmt.Errorf("Language config is not a map: %v", langsMap)
}
- language := NewLanguage(lang)
+ language := helpers.NewLanguage(lang)
for k, v := range langsMap {
loki := strings.ToLower(k)
diff --git a/hugolib/node.go b/hugolib/node.go
index 773573c3c..e9a5ab1a9 100644
--- a/hugolib/node.go
+++ b/hugolib/node.go
@@ -47,7 +47,7 @@ type Node struct {
paginatorInit sync.Once
scratch *Scratch
- language *Language
+ language *helpers.Language
languageInit sync.Once
lang string // TODO(bep) multilingo
@@ -193,7 +193,7 @@ func (n *Node) Scratch() *Scratch {
}
// TODO(bep) multilingo consolidate. See Page.
-func (n *Node) Language() *Language {
+func (n *Node) Language() *helpers.Language {
n.initLanguage()
return n.language
}
diff --git a/hugolib/robotstxt_test.go b/hugolib/robotstxt_test.go
index 62be91522..5b6c90826 100644
--- a/hugolib/robotstxt_test.go
+++ b/hugolib/robotstxt_test.go
@@ -39,7 +39,7 @@ func TestRobotsTXTOutput(t *testing.T) {
s := &Site{
Source: &source.InMemorySource{ByteSource: weightedSources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildAndRenderSite(s, "robots.txt", robotTxtTemplate); err != nil {
diff --git a/hugolib/rss_test.go b/hugolib/rss_test.go
index f9f26cb7b..007d6a17c 100644
--- a/hugolib/rss_test.go
+++ b/hugolib/rss_test.go
@@ -55,7 +55,7 @@ func TestRSSOutput(t *testing.T) {
hugofs.InitMemFs()
s := &Site{
Source: &source.InMemorySource{ByteSource: weightedSources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildAndRenderSite(s, "rss.xml", rssTemplate); err != nil {
diff --git a/hugolib/shortcode_test.go b/hugolib/shortcode_test.go
index 1b5c6c847..18e6314b3 100644
--- a/hugolib/shortcode_test.go
+++ b/hugolib/shortcode_test.go
@@ -562,7 +562,7 @@ tags:
s := &Site{
Source: &source.InMemorySource{ByteSource: sources},
targets: targetList{page: &target.PagePub{UglyURLs: false}},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
addTemplates := func(templ tpl.Template) error {
diff --git a/hugolib/site.go b/hugolib/site.go
index fe3285e14..cfbe75f70 100644
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -96,7 +96,7 @@ type Site struct {
futureCount int
expiredCount int
Data map[string]interface{}
- Language *Language
+ Language *helpers.Language
}
// Reset returns a new Site prepared for rebuild.
@@ -106,13 +106,13 @@ func (s *Site) Reset() *Site {
}
// newSite creates a new site in the given language.
-func newSite(lang *Language) *Site {
+func newSite(lang *helpers.Language) *Site {
return &Site{Language: lang, Info: SiteInfo{multilingual: newMultiLingualForLanguage(lang)}}
}
// newSite creates a new site in the default language.
func newSiteDefaultLang() *Site {
- return newSite(newDefaultLanguage())
+ return newSite(helpers.NewDefaultLanguage())
}
// Convenience func used in tests.
@@ -131,7 +131,7 @@ func newSiteFromSources(pathContentPairs ...string) *Site {
return &Site{
Source: &source.InMemorySource{ByteSource: sources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
}
@@ -173,9 +173,9 @@ type SiteInfo struct {
Data *map[string]interface{}
multilingual *Multilingual
- Language *Language
+ Language *helpers.Language
LanguagePrefix string
- Languages Languages
+ Languages helpers.Languages
}
// Used in tests.
@@ -782,6 +782,9 @@ func (s *Site) setupPrevNext() {
}
func (s *Site) render() (err error) {
+ // There are sadly some global template funcs etc. that needs the language information.
+ viper.Set("Multilingual", s.multilingualEnabled())
+ viper.Set("CurrentContentLanguage", s.Language)
if err = tpl.SetTranslateLang(s.Language.Lang); err != nil {
return
}
@@ -851,11 +854,11 @@ func (s *Site) initialize() (err error) {
// HomeAbsURL is a convenience method giving the absolute URL to the home page.
func (s *SiteInfo) HomeAbsURL() string {
- base := "/"
+ base := ""
if s.IsMultiLingual() {
base = s.Language.Lang
}
- return helpers.AbsURL(base)
+ return helpers.AbsURL(base, false)
}
// SitemapAbsURL is a convenience method giving the absolute URL to the sitemap.
@@ -867,8 +870,8 @@ func (s *SiteInfo) SitemapAbsURL() string {
func (s *Site) initializeSiteInfo() {
var (
- lang *Language = s.Language
- languages Languages
+ lang *helpers.Language = s.Language
+ languages helpers.Languages
)
if s.Multilingual != nil {
@@ -1435,7 +1438,7 @@ func (s *Site) renderAliases() error {
if s.Multilingual.enabled() {
mainLang := s.Multilingual.DefaultLang.Lang
- mainLangURL := helpers.AbsURL(mainLang)
+ mainLangURL := helpers.AbsURL(mainLang, false)
jww.DEBUG.Printf("Write redirect to main language %s: %s", mainLang, mainLangURL)
if err := s.publishDestAlias(s.languageAliasTarget(), "/", mainLangURL); err != nil {
return err
diff --git a/hugolib/site_show_plan_test.go b/hugolib/site_show_plan_test.go
index d330f4344..981bed7bf 100644
--- a/hugolib/site_show_plan_test.go
+++ b/hugolib/site_show_plan_test.go
@@ -112,7 +112,7 @@ func _TestPageTargetUgly(t *testing.T) {
s := &Site{
targets: targetList{page: &target.PagePub{UglyURLs: true, PublishDir: "public"}},
Source: &source.InMemorySource{ByteSource: fakeSource},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildAndRenderSite(s); err != nil {
diff --git a/hugolib/site_test.go b/hugolib/site_test.go
index f98bc6a7d..b93e08aca 100644
--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -128,7 +128,7 @@ func TestDraftAndFutureRender(t *testing.T) {
siteSetup := func(t *testing.T) *Site {
s := &Site{
Source: &source.InMemorySource{ByteSource: sources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildSiteSkipRender(s); err != nil {
@@ -186,7 +186,7 @@ func TestFutureExpirationRender(t *testing.T) {
siteSetup := func(t *testing.T) *Site {
s := &Site{
Source: &source.InMemorySource{ByteSource: sources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildSiteSkipRender(s); err != nil {
@@ -280,7 +280,7 @@ THE END.`, refShortcode)),
s := &Site{
Source: &source.InMemorySource{ByteSource: sources},
targets: targetList{page: &target.PagePub{UglyURLs: uglyURLs}},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildAndRenderSite(s, "_default/single.html", "{{.Content}}"); err != nil {
@@ -348,7 +348,7 @@ func doTestShouldAlwaysHaveUglyURLs(t *testing.T, uglyURLs bool) {
s := &Site{
Source: &source.InMemorySource{ByteSource: sources},
targets: targetList{page: &target.PagePub{UglyURLs: uglyURLs, PublishDir: "public"}},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildAndRenderSite(s,
@@ -438,7 +438,7 @@ func doTestSectionNaming(t *testing.T, canonify, uglify, pluralize bool) {
s := &Site{
Source: &source.InMemorySource{ByteSource: sources},
targets: targetList{page: &target.PagePub{UglyURLs: uglify}},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildAndRenderSite(s,
@@ -500,7 +500,7 @@ func TestSkipRender(t *testing.T) {
s := &Site{
Source: &source.InMemorySource{ByteSource: sources},
targets: targetList{page: &target.PagePub{UglyURLs: true}},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildAndRenderSite(s,
@@ -555,7 +555,7 @@ func TestAbsURLify(t *testing.T) {
s := &Site{
Source: &source.InMemorySource{ByteSource: sources},
targets: targetList{page: &target.PagePub{UglyURLs: true}},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
t.Logf("Rendering with BaseURL %q and CanonifyURLs set %v", viper.GetString("baseURL"), canonify)
@@ -649,7 +649,7 @@ func TestOrderedPages(t *testing.T) {
viper.Set("baseurl", "http://auth/bub")
s := &Site{
Source: &source.InMemorySource{ByteSource: weightedSources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildSiteSkipRender(s); err != nil {
@@ -718,7 +718,7 @@ func TestGroupedPages(t *testing.T) {
viper.Set("baseurl", "http://auth/bub")
s := &Site{
Source: &source.InMemorySource{ByteSource: groupedSources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildSiteSkipRender(s); err != nil {
@@ -903,7 +903,7 @@ func TestWeightedTaxonomies(t *testing.T) {
viper.Set("taxonomies", taxonomies)
s := &Site{
Source: &source.InMemorySource{ByteSource: sources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildSiteSkipRender(s); err != nil {
@@ -972,7 +972,7 @@ func setupLinkingMockSite(t *testing.T) *Site {
site := &Site{
Source: &source.InMemorySource{ByteSource: sources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildSiteSkipRender(site); err != nil {
diff --git a/hugolib/site_url_test.go b/hugolib/site_url_test.go
index 6b96b09dc..522732cc2 100644
--- a/hugolib/site_url_test.go
+++ b/hugolib/site_url_test.go
@@ -17,6 +17,8 @@ import (
"path/filepath"
"testing"
+ "github.com/spf13/hugo/helpers"
+
"html/template"
"github.com/spf13/hugo/hugofs"
@@ -90,7 +92,7 @@ func TestPageCount(t *testing.T) {
viper.Set("paginate", 10)
s := &Site{
Source: &source.InMemorySource{ByteSource: urlFakeSource},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildAndRenderSite(s, "indexes/blue.html", indexTemplate); err != nil {
diff --git a/hugolib/sitemap_test.go b/hugolib/sitemap_test.go
index 58408ce47..6c57084db 100644
--- a/hugolib/sitemap_test.go
+++ b/hugolib/sitemap_test.go
@@ -43,7 +43,7 @@ func TestSitemapOutput(t *testing.T) {
s := &Site{
Source: &source.InMemorySource{ByteSource: weightedSources},
- Language: newDefaultLanguage(),
+ Language: helpers.NewDefaultLanguage(),
}
if err := buildAndRenderSite(s, "sitemap.xml", SITEMAP_TEMPLATE); err != nil {