use strictures 1;
use HTML::String::Overload ();
+use Data::Munge;
use base qw(Template::Directive);
sub template {
- my $result = Template::Directive::pad(shift->SUPER::template(@_), 2);
- $result =~ s/sub {/sub { use HTML::String::Overload;/;
- $result;
+ return byval {
+ s/sub {/sub { package HTML::String::TT::_TMPL; use HTML::String::Overload { ignore => { q{Template::Provider} => 1, q{Template::Directive} => 1, q{Template::Document} => 1, q{Template::Plugins} => 1 } };/;
+ } Template::Directive::pad(shift->SUPER::template(@_), 2);
+}
+
+# TT code does &text(), no idea why
+
+sub textblock {
+ my ($self, $text) = @_;
+ return $Template::Directive::OUTPUT.' '.$self->text($text).';';
+}
+
+# https://rt.perl.org/rt3/Ticket/Display.html?id=49594
+
+sub text {
+ my ($class, $text) = @_;
+ for ($text) {
+ s/(["\$\@\\])/"."\\$1"."/g;
+ s/\n/"."\\n"."/g;
+ }
+ return '"' . $text . '"';
}
1;
+
+__END__
+
+=head1 NAME
+
+HTML::String::TT::Directive - L<Template::Directive> overrides to forcibly escape HTML strings
+
+=head1 SYNOPSIS
+
+This is not user serviceable, and is documented only for your edification.
+
+Please use L<HTML::String::TT> as this module could change, be renamed, or
+if I figure out a better way of implementing the functionality disappear
+entirely at any moment.
+
+=head1 METHODS
+
+=head2 template
+
+We override this top-level method in order to pretend two things to the
+perl subroutine definition that TT has generated - firstly,
+
+ package HTML::String::TT::_TMPL;
+
+to ensure that no packages marked to be ignored are the current one when
+the template code is executed. Secondly,
+
+ use HTML::String::Overload { ignore => { ... } };
+
+where the C<...> contains a list of TT internal packages to ignore so that
+things actually work. This list is not duplicated here since it may also
+change without warning.
+
+Additionally, the hashref option to L<HTML::String::Overload> is not
+documented there since I'm not yet convinced that's a public API either.
+
+=head2 text
+
+Due to a perl bug (L<https://rt.perl.org/rt3/Ticket/Display.html?id=49594>)
+we overload this method to change
+
+ "<foo>\n<bar>"
+
+into
+
+ "<foo>"."\n"."<bar>"
+
+since any string containing a backslash escape doesn't get marked as HTML.
+Since we don't want to escape things that backslash escapes are normally
+used for, this isn't really a problem for us.
+
+=head2 textblock
+
+For no reason I can comprehend at all, L<Template::Directive>'s C<textblock>
+method calls C<&text> instead of using a method call so we have to override
+this as well.
+
+=head1 AUTHORS
+
+See L<HTML::String> for authors.
+
+=head1 COPYRIGHT AND LICENSE
+
+See L<HTML::String> for the copyright and license.
+
+=cut