# The LearningOnline Network with CAPA # Style Parser Module # # last modified 06/29/00 by Alexander Sakharuk package Apache::style; use strict; use HTML::TokeParser; sub styleparser { my ($target,$content_style_string) = @_; my @target_list = ('target','web','tex','edit','modified','rat','answer','metadis'); my @value_style = (); my $current_key = ''; my $current_value = ''; my $stoken; my $flag; my $iele; my $flag_target; 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 { # render 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->[1] ne 'definetag' and $stoken->[1] ne 'render') { # if token not equal to target $flag_target=0 $flag_target = 0; for (my $i=0; $i<$#target_list; $i++) { if ($stoken->[1] eq $target_list[$i]) { $flag_target = 1; } } if ($flag_target == 0) { # target not found my $tempo_out = &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style); $current_value .= $tempo_out; } else { # target found if ($stoken->[0] eq 'S' and $stoken->[1] eq 'target') { # target defined via tag if (defined $stoken->[2]{dest}) { if (index($stoken->[2]{dest},$target) == -1) { while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') { } } elsif (index($stoken->[2]{dest},$target) != -1) { while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') { my $tempo_out = &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style); $current_value .= $tempo_out; } } } else { if (index($stoken->[2]{excl},$target) != -1) { while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') { } } elsif (index($stoken->[2]{excl},$target) == -1) { while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') { my $tempo_out = &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style); $current_value .= $tempo_out; } } } } elsif ($stoken->[1] ne $target) { #target defined via short-form tag my $tempo_token = $stoken->[1]; while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempo_token) { } } else { my $tempo_token = $stoken->[1]; while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempo_token) { my $tempo_out = &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style); $current_value .= $tempo_out; } } } } } } } $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; } sub test { my ($zeroth,$first,$second,$fourth,@value_style) = @_; my $current_value = ''; my $num; my $flag; if ($zeroth eq 'T') { $current_value .= $first; } elsif ($zeroth eq 'S') { $flag = 0; for (my $i=$#value_style-1;$i>=0;$i=$i-2) { if ($first eq $value_style[$i]) { $flag = 1; $num = $i + 1; last; } } if ($flag == 0) { $current_value .= $fourth; } else { $current_value .= $value_style[$num]; } } elsif ($zeroth eq 'E') { $flag = 0; for (my $i=$#value_style-1;$i>=0;$i=$i-2) { if ($first eq $value_style[$i]) { $flag = 1; $num = $i + 1; last; } } if ($flag == 0) { $current_value .= $second; } else { $current_value .= $value_style[$num]; } } return $current_value; } 1; __END__