--- loncom/xml/style.pm 2000/06/28 13:28:05 1.3 +++ loncom/xml/style.pm 2001/03/26 17:32:30 1.10 @@ -1,149 +1,125 @@ # The LearningOnline Network with CAPA -# Style Parser Module +# Style Parser Module (new version) +# +# written 01/08/01 by Alexander Sakharuk # -# last modified 06/23/00 by Alexander Sakharuk -package Apache::style; +package Apache::style; use strict; use HTML::TokeParser; -#============================================================= style subroutine - sub styleparser { - my ($target,$content_style_string) = @_; + my ($target,$content_style_string) = @_; + my $current_key = ''; + my $current_value = ''; + my @keys = (); + my @values = (); + my @style_array = (); + my $stoken; + + my $b_pos; + my $e_pos; + my $entry; + + $b_pos = index($content_style_string,'',0); + my $e_position = index($entry,'',$b_position); + my $target_length = length($target) + 2; + if ($b_position > -1) { + my $entry_target = substr($entry,$b_position+$target_length,$e_position-$b_position-$target_length); + my $pstyle = HTML::TokeParser->new(\$entry_target); + while ($stoken = $pstyle->get_token) { + if ($stoken->[0] eq 'T') { + $current_value .= $stoken->[1]; + } elsif ($stoken->[0] eq 'S') { + my $number = &testkey($stoken->[0],$stoken->[1],@keys); + if ($number != -1) { + $current_value .= &testvalue($number,$stoken->[0],$stoken->[2],@values); + } else { + $current_value .= $stoken->[4]; + } + } else { + my $number = &testkey($stoken->[0],$stoken->[1],@keys); + if ($number != -1) { + $current_value .= &testvalue($number,$stoken->[0],$stoken->[2],@values); + } else { + $current_value .= $stoken->[2]; + } + } -#------------------------------------------- target redefinition (if necessary) - - my @target_string = ''; - my $element; - - ($element,@target_string) = split ('&&',$target); - - map {$content_style_string =~ s/\<(.*)$_\>/\<$1$element\>/g; } @target_string; - - $target = $element; - -#-------------------------------------------- create a table for defined target -#----------------------------------------- from the information from Style File - - my @value_style = (); - my $current_key = ''; - my $current_value = ''; - my $stoken; - my $flag; - my $iele; - - my $pstyle = HTML::TokeParser->new(\$content_style_string); - - while ($stoken = $pstyle->get_token) { -#----------------------------------------------------- start for tag definition - if ($stoken->[0] eq 'S' and $stoken->[1] eq 'definetag') { -#-------------------------------------------------------------- new key in hash - $current_key = $stoken->[2]{name}; - $flag = 0; -#-------------------------------------------------------------- metadata output - if ($target eq 'meta') { - while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag') { - if ($stoken->[0] eq 'S' and $stoken->[1] eq 'meta') { - while ($stoken = $pstyle->get_token and $stoken->[1] ne 'meta') { - $current_value .= $stoken->[1]; - } - } - } - } else { -#--------------------------------------------------------------- outtext output - while ($stoken = $pstyle->get_token and $stoken->[1] ne 'render') { - if ($stoken->[1] eq 'definetag') { - $flag = 1; - last; - } - } - if ($flag == 0) { - while ($stoken = $pstyle->get_token and $stoken->[0] ne 'S') { - $current_value .= $stoken->[1]; - } - while ($stoken->[1] ne 'definetag') { - if ($stoken->[0] eq 'S' and $stoken->[1] eq $target) { - while ($stoken = $pstyle->get_token) { - if ($stoken->[1] ne $target) { - if ($stoken->[0] eq 'S') { - my $flagelem = 0; - for (my $i=$#value_style-1;$i>0;$i=$i-2) { - if ($stoken->[1] eq $value_style[$i]) { - $flagelem = 1; - $iele = $i+1; - last; - } - } - if ($flagelem == 0) { - $current_value .= $stoken->[4]; - } else { - $current_value .= $value_style[$iele]; - } - } - if ($stoken->[0] eq 'E') { - my $flagelem = 0; - for (my $i=$#value_style-1;$i>0;$i=$i-2) { - if ('/'.$stoken->[1] eq $value_style[$i]) { - $flagelem = 1; - $iele = $i+1; - last; - } - } - if ($flagelem == 0) { - $current_value .= $stoken->[2]; - } else { - $current_value .= $value_style[$iele]; - } - } - if ($stoken->[0] eq 'T') { - $current_value .= $stoken->[1]; - } - } else { - last; - } - } - } elsif ($stoken->[0] eq 'S' and $stoken->[1] ne $target) { - my $tempotempo = $stoken->[1]; - while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempotempo) { - } - } - - while ($stoken = $pstyle->get_token) { - if ($stoken->[0] eq 'T') { - $current_value .= $stoken->[1]; - } - if ($stoken->[0] eq 'E') { - last; - } - if ($stoken->[0] eq 'S') { - last; + + + } } - } - - } - } - } - - } - $current_value =~ s/(\s)+/$1/g; - if ($current_value ne ' ' and $current_value ne '' ) { - push (@value_style,lc $current_key,$current_value); - } - $current_key = ''; - $current_value = ''; - - } - my %style_for_target = @value_style; -#--------------------------------------------------------------- check printing -# while (($current_key,$current_value) = each %style_for_target) { -# print "$current_key => $current_value\n"; -# } -#---------------------------------------------------------------- return result + $current_value =~ s/\n//g; + push @values,$current_value; +# &Apache::lonxml::debug("a:$current_value $#values \n"); + $current_key = ''; + $current_value =''; + $b_pos = index($content_style_string,' $style_for_target{$current_key}\n"); + } +# return result return %style_for_target; + +} + +sub testkey { + + my ($zeroth,$first,@keys) = @_; + my $number = -1; + if ($zeroth eq 'S') { + for (my $i=$#keys; $i>=0; $i=$i-1) { + if ($first eq lc($keys[$i])) { + $number = $i; + last; + } + } + } elsif ($zeroth eq 'E') { + for (my $i=$#keys; $i>=0; $i=$i-1) { + if ('/'.$first eq lc($keys[$i])) { + $number = $i; + last; + } + } + } + return $number; +} + +sub testvalue { + + my ($number,$zeroth,$second,@values) = @_; + my $current_content = $values[$number]; + if ($zeroth eq 'S') { + my %tempo_hash = %$second; + while ((my $current_k,my $current_v) = each %tempo_hash) { + $current_content =~ s/\$$current_k/$current_v/g; + } + } elsif ($zeroth eq 'E') { + $current_content = $values[$number]; + } + return $current_content; } 1; + __END__