Diff for /loncom/xml/style.pm between versions 1.1 and 1.21

version 1.1, 2000/06/26 15:21:28 version 1.21, 2004/01/21 13:03:29
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Style Parser Module   # Style Parser Module (new version)
   #
   # $Id$
   #
   # 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 strict;
 use HTML::TokeParser;  use HTML::TokeParser;
   
 #============================================================= style subroutine   
   
 sub styleparser {  sub styleparser {
   
   my ($target,$content_style_string) = @_;      my ($target,$content_style_string)=@_;
       my @keys = ();
       my @values = ();
       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];
    }
       }
    }
       }
       my %style_for_target;
       for (my $i=0; $i<=$#keys; $i++) {
    if ($values[$i] !~ /^\s*$/) {
       $style_for_target{$keys[$i]}=$values[$i]; 
    }
       }
       return %style_for_target; 
   }
   
 #------------------------------------------- target redefinition (if necessary)   
       sub testkey {
   my @target_string = '';  
   my $element;      my ($zeroth,$first,@keys) = @_; 
          my $number = -1;
   ($element,@target_string) = split ('&&',$target);      if ($zeroth eq 'S') {
    for (my $i=$#keys; $i>=0; $i=$i-1) {
   map {$content_style_string =~ s/\<(.*)$_\>/\<$1$element\>/g; } @target_string;      if ($first eq lc($keys[$i]))  { 
       $number = $i;
   $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;   last;
  }      }
         }   }
        } elsif ($stoken->[0] eq 'S' and $stoken->[1] ne $target) {      } elsif ($zeroth eq 'E') {
   my $tempotempo = $stoken->[1];   for (my $i=$#keys; $i>=0; $i=$i-1) {
    while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempotempo) {      if ('/'.$first eq lc($keys[$i]))  { 
    }   $number = $i;
        }   last;
       }
        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;  
  }   }
        }       
       
       }  
      }  
     }      }
        return $number;
    }      }
    $current_value =~ s/(\s)+/$1/g;  
      if ($current_value ne ' ' and $current_value ne '' ) {    sub testvalue {
        push (@value_style,lc $current_key,$current_value);  
      }      my ($number,$zeroth,$second,@values) = @_;   
      $current_key = '';      my $current_content = $values[$number];
      $current_value = '';               if ($zeroth eq 'S') {
    my %tempo_hash = %$second;
   }     while ((my $current_k,my $current_v) = each %tempo_hash) {
   my %style_for_target = @value_style;         $current_content =~ s/\$$current_k/$current_v/g;
 #--------------------------------------------------------------- check printing   }
 #  while (($current_key,$current_value) = each %style_for_target) {      } elsif ($zeroth eq 'E') {
 #       print "$current_key => $current_value\n";   $current_content = $values[$number];
 #  }      }
 #---------------------------------------------------------------- return result      return $current_content;
   return %style_for_target;   
 }  }
   
 1;  1;
   
 __END__  __END__

Removed from v.1.1  
changed lines
  Added in v.1.21


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