File: 038_custom_esc.t

package info (click to toggle)
libtext-xslate-perl 3.5.9-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 2,108 kB
  • sloc: perl: 19,756; ansic: 214; pascal: 182; makefile: 9; cs: 8
file content (120 lines) | stat: -rw-r--r-- 2,879 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!perl -w
use strict;
use Test::More;

use Text::Xslate qw(html_builder mark_raw);

sub custom_html_escape { # for html_escape()
    my $s = shift;
    return $s if ref $s;
    my %h = (
        '<' => '&lt;',
        '>' => '&gt;',
        q{'} => '&#039;',
        q{"} => '&quot;',
        # '&' => '&amp;', # Don't espcae &. allowing to use character-entitfy-references(like '&#hearts)
    );

    $s =~ s/(.)/$h{$1} or $1/xmsge;
    $s;
}

sub custom_html_filter { # for html()
    my $s = shift;
    return $s if ref $s;
    my %h = (
        '<' => '&lt;',
        '>' => '&gt;',
        q{'} => '&#039;',
        q{"} => '&quot;',
        # '&' => '&amp;', # Don't espcae &. allowing to use character-entitfy-references(like '&#hearts)
    );

    $s =~ s/(.)/$h{$1} or $1/xmsge;
    mark_raw($s);
}

note 'override html_escape()';
{
    my $tx = Text::Xslate->new(
        cache   => 0,
        verbose => 2,
        warn_handler => sub { die @_ },

        function => {
            html_escape => \&custom_html_escape
        },
    );

    is $tx->render_string(q{<div><: '<^_^>&hearts;' :></div>}),
        '<div>&lt;^_^&gt;&hearts;</div>';

    is $tx->render_string(q{<div><: $foo :></div>}, { foo => '<^_^>&hearts;' }),
        '<div>&lt;^_^&gt;&hearts;</div>';

    is $tx->render_string(q{<: '<div>' :>}),
        '&lt;div&gt;';

    is $tx->render_string(q{<: '<div>' | raw :>}),
        '<div>';

    is $tx->render_string(q{<: '<div>' | html :>}),
        '&lt;div&gt;';
}

note 'override html()';
{
    my $tx = Text::Xslate->new(
        cache   => 0,
        verbose => 2,
        warn_handler => sub { die @_ },

        function => {
            html => \&custom_html_filter
        },
    );

    is $tx->render_string(q{<div><: '<^_^>&hearts;' :></div>}),
        '<div>&lt;^_^&gt;&amp;hearts;</div>';

    is $tx->render_string(q{<div><: $foo :></div>}, { foo => '<^_^>&hearts;' }),
        '<div>&lt;^_^&gt;&amp;hearts;</div>';

    is $tx->render_string(q{<: '<div>' :>}),
        '&lt;div&gt;';

    is $tx->render_string(q{<: '<div>' | raw :>}),
        '<div>';

    is $tx->render_string(q{<: '<div>' | html :>}),
        '&lt;div&gt;';

    is $tx->render_string(q{<div><: $foo | html :></div>}, { foo => '<^_^>&hearts;' }),
        '<div>&lt;^_^&gt;&hearts;</div>' or die 'stop';
}

note 'override html_escape() with type=text';
{
    my $tx_no_autoescape = Text::Xslate->new(
        cache   => 0,
        verbose => 2,
        warn_handler => sub { die @_ },
        type => 'text',

        function => {
            html_escape => \&custom_html_escape
        },
    );

    is $tx_no_autoescape->render_string(q{<: '<div>' :>}),
        '<div>';

    is $tx_no_autoescape->render_string(q{<: '<div>' | raw :>}),
        '<div>';

    is $tx_no_autoescape->render_string(q{<: '<div>' | html :>}),
        '&lt;div&gt;';
}

done_testing;