output: Fall back to unstranslated base template
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 17 Nov 2017 11:27:50 +0000 (12:27 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 17 Nov 2017 12:08:18 +0000 (13:08 +0100)
Fixes #3893

output/layout_base.go
output/layout_base_test.go

index 79baf9b5f5f93b229c7082b34c8b5305d04f35d9..49ae1d64efdb3913f3619151c093b60ffbfdbe0b 100644 (file)
@@ -174,12 +174,18 @@ func CreateTemplateNames(d TemplateLookupDescriptor) (TemplateNames, error) {
                // Also note that the <current-path> may be both the project's layout folder and the theme's.
                pairsToCheck := createPairsToCheck(baseTemplatedDir, baseFilename, currBaseFilename)
 
-               if strings.Contains(currBaseFilename, ".terms.") {
-                       // We need to get from baseof.terms.html to baseof.html etc.
-                       // See #3856
-                       currBaseFilename = strings.Replace(currBaseFilename, ".terms", "", 1)
-                       baseFilename = strings.Replace(baseFilename, ".terms", "", 1)
-                       pairsToCheck = append(pairsToCheck, createPairsToCheck(baseTemplatedDir, baseFilename, currBaseFilename)...)
+               // We may have language code and/or "terms" in the template name. We want the most specific,
+               // but need to fall back to the baseof.html or baseof.ace if needed.
+               // E.g. list-baseof.en.html and list-baseof.terms.en.html
+               // See #3893, #3856.
+               baseBaseFilename, currBaseBaseFilename := helpers.Filename(baseFilename), helpers.Filename(currBaseFilename)
+               p1, p2 := strings.Split(baseBaseFilename, "."), strings.Split(currBaseBaseFilename, ".")
+               if len(p1) > 0 && len(p1) == len(p2) {
+                       for i := len(p1); i > 0; i-- {
+                               v1, v2 := strings.Join(p1[:i], ".")+"."+ext, strings.Join(p2[:i], ".")+"."+ext
+                               pairsToCheck = append(pairsToCheck, createPairsToCheck(baseTemplatedDir, v1, v2)...)
+
+                       }
                }
 
        Loop:
index 2435fed03c4db396a6a90381f1f062bd8b4a160b..d7c7fbb907edef22c177400fb9a1eca6482fe68d 100644 (file)
@@ -50,6 +50,19 @@ func TestLayoutBase(t *testing.T) {
                                OverlayFilename: "/sites/mysite/layouts/_default/single.html",
                                MasterFilename:  "/sites/mysite/layouts/_default/single-baseof.html",
                        }},
+               // Issue #3893
+               {"Base Lang, Default Base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: "layouts", RelPath: "_default/list.en.html"}, true, "_default/baseof.html",
+                       TemplateNames{
+                               Name:            "_default/list.en.html",
+                               OverlayFilename: "/sites/mysite/layouts/_default/list.en.html",
+                               MasterFilename:  "/sites/mysite/layouts/_default/baseof.html",
+                       }},
+               {"Base Lang, Lang Base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: "layouts", RelPath: "_default/list.en.html"}, true, "_default/baseof.html|_default/baseof.en.html",
+                       TemplateNames{
+                               Name:            "_default/list.en.html",
+                               OverlayFilename: "/sites/mysite/layouts/_default/list.en.html",
+                               MasterFilename:  "/sites/mysite/layouts/_default/baseof.en.html",
+                       }},
                // Issue #3856
                {"Base Taxonomy Term", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: "taxonomy/tag.terms.html"}, true, "_default/baseof.html",
                        TemplateNames{
@@ -116,12 +129,11 @@ func TestLayoutBase(t *testing.T) {
                                OverlayFilename: "/sites/mysite/layouts/_default/single.amp.html",
                                MasterFilename:  "/sites/mysite/layouts/_default/single-baseof.amp.html",
                        }},
-               {"AMP with no match in base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPathAmp}, true, "single-baseof.html",
+               {"AMP with no AMP base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPathAmp}, true, "single-baseof.html",
                        TemplateNames{
                                Name:            "_default/single.amp.html",
                                OverlayFilename: "/sites/mysite/layouts/_default/single.amp.html",
-                               // There is a single-baseof.html, but that makes no sense.
-                               MasterFilename: "",
+                               MasterFilename:  "/sites/mysite/layouts/_default/single-baseof.html",
                        }},
 
                {"JSON with base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPathJSON}, true, "single-baseof.json",