# The LearningOnline Network with CAPA # Style Parser Module (new version) # # written 01/08/01 by Alexander Sakharuk # package Apache::style; use strict; use HTML::TokeParser; sub styleparser { 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]; } } } } $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__