![]() ![]() | ![]() |
- should properly work with meta target now
# The LearningOnline Network with CAPA # <script> definiton package Apache::scripttag; use strict; use Apache::lonnet; sub BEGIN { &Apache::lonxml::register('Apache::scripttag',('script','scriptlib', 'parserlib','import', 'footnote','display')); } sub start_script { my ($target,$token,$parstack,$parser,$safeeval)=@_; my $args =''; if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; } my $type = &Apache::run::run("{$args;".'return $type}',$safeeval); my $result=''; #&Apache::lonxml::debug("found type of $type"); if ($type eq "loncapa/perl") { my $bodytext=&Apache::lonxml::get_all_text("/script",$$parser[$#$parser]); if ( $target eq "modified" ) { } elsif ( $target eq "web" || $target eq "grade" ) { &Apache::run::run($bodytext,$safeeval); } elsif ($target eq "edit" ) { &Apache::run::run($bodytext,$safeeval); $result="<br> <$token->[1]> output: <br>$bodytext<br>Source:<br>"; $result.=&editfield($token->[1],$bodytext); } } else { if ($target ne "meta") { $result = $token->[4]; } } return $result; } sub end_script { my ($target,$token,$parstack,$parser,$safeeval)=@_; if ( $target eq "meta" ) { return ''; } # return $token->[2]; return ''; } sub start_display { my ($target,$token,$parstack,$parser,$safeeval)=@_; my $args =''; if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; } my $bodytext=&Apache::lonxml::get_all_text("/display",$$parser[$#$parser]); if ( $target eq "modified" ) { } my $result=&Apache::run::run($bodytext,$safeeval); if ($target eq 'grade' ) { # grade should produce no output $result=''; } if ($target eq "edit" ) { $result = "<br> <$token->[1]> output: <br>$bodytext<br>Source:<br>"; $result.=&editfield($token->[1],$bodytext); } return $result; } sub end_display { } sub start_scriptlib { my ($target,$token,$parstack,$parser,$safeeval)=@_; my $bodytext=$$parser[$#$parser]->get_text("/scriptlib"); my $result =""; $bodytext=&Apache::run::evaluate($bodytext,$safeeval, $$parstack[$#$parstack]); my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'], $bodytext); my $script=&Apache::lonnet::getfile($location); if ($script == -1) { &Apache::lonxml::error("<b> Unable to find <i>$location</i> for scriptlib</b>"); return ""; } &Apache::run::run($script,$safeeval); #&Apache::lonxml::debug("ran $bodytext:<br>".&Apache::lonnet::getfile($bodytext)."<br>"); if ($target eq "edit" ) { $result.=&editfield($token->[1],$bodytext); } return $result; } sub end_scriptlib {} sub start_parserlib { my ($target,$token,$parstack,$parser,$safeeval,$style)=@_; my $bodytext=$$parser[$#$parser]->get_text("/parserlib"); my $result =""; $bodytext=&Apache::run::evaluate($bodytext,$safeeval, $$parstack[$#$parstack]); my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'], $bodytext); my $styletext=&Apache::lonnet::getfile($location); #&Apache::lonxml::debug("found :$bodytext: in :$location: with :$styletext:"); if ($styletext == -1) { &Apache::lonxml::error("<b> Unable to find <i>$location</i> for parserlib</b>"); return ""; } %$style = ( %$style , &Apache::style::styleparser($target,$styletext)); if ($target eq "edit" ) { $result=&editfield($token->[1],$bodytext); } return $result; } sub end_parserlib { } sub start_footnote { my ($target,$token,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; $Apache::lonxml::redirection = 0; return $result; } sub end_footnote { my ($target,$token,$parstack,$parser,$safeeval,$style)=@_; $Apache::lonxml::outputstack =~ s/\"/\"\;/g; my $result = "<a href=\"javascript:newWindow=open(\'\',\'new_W\',\'width=500,height=200\');newWindow.document.open(\'text/html\',\'replace\');newWindow.document.writeln(\'<html><head><title>newwindow</title></head><body bgcolor="#FFFFFF"> $Apache::lonxml::outputstack </body></html>\');newWindow.document.close();void(0);\"><sup>*</sup></a>"; $Apache::lonxml::outputstack = ""; $Apache::lonxml::redirection = 1; return $result; } sub start_import { my ($target,$token,$parstack,$parser,$safeeval,$style)=@_; my $bodytext=$$parser[$#$parser]->get_text("/import"); my $result =""; $bodytext=Apache::run::evaluate($bodytext,$safeeval,$$parstack[$#$parstack]); my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'],$bodytext); my $file=&Apache::lonnet::getfile($location); if ($file == -1) { &Apache::lonxml::error("<b> Unable to find <i>$bodytext $location</i> for import</b>"); return ""; } my $dir=$location; $dir=~s:/[^/]*$::; &Apache::lonxml::newparser($parser,\$file,$dir); if ($target eq "edit" ) { $result.=&editfield($token->[1],$bodytext); $result.="Click<a href=\"/res/$bodytext\">here</a> to edit<br></br>" } return ''; } sub end_import { } sub editfield { my ($tag,$data)=@_; my $count=0; my $maxlength=-1; map { $count++; if (length($_) > $maxlength) { $maxlength = length ($_); } } split ("\n", $data); return "<br></br>\n<$tag><br></br>\n <textarea rows=\"$count\" cols=\"$maxlength\" name=homework_edit_".$Apache::lonxml::curdepth.">$data</textarea><br></br>\n</$tag><br></br>\n"; } sub getfilenothere { my ($filename) = @_; my $a=""; $filename=~ s/^\s*(\S+)\s*$/$1/; ## strip off leading and trailing spaces $filename="/home/httpd/html/res".$filename; if (! -e $filename ) { &Apache::lonnet::subscribe($filename); &Apache::lonnet::repcopy($filename); } if (! -e $filename ) { return -1; }; my $fh=Apache::File->new($filename); while (<$fh>) { $a .=$_; } return $a } 1; __END__