summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGianni Ceccarelli <dakkar@dechirico.(none)>2009-03-27 13:00:46 +0100
committerGianni Ceccarelli <dakkar@dechirico.(none)>2009-03-27 13:00:46 +0100
commit26248672c6b3ee8f8b10dff5f2b8302e008f46c1 (patch)
tree0035267f3e4b3ab4aa64c22ca60d2018cc6b6e1d /lib
parentlibxml, no namespace support (diff)
downloadTree-Template-Declare-26248672c6b3ee8f8b10dff5f2b8302e008f46c1.tar.gz
Tree-Template-Declare-26248672c6b3ee8f8b10dff5f2b8302e008f46c1.tar.bz2
Tree-Template-Declare-26248672c6b3ee8f8b10dff5f2b8302e008f46c1.zip
LibXML with namespace support, and fixed tests
Diffstat (limited to 'lib')
-rw-r--r--lib/Tree/Template/Declare.pm6
-rw-r--r--lib/Tree/Template/Declare/LibXML.pm42
2 files changed, 45 insertions, 3 deletions
diff --git a/lib/Tree/Template/Declare.pm b/lib/Tree/Template/Declare.pm
index 9778f42..a2be8e2 100644
--- a/lib/Tree/Template/Declare.pm
+++ b/lib/Tree/Template/Declare.pm
@@ -45,6 +45,11 @@ sub _build_group {
}
}
+ my $additional_exports={};
+ if ($builder->can('_additional_exports')) {
+ $additional_exports=$builder->_additional_exports();
+ }
+
my @current_node=(undef);
return {
@@ -76,6 +81,7 @@ sub _build_group {
$builder->set_node_attributes($current_node[0],\%attrs);
return;
},
+ %$additional_exports,
};
}
diff --git a/lib/Tree/Template/Declare/LibXML.pm b/lib/Tree/Template/Declare/LibXML.pm
index 7be3fe8..f8c0e01 100644
--- a/lib/Tree/Template/Declare/LibXML.pm
+++ b/lib/Tree/Template/Declare/LibXML.pm
@@ -7,7 +7,18 @@ use XML::LibXML;
sub new {
my ($class)=@_;
- return bless {},$class;
+ return bless {ns=>{':default'=>undef}},$class;
+}
+
+sub _additional_exports {
+ my ($self)=@_;
+
+ return {
+ xmlns => sub($$) {
+ $self->{ns}->{$_[0]}=$_[1];
+ return;
+ },
+ };
}
sub new_tree {
@@ -22,6 +33,21 @@ sub finalize_tree {
return $tree;
}
+sub _get_ns {
+ my ($self,$name)=@_;
+
+ my ($prefix)=($name=~m{\A (.*?) : }smx);
+
+ if (!defined($prefix) or length($prefix)==0) {
+ return '',$self->{ns}->{':default'};
+ }
+
+ if (exists $self->{ns}->{$prefix}) {
+ return $prefix, $self->{ns}->{$prefix};
+ }
+ return;
+}
+
sub new_node {
my ($self)=@_;
@@ -46,14 +72,24 @@ sub add_child_node {
sub set_node_name {
my ($self,$node,$name)=@_;
- return $node->setNodeName($name);
+ $node->setNodeName($name);
+ my ($prefix,$uri)=$self->_get_ns($name);
+ if ($uri) {
+ $node->setNamespace($uri,$prefix,1);
+ }
}
sub set_node_attributes {
my ($self,$node,$attrs)=@_;
while (my ($name,$val)=each %$attrs) {
- $node->setAttribute($name, $val);
+ my ($prefix,$uri)=$self->_get_ns($name);
+ if ($prefix and $uri) {
+ $node->setAttributeNS($uri, $name, $val);
+ }
+ else {
+ $node->setAttribute($name, $val);
+ }
}
return;
}