further escaping fixes
[scpubgit/HTML-String.git] / lib / HTML / String / Value.pm
1 package HTML::String::Value;
2
3 use strictures 1;
4 use UNIVERSAL::ref;
5 use Safe::Isa;
6 use Data::Munge;
7
8 use overload
9     '""'   => 'escaped_string',
10     '.'    => 'dot',
11     'bool' => 'is_true',
12
13     fallback => 1,
14 ;
15
16 sub new {
17     my ($class, @raw_parts) = @_;
18
19     my $opts = (ref($raw_parts[-1]) eq 'HASH') ? pop(@raw_parts) : {};
20
21     my @parts = map {
22         if (ref($_) eq 'ARRAY') {
23             $_
24         } elsif ($_->$_isa(__PACKAGE__)) {
25             @{$_->{parts}}
26         } else {
27             [ $_, 0 ]
28         }
29     } @raw_parts;
30
31     my $self = bless { parts => \@parts, %$opts }, $class;
32
33     return $self;
34 }
35
36 sub escaped_string {
37     my $self = shift;
38
39     if ($self->{ignore}{scalar caller}) {
40         return $self->unescaped_string;
41     }
42
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
55 sub unescaped_string {
56     my $self = shift;
57
58     return join '', map $_->[0], @{$self->{parts}};
59 }
60
61 sub 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
80     return ref($self)->new(@parts, { ignore => $self->{ignore} });
81 }
82
83 sub is_true {
84     my ($self) = @_;
85     return 1 if grep length($_), map $_->[0], @{$self->{parts}};
86 }
87
88 sub ref { '' }
89
90 1;