mirror of
				https://github.com/gohugoio/hugo.git
				synced 2024-05-11 05:54:58 +00:00 
			
		
		
		
	tpl: Rework to handle both text and HTML templates
Before this commit, Hugo used `html/template` for all Go templates. While this is a fine choice for HTML and maybe also RSS feeds, it is painful for plain text formats such as CSV, JSON etc. This commit fixes that by using the `IsPlainText` attribute on the output format to decide what to use. A couple of notes: * The above requires a nonambiguous template name to type mapping. I.e. `/layouts/_default/list.json` will only work if there is only one JSON output format, `/layouts/_default/list.mytype.json` will always work. * Ambiguous types will fall back to HTML. * Partials inherits the text vs HTML identificator of the container template. This also means that plain text templates can only include plain text partials. * Shortcode templates are, by definition, currently HTML templates only. Fixes #3221
This commit is contained in:
		@@ -110,9 +110,29 @@ func (p *PageOutput) Render(layout ...string) template.HTML {
 | 
			
		||||
	l, err := p.layouts(layout...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		helpers.DistinctErrorLog.Printf("in .Render: Failed to resolve layout %q for page %q", layout, p.pathOrTitle())
 | 
			
		||||
		return template.HTML("")
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return p.s.Tmpl.ExecuteTemplateToHTML(p, l...)
 | 
			
		||||
 | 
			
		||||
	for _, layout := range l {
 | 
			
		||||
		templ := p.s.Tmpl.Lookup(layout)
 | 
			
		||||
		if templ == nil {
 | 
			
		||||
			// This is legacy from when we had only one output format and
 | 
			
		||||
			// HTML templates only. Some have references to layouts without suffix.
 | 
			
		||||
			// We default to good old HTML.
 | 
			
		||||
			templ = p.s.Tmpl.Lookup(layout + ".html")
 | 
			
		||||
		}
 | 
			
		||||
		if templ != nil {
 | 
			
		||||
			res, err := templ.ExecuteToString(p)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				helpers.DistinctErrorLog.Printf("in .Render: Failed to execute template %q for page %q", layout, p.pathOrTitle())
 | 
			
		||||
				return template.HTML("")
 | 
			
		||||
			}
 | 
			
		||||
			return template.HTML(res)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ""
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *Page) Render(layout ...string) template.HTML {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user