Apache2-ModXml2
view release on metacpan or search on metacpan
t/lib/TestSXPath.pm view on Meta::CPAN
use URI;
use base qw(Apache2::Filter);
#
# HTML/SXPATH
#
sub init_sxpath: FilterInitHandler {
my($filter) = @_;
$filter->r->log->debug("SXPATH handler will be initialised.");
$filter->ctx(1);
return AMX2::xpath_filter_init($filter,
'.//a', undef,
get_transform($filter->r));
}
sub handler: FilterHasInitHandler(\&init_sxpath) {
my($filter, $bb) = @_;
$filter->r->log->debug("SXPATH handler called.");
if (!$filter->ctx) {
# Filter initialisation by attribute seems to not work
init_sxpath($filter);
$filter->r->log->debug("SXPATH handler initialised from self.");
# Mark as initialized
$filter->ctx(1);
}
my $rtn = AMX2::xpath_filter($filter, $bb);
$filter->r->log->debug("SXPATH handler finished.");
return $rtn;
}
sub get_transform
{
my ($r) = @_;
return sub {
my($frag) = @_;
my $tree = $frag->firstChild;
$r->log->debug("Tree: ".$tree->toString());
#return APR::Const::SUCCESS();
my $doc = $tree->ownerDocument;
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
#
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 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("Ref: ".ref($frag));
$r->log->debug("Name: ".$frag->nodeName);
$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) {
( run in 0.987 second using v1.01-cache-2.11-cpan-2398b32b56e )