2010-12-16 16 views
12

मैं किसी भी तरह कि इतने खाका टूलकिट कॉन्फ़िगर कर सकते हैं:भागने एचटीएमएल

[% foo | html %] 

है कि, foo में HTML बच:

[% foo %] 

अब तुम क्या कहने के लिए की आवश्यकता होगी है? और कुछ और, जैसे कार्य करें:

[% foo | noHtml %] 

अगर मैं नहीं से बचने के लिए चाहते हो ?

उत्तर

3

मुझे लगता है कि आप Template::Stash को बढ़ाकर अपना खुद का स्टैश बना सकते हैं ताकि यह डिफ़ॉल्ट रूप से बचने वाले चर से हो।

मैंने कहा कि मुझे लगता है कि यह एक अच्छा विचार नहीं है। डिफ़ॉल्ट व्यवहार से चिपकने के लिए बेहतर और कस्टम संशोधनों से बचना बेहतर है क्योंकि वे निश्चित रूप से भ्रमित हैं।

+1

एक कस्टम टेम्पलेट :: स्टैश शायद पर्याप्त नहीं होगा।''% X%] 'और' [% y = x%] '' x' को देखने के लिए स्टेश की 'get()' विधि को कॉल करेंगे, लेकिन केवल पहले उत्पादन का उत्पादन करेगा, संभवतः स्टैश संभवतः सक्षम नहीं होगा "प्राप्त करें और प्रिंट करें" के बीच अंतर बताएं और बस "प्राप्त करें" ताकि आप बहुत डबल/ट्रिपल/... HTML एन्कोडेड सामान के साथ समाप्त हो जाएंगे। शायद परेशान नहीं करने के लिए सबसे अच्छा है। –

+0

टीटी का डिज़ाइन दार्श डिफ़ॉल्ट रूप से क्रॉस-साइट स्क्रिप्टिंग हमलों की अनुमति देना है और यक शेविंग की अत्यधिक मात्रा में सुरक्षा की अनुमति देता है। – geira

+0

हाँ जो टीटी दर्शन में फिट होने के लिए बहुत सुविधाजनक होगा .. – jeje

5

अपने प्रश्न के उत्तर में एक ही प्रश्न का उत्तर देने का प्रयास करते समय आपके प्रश्न पर आया।

http://search.cpan.org/~mithaldu/Template-AutoFilter/ ऐसा लगता है जो हम चाहते हैं, लेकिन इसे एक और मॉड्यूल स्थापित करने की आवश्यकता है। मैं इसे किसी भी तरह से कोशिश करने जा रहा हूँ।

1

मैंने हाल ही में इस समस्या पर कुछ समय बिताया। यहां मेरे समाधान की रूपरेखा है।

मैंने एचटीएमएलएफ़ नामक एक नई कक्षा बनाई जिसमें स्ट्रिंग्स शामिल हैं जिन्हें सुरक्षित भेद्यता के बिना डब्ल्यूडब्ल्यूडब्ल्यू क्लाइंट को सुरक्षित रूप से लिखा जा सकता है। विचार यह था कि HTML टैग जेनरेट करने वाले फ़ंक्शंस HtmlSafe ऑब्जेक्ट्स लौटाते हैं, और बॉक्स के बाहर वेरिएबल्स HtmlSafe नहीं हैं। जो भी एचटीएमएलएफ़ बनाता है वह भी स्ट्रिंग के लिए सुरक्षा के लिए सुरक्षा के लिए झुका हुआ है। एचटीएमएल-सुरक्षित स्ट्रिंग के साथ एक गैर-एचटीएमएल-सुरक्षित स्ट्रिंग को संगत करने से गैर-एचटीएमएल-सुरक्षित स्ट्रिंग को CGI :: escapeHTML के माध्यम से भागने का कारण बनता है, और फिर HTML- सुरक्षित स्ट्रिंग के साथ जुड़ जाता है। एचटीएमएलएफ़ के एचटीएमएलएफ़ के दूसरे उदाहरण को जोड़ना बिना बचने के प्रश्न में स्ट्रिंग्स में शामिल हो जाता है। मैं एक अधिभार का उपयोग कर समाप्त हुआ ताकि मैं फिर से परिभाषित कर सकूं। एचटीएमएलएफ़ कक्षा के लिए ऑपरेटर।

इस बात के साथ सशस्त्र, मैं एक $ टेम्पलेट> प्रक्रिया दे दी है() एक $ उत्पादन चर वास्तव में एक उप कि HtmlSafe के साथ एक संयोजन लागू, इस तरह किया गया है कि काम करते हैं:

my $output = HtmlSafe->new(""); 
$template->process($vars, sub { $output .= $_[0]; }); 
return $output->unwrap(); # remove HtmlSafe and return underlying string 

हम लगभग तैयार हैं एचटीएमएलएफ़ टीटी 2 के साथ। बड़े बदलाव को मुझे वास्तव में करना था था टेम्पलेट :: निर्देश में टेक्स्टब्लॉक() फ़ंक्शन को बदलने के लिए, जिसका उपयोग टेम्पलेट :: पार्सर द्वारा एचटीएमएलएफ़ उदाहरणों को उत्पन्न करने के लिए किया जाता है ताकि जो भी टेक्स्ट ब्लॉक इसे निकालने का प्रयास किया जा सके। ये पार्स टेम्पलेट के पाठ नोड के साथ अनुरूप करने के लिए प्रकट तो बस कर

package MyDirective; 
use base "Template::Directive"; 
sub textblock { my $self = shift; return "$Template::Directive::OUTPUT HtmlSafe->new(" . $self->text(@_) . ")"; } 

जो मुझे बहुत पसंद है पार्सर को दे दिया:

my $parser = Template::Parser->new({ 
    FACTORY => "MyDirective", 
}); 

इस के अलावा, मैं एक "कोई नहीं" फिल्टर परिभाषित टीटी 2 के लिए जो एचटीएमएलएफ़ के रूप में परिभाषित किया गया है, तो आप कच्चे HTML को आउटपुट कर सकते हैं यदि आपको करना है। यह चीजों से बचने से बचाता है। डिफ़ॉल्ट "एचटीएमएल" फ़िल्टर नो-ऑप है, क्योंकि एचटीएमएलएफ़ से जुड़ा कुछ भी वैसे भी बच निकला है।