From 22381c3205f6c24d8e65488b57efb969521aadee Mon Sep 17 00:00:00 2001 From: Gianni Ceccarelli Date: Fri, 27 Mar 2009 11:57:16 +0100 Subject: HTML::Element builder --- lib/Tree/Template/Declare.pm | 9 +++-- lib/Tree/Template/Declare/DAG_Node.pm | 16 +++++++++ lib/Tree/Template/Declare/HTML_Element.pm | 59 +++++++++++++++++++++++++++++++ t/03-html.t | 28 +++++++++++++++ 4 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 lib/Tree/Template/Declare/HTML_Element.pm create mode 100644 t/03-html.t diff --git a/lib/Tree/Template/Declare.pm b/lib/Tree/Template/Declare.pm index 0cff864..9778f42 100644 --- a/lib/Tree/Template/Declare.pm +++ b/lib/Tree/Template/Declare.pm @@ -49,9 +49,12 @@ sub _build_group { return { tree => sub(&) { - local $current_node[0]=undef; - my ($ret)=$_[0]->(caller_args(1)); - return $ret; + my $tree=$builder->new_tree(); + { + local $current_node[0]=$tree; + $_[0]->(caller_args(1)); + } + return $builder->finalize_tree($tree); }, node => sub (&) { my $node=$builder->new_node(); diff --git a/lib/Tree/Template/Declare/DAG_Node.pm b/lib/Tree/Template/Declare/DAG_Node.pm index c005752..45321da 100644 --- a/lib/Tree/Template/Declare/DAG_Node.pm +++ b/lib/Tree/Template/Declare/DAG_Node.pm @@ -13,6 +13,18 @@ sub new { return bless {nc=>$node_class},$class; } +sub new_tree { + my ($self)=@_; + + return bless [],'Tree::Template::Declare::DAG_Node::Tree'; +} + +sub finalize_tree { + my ($self,$tree)=@_; + + return $tree->[0]; +} + sub new_node { my ($self)=@_; @@ -22,6 +34,10 @@ sub new_node { sub add_child_node { my ($self,$parent,$child)=@_; + if ($parent->isa('Tree::Template::Declare::DAG_Node::Tree')) { + push @$parent,$child; + return $parent; + } return $parent->add_daughter($child); } diff --git a/lib/Tree/Template/Declare/HTML_Element.pm b/lib/Tree/Template/Declare/HTML_Element.pm new file mode 100644 index 0000000..1480987 --- /dev/null +++ b/lib/Tree/Template/Declare/HTML_Element.pm @@ -0,0 +1,59 @@ +package Tree::Template::Declare::HTML_Element; +use strict; +use warnings; +use Carp; +use HTML::Element; + +sub new { + my ($class)=@_; + + return bless {},$class; +} + +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; diff --git a/t/03-html.t b/t/03-html.t new file mode 100644 index 0000000..2640a5e --- /dev/null +++ b/t/03-html.t @@ -0,0 +1,28 @@ +#!perl +use Test::Most 'no_plan','die'; +use strict; +use warnings; +use Tree::Template::Declare options => {builder => '+HTML_Element'}; +use Data::Dumper; + +my $tree=tree { + node { + name 'html'; + node { + name 'head'; + node { + name 'title'; + node { name '~text'; attribs text => 'Page title' }; + } + }; + node { + name 'body'; + node { + name 'p'; + node { name '~text'; attribs text => 'Page para' }; + }; + }; + }; +}; + +diag $tree->as_HTML(); -- cgit v1.2.3