# The LearningOnline Network with CAPA # Style Parser Module # # last modified 06/23/00 by Alexander Sakharuk package Apache::style; use strict; use HTML::TokeParser; #============================================================= style subroutine sub styleparser { my ($target,$content_style_string) = @_; #------------------------------------------- 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 return %style_for_target; } 1; __END__