Diff for /loncom/xml/style.pm between versions 1.4 and 1.10

version 1.4, 2000/06/29 20:18:44 version 1.10, 2001/03/26 17:32:30
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Style Parser Module   # Style Parser Module (new version)
   #
   # written 01/08/01 by Alexander Sakharuk
 #  #
 # last modified 06/29/00 by Alexander Sakharuk  
   
 package Apache::style;   package Apache::style;
   
 use strict;  use strict;
 use HTML::TokeParser;  use HTML::TokeParser;
   
 sub styleparser {  sub styleparser {
   
   my ($target,$content_style_string) = @_;      my ($target,$content_style_string) = @_;
   my @target_list = ('target','web','tex','edit','modified','rat','answer','metadis');      my $current_key = '';
   my @value_style = ();      my $current_value = '';
   my $current_key = '';      my @keys = ();
   my $current_value = '';      my @values = ();
   my $stoken;      my @style_array = ();
   my $flag;                        my $stoken;
   my $iele;  
   my $flag_target;      my $b_pos;
       my $e_pos;
   my $pstyle = HTML::TokeParser->new(\$content_style_string);      my $entry;
   
   while ($stoken = $pstyle->get_token) {      $b_pos = index($content_style_string,'<definetag',0);
 # start for tag definition      while ($b_pos != -1) {
    if ($stoken->[0] eq 'S' and $stoken->[1] eq 'definetag') {   $e_pos = index($content_style_string,'</definetag',$b_pos);
 # new key in hash   $entry = substr($content_style_string,$b_pos,$e_pos-$b_pos+12);       
      $current_key = $stoken->[2]{name};   $_ = $entry;
      $flag = 0;   m/<definetag\s+name\s*=\s*\"([^\"]*)\"/;
 # metadata output   $current_key = $1;
      if ($target eq 'meta') {   push @keys,$current_key;
        while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag') {   # &Apache::lonxml::debug("$current_key\n");
     if ($stoken->[0] eq 'S' and $stoken->[1] eq 'meta') {   my $b_position =  index($entry,'<'.$target.'>',0);
       while ($stoken = $pstyle->get_token and $stoken->[1] ne 'meta') {   my $e_position =  index($entry,'</'.$target.'>',$b_position);
    $current_value .= $stoken->[1];   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);
      } else {      while ($stoken = $pstyle->get_token) {
 # render output   if ($stoken->[0] eq 'T') {
      while ($stoken = $pstyle->get_token and $stoken->[1] ne 'render') {      $current_value .= $stoken->[1];
   if ($stoken->[1] eq 'definetag') {   } elsif ($stoken->[0] eq 'S') {
     $flag = 1;      my $number = &testkey($stoken->[0],$stoken->[1],@keys);
     last;      if ($number != -1) {
   }   $current_value .= &testvalue($number,$stoken->[0],$stoken->[2],@values);
      }      } else {
       if ($flag == 0) {    $current_value .= $stoken->[4];
  while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag'      } 
        and $stoken->[1] ne 'render') {          } else {
 # if token not equal to target $flag_target=0       my $number = &testkey($stoken->[0],$stoken->[1],@keys);
       $flag_target = 0;      if ($number != -1) {
       for (my $i=0; $i<$#target_list; $i++) {   $current_value .= &testvalue($number,$stoken->[0],$stoken->[2],@values);
  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 <target> 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 {      } else {
        if (index($stoken->[2]{excl},$target) != -1) {   $current_value .= $stoken->[2];
  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/\n//g;
    push @values,$current_value;
   # &Apache::lonxml::debug("a:$current_value $#values \n");
    $current_key = '';
    $current_value ='';
    $b_pos = index($content_style_string,'<definetag',$b_pos+1);
       }
   
       for (my $i=0; $i<=$#keys; $i++) {
    push @style_array,lc $keys[$i],$values[$i]; 
       }
       my %style_for_target =  @style_array;
   
       }  
      }      
    }      
    $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  # check printing
   while (($current_key,$current_value) = each %style_for_target) {      foreach $current_key (sort keys %style_for_target) {
       print "$current_key => $current_value\n";   &Apache::lonxml::debug("$current_key => $style_for_target{$current_key}\n");
   }      }
 # return result  # return result
   return %style_for_target;     return %style_for_target; 
   
 }  }
   
 sub test {  sub testkey {
   
     my ($zeroth,$first,$second,$fourth,@value_style) = @_;      my ($zeroth,$first,@keys) = @_; 
     my $current_value = '';      my $number = -1;
     my $num;      if ($zeroth eq 'S') {
     my $flag;   for (my $i=$#keys; $i>=0; $i=$i-1) {
       if ($first eq lc($keys[$i]))  { 
  if ($zeroth eq 'T') {   $number = $i;
     $current_value .= $first;   last;
  } 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;          } elsif ($zeroth eq 'E') {
     for (my $i=$#value_style-1;$i>=0;$i=$i-2) {   for (my $i=$#keys; $i>=0; $i=$i-1) {
  if ($first eq $value_style[$i]) {      if ('/'.$first eq lc($keys[$i]))  { 
     $flag = 1;   $number = $i;
     $num = $i + 1;   last;
     last;  
  }  
     }      }
     if ($flag == 0) {   }
  $current_value .= $second;      }
     } else {   return $number;
  $current_value .= $value_style[$num];  }
     }                   
  }   sub testvalue {
     return $current_value;  
       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;  1;
   
 __END__  __END__

Removed from v.1.4  
changed lines
  Added in v.1.10


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>