no_escape filter for TT
Matt S Trout [Sat, 11 Aug 2012 18:53:25 +0000 (18:53 +0000)]
lib/HTML/String/TT.pm
lib/HTML/String/Value.pm
xt/tt.t

index 90b1ec5..6e35360 100644 (file)
@@ -1,10 +1,13 @@
 package HTML::String::TT;
 
 use strictures 1;
+
+use HTML::String;
+use HTML::String::TT::Directive;
+use Safe::Isa;
 use Template;
 use Template::Parser;
 use Template::Stash;
-use HTML::String::TT::Directive;
 
 sub new {
     shift;
@@ -13,6 +16,11 @@ sub new {
             FACTORY => 'HTML::String::TT::Directive'
         ),
         STASH => Template::Stash->new,
+        FILTERS => { no_escape => sub {
+            $_[0]->$_isa('HTML::String::Value')
+                ? HTML::String::Value->new(map $_->[0], @{$_[0]->{parts}})
+                : HTML::String::Value->new($_)
+        } },
         (ref($_[0]) eq 'HASH' ? %{$_[0]} : @_)
     );
 }
index d622694..46181d4 100644 (file)
@@ -44,7 +44,15 @@ use overload
 sub new {
     my ($class, @raw_parts) = @_;
 
-    my @parts = map { ref($_) eq 'ARRAY' ? $_ : [$_] } @raw_parts;
+    my @parts = map {
+        if (ref($_) eq 'ARRAY') {
+            $_
+        } elsif ($_->$_isa(__PACKAGE__)) {
+            @{$_->{parts}}
+        } else {
+            [ $_, 0 ]
+        }
+    } @raw_parts;
 
     my $self = bless { parts => \@parts }, $class;
 
diff --git a/xt/tt.t b/xt/tt.t
index b8c16e4..bd0af60 100644 (file)
--- a/xt/tt.t
+++ b/xt/tt.t
@@ -23,4 +23,9 @@ is(
     '<tag>Hi &lt;bob&gt;</tag>',
 );
 
+is(
+    do_tt('<tag>[% foo | no_escape %]</tag>', { foo => 'Hi <bob>' }),
+    '<tag>Hi <bob></tag>',
+);
+
 done_testing;