@@ -26,6 +26,7 @@ type LayoutDescriptor struct {
2626 Type string
2727 Section string
2828 Kind string
29+ Lang string
2930 Layout string
3031}
3132
@@ -55,31 +56,33 @@ func NewLayoutHandler(hasTheme bool) *LayoutHandler {
5556
5657const (
5758
59+ // TODO(bep) variations reduce to 1 "."
60+
5861 // The RSS templates doesn't map easily into the regular pages.
59- layoutsRSSHome = `NAME.SUFFIX _default/NAME.SUFFIX _internal/_default/rss.xml`
60- layoutsRSSSection = `section/SECTION.NAME.SUFFIX _default/NAME.SUFFIX NAME.SUFFIX _internal/_default/rss.xml`
61- layoutsRSSTaxonomy = `taxonomy/SECTION.NAME.SUFFIX _default/NAME.SUFFIX NAME.SUFFIX _internal/_default/rss.xml`
62- layoutsRSSTaxonomyTerm = `taxonomy/SECTION.terms.NAME.SUFFIX _default/NAME.SUFFIX NAME.SUFFIX _internal/_default/rss.xml`
62+ layoutsRSSHome = `VARIATIONS _default/VARIATIONS _internal/_default/rss.xml`
63+ layoutsRSSSection = `section/SECTION.VARIATIONS _default/VARIATIONS VARIATIONS _internal/_default/rss.xml`
64+ layoutsRSSTaxonomy = `taxonomy/SECTION.VARIATIONS _default/VARIATIONS VARIATIONS _internal/_default/rss.xml`
65+ layoutsRSSTaxonomyTerm = `taxonomy/SECTION.terms.VARIATIONS _default/VARIATIONS VARIATIONS _internal/_default/rss.xml`
6366
64- layoutsHome = "index.NAME.SUFFIX index.SUFFIX _default/list.NAME.SUFFIX _default/list.SUFFIX "
67+ layoutsHome = "index.VARIATIONS _default/list.VARIATIONS "
6568 layoutsSection = `
66- section/SECTION.NAME.SUFFIX section/SECTION.SUFFIX
67- SECTION/list.NAME.SUFFIX SECTION/list.SUFFIX
68- _default/section.NAME.SUFFIX _default/section.SUFFIX
69- _default/list.NAME.SUFFIX _default/list.SUFFIX
70- indexes/SECTION.NAME.SUFFIX indexes/SECTION.SUFFIX
71- _default/indexes.NAME.SUFFIX _default/indexes.SUFFIX
69+ section/SECTION.VARIATIONS
70+ SECTION/list.VARIATIONS
71+ _default/section.VARIATIONS
72+ _default/list.VARIATIONS
73+ indexes/SECTION.VARIATIONS
74+ _default/indexes.VARIATIONS
7275`
7376 layoutsTaxonomy = `
74- taxonomy/SECTION.NAME.SUFFIX taxonomy/SECTION.SUFFIX
75- indexes/SECTION.NAME.SUFFIX indexes/SECTION.SUFFIX
76- _default/taxonomy.NAME.SUFFIX _default/taxonomy.SUFFIX
77- _default/list.NAME.SUFFIX _default/list.SUFFIX
77+ taxonomy/SECTION.VARIATIONS
78+ indexes/SECTION.VARIATIONS
79+ _default/taxonomy.VARIATIONS
80+ _default/list.VARIATIONS
7881`
7982 layoutsTaxonomyTerm = `
80- taxonomy/SECTION.terms.NAME.SUFFIX taxonomy/SECTION.terms.SUFFIX
81- _default/terms.NAME.SUFFIX _default/terms.SUFFIX
82- indexes/indexes.NAME.SUFFIX indexes/indexes.SUFFIX
83+ taxonomy/SECTION.terms.VARIATIONS
84+ _default/terms.VARIATIONS
85+ indexes/indexes.VARIATIONS
8386`
8487)
8588
@@ -185,14 +188,41 @@ func resolveListTemplate(d LayoutDescriptor, f Format,
185188}
186189
187190func resolveTemplate (templ string , d LayoutDescriptor , f Format ) []string {
188- delim := "."
189- if f .MediaType .Delimiter == "" {
190- delim = ""
191+
192+ // VARIATIONS will be replaced with
193+ // .lang.name.suffix
194+ // .name.suffix
195+ // .lang.suffix
196+ // .suffix
197+ var replacementValues []string
198+
199+ name := strings .ToLower (f .Name )
200+
201+ if d .Lang != "" {
202+ replacementValues = append (replacementValues , fmt .Sprintf ("%s.%s.%s" , d .Lang , name , f .MediaType .Suffix ))
203+ }
204+
205+ replacementValues = append (replacementValues , fmt .Sprintf ("%s.%s" , name , f .MediaType .Suffix ))
206+
207+ if d .Lang != "" {
208+ replacementValues = append (replacementValues , fmt .Sprintf ("%s.%s" , d .Lang , f .MediaType .Suffix ))
209+ }
210+
211+ isRSS := f .Name == RSSFormat .Name
212+
213+ if ! isRSS {
214+ replacementValues = append (replacementValues , f .MediaType .Suffix )
215+ }
216+
217+ var layouts []string
218+
219+ templFields := strings .Fields (templ )
220+
221+ for _ , field := range templFields {
222+ for _ , replacements := range replacementValues {
223+ layouts = append (layouts , replaceKeyValues (field , "VARIATIONS" , replacements , "SECTION" , d .Section ))
224+ }
191225 }
192- layouts := strings .Fields (replaceKeyValues (templ ,
193- ".SUFFIX" , delim + f .MediaType .Suffix ,
194- "NAME" , strings .ToLower (f .Name ),
195- "SECTION" , d .Section ))
196226
197227 return filterDotLess (layouts )
198228}
@@ -201,9 +231,7 @@ func filterDotLess(layouts []string) []string {
201231 var filteredLayouts []string
202232
203233 for _ , l := range layouts {
204- // This may be constructed, but media types can be suffix-less, but can contain
205- // a delimiter.
206- l = strings .TrimSuffix (l , "." )
234+ l = strings .Trim (l , "." )
207235 // If media type has no suffix, we have "index" type of layouts in this list, which
208236 // doesn't make much sense.
209237 if strings .Contains (l , "." ) {
0 commit comments