--- loncom/xml/style.pm	2000/06/26 15:21:28	1.1
+++ loncom/xml/style.pm	2000/10/26 14:01:40	1.6
@@ -1,149 +1,171 @@
 # 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::lonstyleparser; 
+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];
-        }
-       }
-     }
-    } 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;
+# 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') {
+                   if ($stoken->[0] eq 'T') {	
+                            $current_value .= $stoken->[1];
+		   } elsif ($stoken->[0] eq 'S') {	
+                            $current_value .= $stoken->[4];
+		   } else {
+                            $current_value .= $stoken->[2];
 		   }
-	       }
-	       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;
+     } 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 <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 {
+		       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 '' ) {  
        push (@value_style,lc $current_key,$current_value);
-     }
-     $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) {
-#       print "$current_key => $current_value\n";
+#      print "$current_key => $current_value\n";
 #  }
-#---------------------------------------------------------------- return result
+# 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__