File:  [LON-CAPA] / loncom / xml / style.pm
Revision 1.6: download - view: text, annotated - select for diffs
Thu Oct 26 14:01:40 2000 UTC (23 years, 7 months ago) by sakharuk
Branches: MAIN
CVS tags: HEAD
new but not full and last version of cbi.sty

    1: # The LearningOnline Network with CAPA
    2: # Style Parser Module 
    3: #
    4: # last modified 06/29/00 by Alexander Sakharuk
    5: 
    6: package Apache::style; 
    7: 
    8: use strict;
    9: use HTML::TokeParser;
   10: 
   11: sub styleparser {
   12: 
   13:   my ($target,$content_style_string) = @_;
   14:   my @target_list = ('target','web','tex','edit','modified','rat','answer','metadis');
   15:   my @value_style = ();
   16:   my $current_key = '';
   17:   my $current_value = '';
   18:   my $stoken;
   19:   my $flag;                  
   20:   my $iele;
   21:   my $flag_target;
   22: 
   23:   my $pstyle = HTML::TokeParser->new(\$content_style_string);
   24: 
   25:   while ($stoken = $pstyle->get_token) {
   26: # start for tag definition
   27:    if ($stoken->[0] eq 'S' and $stoken->[1] eq 'definetag') {
   28: # new key in hash
   29:      $current_key = $stoken->[2]{name};
   30:      $flag = 0;
   31: # metadata output
   32:      if ($target eq 'meta') {
   33:        while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag') { 
   34: 	    if ($stoken->[0] eq 'S' and $stoken->[1] eq 'meta') {
   35: 	      while ($stoken = $pstyle->get_token and $stoken->[1] ne 'meta') {
   36:                    if ($stoken->[0] eq 'T') {	
   37:                             $current_value .= $stoken->[1];
   38: 		   } elsif ($stoken->[0] eq 'S') {	
   39:                             $current_value .= $stoken->[4];
   40: 		   } else {
   41:                             $current_value .= $stoken->[2];
   42: 		   }
   43: 	      }
   44: 	    }
   45:        }
   46:      } else {
   47: # render output
   48:      while ($stoken = $pstyle->get_token and $stoken->[1] ne 'render') {
   49: 	  if ($stoken->[1] eq 'definetag') {
   50: 	    $flag = 1;
   51: 	    last;
   52: 	  }
   53:      }
   54:       if ($flag == 0) { 
   55: 	while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag'
   56: 	       and $stoken->[1] ne 'render') {
   57: # if token not equal to target $flag_target=0 
   58: 	      $flag_target = 0;
   59: 	      for (my $i=0; $i<$#target_list; $i++) {
   60: 		 if ($stoken->[1] eq $target_list[$i]) {
   61: 		   $flag_target = 1;
   62: 		 }
   63: 	      }
   64: 	      if ($flag_target == 0) {
   65: # target not found
   66: 			  my $tempo_out =  &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style);
   67: 			  $current_value .= $tempo_out;
   68: 	      } else {
   69: # target found
   70: 		  if ($stoken->[0] eq 'S' and $stoken->[1] eq 'target') {
   71: # target defined via <target> tag
   72: 		    if (defined $stoken->[2]{dest}) {
   73: 		      if (index($stoken->[2]{dest},$target) == -1) {
   74: 			while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') {
   75: 			}			
   76: 		      } elsif (index($stoken->[2]{dest},$target) != -1) {
   77: 			  while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') {
   78: 			    my $tempo_out =  &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style);
   79: 			    $current_value .= $tempo_out;
   80: 			  } 
   81: 		      }
   82: 		    } else {
   83: 		       if (index($stoken->[2]{excl},$target) != -1) {
   84: 			 while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') {
   85: 			 }			
   86: 		       } elsif (index($stoken->[2]{excl},$target) == -1) {
   87: 			   while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') {
   88: 			     my $tempo_out =  &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style);
   89: 			     $current_value .= $tempo_out;
   90: 			   } 
   91: 		       }
   92: 
   93: 
   94: 		    }
   95: 		  } elsif ($stoken->[1] ne $target) {
   96: #target defined via short-form tag
   97: 		      my $tempo_token = $stoken->[1];
   98: 			while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempo_token) {
   99: 		      }
  100: 		  } else {
  101: 		      my $tempo_token = $stoken->[1];
  102: 			while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempo_token) {
  103: 			   my $tempo_out =  &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style);
  104: 			     $current_value .= $tempo_out;                                                           
  105: 			}           
  106: 		  }
  107: 	      }
  108: 	}
  109: 
  110:       }
  111:      }    
  112:    }    
  113:    $current_value =~ s/(\s)+/$1/g;
  114:    if ($current_value ne '' ) {  
  115:        push (@value_style,lc $current_key,$current_value);
  116:    }
  117:    $current_key = '';
  118:    $current_value = '';         
  119:   }  
  120:   my %style_for_target = @value_style;   
  121: # check printing
  122: #  while (($current_key,$current_value) = each %style_for_target) {
  123: #      print "$current_key => $current_value\n";
  124: #  }
  125: # return result
  126:   return %style_for_target; 
  127: }
  128: 
  129: sub test {
  130: 
  131:     my ($zeroth,$first,$second,$fourth,@value_style) = @_;
  132:     my $current_value = '';
  133:     my $num;
  134:     my $flag;
  135: 	
  136: 	if ($zeroth eq 'T') {
  137: 	    $current_value .= $first;
  138: 	} elsif ($zeroth eq 'S') {
  139: 	    $flag = 0;    
  140: 	    for (my $i=$#value_style-1;$i>=0;$i=$i-2) {
  141: 		if ($first eq $value_style[$i]) {
  142: 		    $flag = 1;
  143: 		    $num = $i + 1;
  144: 		    last;
  145: 		}
  146: 	    }
  147: 	    if ($flag == 0) {
  148: 		$current_value .= $fourth; 
  149: 	    } else {
  150: 		$current_value .= $value_style[$num];
  151: 	    }
  152: 	} elsif ($zeroth eq 'E') {
  153: 	    $flag = 0;    
  154: 	    for (my $i=$#value_style-1;$i>=0;$i=$i-2) {
  155: 		if ($first eq $value_style[$i]) {
  156: 		    $flag = 1;
  157: 		    $num = $i + 1;
  158: 		    last;
  159: 		}
  160: 	    }
  161: 	    if ($flag == 0) {
  162: 		$current_value .= $second;
  163: 	    } else {
  164: 		$current_value .= $value_style[$num];
  165: 	    }                 
  166: 	} 
  167:     return $current_value;
  168: }
  169: 
  170: 1;
  171: __END__

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