diff options
| author | xerl <puppet@mx.buetow.org> | 2013-02-03 11:29:31 +0100 |
|---|---|---|
| committer | xerl <puppet@mx.buetow.org> | 2013-02-03 11:29:31 +0100 |
| commit | 469d0a4485d65bbea6161782e78781333eb28d8b (patch) | |
| tree | 70d507a1b3ecc82a67cc945e7bd6b06e02c0ac9e /Xerl | |
| parent | 835c6ee12cd78cbd8caec77d11e8b074c6e5845e (diff) | |
add do while loop to Reader.pm, may fixes XML bug
Diffstat (limited to 'Xerl')
| -rw-r--r-- | Xerl/XML/Reader.pm | 183 |
1 files changed, 96 insertions, 87 deletions
diff --git a/Xerl/XML/Reader.pm b/Xerl/XML/Reader.pm index 51aa75b..7b5f8d4 100644 --- a/Xerl/XML/Reader.pm +++ b/Xerl/XML/Reader.pm @@ -73,114 +73,123 @@ sub parse($) { # Allow <tag /> my $is_single_tag = $line =~ s#<([^/].+?)( (.*?))? ?/ *>#<$1 $3></$1>#o; - # Open XML tag - if ( $line =~ s#<([^/].+?)( (.*?))? *>##o ) { - my ( $name, $params ) = ( $1, $3 ); + my $flag = 0; - # Ignore XML comments - next if $name =~ /^!--/o; + do { - $next = Xerl::XML::Element->new(); - $next->set_name($name); - $next->set_prev($element); - $next->set_single($is_single_tag); + # Open XML tag + if ( $line =~ s#<([^/].+?)( (.*?))? *>##o ) { + my ( $name, $params ) = ( $1, $3 ); + $flag = 1; - # Handle tag parameters - if ( defined $params ) { - my %params = $params =~ / + # Ignore XML comments + next if $name =~ /^!--/o; + + $next = Xerl::XML::Element->new(); + $next->set_name($name); + $next->set_prev($element); + $next->set_single($is_single_tag); + + # Handle tag parameters + if ( defined $params ) { + my %params = $params =~ / (?: ( [^\s]+? ) \s*=\s* ( (?: '(?:.|(?:\\'))*?' ) | (?: "(?:.|(?:\\"))*?" ) | (?: [^\s]+ ) ) ) /gox; - # Remove " and ' - $params{$_} =~ s/^(?:"|')|(?:"|')$//go for keys %params; - $next->set_params( \%params ); - $notrim = 1 if exists $params{notrim}; - } - - $element->push_array($next); - - $root = $element unless defined $root; - $element = $next; - $insert = $element; - - redo; - } - - # Close XML tag - if ( $line =~ s#<(/.+?)>##o ) { - - #print "XML::<$1>\n"; - if ( $element->get_name() eq 'includefiles' ) { - my $config = $self->get_config(); - my $params = $element->get_params(); - my $path = - $config->get_hostpath() . 'content/' . $params->{reldir}; - my $pattern = $params->{pattern}; - my $maxitems = - exists $params->{maxitems} ? $params->{maxitems} : 100; - my $startindex = - exists $params->{startindex} ? $params->{startindex} : 0; - - my Xerl::Tools::FileIO $io = - Xerl::Tools::FileIO->new( path => $path ); + # Remove " and ' + $params{$_} =~ s/^(?:"|')|(?:"|')$//go for keys %params; + $next->set_params( \%params ); + $notrim = 1 if exists $params{notrim}; + } - $io->dslurp(); - $io->reverse_array() if exists $params->{reversed}; + $element->push_array($next); - for my $include ( grep { /$pattern/o } @{ $io->get_array() } ) { - last unless $maxitems--; - next if 0 < $startindex--; + $root = $element unless defined $root; + $element = $next; + $insert = $element; - my Xerl::XML::Reader $reader = Xerl::XML::Reader->new( - path => $include, - config => $config - ); + redo; + } - if ( -1 == $reader->open() ) { - $config->set_finish_request(1); - return undef; + # Close XML tag + if ( $line =~ s#<(/.+?)>##o ) { + $flag = 1; + + #print "XML::<$1>\n"; + if ( $element->get_name() eq 'includefiles' ) { + my $config = $self->get_config(); + my $params = $element->get_params(); + my $path = + $config->get_hostpath() . 'content/' . $params->{reldir}; + my $pattern = $params->{pattern}; + my $maxitems = + exists $params->{maxitems} ? $params->{maxitems} : 100; + my $startindex = + exists $params->{startindex} ? $params->{startindex} : 0; + + my Xerl::Tools::FileIO $io = + Xerl::Tools::FileIO->new( path => $path ); + + $io->dslurp(); + $io->reverse_array() if exists $params->{reversed}; + + for + my $include ( grep { /$pattern/o } @{ $io->get_array() } ) + { + last unless $maxitems--; + next if 0 < $startindex--; + + my Xerl::XML::Reader $reader = Xerl::XML::Reader->new( + path => $include, + config => $config + ); + + if ( -1 == $reader->open() ) { + $config->set_finish_request(1); + return undef; + } + $reader->parse(); + + my Xerl::XML::Element $starttag = + $reader->get_root()->starttag('content'); + + my $sep = + exists $params->{separator} + ? $params->{separator} + : 'noop'; + $starttag->set_name($sep); + $element->set_name('noop'); + $element->push_array($starttag); } - $reader->parse(); - - my Xerl::XML::Element $starttag = - $reader->get_root()->starttag('content'); - - my $sep = - exists $params->{separator} - ? $params->{separator} - : 'noop'; - $starttag->set_name($sep); - $element->set_name('noop'); - $element->push_array($starttag); } - } - $insert = $element; - $prev = $element->get_prev(); - $element = $prev if defined $prev; - $notrim = 0 if $notrim; + $insert = $element; + $prev = $element->get_prev(); + $element = $prev if defined $prev; + $notrim = 0 if $notrim; - redo; - } + redo; + } - # XML text - if ( defined $insert - and $line =~ s/^( *)(.+?) *$/$notrim ? $1.$2 : $2/oe ) - { + # XML text + if ( defined $insert + and $line =~ s/^( *)(.+?) *$/$notrim ? $1.$2 : $2/oe ) + { - if ($newlineadd) { - $insert->append_text("\n"); - $newlineadd = 0; - } + if ($newlineadd) { + $insert->append_text("\n"); + $newlineadd = 0; + } - $line =~ s/!!LT!!/</g; - $line =~ s/!!GT!!/>/g; + $line =~ s/!!LT!!/</g; + $line =~ s/!!GT!!/>/g; - $insert->append_text($line); - } + $insert->append_text($line); + } + } while ( $flag == 1 ); } $root->set_name('root'); |
