Apache2-ModXml2
view release on metacpan or search on metacpan
examples/TestXML2.pm view on Meta::CPAN
} else {
$filter->r->log->error("No node in bucket data:".$b->data);
}
}
}
my $rv = $filter->next->pass_brigade($bb);
return $rv unless $rv == APR::Const::SUCCESS();
return APR::Const::SUCCESS();
}
#
# HTML/SXPATH
#
sub init_html : FilterInitHandler {
my($filter) = @_;
$filter->r->log->debug("HTML handler will be initialised.");
return AMX2::xpath_filter_init($filter,
'.//a', undef,
get_transform($filter->r));
}
sub handler_html : FilterHasInitHandler(\&init_html) {
my($filter, $bb) = @_;
if (!$filter->ctx) {
init_html($filter);
}
$filter->r->log->debug("HTML handler called.");
return AMX2::xpath_filter($filter, $bb);
}
sub get_transform
{
my ($r) = @_;
return sub {
my($tree) = @_;
$r->log->debug("Tree: ".$tree->toString());
#return APR::Const::SUCCESS();
my $doc = $tree->ownerDocument;
my $frag = $tree->parentNode;
my $xpc = XML::LibXML::XPathContext->new($frag);
$r->log->debug("XPathContext created.");
my @tags = $xpc->findnodes(q|.//*[@tag='param']|);
$r->log->debug(scalar(@tags)." parameter tags found.");
$tree->addChild($doc->createComment("mod_xml2"));
my @params = ();
foreach my $tag (@tags) {
push(@params, $tag->getAttribute( 'name' ));
push(@params, $tag->textContent());
$tag->unbindNode();
}
my $uri = URI->new($tree->getAttribute('href'));
$uri->query_form(@params);
$r->log->debug("Setting new href ".$uri.".");
$tree->setAttribute('href', $uri);
$r->log->debug("transform is done.");
return APR::Const::SUCCESS();
};
}
#
# OSM/SXPATH
#
sub init_osm : FilterInitHandler {
my($filter) = @_;
$filter->r->log->debug("OSM handler will be initialised.");
return AMX2::xpath_filter_init($filter,
'.//node', undef,
get_osm_transform($filter->r));
}
sub handler_osm : FilterHasInitHandler(\&init_osm) {
my($filter, $bb) = @_;
$filter->r->log->debug("OSM handler called.");
if (!$filter->ctx) {
init_osm($filter);
$filter->ctx(1);
}
return AMX2::xpath_filter($filter, $bb);
}
sub get_osm_transform
{
my ($r) = @_;
return sub {
my($frag) = @_;
$r->log->debug("Tree: ".$frag->toString());
my $tree = $frag->firstChild;
return unless ($tree);
#return APR::Const::SUCCESS();
my $doc = $frag->ownerDocument;
$r->log->debug("XPathContext will be created.");
my $xpc = XML::LibXML::XPathContext->new($frag);
$r->log->debug("XPathContext created.");
# check if the node is a gas station.
my @tags = $xpc->findnodes(q|.//tag[@k='amenity'][@v='fuel']|);
$r->log->debug(scalar(@tags)." fuel tags found.");
if (!@tags) {
# We remove the whole tree.
( run in 1.611 second using v1.01-cache-2.11-cpan-2398b32b56e )