--- loncom/xml/style.pm	2001/01/09 14:10:14	1.7
+++ loncom/xml/style.pm	2008/11/24 18:55:01	1.22
@@ -1,6 +1,41 @@
 # The LearningOnline Network with CAPA
 # Style Parser Module (new version)
 #
+# $Id: style.pm,v 1.22 2008/11/24 18:55:01 jms 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
 #
 
@@ -11,77 +46,83 @@ use HTML::TokeParser;
 
 sub styleparser {
 
-    my ($target,$content_style_string) = @_;
-    my $current_key = '';
-    my $current_value = '';
+    my ($target,$content_style_string)=@_;
     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;
-#	print "$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];
-		    } 
-	        }
-
-
-
-	    } 
+    my $current_value;
+    my $allow=0;
+    my $pstyle = HTML::TokeParser->new(\$content_style_string);
+    $pstyle->xml_mode('1');
+    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];
+		}
+	    }
 	}
-	push @values,$current_value;
-#	print "a:$current_value $#values \n";
-	$current_key = '';
-	$current_value ='';
-	$b_pos = index($content_style_string,'<definetag',$b_pos+1);
     }
-
+    my %style_for_target;
     for (my $i=0; $i<=$#keys; $i++) {
-	push @style_array,$keys[$i],$values[$i]; 
+	if ($values[$i] !~ /^\s*$/) {
+	    $style_for_target{$keys[$i]}=$values[$i]; 
+	}
     }
-    my %style_for_target = @style_array;
-
-# check printing
-  while (($current_key,$current_value) = each %style_for_target) {
-      print "$current_key => $current_value\n";
-  }
-# return result
-  return %style_for_target; 
-
+    return %style_for_target; 
 }
 
+
 sub testkey {
 
     my ($zeroth,$first,@keys) = @_; 
@@ -109,12 +150,12 @@ 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;
-    }
+	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];
+	$current_content = $values[$number];
     }
     return $current_content;
 }
@@ -122,3 +163,32 @@ sub testvalue {
 1;
 
 __END__
+
+=pod
+
+=head1 NAME
+
+Apache::style.pm
+
+=head1 SYNOPSIS
+
+Style parsing module
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+
+=head1 SUBROUTINES
+
+=over
+
+=item styleparser()
+
+=item testkey()
+
+=item testvalue()
+
+=back
+
+=cut
+