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

version 1.1, 2000/06/26 15:21:28 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/23/00 by Alexander Sakharuk  
   
 package Apache::lonstyleparser;   package Apache::style;
   
 use strict;  use strict;
 use HTML::TokeParser;  use HTML::TokeParser;
   
 #============================================================= style subroutine   
   
 sub styleparser {  sub styleparser {
   
   my ($target,$content_style_string) = @_;      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,'<definetag',0);
       while ($b_pos != -1) {
    $e_pos = index($content_style_string,'</definetag',$b_pos);
    $entry = substr($content_style_string,$b_pos,$e_pos-$b_pos+12);       
    $_ = $entry;
    m/<definetag\s+name\s*=\s*\"([^\"]*)\"/;
    $current_key = $1;
    push @keys,$current_key;
   # &Apache::lonxml::debug("$current_key\n");
    my $b_position =  index($entry,'<'.$target.'>',0);
    my $e_position =  index($entry,'</'.$target.'>',$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];
       } 
           }
   
 #------------------------------------------- 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 'outtext') {  
    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/\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);
    }          }
    $current_value =~ s/(\s)+/$1/g;  
      if ($current_value ne ' ' and $current_value ne '' ) {        for (my $i=0; $i<=$#keys; $i++) {
        push (@value_style,lc $current_key,$current_value);   push @style_array,lc $keys[$i],$values[$i]; 
      }      }
      $current_key = '';      my %style_for_target =  @style_array;
      $current_value = '';           
   # check printing
   }        foreach $current_key (sort keys %style_for_target) {
   my %style_for_target = @value_style;      &Apache::lonxml::debug("$current_key => $style_for_target{$current_key}\n");
 #--------------------------------------------------------------- check printing      }
 #  while (($current_key,$current_value) = each %style_for_target) {  # return result
 #       print "$current_key => $current_value\n";  
 #  }  
 #---------------------------------------------------------------- return result  
   return %style_for_target;     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;  1;
   
 __END__  __END__

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


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