jekylljekyll-paginator

Jekyll inheritance


I have this following layout, with jekyll 3.7.3;

declare A = apple

include file.html > declare A = orange

print A => orange

I am confused to how did A=orange leaked to the parent layout, in the jekyll's doc, says that the variables assess thru layout in the liquid tag. Does this apply to the include as well? It makes no sense in where child layout overwritten the parent layout, as it is saying in the github conversation and this conversation.

So my question is how is this inheritance work?

From what I understand about inheritance, there should be some control how the child variable be overwrite the parent variable. From the document, I believe it is through the variable layout. Then this should look like this;

declare A = apple 

include file.html > declare layout.A = orange

print A => apple

Other case is;

declare A = apple

include file.html > print A => apple

declare A = orange

print A => orange

What is the point of having an argument in the include if the child include inheritances the value without explicitly tells it to.

also with the leak variables into the include child, would mean the child include is not isolated any more for the purpose of special case like it is saying here


Solution

  • Includes and layouts are not the same.

    While generating a site, Jekyll does a lot of things in a particular order.

    When it renders liquid :

    === page.html
    include other.html
    
    print a
    assign: a = apple
    print a
    
    include other.html
    === end page.html
    

    Becomes a pile of code which is processed like this :

    === page.html
      ====== other.html
      print a ------> nil
      assign: a = orange
      print a ------> orange
      ====== end other.html
    print a ------> orange
    assign: a = apple
    print a ------> apple
      ====== other.html
      print a ------> apple
      assign: a = orange
      print a ------> orange
      ====== end other.html
    === end page.html
    

    Liquid tags are executed exactly in the order they appear in code, and variables (the local variables assigned in page body, not the one in front matter that are freezed and cannot be changed) are global and can be overridden from page or any child include.

    After this, it renders HTML if necessary, and "spits" page's {{ content }} in the layout that knows nothing about page's local variables and can only see page's variables defined in front matter.