shithub: hugo

Download patch

ref: 0a81a6b4bae3de53aa9c179b855c671a2d30eec7
parent: 60dfb9a6e076200ab3ca3fd30e34bb3c14e0a893
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Fri Nov 17 07:27:50 EST 2017

output: Fall back to unstranslated base template

Fixes #3893

--- a/output/layout_base.go
+++ b/output/layout_base.go
@@ -174,12 +174,18 @@
 		// 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:
--- a/output/layout_base_test.go
+++ b/output/layout_base_test.go
@@ -50,6 +50,19 @@
 				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 @@
 				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",
--