From a6ef998abc0af8116d712297407cf2d980463efa Mon Sep 17 00:00:00 2001 From: "Paul Buetow (pluto.buetow.org)" Date: Sun, 29 Sep 2013 04:40:13 +0200 Subject: add flag support --- TODO | 2 ++ Xerl/Base.pm | 4 +++ Xerl/Page/Content.pm | 66 +++++++++++++++++++++++++++----------------------- Xerl/XML/SAXHandler.pm | 18 +++++++++++++- 4 files changed, 59 insertions(+), 31 deletions(-) diff --git a/TODO b/TODO index a8daad1..1853c77 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,7 @@ Hint: Run 'make todo' to see everything in every file what is to do! +TODO: - Validate HTML5 +TODO: - Convert all files to UTF-8 TODO: - Evaluate Template Toolkit, maybe use it TODO: - Create a Debian package and put it to deb.buetow.org TODO: - Documentation of all features/options (manpage) diff --git a/Xerl/Base.pm b/Xerl/Base.pm index 043487b..7301b32 100644 --- a/Xerl/Base.pm +++ b/Xerl/Base.pm @@ -49,6 +49,10 @@ sub AUTOLOAD { if ( $auto =~ /.*::set_(.+)$/ ) { $self->{$1} = $_[1]; + } + elsif ( $auto =~ /.*::set$/ ) { + $self->{$_[1]} = $_[2]; + } elsif ( $auto =~ /.*::get_(.+)_ref$/ ) { return defined $self->{$1} ? \$self->{$1} : ['']; diff --git a/Xerl/Page/Content.pm b/Xerl/Page/Content.pm index 578c254..5969ff0 100644 --- a/Xerl/Page/Content.pm +++ b/Xerl/Page/Content.pm @@ -12,6 +12,8 @@ use warnings; use v5.14.0; +use Data::Dumper; + use Xerl::Base; use Xerl::Page::Rules; use Xerl::Setup::Configure; @@ -36,7 +38,7 @@ sub parse($) { my Xerl::Page::Rules $rules = Xerl::Page::Rules->new( config => $config ); $rules->parse( $config->get_xmlconfigrootobj() ) - unless $config->exists('noparse'); + unless $config->exists('noparse'); $config->insertxmlvars( $config->get_xmlconfigrootobj() ); $self->insertrules( $rules, $xmlcontent->get_root() ); @@ -59,12 +61,12 @@ sub insertrules($$$$) { my $params = $element->get_params(); unshift @content, "Content-Type: $params->{type}\n\n" - if ref $params eq 'HASH' and exists $params->{type}; + if ref $params eq 'HASH' and exists $params->{type}; push @content, $self->_insertrules( $rules, $element ); $self->set_content( \@content ); - return undef; +return undef; } sub _insertrules($$$) { @@ -115,15 +117,19 @@ sub _insertrules($$$) { else { # No rule available, use the tag unmodified! - $name =~ s/^=//o; # Remove the leading = if ( $succ->get_single() ) { push @content, "<$name" . ( $succ->params_str() || '' ) . " />\n" } else { - push @content, + if ($succ->get_flag_noendtag() == 1) { + push @content, + "<$name" . ( $succ->params_str() || '' ) . ">\n"; + } else { + push @content, "<$name" . ( $succ->params_str() || '' ) . '>', $self->_insertrules( $rules, $succ ), $text, "\n"; + } } } @@ -140,38 +146,38 @@ sub _insertrules($$$) { my ( $orule, $crule ) = ( $rule->[0], $rule->[1] ); $self->_insert_special_vars( $rules, $succ, \$orule ); - $self->_insert_special_vars( $rules, $succ, \$crule ); - chomp $orule; + $self->_insert_special_vars( $rules, $succ, \$crule ); + chomp $orule; - # Parse for known tag params. - if ( ref $params eq 'HASH' ) { - Xerl::Page::Templates::PARSELINE( $config, '%%', \$text ); + # Parse for known tag params. + if ( ref $params eq 'HASH' ) { + Xerl::Page::Templates::PARSELINE( $config, '%%', \$text ); - # path/to/file.bla => file.bla - $text =~ s#.*/(.*)$#$1# if lc $params->{basename} eq 'yes'; + # path/to/file.bla => file.bla + $text =~ s#.*/(.*)$#$1# if lc $params->{basename} eq 'yes'; - # foo.bar.tld?options => ?options - if ( exists $params->{cut} ) { - my $cut = quotemeta $params->{cut}; - $text =~ s/.*$cut(.*)$/$1/o; - } + # foo.bar.tld?options => ?options + if ( exists $params->{cut} ) { + my $cut = quotemeta $params->{cut}; + $text =~ s/.*$cut(.*)$/$1/o; + } - $text .= $params->{addback} - if exists $params->{addback}; - $text = $params->{addfront} . $text - if exists $params->{addfront}; - } + $text .= $params->{addback} + if exists $params->{addback}; + $text = $params->{addfront} . $text + if exists $params->{addfront}; +} - my $oadd = - exists $ruleparams->{addfront} - ? '<' . $ruleparams->{addfront} - : ''; +my $oadd = +exists $ruleparams->{addfront} +? '<' . $ruleparams->{addfront} +: ''; - my $cadd = - exists $ruleparams->{addback} ? $ruleparams->{addback} . '>' : ''; +my $cadd = +exists $ruleparams->{addback} ? $ruleparams->{addback} . '>' : ''; - push @content, $orule, $oadd, $self->_insertrules( $rules, $succ ), - $text, $cadd, $crule; +push @content, $orule, $oadd, $self->_insertrules( $rules, $succ ), +$text, $cadd, $crule; } } diff --git a/Xerl/XML/SAXHandler.pm b/Xerl/XML/SAXHandler.pm index 7bcb3f0..9aa1e9d 100644 --- a/Xerl/XML/SAXHandler.pm +++ b/Xerl/XML/SAXHandler.pm @@ -40,9 +40,13 @@ sub start_element { my %params = map { $_->{Name} => $_->{Value} } values %{ $doc->{Attributes} }; + # Extract name and flags from a tag such as: .. + my ($name, @flags) = _GET_NAME_N_FLAG($doc->{Name}); + $x->{current} = Xerl::XML::Element->new(); $x->{current}->set_text(''); - $x->{current}->set_name( $doc->{Name} ); + $x->{current}->set_name( $name ); + $x->{current}->set( "flag_$_", 1 ) for @flags; $x->{current}->set_params( \%params ) if %params; ${ $x->{stack} }[-1]->push_array( $x->{current} ) if @{ $x->{stack} }; @@ -73,4 +77,16 @@ sub end_element { return undef; } +sub _GET_NAME_N_FLAG ($) { + my $string = shift; + + my ($name, $flags) = $string =~ /^(.+)\.xerl\.(.*)$/; + + if (defined $flags) { + return ($name, split(/\./, $flags)); + } else { + return ($string); + } +} + 1; -- cgit v1.2.3