2013-01-21 8 views
9

मैं क्लोजर में अपने पैरों को गीला कर रहा हूं। मैं ऐसा कुछ करने की कोशिश कर रहा हूं जो ईआरबी के साथ बहुत आसान था लेकिन मैं अपने जीवन के लिए इसे enlive में नहीं समझ सकता।मैं enlive में स्निपेट का उपयोग कैसे करूं?

<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 
</body> 
</html> 

और मैं इन स्निपेट हैं तो उदाहरण के लिए, header.html और footer.html और इस सरल मार्ग के लिए:

मैं layout.html में एक वेबसाइट के लिए एक सरल लेआउट फ़ाइल है कहो।

(deftemplate layout "layout.html" []) 

(defroutes home-routes 
    (GET "/" [] layout)) 

मैं इसे "/" यह लेआउट बदल देती है और इसे में शीर्ष लेख और पाद के टुकड़े सम्मिलित करता है ताकि जब भी एक अनुरोध हो जाता है कैसे कर सकते हैं?

उत्तर

11

defsnippet केवल आपके एचटीएमएल के एक विशिष्ट भाग से मेल खाता है (यही कारण है कि यह एक चयनकर्ता के रूप में चयनकर्ता लेता है), और इसे बदल देता है। deftemplate पूरे एचटीएमएल लेता है, और इसे बदल देता है। इसके अलावा, defsnippet क्लोजर डेटा स्ट्रक्चर देता है जबकि डेफटेम्प्लेट स्ट्रिंग्स का वेक्टर लौटाता है, इसलिए डिफेंसिपेट आमतौर पर डेफटेम्प्लेट के भीतर उपयोग किया जाता है।

आप डेटा क्या एक टुकड़ा (या चयनकर्ता) द्वारा दिया की एक विचार देने के लिए लग रही है जैसे:

header.html:

(enlive/html-snippet "<div id='foo'><p>Hello there</p></div>") 
;=({:tag :div, :attrs {:id "foo"}, :content ({:tag :p, :attrs nil, :content ("Hello there")})}) 

अपने मामले में आप की तरह कुछ चाहता हूँ

<div id="my-header-root"> 
... 
</div> 

Clojure कोड:

(enlive/defsnippet header "path/to/header.html" [:#my-header-root] [] 
identity) 

(enlive/defsnippet footer "path/to/footer.html" [enlive/root] [] 
identity) 

(enlive/deftemplate layout "layout.html" [header footer] 
[:head] (enlive/content header) 
[:body] (enlive/append footer)) 

(defroutes home-routes 
    (GET "/" [] (layout (header) (footer)) 

स्निपेट में उपयोग की जाने वाली पहचान फ़ंक्शन इसे तर्क देता है, जो इस मामले में: # my-header-root selector द्वारा चयनित डेटा संरचना है (हम कोई परिवर्तन नहीं करते हैं)। यदि आप i.e head.html में सबकुछ शामिल करना चाहते हैं तो आप रूट चयनकर्ता-चरण का उपयोग कर सकते हैं जो enlive के साथ आता है।

आप कर सकते हैं कुछ इस तरह का उपयोग कर एक defsnippet से उत्पन्न एचटीएमएल देखने:

(print (apply str (enlive/emit* (my-snippet)))) 

मैं भी ट्यूटोरियल की सिफारिश: https://github.com/swannodette/enlive-tutorial/ और कैसे defsnippet और deftemplate मैक्रो की कुछ और जानकारी के लिए ब्रायन मेरिक के बाद एक काम।

(enlive/sniptest "<p>Replace me</p>" 
[:p] (enlive/content "Hello world!")) 
;= "<p>Hello world!</p>" 
+1

धन्यवाद:

अंतिम टिप, आप चयनकर्ताओं और परिवर्तनों sniptest मैक्रो लू ए के साथ आता है का उपयोग कर के साथ प्रयोग कर सकते हैं! भविष्य के पाठकों के लिए एक सुधार। लाइन, (enlive/defsnippet हेडर "पथ/से/header.html" [: # my-header-root] पहचान) चयनकर्ता के बाद एक वेक्टर होना चाहिए। तो यह होना चाहिए: (enlive/defsnippet हेडर "पथ/से/header.html" [: # my-header-root] [] पहचान)। पाद लेख के लिए defsnippet के साथ ही। –

+1

आह, उसको याद किया। मैंने तदनुसार उदाहरण अपडेट किए हैं। – ebaxt

0

enlive tutorial में उदाहरणों के साथ बहुत अच्छा जवाब है।

चेतावनी। सभी स्रोत फाइल लिंक टूटे लगते हैं। आपको सभी लिंक में https://github.com/swannodette/ के बाद enlive-tutorial/blob/master/ डालने की आवश्यकता है या उन्हें सीधे ट्यूटोरियल प्रोजेक्ट से खोलें।

संबंधित मुद्दे