options to ignore specific callers, more TT tests
[scpubgit/HTML-String.git] / lib / HTML / String / Value.pm
CommitLineData
e1b4b35c 1package HTML::String::Value;
2
3use strictures 1;
586054e0 4use UNIVERSAL::ref;
e1b4b35c 5use Safe::Isa;
6use Data::Munge;
7
e1b4b35c 8use overload
9 '""' => 'escaped_string',
10 '.' => 'dot',
f27b509e 11 'bool' => 'is_true',
e1b4b35c 12
e1b4b35c 13 fallback => 1,
14;
15
16sub new {
17 my ($class, @raw_parts) = @_;
18
f27b509e 19 my $opts = (ref($raw_parts[-1]) eq 'HASH') ? pop(@raw_parts) : {};
20
51eaef0b 21 my @parts = map {
22 if (ref($_) eq 'ARRAY') {
23 $_
24 } elsif ($_->$_isa(__PACKAGE__)) {
25 @{$_->{parts}}
26 } else {
27 [ $_, 0 ]
28 }
29 } @raw_parts;
e1b4b35c 30
f27b509e 31 my $self = bless { parts => \@parts, %$opts }, $class;
e1b4b35c 32
33 return $self;
34}
35
36sub escaped_string {
37 my $self = shift;
38
f27b509e 39 if ($self->{ignore}{scalar caller}) {
40 return $self->unescaped_string;
41 }
42
e1b4b35c 43 return join '', map +(
44 $_->[1]
45 ? byval {
46 s/&/&/g;
47 s/</&lt;/g;
48 s/>/&gt;/g;
49 s/"/&quot;/g;
50 } $_->[0]
51 : $_->[0]
52 ), @{$self->{parts}};
53}
54
55sub unescaped_string {
56 my $self = shift;
57
58 return join '', map $_->[0], @{$self->{parts}};
59}
60
61sub dot {
62 my ($self, $str, $prefix) = @_;
63
64 return $self unless $str;
65
66 my @parts = @{$self->{parts}};
67
68 my @new_parts = (
69 $str->$_isa(__PACKAGE__)
70 ? @{$str->{parts}}
71 : [ $str, 1 ]
72 );
73
74 if ( $prefix ) {
75 unshift @parts, @new_parts;
76 } else {
77 push @parts, @new_parts;
78 }
79
f27b509e 80 return ref($self)->new(@parts, { ignore => $self->{ignore} });
81}
82
83sub is_true {
84 my ($self) = @_;
85 return 1 if grep length($_), map $_->[0], @{$self->{parts}};
e1b4b35c 86}
87
586054e0 88sub ref { '' }
89
e1b4b35c 901;