Annotation of loncom/xml/lonxml.pm, revision 1.3

1.2       sakharuk    1: # The LearningOnline Network with CAPA
1.3     ! sakharuk    2: # XML Parser Module 
1.2       sakharuk    3: #
1.3     ! sakharuk    4: # last modified 06/26/00 by Alexander Sakharuk
1.2       sakharuk    5: 
1.3     ! sakharuk    6: package Apache::lonxmlparser; 
1.1       sakharuk    7: 
                      8: use strict;
                      9: use HTML::TokeParser;
1.3     ! sakharuk   10: use Safe;
        !            11: use Apache::lonstyleparser;
        !            12: use Apache::lontexconvert;
        !            13: use Apache::londefaulttags;
        !            14: #==================================================   Main subroutine: xmlparse  
        !            15: 
        !            16: sub xmlparse {
        !            17: 
        !            18:  my ($target,$content_file_string,%style_for_target) = @_;
        !            19:  my $pars = HTML::TokeParser->new(\$content_file_string);
        !            20:  my $currentstring = '';
        !            21:  my $finaloutput = ''; 
        !            22:  my $newarg = '';
        !            23:  my $tempostring = '';
        !            24:  my $tempocont = '';
        !            25:  my $safeeval = new Safe;
        !            26: 
        !            27: #-------------------- Redefinition of the target in the case of compound target
        !            28: 
        !            29:  ($target, my @tenta) = split('&&',$target);
        !            30: 
        !            31: #------------------------- Stack definition (in stack we have all current tags)
        !            32: 
        !            33:  my @stack = (); 
        !            34:  my @parstack = ();
        !            35: 
        !            36: #------------------------------------- Parse input string (content_file_string)
        !            37:  
        !            38:  my $token;
        !            39: 
        !            40:  while ($token = $pars->get_token) {
        !            41:   if ($token->[0] eq 'T') {
        !            42:     $finaloutput .= $token->[1];
        !            43:     $tempocont .= $token->[1];
        !            44:   } elsif ($token->[0] eq 'S') {
        !            45: #------------------------------------------------------------- add tag to stack 	    
        !            46:   push (@stack,$token->[1]);
        !            47: #----------------------------------------- add parameters list to another stack
        !            48:   map {$tempostring .= "$_=$token->[2]->{$_},"} @{$token->[3]};
        !            49:   push (@parstack,$tempostring);
        !            50:   $tempostring = '';
        !            51: 
        !            52:    if (exists $style_for_target{$token->[1]}) { 
        !            53: 
        !            54: #---------------------------------------------------- use style file definition
        !            55: 
        !            56:     $newarg = $style_for_target{$token->[1]};
        !            57: 
        !            58:     if (index($newarg,'script') != -1 ) {
        !            59:       my $pat = HTML::TokeParser->new(\$newarg);
        !            60:       my $tokenpat;
        !            61:       my $partstring = '';
        !            62:       my $oustring = '';
        !            63:       my $outputstring;
        !            64: 
        !            65:        while  ($tokenpat = $pat->get_token) {
        !            66: 	if ($tokenpat->[0] eq 'T') {
        !            67: 	  $oustring .= $tokenpat->[1];
        !            68: 	} elsif ($tokenpat->[0] eq 'S') {
        !            69:            if ($tokenpat->[1] eq 'script') {
        !            70:              while  ($tokenpat = $pat->get_token and $tokenpat->[1] ne 'script') {
        !            71:                    if ($tokenpat->[0] eq 'S')  {
        !            72: 		     $partstring .=  $tokenpat->[4];
        !            73: 		   } elsif ($tokenpat->[0] eq 'T') {
        !            74:                      $partstring .=  $tokenpat->[1];
        !            75: 		   } elsif ($tokenpat->[0] eq 'E') {
        !            76:                      $partstring .=  $tokenpat->[2];
        !            77:                    }
        !            78: 	     }
        !            79: 			      
        !            80:              map {$partstring =~ s/\$$_/$token->[2]->{$_}/g; } @{$token->[3]};
        !            81:                                
        !            82:              &run($partstring,$safeeval);
        !            83: 
        !            84:              $partstring = '';
        !            85: 	   } elsif ($tokenpat->[1] eq 'evaluate') {			       
        !            86: 	      $outputstring = &evaluate($tokenpat->[2]{expression},$safeeval);
        !            87:               $oustring .=  $outputstring;
        !            88: 	   } else {
        !            89:               $oustring .= $tokenpat->[4]; 
        !            90: 	   }
        !            91: 	} elsif ($tokenpat->[0] eq 'E' and $tokenpat->[1] ne 'evaluate') {
        !            92:            $oustring .= $tokenpat->[1];    
        !            93: 	}
1.2       sakharuk   94:        }
1.3     ! sakharuk   95:        $newarg =  $oustring;
1.2       sakharuk   96:     } else {
1.3     ! sakharuk   97:        map {$newarg =~ s/\$$_/$token->[2]->{$_}/g; } @{$token->[3]};
        !            98:     }
        !            99:        $finaloutput .= $newarg;
        !           100:    } else {
        !           101: #------------------------------------------------ use default definition of tag
        !           102:       my $sub="start_$token->[1]";
        !           103:         {
        !           104: 	 no strict 'refs';
        !           105:          if (defined (&$sub)) {
        !           106:            $currentstring = &$sub($target,$token,\@parstack);
        !           107:            $finaloutput .= $currentstring;
        !           108:            $currentstring = '';
        !           109: 	 } else {
        !           110: 	   $finaloutput .= $token->[4];
        !           111: 	 }
        !           112:          use strict 'refs';    
        !           113: 	}
        !           114:    }              
        !           115:   } elsif ($token->[0] eq 'E')  {
        !           116: # Put here check for correct final tag (to avoid existence of starting tag only)
        !           117:         
        !           118:      pop @stack; 
        !           119:      unless (exists $style_for_target{$token->[1]}) {
        !           120:       my $sub="end_$token->[1]";
        !           121:        {
        !           122: 	no strict 'refs';
        !           123:           if (defined (&$sub)) {
        !           124: 		$currentstring = &$sub($target,$token,\@parstack);
        !           125:                 $finaloutput .= $currentstring;
        !           126:                 $currentstring = '';
        !           127: 	  } else {
        !           128:                 $finaloutput .= $token->[4];
        !           129: 	  }
        !           130: 	use strict 'refs';
1.2       sakharuk  131:        }
1.3     ! sakharuk  132:      }
        !           133: #-------------------------------------------------- end tag from the style file
        !           134:      if (exists $style_for_target{'/'."$token->[1]"}) {
        !           135:        $newarg = $style_for_target{'/'."$token->[1]"};
        !           136:        if (index($newarg,'script') != -1 ) {
        !           137:          my $pat = HTML::TokeParser->new(\$newarg);
        !           138:          my $tokenpat;
        !           139:          my $partstring = '';
        !           140:          my $oustring = '';
        !           141:          my $outputstring;
        !           142: 
        !           143:          while  ($tokenpat = $pat->get_token) {
        !           144: 	  if ($tokenpat->[0] eq 'T') {
        !           145: 	    $oustring .= $tokenpat->[1];
        !           146:       	  } elsif ($tokenpat->[0] eq 'S') {
        !           147:              if ($tokenpat->[1] eq 'script') {
        !           148:                while  ($tokenpat = $pat->get_token and $tokenpat->[1] ne 'script') {
        !           149:                      if ($tokenpat->[0] eq 'S')  {
        !           150: 		       $partstring .=  $tokenpat->[4];
        !           151: 		     } elsif ($tokenpat->[0] eq 'T') {
        !           152:                        $partstring .=  $tokenpat->[1];
        !           153: 		     } elsif ($tokenpat->[0] eq 'E') {
        !           154:                        $partstring .=  $tokenpat->[2];
        !           155:                      }
1.2       sakharuk  156: 	       }
1.3     ! sakharuk  157: 	
        !           158:                my @tempor_list = split(',',$parstack[$#parstack]);
        !           159:                my @te_kl = ();
        !           160:                my %tempor_hash = ();
        !           161:                map {(my $onete,my $twote) = split('=',$_); push (@te_kl,$onete); 
        !           162:                     $tempor_hash{$onete} = $twote} @tempor_list;
        !           163:                map {$partstring =~ s/\$$_/$tempor_hash{$_}/g; } @te_kl; 
        !           164:                                
        !           165:                &run($partstring,$safeeval);
        !           166: 
        !           167:                $partstring = '';
        !           168: 	     } elsif ($tokenpat->[1] eq 'evaluate') {		
        !           169: 	        $outputstring = &evaluate($tokenpat->[2]{expression},$safeeval);
        !           170:                 $oustring .=  $outputstring;
        !           171: 	     } else {
        !           172:                 $oustring .= $tokenpat->[4]; 
        !           173: 	     }
        !           174: 	  } elsif ($tokenpat->[0] eq 'E' and $tokenpat->[1] ne 'evaluate') {
        !           175:              $oustring .= $tokenpat->[1];    
        !           176: 	  }
        !           177:          }
        !           178:              $newarg =  $oustring;
        !           179:        } else {
        !           180:          my @very_temp = split(',',@parstack[$#parstack]);
        !           181:          map {my @ret= split('=',$_); $newarg =~ s/\$$ret[0]/$ret[1]/g; } @very_temp;
1.2       sakharuk  182:        }
                    183: 
1.3     ! sakharuk  184:        $finaloutput .= $newarg; 
1.2       sakharuk  185:      }
1.3     ! sakharuk  186:      pop @parstack;
        !           187:   }
        !           188:  }
        !           189:  return $finaloutput;
1.1       sakharuk  190: }
                    191: 
                    192: 1;
                    193: __END__

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