Commit | Line | Data |
e1b4b35c |
1 | package HTML::String::Value; |
2 | |
3 | use strictures 1; |
586054e0 |
4 | use UNIVERSAL::ref; |
e1b4b35c |
5 | use Safe::Isa; |
6 | use Data::Munge; |
7 | |
e1b4b35c |
8 | use overload |
9 | '""' => 'escaped_string', |
10 | '.' => 'dot', |
f27b509e |
11 | 'bool' => 'is_true', |
e1b4b35c |
12 | |
e1b4b35c |
13 | fallback => 1, |
14 | ; |
15 | |
16 | sub 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 | |
36 | sub 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/</</g; |
48 | s/>/>/g; |
49 | s/"/"/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 | |
f27b509e |
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}}; |
e1b4b35c |
86 | } |
87 | |
586054e0 |
88 | sub ref { '' } |
89 | |
e1b4b35c |
90 | 1; |