PApp
view release on metacpan or search on metacpan
PApp/XML.pm view on Meta::CPAN
$self;
}
=item $pappxml->dom2template($dom, {special}, key => value...)
Compile the given DOM into a C<PApp::XML::Template> object and returns
it. An additional set of specials only used to parse this dom can be
passed as a hashref (this argument is optional). Additional key => value
pairs will be added to the template's attribute hash. The template will be
evaluated in the caller's package (e.g. to get access to __ and similar
functions).
On error, nothing is returned. Use the C<error> method to get more
information about the problem.
In addition to the syntax accepted by C<PApp::PCode::pxml2pcode>, this
function evaluates certain XML Elements (please note that I consider the
"papp" namespace to be reserved):
papp:special _special="special-name" attributes...
Evaluate the special with the name given by the attribute C<_special>
after evaluating its content. The special will receive two arguments:
a hashref with all additional attributes and a string representing an
already evaluated code fragment.
papp:unquote
Expands ("unquotes") some (but not all) entities, namely lt, gt, amp,
quot, apos. This can be easily used within a stylesheet to create
verbatim html or perl sections, e.g.
<papp:unquote><![CDATA[
<: echo "hallo" :>
]]></papp:unquote>
A XSLT stylesheet that converts <phtml> sections just like in papp files
might look like this:
<xsl:template match="phtml">
<papp:unquote>
<xsl:apply-templates/>
</papp:unquote>
</xsl:template>
=begin comment
attr a hashref with attribute => value pairs. These attributes can
later be quieried and set using the C<attr> method.
=end comment
=cut
sub dom2template($$;%) {
my $self = shift;
my $dom = shift;
my $temp = bless {
attr => {@_},
}, PApp::XML::Template::;
my $package = (caller)[0];
$temp->{code} = $temp->_dom2sub($dom, $self, $package);
delete $temp->{attr}{special};
if ($temp->{code}) {
$temp;
} else {
# error
();
}
}
=item $err = $pappxml->error
Return information about an error as an C<PApp::Exception> object
(L<PApp::Exception>).
=cut
sub error {
my $self = shift;
$self->{error};
}
package PApp::XML::Template;
use PApp::PCode ();
our $_res;
sub __dom2sub($) {
my $node = $_[0]->getFirstChild;
while ($node) {
my $type = $node->getNodeType;
if ($type == &XML::DOM::TEXT_NODE || $type == &XML::DOM::CDATA_SECTION_NODE) {
$_res .= $node->toString;
} elsif ($type == &XML::DOM::ELEMENT_NODE) {
my $name = $node->getTagName;
my %attr;
{
my $attrs = $node->getAttributes;
for (my $n = $attrs->getLength; $n--; ) {
my $attr = $attrs->item($n);
$attr{$attr->getName} = $attr->getValue;
}
}
if (substr($name, 0, 5) eq "papp:") {
if ($name eq "papp:special") {
my $name = delete $attr{_special};
my $sub = $_self->{attr}{special}{$name} || $_factory->{special}{$name};
if (defined $sub) {
my $idx = @$_local;
if (ref $sub eq "REF") {
push @$_local, $_self->_dom2sub($node, $_factory, $_package);
$_res .= $$sub->(
\%attr,
( run in 2.232 seconds using v1.01-cache-2.11-cpan-5c0b1e786e0 )