12

私は大々的に Jekyll に取り組んでおり、一般的なフロントエンド開発プラットフォームとして使用したいと考えていますが、Liquid テンプレート言語の制限、特に Django テンプレートとの違いに直面しています。

Django の非常に重要な Extends および Block 構文を追加する、liquid-inheritance gem を発見しました。このブログ投稿では、gekyll のファイル システムに合わせて gem をさらに拡張しています

問題は、Django とまったく同じ方法でブロックを実装していないように見えることです。これにより、基本的に gem が役に立たなくなります。

わかりやすくするために、parent.html と child.html という 2 つの jekyll の「レイアウト」があります。どちらにも YAML セクションは含まれていません。

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

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

そして、YAMLセクションを含むjekyllページがあります:

---
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 の Liquid-inheritance の問題は、他の人がこのブロックのネストの問題を経験していることを示唆しています: https://github.com/danwrong/liquid-inheritance/issues/3

私は Liquid-inheritance のいくつかのフォークを試しましたが、その多くは問題の正規表現を明らかに修正しましたが、これを解決するものはないようです。

私がやろうとしていることは根本的に不可能ですか?少なくとも 85% は進んでいるようで、最後の部分を修正する必要があります。

4

1 に答える 1

7

これがJekyll内で機能するかどうかはわかりません。私は間違っているかもしれませんが、ここに私の理由があります:

各ページは、 https: //github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rbのdo_layoutを使用してレンダリングされます

これは再帰的に機能します-ページのコンテンツを処理し、次にページのレイアウトを処理し、次にそのレイアウトのレイアウトなどを処理し、YAML変数をチェーンの上位に渡します(したがって、親テンプレートでは常に{{page 。なんでもいい}})。

これは、渡されるのはYAML値だけであり、「content」の値がLiquidによって処理された後のものであることを意味します。他の場所でどのように行われるかはわかりませんが、2つのブロックを別々に渡す必要があるため、ブロックの概念と互換性がないようです。

基本的に、問題は、Jekyllがすでに単純な形式の継承を持っていることであるように思われます-レイアウトに与えることができる「layout」属性を介して。基本的に、これは液体テンプレートと互換性があると思います。

とはいえ、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のすべての変数を取得します。

これがうまくいかない場合は、いつでもHyde: http ://hyde.github.com/を試すことができます。これは、Pythonで記述され、Jinja2(基本的にはDjangoテンプレート++)を使用し、同じようなことを行います。

于 2012-10-31T20:51:39.433 に答える