2012-10-26 35 views
11

का उपयोग करते हुए जैकील टेम्पलेट्स मैं जैकिल में एक बड़े तरीके से जा रहा हूं और इसे सामान्य फ्रंट एंड डेवलपमेंट प्लेटफ़ॉर्म के रूप में उपयोग करना चाहता हूं, लेकिन तरल टेम्पलेटिंग भाषा की सीमाओं के विरुद्ध चल रहा हूं , विशेष रूप से Django templating के लिए इसके अंतर।डीजेंगो जैसे तरल ब्लॉक/विरासत

मैंने तरल-विरासत मणि की खोज की, जो Django से सभी महत्वपूर्ण विस्तार और ब्लॉक वाक्यविन्यास जोड़ता है। http://www.sameratiani.com/2011/10/22/get-jekyll-working-with-liquid-inheritance.html

समस्या यह है कि यह ठीक उसी तरह Django करता है, जो अनिवार्य रूप से मणि बेकार renders में ब्लॉक लागू करने के लिए प्रकट नहीं होता है: इस ब्लॉग पोस्ट मणि आगे Jekyll के फाइल सिस्टम के अनुरूप करने के फैली हुई है।

मेरे पास दो jekyll "लेआउट" हैं - समझने के लिए - parent.html और child.html। इनमें से कोई भी वाईएएमएल अनुभाग नहीं है।

--- 
title: test 
--- 

{% extends _layouts/child.html %} 
{% block bar %}My title is {{ page.title }} {% endblock %} 

मैं क्या उम्मीद थी:

जनक

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

बाल

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

और फिर मैं एक Jekyll पेज जो एक YAML अनुभाग इस प्रकार भी शामिल है

<html> 
    <div> 
    Bar comes next: 
    My title is test 
    </div> 
</html> 

मुझे क्या मिलेगा:

<html> 
    <div> 
    Bar comes next: 
    </div> 
</html>My title is test 

यह कुछ, माता पिता/बच्चे के उपयुक्त स्थानों में प्रविष्टि के लिए योग्य होने के रूप में mypage.html में ब्लॉक के इलाज के लिए विफल हो रहा है, हालांकि यह स्पष्ट रूप से अभी भी कुछ कर रहा है लगता है।

मैं एक रूबी डेवलपर नहीं हूं और जेकील के लिए काफी नया हूं, इसलिए मुझे यह पता लगाने में मदद की ज़रूरत है कि इस ढेर का कौन सा हिस्सा असफल रहा है। GitHub पर तरल विरासत मुद्दों का सुझाव अन्य लोगों को इस ब्लॉक घोंसले समस्या का सामना कर रहे हैं: https://github.com/danwrong/liquid-inheritance/issues/3

मैं तरल उत्तराधिकार के कांटे, जिनमें से कई जाहिरा तौर पर है कि समस्या को ठीक regex के कई की कोशिश की है, लेकिन कोई भी इस का समाधान करने लगते हैं।

क्या मैं मूल रूप से असंभव करने की कोशिश कर रहा हूं? ऐसा लगता है कि मैं कम से कम 85% रास्ते में हूं और अंतिम बिट को फिक्सिंग की जरूरत है।

उत्तर

6

मुझे यकीन नहीं है कि यह कभी जेकिल के भीतर काम करने जा रहा है। मैं गलत हो सकता है, लेकिन यहाँ मेरा तर्क है:

प्रत्येक पृष्ठ https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb

में do_layout का उपयोग कर बाहर प्रदान की गई है यह रिकर्सिवली काम करता है - यह पृष्ठ की सामग्री संसाधित करता है, तो पृष्ठ के लेआउट को संसाधित करता है, तो उस लेआउट के लेआउट और इतने पर और आगे, श्रृंखला को वाईएएमएल वैरिएबल पास कर रहा है (इसलिए वे हमेशा माता-पिता टेम्पलेट्स में {{page.whatever}} के रूप में उपलब्ध होते हैं)।

इसका मतलब है कि पारित होने वाली एकमात्र चीजें वाईएएमएल मान हैं, और जो कुछ भी 'सामग्री' का मूल्य तरल पदार्थ द्वारा संसाधित होने के बाद होता है। मुझे नहीं पता कि यह कहीं और कैसे किया जाता है, लेकिन यह ब्लॉक के विचार के साथ असंगत लगता है, क्योंकि उन्हें आपको दो ब्लॉक अलग से पारित करने की आवश्यकता होगी।

मूल रूप से, मुझे लगता है कि मुद्दा यह है कि जैकिल के पास "लेआउट" विशेषता के माध्यम से विरासत का एक सरल रूप है - जिसे आप लेआउट को दे सकते हैं। मूल रूप से, मुझे लगता है कि यह तरल-templating के साथ संगत है।

सभी ने कहा, मुझे यकीन नहीं है कि आपने वाईएएमएल, _ शामिल, और टेम्पलेट तर्क का उपयोग करने की सीमा समाप्त कर दी है।

सामग्री::

--- 
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 शैली खंडों डालने के बिंदु पर कर रहे हैं, यही कारण है कि सिर्फ इस तरह कुछ करना नहीं

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

और फिर उन फ़ाइलों में अपने पृष्ठ प्रकार विशिष्ट सामान रख दिया। जाहिर है आप इसे सीधे शामिल कर सकते हैं, लेकिन शायद इसे अमूर्त करना अच्छा लगता है। उन लोगों को वाईएएमएल में सभी चर मिलेगा।

यदि इनमें से कोई भी जीत नहीं है, तो आप हमेशा हाइड: http://hyde.github.com/ जो पायथन में लिखे गए हैं, Jinja2 (मूल रूप से Django टेम्पलेट्स ++) का उपयोग करता है, और वही काम करता है।

+0

मैंने अभी परीक्षण किया है, और पाया कि यद्यपि तरल विरासत * लेआउट * पर ठीक काम करती है, लेकिन जब आप वास्तविक * सामग्री * पृष्ठों पर जाते हैं तो यह विफल हो जाता है - जो मुझे लगता है कि आपकी समस्या कहां उत्पन्न होती है (जो। लेकिन जैसा कि मैंने कहा - एक बार जब आप सामग्री के एक विशिष्ट टुकड़े पर उतर जाते हैं, तो मुझे अभी भी आश्वस्त है कि YAML आपके सामग्री क्षेत्र में ब्लॉक डालने से सहायक सामग्री शामिल करने का एक बेहतर तरीका है ... – heliotrope

+7

वाईएएमएल निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका है, लेकिन यह बन जाता है अनावश्यक रूप से जटिल यदि आपकी अधिकांश सामग्री अविभाज्य HTML के बड़े ब्लॉक हैं। शीर्षक के अलावा, कच्चे डेटा का एक बड़ा सौदा नहीं है जिसे मुझे वास्तव में _process_ की आवश्यकता है। मुझे बस HTML के बड़े हिस्से को विशिष्ट में डालने की आवश्यकता है , पृष्ठ के गैर-संगत क्षेत्रों। वर्णन करते हैं कि वाईएएमएल में एचटीएमएल बेकार और अस्पष्ट है। – xcession