summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGianni Ceccarelli <dakkar@dechirico.(none)>2009-03-27 11:57:16 +0100
committerGianni Ceccarelli <dakkar@dechirico.(none)>2009-03-27 11:57:16 +0100
commit22381c3205f6c24d8e65488b57efb969521aadee (patch)
tree121f349d809c784dcfc45fcbdeb9a254024a3ce1
parentcustom builder works, it's just ugly (diff)
downloadTree-Template-Declare-22381c3205f6c24d8e65488b57efb969521aadee.tar.gz
Tree-Template-Declare-22381c3205f6c24d8e65488b57efb969521aadee.tar.bz2
Tree-Template-Declare-22381c3205f6c24d8e65488b57efb969521aadee.zip
HTML::Element builder
-rw-r--r--lib/Tree/Template/Declare.pm9
-rw-r--r--lib/Tree/Template/Declare/DAG_Node.pm16
-rw-r--r--lib/Tree/Template/Declare/HTML_Element.pm59
-rw-r--r--t/03-html.t28
4 files changed, 109 insertions, 3 deletions
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();