2010-10-06 7 views
5

से स्ट्रिप व्हाइटस्पेस मैं मको + पिलोन का उपयोग कर रहा हूं और मैंने अपने एचटीएमएल आउटपुट में एक भयानक मात्रा में व्हाइटस्पेस देखा है।मको टेम्पलेट आउटपुट (पिलों)

मैं इससे छुटकारा पाने के लिए कैसे जाउंगा? Reddit इसे करने के लिए प्रबंधन करते हैं।

उत्तर

2

मुझे यकीन नहीं है कि माको के भीतर ऐसा करने का कोई तरीका है लेकिन आप पेज को पूरा करने से पहले हमेशा कुछ पोस्ट-रेन्डरिंग प्रोसेसिंग कर सकते हैं। उदाहरण के लिए, मान लीजिए कि आप निम्नलिखित कोड है कि अपने खराब खाली स्थान के उत्पन्न करता है:

from mako import TemplateLookup 

template_lookup = TemplateLookup(directories=['.']) 
template = template_lookup.get_template("index.mako") 
whitespace_mess = template.render(somevar="no whitespace here") 
return whitespace_mess # Why stop here? 

तुम इतनी तरह एक अतिरिक्त कदम में जोड़ सकते हैं:

from mako import TemplateLookup 

template_lookup = TemplateLookup(directories=['.']) 
template = template_lookup.get_template("index.mako") 
whitespace_mess = template.render(somevar="no whitespace here") 
cleaned_up_output = cleanup_whitespace(whitespace_mess) 
return cleaned_up_output 

... जहां cleanup_whitespace() कुछ कार्य है कि जो भी आप चाहते हैं (यह HTML Tidy या slimmer या जो कुछ भी हो सकता है)। यह करने का सबसे प्रभावी तरीका नहीं है लेकिन यह एक त्वरित उदाहरण बनाता है :)

2

यदि आपका डेटा बहुत गतिशील नहीं है, तो आप टेम्पलेट आउटपुट का एक अनुकूलित कैश स्टोर कर सकते हैं और इसे वेब क्लाइंट को सेवा दे सकते हैं।

+0

मुझे समझ नहीं आता कि कैसे मेरे खाली स्थान के समस्या से संबंधित है है। क्या आप विस्तारित कर सकते हैं? –

+0

खैर, मको टेम्पलेट्स जेनरेट करता है जैसा कि अब करता है। और, प्रत्येक अनुरोध (बाद में नियमित अभिव्यक्तियों के माध्यम से) की प्रसंस्करण की जटिलता जोड़ने के बजाय, संसाधित होने के बाद पृष्ठ के कैश किए गए संस्करण की सेवा करें। –

6

बैकस्लैश चीज़ है।

उदाहरण के लिए mako http://makotemplates.org के मुखपृष्ठ पर देखें।

<%def name="makerow(row)"> 
    <tr> 
    % for name in row: 
     <td>${name}</td>\ 
    % endfor 
    </tr> 
</%def> 

लेकिन गंभीरता से, मैं सही ढंग से ouput फ़ॉर्मेट करने के लिए कोशिश कर अधिक समय खर्च नहीं होता। पठनीय टेम्पलेट कोड होना महत्वपूर्ण है। मैं "स्रोत देखें" से अधिक बार वेबकिट (या फ़ायरबग, यदि आप चाहें) के वेब इंस्पेक्टर का उपयोग करते हैं।

यदि आप वास्तव में अच्छा स्वरूपित HTML आउटपुट चाहते हैं, तो आप हमेशा एक मिडलवेयर लिख सकते हैं जो ऐसा करता है।

+0

http://docs.makotemplates.org/en/latest/syntax.html?highlight=empty#newline- फ़िल्टर –

4

पोस्ट-प्रोसेसिंग के बिना ऐसा करने का एकमात्र तरीका टेम्पलेट में व्हाइटस्पेस से बचने के लिए होगा। हालांकि, इससे डेवलपर के रूप में आपके लिए चीजें बहुत कठिन हो जाएंगी।

आपको टेम्पलेट प्रस्तुत करने के बाद HTML स्ट्रिंग को साफ़ करने का समय इस निर्णय को ऑफ़सेट करने के लिए पर्याप्त बैंडविड्थ को सहेजने के बारे में निर्णय लेने की आवश्यकता है। मैं आपके लिए ऐसा करने के लिए अनुकूलित सी कोड लाइब्रेरी का उपयोग करने की सलाह देता हूं, जैसे कि lxml.html

>>> from lxml import html 
>>> page = html.fromstring("""<html> 
... 
... <body>yuck, a newline! bandwidth wasted!</body> 
... </html>""") 
>>> html.tostring(page) 
'<html><body>yuck, a newline! bandwidth wasted!</body></html>' 
0

दान के उत्तर के समान, मैंने इस फ़ंक्शन के माध्यम से प्रस्तुत आउटपुट पारित किया जो केवल "जानबूझकर" व्हाइटस्पेस को संरक्षित करता है। मैंने परिभाषित किया कि एक पंक्ति में दो कैरिज रिटर्न होने के लिए (i।ई एक खाली पंक्ति)

तो

Hello 
There 

हो जाता है

Hello There 

लेकिन

Hello 

There 

हो जाता है

Hello 
There 

यहाँ कोड

def filter_newline(input): 
    rendered_output = [] 
    for line in input.split("\n"): 
     if line: 
      # Single new-lines are removed 
      rendered_output.append(line) 
     else: 
      # Subsequent newlines (so no body to the interveaning line) are retained 
      rendered_output.append("\n") 

    return "".join(rendered_output) 

निष्पादित की तरह तो (मैं दान के उदाहरण का हिस्सा चुरा लिया)

whitespace_mess = template.render(somevar="Hello \nThere") 
cleaned_up_output = filter_newline(whitespace_mess) 
संबंधित मुद्दे