我发现了液体继承宝石,它从Django添加了所有重要的Extends和Block语法.这个博客文章扩展了宝石,以适应Jekyll的文件系统:
http://www.sameratiani.com/2011/10/22/get-jekyll-working-with-liquid-inheritance.html
问题是,它似乎并没有像Django那样完全相同的方式来实现块,这实际上使得gem无用.
我有两个jekyll“布局” – 为了理解 – parent.html和child.html.这两个都不包含YAML部分.
亲
<html> {% block foo %} {% endblock %} </html>
儿童
{% extends _layouts/parent.html %} {% block foo %} <div> Bar comes next: {% block bar %} {% endblock %} </div> {% endblock %}
--- title: test --- {% extends _layouts/child.html %} {% block bar %}My title is {{ page.title }} {% endblock %}
我期望什么
<html> <div> Bar comes next: My title is test </div> </html>
我得到的
<html> <div> Bar comes next: </div> </html>My title is test
似乎有些事情没有把mypage.html中的块视为有资格插入父母/孩子的合适位置,尽管它显然还在做某些事情.
我不是Ruby的开发人员,对于Jekyll来说是相当新的,所以我需要帮助来确定这个堆栈的哪个部分是失败的. github上的液体继承问题表明其他人正在遇到这个块嵌套问题:https://github.com/danwrong/liquid-inheritance/issues/3
我已经尝试了几种液体继承叉,其中许多显然修复了这个问题正则表达式,但是似乎没有解决这个问题.
我从根本上不可能做的是什么?看起来我至少有85%的方式,最后一点需要修复.
解决方法
每个页面都会在https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb中使用do_layout进行渲染
这是递归的工作 – 它处理页面的内容,然后处理页面的布局,然后处理该布局的布局等等,将YAML变量传递给链(因此它们始终在父模板中可用为{{page .随你}}).
这意味着只有通过“YAML”值才能被传递出来的东西,以及“Content”处理之后的“content”的值.我不知道其他地方怎么做,但这似乎与块的想法不符,因为它们需要你单独传递两个块.
从根本上说,在我看来,问题是Jekyll已经有一种简单的继承形式 – 通过你可以给布局的“布局”属性.从根本上说,我认为这与液体模板兼容.
所有这一切,我不知道你已经耗尽了使用YAML,_includes和模板逻辑的限制.如果您正在将Django样式块放入您的内容,为什么不要这样做:
内容:
--- title: some title secondary_content: | Here is some *secondary* content that will be [markdownified](http://example.com). It can run to multiple lines and include * Lists * Good things * Etc --- And here is the main content,as per usual
模板:
<html> <article> <h1>{{ page.title }}</h1> {{ content }} </article> <aside> {{ page.secondary_content | markdownify}} </aside>
如果您想保持模板清洁,并为不同类型的页面提供不同的内容,则可以使用各种包括:
模板:
<aside> {% include sidebar_negotiation.html %} </aside>
_includes / sidebar_negotiation.html:
{% if page.type = 'foo' %} {% include sidebar_foo.html %} {% else if page.type = 'bar' %} {% include sidebar_bar.html %} {% endif %}
然后将您的页面类型特定的东西放在这些文件中.显然你可以直接包含它,但抽出来很可能很好.那些包括将获得YAML中的所有变量.
如果这不是一个胜利,您可以随时尝试使用Python编写的海德http://hyde.github.com/,使用Jinja2(基本上是Django模板),并做同样的事情.