File:  [LON-CAPA] / loncom / xml / style.pm
Revision 1.2: download - view: text, annotated - select for diffs
Tue Jun 27 19:35:32 2000 UTC (23 years, 10 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
- renamed pakages to conform to apache

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

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 @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 {      
		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;
	}
       }	     
    
      }
     }
    }
    
   }    
   $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; 
}

1;
__END__

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