summaryrefslogtreecommitdiff
path: root/lib/Tree/Template/Declare/HTML_Element.pm
blob: 277cbc707b382249145c6287b7f4e31f04cff962 (plain)
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
package Tree::Template::Declare::HTML_Element; 
 
use strict;
use warnings;
use Carp;
use HTML::Element;
 
sub new {
    my ($class)=@_;
 
    return bless {},$class;
}
 
sub _munge_exports {
    my ($self,$exports)=@_;
 
    my %all_exports=(
        %{$exports},
        text_node => sub($) {
            $exports->{node}->(
                sub {
                    $exports->{name}->('~text');
                    $exports->{attribs}->(text => $_[0]);
                });
        },
    );
 
    return \%all_exports;
}
 
sub new_tree {
    my ($self)=@_;
 
    return bless [],'Tree::Template::Declare::HTML_Element::Tree';
}
 
sub finalize_tree {
    my ($self,$tree)=@_;
 
    my $dom=$tree->[0];
    $dom->deobjectify_text();
    return $dom;
}
 
sub new_node {
    my ($self)=@_;
 
    return HTML::Element->new('~comment');
}
 
sub add_child_node {
    my ($self,$parent,$child)=@_;
 
 
    if ($parent->isa('Tree::Template::Declare::HTML_Element::Tree')) {
        push @{$parent},$child;
        return $parent;
    }
    return $parent->push_content($child);
}
 
sub set_node_name {
    my ($self,$node,$name)=@_;
 
    return $node->tag($name);
}
 
sub set_node_attributes {
    my ($self,$node,$attrs)=@_;
 
    while (my ($name,$val)=each %{$attrs}) {
        $node->attr($name$val);
    }
    return;
}
 
1;
__END__
 
# ABSTRACT: adaptor for HTML::Element 
 
=head1 SYNOPSIS
 
See L<Tree::Template::Declare>.
 
=head1 SPECIFICITIES
 
This module will build trees using L<HTML::Element>.
 
To create text nodes, you would be forced to say:
 
  node {
    name '~text';
    attribs text => 'some text';
  }
 
which is too cumbersone. You can instead use:
 
  text_node 'some text';
 
HTML::Element's C<deobjectify_text> method will be called by
C<finalize_tree> before returning the tree object.
 
=for Pod::Coverage add_child_node finalize_tree new new_node new_tree set_node_attributes set_node_name
 
=cut