Diff for /loncom/xml/style.pm between versions 1.10 and 1.20

version 1.10, 2001/03/26 17:32:30 version 1.20, 2003/11/09 01:14:30
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Style Parser Module (new version)  # 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  # written 01/08/01 by Alexander Sakharuk
 #  #
   
Line 11  use HTML::TokeParser; Line 46  use HTML::TokeParser;
   
 sub styleparser {  sub styleparser {
   
     my ($target,$content_style_string) = @_;      my ($target,$content_style_string)=@_;
     my $current_key = '';  
     my $current_value = '';  
     my @keys = ();      my @keys = ();
     my @values = ();      my @values = ();
     my @style_array = ();      my $current_value;
     my $stoken;      my $allow=0;
       my $pstyle = HTML::TokeParser->new(\$content_style_string);
     my $b_pos;      while (my $stoken = $pstyle->get_token) {
     my $e_pos;   if (($stoken->[0] eq 'S') && ($stoken->[1] eq 'definetag')) {
     my $entry;      push @keys,$stoken->[2]->{'name'};
               $current_value='';
     $b_pos = index($content_style_string,'<definetag',0);      $allow=0;
     while ($b_pos != -1) {   } elsif (($stoken->[0] eq 'E') && ($stoken->[1] eq 'definetag')) {
  $e_pos = index($content_style_string,'</definetag',$b_pos);      $current_value =~ s/(\s)+/$1/g;
  $entry = substr($content_style_string,$b_pos,$e_pos-$b_pos+12);             $current_value =~ s/\n//g;
  $_ = $entry;      push(@values,$current_value);
  m/<definetag\s+name\s*=\s*\"([^\"]*)\"/;   } elsif (($target eq 'meta') && ($stoken->[0] eq 'S') && ($stoken->[1] eq 'meta')) {
  $current_key = $1;      $allow=1;
  push @keys,$current_key;          } elsif (($target eq 'meta') && ($stoken->[0] eq 'E') && ($stoken->[1] eq 'meta')) {
 # &Apache::lonxml::debug("$current_key\n");      $allow=0;
  my $b_position =  index($entry,'<'.$target.'>',0);   } elsif (($target ne 'meta') && ($stoken->[0] eq 'S') && ($stoken->[1] eq 'render')) {
  my $e_position =  index($entry,'</'.$target.'>',$b_position);      $allow=1;
  my $target_length = length($target) + 2;   } elsif (($target ne 'meta') && ($stoken->[0] eq 'E') && ($stoken->[1] eq 'render')) {
  if ($b_position > -1) {      $allow=0;
     my $entry_target = substr($entry,$b_position+$target_length,$e_position-$b_position-$target_length);   } elsif (($target ne 'meta') && ($target ne 'web') && ($stoken->[0] eq 'S') && ($stoken->[1] eq 'web')) {
     my $pstyle = HTML::TokeParser->new(\$entry_target);      $allow=0;
     while ($stoken = $pstyle->get_token) {   } elsif (($target ne 'meta') && ($target ne 'web') && ($stoken->[0] eq 'E') && ($stoken->[1] eq 'web')) {
  if ($stoken->[0] eq 'T') {      $allow=1;
     $current_value .= $stoken->[1];   } elsif (($target ne 'meta') && ($target ne 'tex') && ($stoken->[0] eq 'S') && ($stoken->[1] eq 'tex')) {
  } elsif ($stoken->[0] eq 'S') {      $allow=0;
     my $number = &testkey($stoken->[0],$stoken->[1],@keys);   } elsif (($target ne 'meta') && ($target ne 'tex') && ($stoken->[0] eq 'E') && ($stoken->[1] eq 'tex')) {
     if ($number != -1) {      $allow=1;
  $current_value .= &testvalue($number,$stoken->[0],$stoken->[2],@values);   } 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*$)/)) {
     } else {      $allow=0;
  $current_value .= $stoken->[4];   } elsif (($stoken->[0] eq 'E') && ($stoken->[1] eq 'target')) {
     }       $allow=1;
         } else {    } elsif (($target ne 'meta') && ($stoken->[0] eq 'S') && ($stoken->[1] eq $target)) {
     my $number = &testkey($stoken->[0],$stoken->[1],@keys);      $allow=1;
     if ($number != -1) {   } elsif (($target ne 'meta') && ($stoken->[0] eq 'E') && ($stoken->[1] eq $target)) {
  $current_value .= &testvalue($number,$stoken->[0],$stoken->[2],@values);   } elsif (($stoken->[0] eq 'S') && ($stoken->[1] eq 'target') && ($stoken->[2]->{'name'}=~/(^\s*$target\s*,|,\s*$target\s*,|,\s*$target\s*$|^\s*$target\s*$)/)) {
     } else {      $allow=1;
  $current_value .= $stoken->[2];   } 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];
    }
       }
  }   }
         $current_value =~ s/\n//g;  
  push @values,$current_value;  
 # &Apache::lonxml::debug("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++) {      for (my $i=0; $i<=$#keys; $i++) {
  push @style_array,lc $keys[$i],$values[$i];    if ($values[$i] !~ /^\s*$/) {
     }      $style_for_target{$keys[$i]}=$values[$i]; 
     my %style_for_target =  @style_array;   }
   
 # check printing  
     foreach $current_key (sort keys %style_for_target) {  
  &Apache::lonxml::debug("$current_key => $style_for_target{$current_key}\n");  
     }      }
 # return result      return %style_for_target; 
   return %style_for_target;   
   
 }  }
   
   
 sub testkey {  sub testkey {
   
     my ($zeroth,$first,@keys) = @_;       my ($zeroth,$first,@keys) = @_; 
Line 110  sub testvalue { Line 149  sub testvalue {
     my ($number,$zeroth,$second,@values) = @_;         my ($number,$zeroth,$second,@values) = @_;   
     my $current_content = $values[$number];      my $current_content = $values[$number];
     if ($zeroth eq 'S') {      if ($zeroth eq 'S') {
     my %tempo_hash = %$second;   my %tempo_hash = %$second;
     while ((my $current_k,my $current_v) = each %tempo_hash) {   while ((my $current_k,my $current_v) = each %tempo_hash) {
         $current_content =~ s/\$$current_k/$current_v/g;      $current_content =~ s/\$$current_k/$current_v/g;
     }   }
     } elsif ($zeroth eq 'E') {      } elsif ($zeroth eq 'E') {
         $current_content = $values[$number];   $current_content = $values[$number];
     }      }
     return $current_content;      return $current_content;
 }  }

Removed from v.1.10  
changed lines
  Added in v.1.20


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