From aa6b1b9be7c9d7322333893b642aaf8c7a5f2c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 2 Jul 2017 10:46:28 +0200 Subject: output: Support templates per site/language This applies to both regular templates and shortcodes. So, if the site language is French and the output format is AMP, this is the (start) of the lookup order for the home page: 1. index.fr.amp.html 2. index.amp.html 3. index.fr.html 4. index.html 5. ... Fixes #3360 --- hugolib/shortcode.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'hugolib/shortcode.go') diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index 150d82c44..3cf472f82 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -157,6 +157,7 @@ func (sc shortcode) String() string { // Note that in the below, OutputFormat may be empty. // We will try to look for the most specific shortcode template available. type scKey struct { + Lang string OutputFormat string Suffix string ShortcodePlaceholder string @@ -166,8 +167,8 @@ func newScKey(m media.Type, shortcodeplaceholder string) scKey { return scKey{Suffix: m.Suffix, ShortcodePlaceholder: shortcodeplaceholder} } -func newScKeyFromOutputFormat(o output.Format, shortcodeplaceholder string) scKey { - return scKey{Suffix: o.MediaType.Suffix, OutputFormat: o.Name, ShortcodePlaceholder: shortcodeplaceholder} +func newScKeyFromLangAndOutputFormat(lang string, o output.Format, shortcodeplaceholder string) scKey { + return scKey{Lang: lang, Suffix: o.MediaType.Suffix, OutputFormat: o.Name, ShortcodePlaceholder: shortcodeplaceholder} } func newDefaultScKey(shortcodeplaceholder string) scKey { @@ -251,10 +252,11 @@ const innerCleanupExpand = "$1" func prepareShortcodeForPage(placeholder string, sc shortcode, parent *ShortcodeWithPage, p *Page) map[scKey]func() (string, error) { m := make(map[scKey]func() (string, error)) + lang := p.Lang() for _, f := range p.outputFormats { // The most specific template will win. - key := newScKeyFromOutputFormat(f, placeholder) + key := newScKeyFromLangAndOutputFormat(lang, f, placeholder) m[key] = func() (string, error) { return renderShortcode(key, sc, nil, p), nil } @@ -371,9 +373,11 @@ func (s *shortcodeHandler) updateDelta() bool { func (s *shortcodeHandler) contentShortcodesForOutputFormat(f output.Format) map[scKey]func() (string, error) { contentShortcodesForOuputFormat := make(map[scKey]func() (string, error)) + lang := s.p.Lang() + for shortcodePlaceholder := range s.shortcodes { - key := newScKeyFromOutputFormat(f, shortcodePlaceholder) + key := newScKeyFromLangAndOutputFormat(lang, f, shortcodePlaceholder) renderFn, found := s.contentShortcodes[key] if !found { @@ -390,7 +394,7 @@ func (s *shortcodeHandler) contentShortcodesForOutputFormat(f output.Format) map if !found { panic(fmt.Sprintf("Shortcode %q could not be found", shortcodePlaceholder)) } - contentShortcodesForOuputFormat[newScKeyFromOutputFormat(f, shortcodePlaceholder)] = renderFn + contentShortcodesForOuputFormat[newScKeyFromLangAndOutputFormat(lang, f, shortcodePlaceholder)] = renderFn } return contentShortcodesForOuputFormat @@ -676,12 +680,19 @@ func getShortcodeTemplateForTemplateKey(key scKey, shortcodeName string, t tpl.T suffix := strings.ToLower(key.Suffix) outFormat := strings.ToLower(key.OutputFormat) + lang := strings.ToLower(key.Lang) if outFormat != "" && suffix != "" { + if lang != "" { + names = append(names, fmt.Sprintf("%s.%s.%s.%s", shortcodeName, lang, outFormat, suffix)) + } names = append(names, fmt.Sprintf("%s.%s.%s", shortcodeName, outFormat, suffix)) } if suffix != "" { + if lang != "" { + names = append(names, fmt.Sprintf("%s.%s.%s", shortcodeName, lang, suffix)) + } names = append(names, fmt.Sprintf("%s.%s", shortcodeName, suffix)) } -- cgit v1.2.3