2012-10-26 11 views
11

私は大きな方法でジキルールに入っていて、それを一般的なフロントエンド開発プラットフォームとして使いたいのですが、液体テンプレート言語特にDjangoテンプレートとの違い。ジャンゴ様の液体ブロック/継承を使用するジキールテンプレート

私は、Djangoのすべての重要なExtendsとBlockの構文を追加する液体継承宝石を発見しました。このブログ記事は、ジキルのファイルシステムに合わせて、さらに宝石を拡張: http://www.sameratiani.com/2011/10/22/get-jekyll-working-with-liquid-inheritance.html

問題は、基本的に役に立たない宝石をレンダリングした、Djangoはない全く同じようにブロックを実装するために表示されないことです。

私は理解のために - parent.htmlとchild.htmlという2つのジキル "レイアウト"を持っています。どちらもYAMLセクションを含んでいません。

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

子供

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

そして私は、このように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には新しくなっているので、このスタックのどの部分が失敗しているかを確認するのに役立つ必要があります。 https://github.com/danwrong/liquid-inheritance/issues/3

液体相続のいくつかのフォークを試しましたが、その多くは明らかにその問題の正規表現を修正していますが、これを解決するものはありません。

私は根本的に不可能なのですか?私はそこの道の少なくとも85%のようで、最終的なビットは修正が必要です。

答えて

6

私はこれがジキルの中でうまくいくかどうかはわかりません。私は間違っているかもしれませんが、ここに私の推論です:

各ページは、これは再帰的に動作しますhttps://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb

にdo_layout使用してレンダリングされる - それは、ページのレイアウトを処理し、その後、ページの内容を処理し、そのレイアウトのレイアウトとYAML変数をチェーンの上に渡します(つまり、{{page.whatever}}のような親テンプレートで常に利用できます)。

これは、渡されるのはYAML値だけで、 'content'の値がLiquidによって処理された後の値であることを意味します。私はそれが他の場所でどのように行われているのかわかりませんが、ブロックのアイデアと両立できないようです。なぜなら、2つのブロックを別々に渡す必要があるからです。

基本的には、ジキルは既にレイアウトに与えることができる「レイアウト」属性を使って、簡単な継承形式を持っているということです。基本的には、これは液体テンプレートと互換性があると私は考える。

私はあなたがYAML、_includes、およびテンプレートロジックの使用の限界を使い尽くしたのかどうかはわかりません。あなたの場合は

<html> 
<article> 
    <h1>{{ page.title }}</h1> 
    {{ content }} 
</article> 
<aside> 
{{ page.secondary_content | markdownify}} 
</aside> 

内容::

--- 
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 

テンプレートあなたのコンテンツにDjangoのスタイルブロックを置くの時点であれば、なぜちょうどこのような何かをしませんテンプレートをきれいに保ちたい、ページのタイプごとに異なるコンテンツがある場合は、さまざまなものを使用できます。

テンプレート:

<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のテンプレート++)を使い、同じことをすることができます。

+0

私はちょっとテストしたところ、液体の継承は*レイアウト*でうまくいきますが、実際のコンテンツ*ページになると失敗することがわかりました。これはあなたの問題がどこにあるかと思います(しかし、一度コンテンツの特定の部分に落ちると、私はYAMLがあなたのコンテンツ領域にブロックを置くよりも、補助的なコンテンツを含むより良い方法だと確信しています。 – heliotrope

+7

YAMLは確かにそれを行う最良の方法ですが、大部分のコンテンツが単なるHTMLの分離不可能なブロックである場合には、不必要に複雑になります。 タイトルとは別に、本当に必要な膨大な量の生データはありません。 YAMLのHTMLは不器用でメンテナンスが難しいと記述しています。 – xcession

関連する問題