--- loncom/xml/style.pm 2000/06/28 13:28:05 1.3 +++ loncom/xml/style.pm 2000/06/29 20:18:44 1.4 @@ -1,149 +1,165 @@ # The LearningOnline Network with CAPA # Style Parser Module # -# last modified 06/23/00 by Alexander Sakharuk +# last modified 06/29/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 @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 +# 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]; - } +# 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 + } 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->[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; + 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 '' ) { + if ($current_value ne ' ' and $current_value ne '' ) { push (@value_style,lc $current_key,$current_value); - } - $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 +# 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__