Diff for /loncom/xml/style.pm between versions 1.5 and 1.22

version 1.5, 2000/07/20 15:37:54 version 1.22, 2008/11/24 18:55:01
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/29/00 by Alexander Sakharuk  
   
 package Apache::style;   package Apache::style;
   
 use strict;  use strict;
 use HTML::TokeParser;  use HTML::TokeParser;
   
 sub styleparser {  sub styleparser {
   
   my ($target,$content_style_string) = @_;      my ($target,$content_style_string)=@_;
   my @target_list = ('target','web','tex','edit','modified','rat','answer','metadis');      my @keys = ();
   my @value_style = ();      my @values = ();
   my $current_key = '';      my $current_value;
   my $current_value = '';      my $allow=0;
   my $stoken;      my $pstyle = HTML::TokeParser->new(\$content_style_string);
   my $flag;                        $pstyle->xml_mode('1');
   my $iele;      while (my $stoken = $pstyle->get_token) {
   my $flag_target;   if (($stoken->[0] eq 'S') && ($stoken->[1] eq 'definetag')) {
       push @keys,$stoken->[2]->{'name'};
   my $pstyle = HTML::TokeParser->new(\$content_style_string);              $current_value='';
       $allow=0;
   while ($stoken = $pstyle->get_token) {   } elsif (($stoken->[0] eq 'E') && ($stoken->[1] eq 'definetag')) {
 # start for tag definition      $current_value =~ s/(\s)+/$1/g;
    if ($stoken->[0] eq 'S' and $stoken->[1] eq 'definetag') {      $current_value =~ s/\n//g;
 # new key in hash      push(@values,$current_value);
      $current_key = $stoken->[2]{name};   } elsif (($target eq 'meta') && ($stoken->[0] eq 'S') && ($stoken->[1] eq 'meta')) {
      $flag = 0;      $allow=1;
 # metadata output          } elsif (($target eq 'meta') && ($stoken->[0] eq 'E') && ($stoken->[1] eq 'meta')) {
      if ($target eq 'meta') {      $allow=0;
        while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag') {    } elsif (($target ne 'meta') && ($stoken->[0] eq 'S') && ($stoken->[1] eq 'render')) {
     if ($stoken->[0] eq 'S' and $stoken->[1] eq 'meta') {      $allow=1;
       while ($stoken = $pstyle->get_token and $stoken->[1] ne 'meta') {   } elsif (($target ne 'meta') && ($stoken->[0] eq 'E') && ($stoken->[1] eq 'render')) {
    $current_value .= $stoken->[1];      $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];
    }
     }      }
        }  
      } 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;                                                             
  }             
   }  
       }  
  }   }
       }
       }      my %style_for_target;
      }          for (my $i=0; $i<=$#keys; $i++) {
    }       if ($values[$i] !~ /^\s*$/) {
    $current_value =~ s/(\s)+/$1/g;      $style_for_target{$keys[$i]}=$values[$i]; 
    if ($current_value ne '' ) {     }
        push (@value_style,lc $current_key,$current_value);      }
    }      return %style_for_target; 
    $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) = @_;  sub testkey {
     my $current_value = '';  
     my $num;      my ($zeroth,$first,@keys) = @_; 
     my $flag;      my $number = -1;
       if ($zeroth eq 'S') {
  if ($zeroth eq 'T') {   for (my $i=$#keys; $i>=0; $i=$i-1) {
     $current_value .= $first;      if ($first eq lc($keys[$i]))  { 
  } elsif ($zeroth eq 'S') {   $number = $i;
     $flag = 0;       last;
     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;          } elsif ($zeroth eq 'E') {
     for (my $i=$#value_style-1;$i>=0;$i=$i-2) {   for (my $i=$#keys; $i>=0; $i=$i-1) {
  if ($first eq $value_style[$i]) {      if ('/'.$first eq lc($keys[$i]))  { 
     $flag = 1;   $number = $i;
     $num = $i + 1;   last;
     last;  
  }  
     }      }
     if ($flag == 0) {   }
  $current_value .= $second;      }
     } else {   return $number;
  $current_value .= $value_style[$num];  }
     }                   
  }   sub testvalue {
     return $current_value;  
       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;  1;
   
 __END__  __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
   

Removed from v.1.5  
changed lines
  Added in v.1.22


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