File:  [LON-CAPA] / loncom / xml / style.pm
Revision 1.4: download - view: text, annotated - select for diffs
Thu Jun 29 20:18:44 2000 UTC (23 years, 10 months ago) by sakharuk
Branches: MAIN
CVS tags: HEAD
- massive rewrite of style parser

# The LearningOnline Network with CAPA
# Style Parser Module 
#
# last modified 06/29/00 by Alexander Sakharuk

package Apache::style; 

use strict;
use HTML::TokeParser;

sub styleparser {

  my ($target,$content_style_string) = @_;
  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
   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 {
# 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 '' ) {  
       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; 
}

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__

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