12

我正在深入了解 Jekyll,并希望将其用作通用前端开发平台,但我遇到了 Liquid 模板语言的限制,特别是它与 Django 模板的区别。

我发现了液体继承 gem,它添加了 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 部分。

家长

<html>
{% block foo %} {% endblock %}
</html>

孩子

{% extends _layouts/parent.html %}
{% block foo %}
  <div>
    Bar comes next:
    {% block bar %} {% endblock %}
  </div>
{% endblock %}

然后我有一个 jekyll 页面,其中包含一个 YAML 部分,因此:

---
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% 的路,最后一点需要修复。

4

1 回答 1

7

我不确定这是否会在 Jekyll 中起作用。我可能错了,但这是我的理由:

每个页面都使用https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb中的 do_layout 渲染出来

这以递归方式工作 - 它处理页面的内容,然后处理页面的布局,然后处理该布局的布局等等,将 YAML 变量传递到链上(因此它们始终在父模板中作为 {{ page 。任何}})。

这意味着唯一被传递的东西是 YAML 值,以及在 Liquid 处理后的“内容”值是什么。我不知道它在其他地方是如何完成的,但这似乎与块的想法不相容,因为它们要求你分别传递两个块。

从根本上说,在我看来,问题在于 Jekyll 已经有了一种简单的继承形式——通过您可以赋予布局的“布局”属性。从根本上说,我认为这与液体模板兼容。

说了这么多,我不确定您是否已经用尽了使用 YAML、_include 和模板逻辑的限制。如果您打算将 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 中的所有变量。

如果这一切都不是一个胜利,你总是可以尝试 Hyde:http ://hyde.github.com/它是用 Python 编写的,使用 Jinja2(基本上是 Django 模板++),并且做同样的事情。

于 2012-10-31T20:51:39.433 回答