2012-10-26 44 views
11

我進入Jekyll在很大程度上,並希望使用它作爲一個通用的前端開發平臺,但我遇到了液態模板語言的侷限性,特別是它與Django模板的區別。Jekyll模板使用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 %} 

然後,我有一個哲基爾網頁,其中包括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%的方式,最後一點需要修復。

回答

6

我不確定這是否會在Jekyll內工作。我可能是錯的,但這裏是我的推理:

每個頁面呈現出使用do_layout在https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb

這工作遞歸 - 它處理頁面的內容,然後處理頁面的佈局,那麼佈局的佈局和等等等等,將YAML變量傳遞給鏈(所以它們始終在父模板中可用,如{{page.whatever}})。

這意味着唯一被傳遞的東西是YAML值,而'內容'的任何值都是在Liquid處理後的值。我不知道它是如何在別處完成的,但這似乎與塊的想法不相容,因爲它們需要你分開放棄兩個塊。

從根本上看,問題在於,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中的所有變量。

如果這不是一個勝利,你總是可以嘗試Hyde:http://hyde.github.com/這是用Python編寫的,使用Jinja2(基本上是Django模板++),並且做同樣的事情。

+0

我剛剛進一步測試,發現雖然液體繼承在*佈局*上工作正常,但是當您到達實際的*內容*頁面時,它會失敗 - 我認爲這是您問題出現的地方(但是正如我所說 - 一旦你認真閱讀了一個特定的內容,我仍然相信YAML是一個更好的方式來包含輔助內容,而不是將內容放在你的內容區域中...... – heliotrope

+7

YAML絕對是最好的方法,但它變成了如果你的大部分內容只是大塊不可分割的HTML,那麼不必要的複雜。 除了標題,我並不需要大量的原始數據_process_。我只需要插入大塊的HTML到特定的,該頁面的非連續區域描述YAML中的HTML笨拙且不可維護。 – xcession