Cindy
view release on metacpan or search on metacpan
lib/Cindy.pm view on Meta::CPAN
|| ($string =~ /<html|<body/i);
my $parser = XML::LibXML->new();
my $doc = $parser->parse_html_string($string, $ropt);
if (!$dont_omit) {
# Until HTML_PARSE_NOIMPLIED is implemented by
# libxml2 (and passed by XML::LibXML) we need
# to remove html/body tags that have been added to
# fragments.
omit_nodes($doc, 'html');
omit_nodes($doc, 'body');
}
return $doc;
}
sub parse_xml_string($)
{
my $parser = XML::LibXML->new();
lib/Cindy.pm view on Meta::CPAN
The repeat action is the CJS equivalent of a template engines loop. For
each match of the source path the source node and the target node are
used as root nodes for a sequence of actions. The syntax is
<source> repeat <target> [condition] {
<actions>
} ;
The optional condition is an xpath expression that is run in the context
of the root node of a temporary document fragment. The fragment has
two children, DOC and DATA which hold a subtree from a repeat doc respective data
match. Only those combinations where the condition evaluates to true are
used, all others are discarded.
Note that the repeat condition is an EXPERIMENTAL feature, it may well
change.
=head2 XPATH FUNCTIONS
A small number of additional XPath functions have been implemented.
lib/Cindy/Injection.pm view on Meta::CPAN
my ($self) = @_;
my $xfilter = $self->{xfilter};
if ( not $xfilter
# avoid filtering the remove action
or $self->{action} ne 'repeat') {
return ($self);
}
#INFO "Filtering with $xfilter.";
my $fragment = XML::LibXML::DocumentFragment->new();
my $context = XML::LibXML::Element->new( 'ROOT' );
my $doc = XML::LibXML::Element->new( 'DOC' );
my $data = XML::LibXML::Element->new( 'DATA' );
$fragment->appendChild($context);
$context->appendChild($doc);
$context->appendChild($data);
$doc->appendChild($self->{doc}->cloneNode(1)); # if ($self->{doc}->toString());
$data->appendChild($self->{data}->cloneNode(1)); # if ($self->{data}->toString());
my @found = find_matches($context,
"self::node()[boolean($xfilter)]");
if ( scalar(@found) >= 1 ) {
DEBUG "Match. Kept.";
lib/Cindy/Injection.pm view on Meta::CPAN
}
return ($self);
}
#
# This does all the work on the subsheet.
# The subsheet is a list of injections. It
# may get longer during the steps of run.
# The doc side is matched first because the
# in case of repeat the matched doc fragments
# are copied.
sub run($;$$)
{
my ($self, $dataroot, $docroot) = @_;
$dataroot ||= $self->{data};
$docroot ||= $self->{doc};
return ($self) unless $self->{subsheet};
# Match all doc nodes.
( run in 1.988 second using v1.01-cache-2.11-cpan-364913b4093 )