How to pass {% captured %} variable from a view to the layout in Jekyll/Liquid?

jekyll, jekyll-extensions, liquid, liquid-layout

Solution

You can't do this with a capture, but you can using an include. Every level of the page hierarchy can override the `head` key to point to a different include file as required. This example wraps the include with a condition so if no `head` key is specified the page will still generate.

default.html

{% if page.head %}
  {% include {{ page.head }} %}
{% endif %}

{{ content }}

frontpage.html

---
layout: default
head: header1.html
---

{{ content }}

_includes/header1.html

(Frontpage header content)

Problem

I am trying to rebuild a blog in Jekyll and I have stubled upon a simple task. Provided I have the following set of templates: default.html: ``` {{ head }} {{ content }} ``` frontpage.html: ``` --- layout: default --- {% capture head %} Frontpage {% end %} {{ content }} ``` index.html: ``` --- layout: frontpage --- Other stuff ``` I was expecting that `{% capture head %}` would pass a variable to layout. But it seems only variables from the Front Matter are actually being passed as `page.variable_name`. Is there a way to pass `capture`-d var to the layout in Jekyll? Guess I could make 2 different layouts for `frontpage` and `normal_page` that would replace the whole `{{head}}{{content}}` block in the layout. But that's like twice the html, so I'd rather solve it with `capture` if possible.

Original source

Related problems