Jekyll模板使用类似django的液体块/inheritance
我正在以一种很大的方式进入Jekyll,并希望将其用作一般的前端开发平台,但是我遇到了Liquid模板语言的局限性,特别是它与Django模板的区别。
我发现了液体inheritancegem,它添加了Django中最重要的Extends和Block语法。 此博客文章进一步扩展了gem以适应Jekyll的文件系统: http : //www.sameratiani.com/2011/10/22/get-jekyll-working-with-liquid-inheritance.html
问题是它似乎没有以与Django完全相同的方式实现块,这实际上使得gem无用。
为了理解,我有两个jekyll“布局” – parent.html和child.html。 这些都不包含YAML部分。
亲
{% block foo %} {% endblock %}
儿童
{% extends _layouts/parent.html %} {% block foo %} Bar comes next: {% block bar %} {% endblock %} {% endblock %}
然后我有一个jekyll页面,其中包含一个YAML部分:
--- title: test --- {% extends _layouts/child.html %} {% block bar %}My title is {{ page.title }} {% endblock %}
我期待的是:
Bar comes next: My title is test
我得到了什么:
Bar comes next: My title is test
似乎有些事情未能将mypage.html中的块视为有资格插入父母/孩子的合适位置,尽管它显然仍在做些什么。
我不是一个ruby开发人员,对Jekyll来说相当新,所以我需要帮助确定这个堆栈的哪个部分失败了。 github上的液体inheritance问题表明其他人正在遇到这种块嵌套问题: https : //github.com/danwrong/liquid-inheritance/issues/3
我已经尝试了几种液体inheritance的分支,其中许多显然已经解决了问题正则表达式,但似乎没有解决这个问题。
我根本不可能做什么? 看起来我至少有85%的方式,最后一点需要修复。
我不确定这是否会在杰基尔内部发挥作用。 我可能错了,但这是我的理由:
在https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb中使用do_layout渲染每个页面。
这是递归工作 – 它处理页面的内容,然后处理页面的布局,然后处理布局的布局等等,将YAML变量传递到链(因此它们总是在父模板中可用{{page 。随你}})。
这意味着唯一被传递的东西是YAML值,以及在Liquid处理之后’content’的值是什么。 我不知道它在其他地方是如何完成的,但这似乎与块的概念不相容,因为它们需要你分别传递两个块。
从根本上说,在我看来,问题是Jekyll已经有了一种简单的inheritanceforms – 通过你可以给布局的“布局”属性。 从根本上说,我认为这与液体模板兼容。
总而言之,我不确定你是否已经用尽了使用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
模板:
{{ page.title }}
{{ content }}
如果您希望保持模板清洁,并为不同类型的页面提供不同的内容,则可以使用各种包含:
模板:
_includes / sidebar_negotiation.html:
{% if page.type = 'foo' %} {% include sidebar_foo.html %} {% else if page.type = 'bar' %} {% include sidebar_bar.html %} {% endif %}
然后将您的页面类型特定的东西放在这些文件中。 显然你可以直接包含它,但它可能很好地抽象出来。 这些包含将获得YAML中的所有变量。
如果这不是一场胜利,你总是可以尝试使用Hyde: http : //hyde.github.com/这是用Python编写的,使用Jinja2(基本上是Django模板++),并做同样的事情。