HCKit-Template

 view release on metacpan or  search on metacpan

Template.pm  view on Meta::CPAN

	    }
	}
	my $prev = $env->{$sym};
	if( $prev ){
	    ref($prev) eq "HCKit::Template::Rule" 
		|| die "$sym already defined";
	    if( $append ){
		if( @args ){
		    die "cannot specify args in appending rule";
		}
		$prev->append($val);
	    }
	    else{
		$env->{$sym} = HCKit::Template::Rule->new($val);
	    }
	}
	else{
	    $env->{$sym} = HCKit::Template::Rule->new($val);
	    if( @args ){
		$env->{$sym}->set_args(@args);
	    }
	}
    }
}

sub parse_data {
    my ($self, $data, $env) = @_;
    $data ||= "";
    while( $data =~ 
	   /<([\w-]+)>(.*?)<\/\1>|<\*(.*?)\*>|(<--.*?-->)/gs ){
	my ($sym, $body, $cmd, $comm) = ($1, $2, trim($3), $4);
	if( $comm ){ next }
	if( $sym ){
	    my $val = $self->parse_data_body($body, $env);
	    extend_data($sym, $val, $env);
	}
	else{
	    if( $cmd =~ /^\?(.*?)\?$/ ){
		my $instr = trim($1);
		if( $instr =~ /^include\s+(\S+)$/ ){
		    $self->_include_file($1, $env);
		    next;
		}
		die "invalid instruction $cmd";
	    }
	    $self->eval_var_raw($cmd, $env);
	}
    }
}

sub parse_data_body {
    my ($self, $body, $env) = @_;
    my %hash;
    my $text;
    my $last = 0;
    while( $body =~ 
	   /(<([\w-]+)>(.*?)<\/\2> |
	     <\*(.*?)\*> |
	     (<!\[\[CDATA\[.*\]\]>)
	     )/gsx ){
	my ($match, $sym, $val, $cmd, $cdata) = ($1,$2,$3,$4,$5);
	my $len = length($match);
	my $pre = substr($body, $last, pos($body)-$len-$last);
	$text .= $pre;
	$last = pos($body);
	if( $sym ){
	    my $sub = $self->parse_data_body($val, $env);
	    extend_data($sym, $sub, \%hash);
	}
	elsif( $cdata ){
	    $cdata =~ s/^<!\[\[CDATA\[//;
	    $cdata =~ s/\]\]>$//;
	    $text .= $cdata;
	}
	else{
	    my ($key, $aux) = 
		$cmd =~ /\s*([\w:.-]+)\s*(.*)/;
	    my $val = $self->eval_var($key, $aux, $env);
	    if( ref($val) eq "HASH" ){
		while( my ($sym, $sub) = each %$val ){
		    extend_data($sym, $sub, \%hash);
		}
	    }
	    else{ $text .= $val }
	}
    }
    if( $last < length($body) ){
	$text .= substr($body, $last);
    }
    return %hash ? \%hash : $text;
}

sub extend_data {
    my ($key, $val, $env) = @_;
    if( defined($env->{$key}) ){
	if( ref($env->{$key}) eq 'ARRAY' ){
	    push @{$env->{$key}}, $val;
	}
	else{
	    $env->{$key} = [$env->{$key}, $val];
	}
    }
    else{
	$env->{$key} = $val;
    }
}

sub rewrite {
    my ($self, $tmpl, $env) = @_;
    $tmpl = "" if !defined($tmpl);
    my $last = 0;
    my $output = "";
    while( $tmpl =~ 
	   /(
	     <\*\s*([\w:.-]+)\s*(.*?)\*> |
	     <\&\s*([\w:.-]+(?:@\w+)?)\s*(.*?)\&>(.*?)<\&\s*\/\4\s*\&> |
	     <\{\s*([\w:.-]+(?:@\w+)?)\s*(.*?)\}>(.*?)<\{\s*\/\7\s*\}>
	     )/gxs ){
	my ($match, $var, $varaux, $fun, $funaux, $funarg, 
	    $loop, $loopaux, $loopbody) = 
		($1,$2,$3,$4,$5,$6,$7,$8,$9);
	my $len = length($match);
	my $pre = substr($tmpl, $last, pos($tmpl)-$len-$last);
	$output .= $pre;
	$last = pos($tmpl);
	if( $var ){
	    $output .= $self->eval_var($var, $varaux, $env);
	}
	elsif( $fun ){
	    $fun =~ s/@.*//;
	    $output .= $self->eval_fun($fun, $funaux, $funarg, $env);
	}
	elsif( $loop ){



( run in 1.881 second using v1.01-cache-2.11-cpan-d06a3f9ecfd )