--- loncom/xml/style.pm	2000/06/26 15:21:28	1.1
+++ loncom/xml/style.pm	2003/09/22 13:01:57	1.19
@@ -1,149 +1,163 @@
 # The LearningOnline Network with CAPA
-# Style Parser Module 
+# Style Parser Module (new version)
+#
+# $Id: style.pm,v 1.19 2003/09/22 13:01:57 sakharuk Exp $
+#
+# Copyright Michigan State University Board of Trustees
+#
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
+#
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
+# Copyright for TtHfunc and TtMfunc by Ian Hutchinson. 
+# TtHfunc and TtMfunc (the "Code") may be compiled and linked into 
+# binary executable programs or libraries distributed by the 
+# Michigan State University (the "Licensee"), but any binaries so 
+# distributed are hereby licensed only for use in the context
+# of a program or computational system for which the Licensee is the 
+# primary author or distributor, and which performs substantial 
+# additional tasks beyond the translation of (La)TeX into HTML.
+# The C source of the Code may not be distributed by the Licensee
+# to any other parties under any circumstances.
+#
+# written 01/08/01 by Alexander Sakharuk
 #
-# last modified 06/23/00 by Alexander Sakharuk
 
-package Apache::lonstyleparser; 
+package Apache::style;
 
 use strict;
 use HTML::TokeParser;
 
-#============================================================= style subroutine 
-
 sub styleparser {
 
-  my ($target,$content_style_string) = @_;
+    my ($target,$content_style_string)=@_;
+    my @keys = ();
+    my @values = ();
+    my @style_array = ();
+    my $current_value;
+    my $allow=0;
+    my $pstyle = HTML::TokeParser->new(\$content_style_string);
+    while (my $stoken = $pstyle->get_token) {
+	if (($stoken->[0] eq 'S') && ($stoken->[1] eq 'definetag')) {
+	    push @keys,$stoken->[2]->{'name'};
+            $current_value='';
+	    $allow=0;
+	} elsif (($stoken->[0] eq 'E') && ($stoken->[1] eq 'definetag')) {
+	    $current_value =~ s/(\s)+/$1/g;
+	    $current_value =~ s/\n//g;
+	    push(@values,$current_value);
+	} elsif (($target eq 'meta') && ($stoken->[0] eq 'S') && ($stoken->[1] eq 'meta')) {
+	    $allow=1;
+        } elsif (($target eq 'meta') && ($stoken->[0] eq 'E') && ($stoken->[1] eq 'meta')) {
+	    $allow=0;
+	} elsif (($target ne 'meta') && ($stoken->[0] eq 'S') && ($stoken->[1] eq 'render')) {
+	    $allow=1;
+	} elsif (($target ne 'meta') && ($stoken->[0] eq 'E') && ($stoken->[1] eq 'render')) {
+	    $allow=0;
+	} elsif (($target ne 'meta') && ($target ne 'web') && ($stoken->[0] eq 'S') && ($stoken->[1] eq 'web')) {
+	    $allow=0;
+	} elsif (($target ne 'meta') && ($target ne 'web') && ($stoken->[0] eq 'E') && ($stoken->[1] eq 'web')) {
+	    $allow=1;
+	} elsif (($target ne 'meta') && ($target ne 'tex') && ($stoken->[0] eq 'S') && ($stoken->[1] eq 'tex')) {
+	    $allow=0;
+	} elsif (($target ne 'meta') && ($target ne 'tex') && ($stoken->[0] eq 'E') && ($stoken->[1] eq 'tex')) {
+	    $allow=1;
+	} elsif (($stoken->[0] eq 'S') && ($stoken->[1] eq 'target') && (not $stoken->[2]->{'name'}=~/(^\s*$target\s*,|,\s*$target\s*,|,\s*$target\s*$|^\s*$target\s*$)/)) {
+	    $allow=0;
+	} elsif (($stoken->[0] eq 'E') && ($stoken->[1] eq 'target')) {
+	    $allow=1;
+ 	} elsif (($target ne 'meta') && ($stoken->[0] eq 'S') && ($stoken->[1] eq $target)) {
+	    $allow=1;
+	} elsif (($target ne 'meta') && ($stoken->[0] eq 'E') && ($stoken->[1] eq $target)) {
+	} elsif (($stoken->[0] eq 'S') && ($stoken->[1] eq 'target') && ($stoken->[2]->{'name'}=~/(^\s*$target\s*,|,\s*$target\s*,|,\s*$target\s*$|^\s*$target\s*$)/)) {
+	    $allow=1;
+	} elsif ($allow) { 
+	    if ($stoken->[0] eq 'T') {
+		$current_value .= $stoken->[1];
+	    } elsif ($stoken->[0] eq 'S') {
+		my $number=-1;
+		if ($stoken->[1] ne $keys[-1]) {
+		    $number = &testkey($stoken->[0],$stoken->[1],@keys);
+		}
+		if ($number != -1) {
+		    $current_value .= &testvalue($number,$stoken->[0],$stoken->[2],@values);
+		} else {
+		    $current_value .= $stoken->[4];
+		}
+	    } elsif ($stoken->[0] eq 'E') {
+		my $number=-1;
+		if (('/'.$stoken->[1]) ne $keys[-1]) {
+		    $number = &testkey($stoken->[0],$stoken->[1],@keys);
+		}
+		if ($number != -1) {
+		    $current_value .= &testvalue($number,$stoken->[0],$stoken->[2],@values);
+		} else {
+		    $current_value .= $stoken->[2];
+		}
+	    }
+	}
+    }
+    for (my $i=0; $i<=$#keys; $i++) {
+	push @style_array,$keys[$i],$values[$i]; 
+    }
+    my %style_for_target =  @style_array;
+    return %style_for_target; 
+}
+
+
+sub testkey {
 
-#------------------------------------------- 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 {      
+    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 ($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;
+	    }
+	}
+    } elsif ($zeroth eq 'E') {
+	for (my $i=$#keys; $i>=0; $i=$i-1) {
+	    if ('/'.$first eq lc($keys[$i]))  { 
+		$number = $i;
+	 	last;
+	    }
 	}
-       }	     
-    
-      }
-     }
     }
-    
-   }    
-   $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
-#  while (($current_key,$current_value) = each %style_for_target) {
-#       print "$current_key => $current_value\n";
-#  }
-#---------------------------------------------------------------- return result
-  return %style_for_target; 
+	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;
+
 __END__