Annotation of loncom/homework/structuretags.pm, revision 1.227.2.1

1.34      albertel    1: # The LearningOnline Network with CAPA 
                      2: # definition of tags that give a structure to a document
1.74      albertel    3: #
1.227.2.1! albertel    4: # $Id: structuretags.pm,v 1.227 2003/11/26 19:35:28 albertel Exp $
1.74      albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
1.33      albertel   28: # 2/19 Guy
1.44      ng         29: # 6/26/2001 fixed extra web display at end of <web></web> tags
1.60      www        30: # 8/17,8/18,8/20 Gerd Kortemeyer
1.54      www        31: 
1.133     sakharuk   32: 
1.1       albertel   33: package Apache::structuretags; 
                     34: 
                     35: use strict;
                     36: use Apache::lonnet;
1.101     sakharuk   37: use Apache::File();
1.147     www        38: use Apache::lonmenu;
1.210     albertel   39: use Apache::lonlocal;
1.1       albertel   40: 
1.78      harris41   41: BEGIN {
1.193     www        42:     &Apache::lonxml::register('Apache::structuretags',('block','languageblock','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','startouttext','endouttext',
1.197     www        43: 'simpleeditbutton','definetag'));
1.10      albertel   44: }
                     45: 
                     46: sub start_web {
1.159     albertel   47:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.200     albertel   48:     my $bodytext=&Apache::lonxml::get_all_text("/web",$parser);
                     49:     if ($target eq 'web') {
                     50: 	return $bodytext;
1.159     albertel   51:     }
                     52:     return '';
1.10      albertel   53: }
                     54: 
                     55: sub end_web {
1.44      ng         56:     return '';
1.10      albertel   57: }
                     58: 
                     59: sub start_tex {
1.159     albertel   60:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.198     sakharuk   61:     my $result='';
1.200     albertel   62:     my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser);
                     63:     if ($target eq 'tex') {
                     64: 	return $bodytext.' ';
1.159     albertel   65:     }
1.198     sakharuk   66:     return $result;;
1.10      albertel   67: }
                     68: 
                     69: sub end_tex {
1.44      ng         70:     return '';
1.9       albertel   71: }
                     72: 
1.48      albertel   73: sub page_start {
1.159     albertel   74:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                     75:     my %found;
1.207     albertel   76:     foreach my $taginside (@$tagstack) {
1.159     albertel   77: 	foreach my $taglookedfor ('html','body','form') {
                     78: 	    if ($taginside =~ /^$taglookedfor$/i) {$found{$taglookedfor} = 1;}
                     79: 	}
                     80:     }
                     81: 
                     82:     my $result;
                     83:     my $head_tag_start;
                     84:     if (!defined($found{'html'})) {
                     85: 	$result=&Apache::londefdef::start_html($target,$token,$tagstack,
                     86: 					       $parstack,$parser,$safeeval);
1.218     albertel   87: 	$head_tag_start='<head>'.&Apache::lonmenu::registerurl(undef,$target);
1.159     albertel   88:     }
                     89:     my $body_tag_start;
                     90:     if (!defined($found{'body'})) {
                     91: 	$body_tag_start='<body onLoad="'.&Apache::lonmenu::loadevents().'" '.
                     92: 	    'onUnload="'.&Apache::lonmenu::unloadevents().'" ';
                     93: 	my $background=&Apache::lonxml::get_param('background',$parstack,
                     94: 						  $safeeval);
1.199     www        95: 	if ($ENV{'browser.imagesuppress'} eq 'on') { $background=''; }
1.159     albertel   96: 	if ($background) {
                     97: 	    $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
                     98: 		$background;
                     99: 	    $body_tag_start.='background="'.$background.'" ';
                    100: 	} else {
                    101: 	    my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack,
                    102: 						   $safeeval);
1.199     www       103: 	    if (($bgcolor) && ($ENV{'browser.blackwhite'} ne 'on')) {
1.159     albertel  104: 		$body_tag_start.='bgcolor="'.$bgcolor.'" ';
                    105: 	    } else {
                    106: 		$body_tag_start.='bgcolor="#ffffff"';
                    107: 	    }
1.199     www       108: 	}
                    109: 	if ($ENV{'browser.fontenhance'} eq 'on') {
                    110: 	    $body_tag_start.=' style="font-size: x-large;" ';
1.159     albertel  111: 	}
                    112: 	$body_tag_start.='>'.&Apache::lonmenu::menubuttons(undef,$target,1);
                    113: 	if ($target eq 'web' && $ENV{'request.state'} ne 'construct') {
1.165     albertel  114: 	    my ($symb,undef,undef,undef,$publicuser)=
                    115: 		&Apache::lonxml::whichuser();
                    116: 	    if ($symb eq '' && !$publicuser) {
1.159     albertel  117: 		my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference");
1.211     albertel  118: 		$help=&mt("Browsing resource, all submissions are temporary.")."<br />";
1.159     albertel  119: 		$body_tag_start.=$help;
                    120: 	    }
                    121: 	}
                    122:     }
                    123:     my $form_tag_start;
                    124:     if (!defined($found{'form'})) {
                    125: 	$form_tag_start='<form name="lonhomework" method="POST" action="'.
                    126: 	    $ENV{'request.uri'}.'">';
                    127:     }
                    128:     return ($result,$head_tag_start,$body_tag_start,$form_tag_start);
1.105     albertel  129: }
                    130: 
1.141     matthew   131: #use Time::HiRes();
1.105     albertel  132: sub get_resource_name {
1.159     albertel  133:     my ($parstack,$safeeval)=@_;
1.204     albertel  134:     if (defined($Apache::lonhomework::name)) {
                    135: 	return $Apache::lonhomework::name;
                    136:     }
1.159     albertel  137:     my $name=&Apache::lonnet::gettitle();
                    138:     if ($name eq '') {
                    139: 	$name=&Apache::lonnet::EXT('resource.title');
                    140: 	if ($name eq 'con_lost') { $name = ''; }
                    141:     }
1.204     albertel  142:     if ($name!~/\S+/) {
                    143: 	$name=$ENV{'request.uri'};
1.205     albertel  144: 	$name=~s-.*/([^/]+)$-$1-;
1.204     albertel  145:     }
1.159     albertel  146:     $Apache::lonhomework::name=$name;
                    147:     return $name;
1.105     albertel  148: }
                    149: 
                    150: sub setup_rndseed {
1.159     albertel  151:     my ($safeeval)=@_;
                    152:     my $rndseed;
1.162     albertel  153:     my ($symb)=&Apache::lonxml::whichuser();
                    154:     if ($ENV{'request.state'} eq "construct" || $symb eq '') {
1.159     albertel  155: 	$rndseed=$ENV{'form.rndseed'};
                    156: 	if (!$rndseed) {
1.162     albertel  157: 	    $rndseed=$Apache::lonhomework::history{'rndseed'};
                    158: 	    if (!$rndseed) {
                    159: 		$rndseed=time;
                    160: 		$ENV{'form.rndseed'}=$rndseed;
                    161: 	    }
                    162: 	}
1.210     albertel  163: 	if ($ENV{'form.resetdata'} eq &mt('New Problem Variation') ||
                    164: 	    $ENV{'form.newrandomization'} eq &mt('New Randomization')) {
1.190     albertel  165: 	    srand(time);
                    166: 	    $rndseed=int(rand(2100000000));
1.159     albertel  167: 	    $ENV{'form.rndseed'}=$rndseed;
1.180     albertel  168: 	    delete($ENV{'form.resetdata'});
                    169: 	    delete($ENV{'form.newrandomization'});
1.159     albertel  170: 	}
1.187     albertel  171: 	if (defined($rndseed) && $rndseed ne int($rndseed)) {
                    172: 	   $rndseed=join(',',&Math::Random::random_seed_from_phrase($rndseed));
                    173:         }
1.221     albertel  174: 	if ($safeeval) {
                    175: 	    &Apache::lonxml::debug("Setting rndseed to $rndseed");
                    176: 	    &Apache::run::run('$external::randomseed='.$rndseed.';',$safeeval);
                    177: 	}
1.159     albertel  178:     }
                    179:     return $rndseed;
1.105     albertel  180: }
                    181: 
                    182: sub problem_edit_header {
1.159     albertel  183:     return '<input type="hidden" name="submitted" value="edit" />
1.210     albertel  184:        <input type="hidden" name="problemmode" value="'.&mt('Edit').'" />
                    185:        <input type="submit" name="problemmode" value="'.&mt('Discard Edits and View').'" />
                    186:        <input type="submit" name="problemmode" value="'.&mt('EditXML').'" />
                    187:        <input type="submit" name="Undo" value="'.&mt('undo').'" /> <hr />
                    188:        <input type="submit" name="submit" value="'.&mt('Submit Changes and Edit').'" />
                    189:        <input type="submit" name="submit" value="'.&mt('Submit Changes and View').'" /><br /><p>&nbsp;</p><table border="0"><tr><td bgcolor="#DDDDDD">
1.105     albertel  190:       ';
                    191: }
                    192: 
                    193: sub problem_edit_footer {
1.210     albertel  194:     return '</td></tr></table><br /><input type="submit" name="submit" value="'.&mt('Submit Changes and Edit').'" />
                    195:     <input type="submit" name="submit" value="'.&mt('Submit Changes and View').'" />';
1.105     albertel  196: }
                    197: 
                    198: sub problem_web_to_edit_header {
1.159     albertel  199:     my ($rndseed)=@_;
1.210     albertel  200:     my $result.='<input type="hidden" name="problemmode" value="'.&mt('View').'" />
                    201:              <input type="submit" name="problemmode" value="'.&mt('Edit').'" />
                    202:              <input type="submit" name="problemmode" value="'.&mt('EditXML').'" />
                    203:              <input type="submit" name="newrandomization" value="'.&mt('New Randomization').'" />
                    204:              <input type="submit" name="resetdata" value="'.&mt('Reset Submissions').'" />
                    205:              <nobr><input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" />
1.175     albertel  206:               <input type="text" name="rndseed" width="10" value="'.
                    207: 	       $rndseed.'"
                    208:            onChange="javascript:document.lonhomework.changerandseed.click()" /></nobr>
1.105     albertel  209:              <input type="checkbox" name="showallfoils" ';
1.159     albertel  210:     if (defined($ENV{'form.showallfoils'})) { $result.='checked="on"'; }
1.210     albertel  211:     $result.= ' />'.&mt('&nbsp;Show&nbsp;All&nbsp;Foils').'
1.105     albertel  212:              <hr />';
1.159     albertel  213:     my $numtoanalyze=$ENV{'form.numtoanalyze'};
1.176     albertel  214:     if (!$numtoanalyze) { $numtoanalyze=20; }
1.210     albertel  215:     $result.= '<input type="submit" name="problemmode" value='.
                    216: 	&mt('"Calculate answers').'" /> for
1.136     albertel  217:              <input type="text" name="numtoanalyze" value="'.
1.210     albertel  218: 	     $numtoanalyze.'" size="5" /> '.&mt('versions of this problem').
                    219: 	     '.'.&Apache::loncommon::help_open_topic("Analyze_Problem",
1.176     albertel  220: 						     '',undef,undef,300).
1.210     albertel  221: 						     '<hr />';
1.159     albertel  222:     return $result;
1.48      albertel  223: }
                    224: 
1.65      albertel  225: sub initialize_storage {
1.159     albertel  226:     %Apache::lonhomework::results=();
1.162     albertel  227:     %Apache::lonhomework::history=();
1.159     albertel  228:     my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
1.162     albertel  229:     if ($ENV{'request.state'} eq 'construct' || $symb eq '') {
1.159     albertel  230: 	%Apache::lonhomework::history=
                    231: 	    &Apache::lonnet::tmprestore($ENV{'request.uri'},'',$domain,$name);
                    232: 	my ($temp)=keys %Apache::lonhomework::history ;
                    233: 	&Apache::lonxml::debug("Return message of $temp");
                    234:     } else {
                    235: 	%Apache::lonhomework::history=
                    236: 	    &Apache::lonnet::restore($symb,$courseid,$domain,$name);
                    237:     }
                    238:     #ignore error conditions
1.67      albertel  239:     my ($temp)=keys %Apache::lonhomework::history ;
1.159     albertel  240:     if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }
1.65      albertel  241: }
                    242: 
                    243: # -------------------------------------------------------------finalize_storage
                    244: # Stores away the result has to a student's environment
                    245: # checks form.grade_ for specific values, other wises stores
                    246: # to the running users environment
                    247: sub finalize_storage {
1.159     albertel  248:     my $result;
                    249:     my ($temp) = keys %Apache::lonhomework::results;
                    250:     if ( $temp ne '' ) {
                    251: 	my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
1.162     albertel  252: 	if ($ENV{'request.state'} eq 'construct' || $symb eq '') {
                    253: 	    $Apache::lonhomework::results{'rndseed'}=$ENV{'form.rndseed'};
1.159     albertel  254: 	    $result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results,
                    255: 					$ENV{'request.uri'},'',$domain,$name);
                    256: 	    &Apache::lonxml::debug('Construct Store return message:'.$result);
                    257: 	} else {
                    258: 	    $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
                    259: 					    $symb,$courseid,$domain,$name);
                    260: 	    &Apache::lonxml::debug('Store return message:'.$result);
                    261: 	}
1.67      albertel  262:     }
1.159     albertel  263:     return $result;
1.65      albertel  264: }
                    265: 
                    266: sub checkout_msg {
1.211     albertel  267:     my %lt=&Apache::lonlocal::texthash( 
                    268: 		'resource'=>'The resource needs to be checked out',
                    269: 		'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.',
                    270:                 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',
                    271:                 'checkout'=>'Check out Exam for Viewing',
                    272: 		'checkout?'=>'Check out Exam?');
1.159     albertel  273:     return (<<ENDCHECKOUT);
1.211     albertel  274: <h2>$lt{'resource'}</h2>
                    275:     <p>$lt{'id_expln'}</p>
                    276: <font color="red">
                    277: <p>$lt{'warning'}</p>
1.91      albertel  278: </font>
                    279: <form name="checkout" method="POST" action="$ENV{'request.uri'}">
                    280: <input type="hidden" name="doescheckout" value="yes" />
1.211     albertel  281: <input type="button" name="checkoutbutton" value="$lt{'checkout'}" onClick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" />
1.65      albertel  282: </form>
                    283: ENDCHECKOUT
                    284: }
                    285: 
1.204     albertel  286: sub init_problem_globals {
                    287:     my ($type)=@_;
                    288:     #initialize globals
                    289:     if ($type eq 'problem') {
                    290: 	$Apache::inputtags::part='0';
                    291: 	@Apache::inputtags::partlist=('0');
                    292: 	$Apache::lonhomework::problemstatus=
                    293: 	    &Apache::lonnet::EXT('resource.0.problemstatus');
                    294:     } else {
                    295: 	$Apache::inputtags::part='';
                    296: 	@Apache::inputtags::partlist=();
                    297: 	$Apache::lonhomework::problemstatus='';	
                    298:     }
                    299:     @Apache::inputtags::responselist = ();
                    300:     @Apache::inputtags::importlist = ();
                    301:     @Apache::inputtags::previous=();
                    302:     @Apache::inputtags::previous_version=();
                    303:     $Apache::structuretags::printanswer='No';
                    304:     @Apache::structuretags::whileconds=();
                    305:     @Apache::structuretags::whilebody=();
                    306:     @Apache::structuretags::whileline=();
                    307:     $Apache::lonhomework::scantronmode=0;
                    308:     undef($Apache::lonhomework::name);
                    309: 
                    310: }
                    311: 
                    312: sub reset_problem_globals {
                    313:     my ($type)=@_;
                    314:     undef(%Apache::lonhomework::history);
                    315:     undef(%Apache::lonhomework::results);
                    316:     undef($Apache::inputtags::part);
1.208     albertel  317: #don't undef this, lonhomework.pm takes care of this, we use this to 
                    318: #detect if we try to do 2 problems in one file
                    319: #   undef($Apache::lonhomework::parsing_a_problem);
1.204     albertel  320:     undef($Apache::lonhomework::name);
                    321: }
                    322: 
1.9       albertel  323: sub start_problem {
1.159     albertel  324:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.19      albertel  325: 
1.184     albertel  326:     if ( $Apache::inputtags::part ne '' ||
                    327: 	 $Apache::lonhomework::parsing_a_problem) {
                    328: 	&Apache::lonxml::error('Only one &lt;problem&gt; allowed in a .problem file');
                    329: 	#my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser);
1.159     albertel  330: 	return '';
                    331:     }
1.184     albertel  332: 
                    333:     $Apache::lonhomework::parsing_a_problem=1;
1.204     albertel  334:     &init_problem_globals('problem');
1.166     albertel  335: 
                    336:     if (defined($ENV{'scantron.maxquest'})) {
                    337: 	$Apache::lonhomework::scantronmode=1;
                    338:     }
1.161     albertel  339: 
1.159     albertel  340:     if ($target ne 'analyze') {
                    341: 	&initialize_storage();
                    342: 	if ($target eq 'web') {
                    343: 	    &Apache::lonhomework::showhash(%Apache::lonhomework::history);
                    344: 	}
                    345: 	$Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type');
                    346: 	&Apache::lonxml::debug("Found this to be of type :$Apache::lonhomework::type:");
                    347:     }
1.164     albertel  348:     if ($Apache::lonhomework::type eq '' ) {
1.159     albertel  349: 	my $uri=$ENV{'request.uri'};
                    350: 	if ($uri=~/\.(\w+)$/) {
                    351: 	    $Apache::lonhomework::type=$1;
                    352: 	    &Apache::lonxml::debug("Using type of $1");
                    353: 	} else {
                    354: 	    $Apache::lonhomework::type='problem';
                    355: 	    &Apache::lonxml::debug("Using default type, problem, :$uri:");
                    356: 	}
1.87      albertel  357:     }
1.58      www       358: 
1.159     albertel  359:     #added vars to the scripting enviroment
1.213     albertel  360:     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.24      albertel  361:     &Apache::run::run($expression,$safeeval);
1.159     albertel  362:     my $status;
                    363:     my $accessmsg;
                    364: 
                    365:     #should get back a <html> or the neccesary stuff to start XML/MathML
                    366:     my ($result,$head_tag_start,$body_tag_start,$form_tag_start)=
                    367: 	&page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
                    368:     if ($target eq 'tex' and $ENV{'request.symb'} =~ m/\.page_/) {$result='';}
                    369: 
                    370:     if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }
                    371:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                    372: 	$target eq 'tex') {
                    373: 	#handle exam checkout
                    374: 	if ($Apache::lonhomework::type eq 'exam') {
                    375: 	    my $token=
                    376: 		$Apache::lonhomework::history{"resource.0.outtoken"};
                    377: 	    if (($ENV{'form.doescheckout'}) && (!$token)) {
                    378: 		$token=&Apache::lonxml::maketoken();
                    379: 		$Apache::lonhomework::history{"resource.0.outtoken"}=
                    380: 		    $token;
                    381: 	    }
                    382: 	    $body_tag_start.=&Apache::lonxml::printtokenheader($target,$token);
1.142     albertel  383: 	}
1.159     albertel  384: 
                    385: 	#handle rand seed in construction space
                    386: 	my $rndseed=&setup_rndseed($safeeval);
1.162     albertel  387: 	my ($symb)=&Apache::lonxml::whichuser();
1.163     albertel  388: 	if ($ENV{'request.state'} ne "construct" && $symb eq '') {
1.162     albertel  389: 	    $form_tag_start.='<input type="hidden" name="rndseed" value="'.
                    390: 		$rndseed.'" />'.
                    391: 		    '<input type="submit" name="resetdata"
1.211     albertel  392:                              value="'.&mt('New Problem Variation').'" />'.
1.164     albertel  393: 		    '<input type="hidden" name="username"
1.185     albertel  394:                              value="'.$ENV{'form.username'}.'" /> <br />';
1.162     albertel  395: 	}
1.159     albertel  396: 	($status,$accessmsg) = &Apache::lonhomework::check_access('0');
                    397: 	push (@Apache::inputtags::status,$status);
                    398: 	my $expression='$external::datestatus="'.$status.'";';
                    399: 	$expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
                    400: 	&Apache::run::run($expression,$safeeval);
                    401: 	&Apache::lonxml::debug("Got $status");
                    402: 	if (( $status eq 'CLOSED' ) ||
                    403: 	    ( $status eq 'UNCHECKEDOUT') ||
                    404: 	    ( $status eq 'BANNED') ||
1.216     albertel  405: 	    ( $status eq 'UNAVAILABLE') ||
                    406: 	    ( $status eq 'INVALID_ACCESS')) {
1.159     albertel  407: 	    my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser);
                    408: 	    if ( $target eq "web" ) {
                    409: 		$result.= $head_tag_start.'</head>';
                    410: 		my $msg=$body_tag_start;
                    411: 		if ($status eq 'UNAVAILABLE') {
1.211     albertel  412: 		    $result.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';
1.159     albertel  413: 		} else {
1.211     albertel  414: 		    $result.='<h1>'.&mt('Not open to be viewed').'</h1>';
1.159     albertel  415: 		}
1.216     albertel  416: 		if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
1.159     albertel  417: 		    $msg.='The problem '.$accessmsg;
                    418: 		} elsif ($status eq 'UNCHECKEDOUT') {
                    419: 		    $msg.=&checkout_msg;
                    420: 		}
                    421: 		$result.=$msg.'<br />';
                    422: 	    } elsif ($target eq 'tex') {
                    423: 		$result.='\begin{document}\noindent \vskip 1 mm  \begin{minipage}{\textwidth}\vskip 0 mm';
                    424: 		if ($status eq 'UNAVAILABLE') {
1.211     albertel  425: 		    $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
1.159     albertel  426: 		} else {
1.211     albertel  427: 		    $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";
1.159     albertel  428: 		}
                    429: 	    }
                    430: 	} elsif ($target eq 'web') {
                    431: 	    my $name= &get_resource_name($parstack,$safeeval);
1.227     albertel  432: 	    $result.="$head_tag_start<title>$name</title></head>
1.158     sakharuk  433:               $body_tag_start \n $form_tag_start".	
1.227     albertel  434: 	      '<input type="hidden" name="submitted" value="yes" />';
                    435: 	    # create a page header and exit
                    436: 	    if ($ENV{'request.state'} eq "construct") {
                    437: 		$result.= &problem_web_to_edit_header($ENV{'form.rndseed'});
                    438: 	    }
                    439: 	    # if we are viewing someone else preserve that info
                    440: 	    if (defined $ENV{'form.grade_symb'}) {
                    441: 		foreach my $field ('symb','courseid','domain','username') {
                    442: 		    $result .= '<input type="hidden" name="grade_'.$field.
                    443: 			'" value="'.$ENV{"form.grade_$field"}.'" />'."\n";
1.159     albertel  444: 		}
                    445: 	    }
                    446: 	} elsif ($target eq 'tex') {
1.192     sakharuk  447: 	    my $startminipage = '';
1.191     sakharuk  448: 	    if (not $ENV{'form.problem_split'}=~/yes/) {
1.192     sakharuk  449: 		$startminipage = '\begin{minipage}{\textwidth}';
1.178     sakharuk  450: 	    }
1.159     albertel  451: 	    my $id = $Apache::inputtags::part;
                    452: 	    my $weight = &Apache::lonnet::EXT("resource.$id.weight");
1.223     sakharuk  453: 	    my $packages=&Apache::lonnet::metadata($ENV{'request.uri'},'packages');
                    454: 	    my @packages = split /,/,$packages;
                    455: 	    my $allow_print_points = 0;
                    456: 	    foreach my $partial_key (@packages) {
1.227.2.1! albertel  457: 		if ($partial_key=~m/^part_0$/) {
1.223     sakharuk  458: 		    $allow_print_points=1;
1.159     albertel  459: 		}
                    460: 	    }
                    461: 	    my $duedate = &Apache::lonnet::EXT("resource.$id.duedate"); 
                    462: 	    $duedate = POSIX::strftime("%c",localtime($duedate));
                    463: 	    my $temp_file;
                    464: 	    my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.due";
                    465: 	    if (-e $filename) {
                    466: 		$temp_file = Apache::File->new($filename);
                    467: 	    } else {
                    468: 		$temp_file = Apache::File->new('>>'.$filename);
                    469: 	    }
                    470: 	    my @due_file_content = <$temp_file>;
                    471: 	    my $due_file_content = $due_file_content[$#due_file_content];
                    472: 	    chomp $due_file_content;
                    473: 	    my $name_of_resourse= &get_resource_name($parstack,$safeeval);
                    474: 	    if ($due_file_content ne $duedate) {
                    475: 		$temp_file = Apache::File->new('>'.$filename);
                    476: 		print $temp_file "$duedate\n";
                    477: 		if (not $ENV{'request.symb'} =~ m/\.page_/) {
                    478: 		    if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {
1.206     sakharuk  479: 			$result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent\textit{Due date: '.$duedate.'} \vskip 1 mm\noindent '.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';	
1.159     albertel  480: 		    } else {
1.206     sakharuk  481: 			$result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm \noindent'.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
1.159     albertel  482: 			if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
                    483: 		    }
1.104     sakharuk  484: 		} else {
1.159     albertel  485: 		    $result .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\';
1.104     sakharuk  486: 		}
1.101     sakharuk  487: 	    } else {
1.159     albertel  488: 		if (not $ENV{'request.symb'} =~ m/\.page_/) {
1.206     sakharuk  489: 		    $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm\noindent'.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';	
1.159     albertel  490: 		    if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
                    491: 		} else {
                    492: 		    $result .= '\vskip 1mm \\\\\\\\';
                    493: 		}
                    494: 	    }
1.99      sakharuk  495: 	}
1.159     albertel  496:     } elsif ($target eq 'edit') {
                    497: 	$result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.
                    498: 	    &problem_edit_header();
1.226     albertel  499: 	$Apache::lonxml::warnings_error_header=
                    500: 	    &mt("Editor Errors - these errors might not effect the running of the problem, but they will likely cause problems with further use of the Edit mode. Please use the EditXML mode to fix these errors.")."<br />";
1.159     albertel  501: 	my $temp=&Apache::edit::insertlist($target,$token);
                    502: 	$result.=$temp;
                    503:     } elsif ($target eq 'modified') {
                    504: 	$result=$token->[4];
                    505: 	$result.=&Apache::edit::handle_insert();
                    506:     } else {
                    507: 	# page_start returned a starting result, delete it if we don't need it
                    508: 	$result = '';
1.99      sakharuk  509:     }
1.159     albertel  510:     return $result;
1.9       albertel  511: }
                    512: 
                    513: sub end_problem {
1.159     albertel  514:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    515:     my $result='';
                    516:     my $status=$Apache::inputtags::status['-1'];
                    517:     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
                    518: 	$target eq 'tex') {
                    519: 	if ( $target eq 'grade' && $Apache::inputtags::part eq '0' &&
                    520: 	     $status eq 'CAN_ANSWER' ) {
                    521: 	    # if part is zero, no <part>s existed, so we need to the grading
                    522: 	    &Apache::inputtags::grade;
                    523: 	} elsif ( ($target eq 'web' || $target eq 'tex') &&
                    524: 		  $Apache::inputtags::part eq '0' &&
                    525: 		  $status ne 'UNCHECKEDOUT') {
                    526: 	    # if part is zero, no <part>s existed, so we need show the current
                    527: 	    # grading status
                    528: 	    my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
                    529: 	    $result.= $gradestatus;
                    530: 	}
                    531: 	if (
                    532: 	    (($target eq 'web') && ($ENV{'request.state'} ne 'construct')) ||
                    533: 	    ($target eq 'answer') || ($target eq 'tex')
                    534: 	   ) {
1.227     albertel  535: 	    if ($target ne 'tex' &&
                    536: 		$ENV{'form.answer_output_mode'} ne 'tex') {
                    537: 		$result.="</form></body>\n";
1.159     albertel  538: 	    }
                    539: 	    if ($target eq 'web') {
                    540: 		$result.=&Apache::lonxml::xmlend();
                    541: 	    } elsif ($target eq 'tex') {
1.178     sakharuk  542: 		my $endminipage = '';
1.191     sakharuk  543: 		if (not $ENV{'form.problem_split'}=~/yes/) {
1.178     sakharuk  544: 		    $endminipage = '\end{minipage}';
                    545: 		}
1.174     sakharuk  546: 		$result .= '\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}';
1.159     albertel  547: 		if (not $ENV{'request.symb'} =~ m/\.page_/) {
1.178     sakharuk  548: 		    $result .= $endminipage.'\end{document} ';
1.159     albertel  549: 		} else {
                    550: 		    $result .= '';
                    551: 		}
                    552: 	    }
                    553: 	}
                    554: 	if ($target eq 'grade') {
                    555: 	    &Apache::lonhomework::showhash(%Apache::lonhomework::results);
                    556: 	    &finalize_storage();
                    557: 	}
1.172     albertel  558: 	if ($target eq 'answer' && ($ENV{'request.state'} eq 'construct')
1.173     albertel  559: 	    && $ENV{'form.answer_output_mode'} ne 'tex') {
1.172     albertel  560: 	    $result.='</html>'; # normally we get it from xmlend, but in CSTR
                    561: 	                        # we always show answer mode too.
1.159     albertel  562: 	}
                    563:     } elsif ($target eq 'meta') {
                    564: 	if ($Apache::inputtags::part eq '0') {
1.179     albertel  565: 	    @Apache::inputtags::response=();
1.159     albertel  566: 	    $result=&Apache::response::mandatory_part_meta;
                    567: 	}
1.215     albertel  568: 	$result.=&Apache::response::meta_part_order();
1.159     albertel  569:     } elsif ($target eq 'edit') {
                    570: 	&Apache::lonxml::debug("in end_problem with $target, edit");
                    571: 	$result = &problem_edit_footer();
                    572:     }
1.155     albertel  573: 
1.177     albertel  574:     if ($ENV{'request.state'} eq 'construct' && $target eq 'web') {
                    575: 	&Apache::inputtags::check_for_duplicate_ids();
                    576:     }
1.204     albertel  577: 
                    578:     &reset_problem_globals('problem');
1.159     albertel  579: 
                    580:     return $result;
1.48      albertel  581: }
                    582: 
1.108     albertel  583: 
1.48      albertel  584: sub start_library {
1.159     albertel  585:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    586:     my ($result,$head_tag_start,$body_tag_start,$form_tag_start);
1.204     albertel  587:     if ($$tagstack[0] eq 'library') { &init_problem_globals('library') };
1.159     albertel  588:     if ($target eq 'edit') {
                    589: 	($result,$head_tag_start,$body_tag_start,$form_tag_start)=
                    590: 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
                    591: 	$result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.
                    592: 	    &problem_edit_header();
                    593: 	my $temp=&Apache::edit::insertlist($target,$token);
                    594: 	$result.=$temp;
                    595:     } elsif ($target eq 'modified') {
                    596: 	$result=$token->[4];
                    597: 	$result.=&Apache::edit::handle_insert();
                    598:     } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&
                    599: 	     $ENV{'request.state'} eq "construct" ) {
                    600: 	($result,$head_tag_start,$body_tag_start,$form_tag_start)=
                    601: 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
                    602: 	my $name=&get_resource_name($parstack,$safeeval);
                    603: 	my $rndseed=&setup_rndseed($safeeval);
                    604: 	$result.="$head_tag_start<title>$name</title></head>
1.105     albertel  605:               $body_tag_start \n $form_tag_start".	
1.159     albertel  606: 		  '<input type="hidden" name="submitted" value="yes" />';
                    607: 	$result.=&problem_web_to_edit_header($rndseed);
                    608:     }
                    609:     return $result;
1.48      albertel  610: }
                    611: 
                    612: sub end_library {
1.159     albertel  613:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    614:     my $result='';
                    615:     if ($target eq 'edit') {
                    616: 	$result=&problem_edit_footer();
                    617:     } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&
                    618: 	     $ENV{'request.state'} eq "construct") {
                    619: 	$result.='</form></body>'.&Apache::lonxml::xmlend();
                    620:     }
1.204     albertel  621:     if ($$tagstack[0] eq 'library') { &reset_problem_globals('library') };
1.159     albertel  622:     return $result;
1.197     www       623: }
                    624: 
                    625: sub start_definetag {
                    626:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    627: 
                    628:     my $result;
                    629: 
                    630:     my $name = $token->[2]->{'name'};
                    631:     my $skip=&Apache::lonxml::get_all_text("/definetag",$parser);
                    632:     if ($name=~/^\//) {
                    633: 	$result=
                    634:  '<br /><table bgcolor="#FFBBBB"><tr><th>END <tt>'.$name.'</tt></th></tr>';
                    635:     } else {
                    636: 	$result=
                    637:  '<br /><table bgcolor="#BBFFBB"><tr><th>BEGIN <tt>'.$name.'</tt></th></tr>';
                    638:     }
                    639:     $skip=~s/\</\&lt\;/gs;
                    640:     $skip=~s/\>/\&gt\;/gs;
                    641:     $result.='<tr><td><pre>'.$skip.'</pre></td></tr></table>';
                    642:     return $result;
                    643: }
                    644: 
                    645: sub end_definetag {
                    646:     return '';
1.1       albertel  647: }
                    648: 
                    649: sub start_block {
1.201     albertel  650:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.131     albertel  651: 
                    652:     my $result;
1.1       albertel  653: 
1.160     albertel  654:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1.131     albertel  655: 	$target eq 'tex' || $target eq 'analyze') {
1.159     albertel  656: 	my $code = $token->[2]->{'condition'};
1.201     albertel  657: 	if (defined($code)) {
1.137     albertel  658: 	    if (!$Apache::lonxml::default_homework_loaded) {
                    659: 		&Apache::lonxml::default_homework_load($safeeval);
                    660: 	    }
1.131     albertel  661: 	    $result = &Apache::run::run($code,$safeeval);
                    662: 	    &Apache::lonxml::debug("block :$code: returned :$result:");
                    663: 	} else {
                    664: 	    $result='1';
                    665: 	}
                    666: 	if ( ! $result ) {
1.201     albertel  667: 	    my $skip=&Apache::lonxml::get_all_text("/block",$parser,$style);
1.131     albertel  668: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                    669: 	}
                    670: 	$result='';
                    671:     } elsif ($target eq 'edit') {
                    672: 	$result .=&Apache::edit::tag_start($target,$token);
                    673: 	$result .=&Apache::edit::text_arg('Test Condition:','condition',
                    674: 					  $token,40);
                    675: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                    676:     } elsif ($target eq 'modified') {
                    677: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    678: 						     $safeeval,'condition');
                    679: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.38      albertel  680:     }
1.131     albertel  681:     return $result;
1.1       albertel  682: }
                    683: 
                    684: sub end_block {
1.167     www       685:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    686:     my $result;
                    687:     if ($target eq "edit") {
                    688: 	$result.= &Apache::edit::tag_end($target,$token,'');
                    689:     }
                    690:     return $result;
                    691: }
                    692: 
                    693: sub start_languageblock {
1.201     albertel  694:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.167     www       695: 
                    696:     my $result;
                    697: 
                    698:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                    699: 	$target eq 'tex' || $target eq 'analyze') {
1.201     albertel  700: 	my $include = $token->[2]->{'include'};
                    701: 	my $exclude = $token->[2]->{'exclude'};
                    702:         my %languages=&Apache::loncommon::display_languages();
                    703:         $result='1';
                    704: 	if ($include) {
                    705:             $result='';
                    706:             foreach (split(/\,/,$include)) {
                    707:                 if ($languages{$_}) { $result='1'; }
                    708:             }
                    709: 	}
                    710:         if ($exclude) {
                    711:             foreach (split(/\,/,$exclude)) {
                    712:                 if ($languages{$_}) { $result='0'; }
                    713:             }
                    714: 	}
                    715: 	if ( ! $result ) {
                    716: 	    my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser,
                    717: 						   $style);
                    718: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                    719: 	}
                    720: 	$result='';
1.167     www       721:     } elsif ($target eq 'edit') {
                    722: 	$result .=&Apache::edit::tag_start($target,$token);
1.211     albertel  723: 	$result .=&Apache::edit::text_arg(&mt('Include Language:'),'include',
1.167     www       724: 					  $token,40);
1.211     albertel  725: 	$result .=&Apache::edit::text_arg(&mt('Exclude Language:'),'exclude',
1.167     www       726: 					  $token,40);
                    727: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                    728:     } elsif ($target eq 'modified') {
                    729: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.168     albertel  730: 						     $safeeval,'include',
                    731: 						     'exclude');
1.167     www       732: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                    733:     }
                    734:     return $result;
                    735: }
                    736: 
                    737: sub end_languageblock {
1.170     www       738:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    739:     my $result;
1.201     albertel  740:     if ($target eq "edit") {
1.170     www       741: 	$result.= &Apache::edit::tag_end($target,$token,'');
                    742:     }
                    743:     return $result;
                    744: }
                    745: 
                    746: sub start_instructorcomment {
1.201     albertel  747:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.170     www       748: 
                    749:     my $result;
                    750: 
                    751:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                    752: 	$target eq 'tex' || $target eq 'analyze') {
                    753:         $result=($ENV{'request.role'}=~/^(in|cc|au|ca|li)/);
                    754: 	if ( ! $result ) {
1.201     albertel  755: 	    my $skip=&Apache::lonxml::get_all_text("/instructorcomment",
                    756: 						   $parser,$style);
1.170     www       757: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                    758: 	}
                    759: 	$result='';
                    760:     } elsif ($target eq 'edit') {
                    761: 	$result .=&Apache::edit::tag_start($target,$token);
                    762: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                    763:     }
                    764:     return $result;
                    765: }
                    766: 
                    767: sub end_instructorcomment {
1.159     albertel  768:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160     albertel  769:     my $result;
                    770:     if ($target eq "edit") {
                    771: 	$result.= &Apache::edit::tag_end($target,$token,'');
                    772:     }
                    773:     return $result;
1.4       tsai      774: }
                    775: 
                    776: sub start_while {
1.159     albertel  777:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    778: 
1.160     albertel  779:     my $result;
1.161     albertel  780:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1.160     albertel  781: 	$target eq 'tex' || $target eq 'analyze') {
                    782: 	my $code = $token->[2]->{'condition'};
1.4       tsai      783: 
1.160     albertel  784: 	push( @Apache::structuretags::whileconds, $code);
                    785: 	if (!$Apache::lonxml::default_homework_loaded) {
                    786: 	    &Apache::lonxml::default_homework_load($safeeval);
                    787: 	}
                    788: 	my $result = &Apache::run::run($code,$safeeval);
1.161     albertel  789: 	my $bodytext=&Apache::lonxml::get_all_text("/while",$parser);
1.160     albertel  790: 	push( @Apache::structuretags::whilebody, $bodytext);
1.161     albertel  791: 	push( @Apache::structuretags::whileline, $token->[5]);
                    792: 	&Apache::lonxml::debug("s code $code got -$result-");
1.160     albertel  793: 	if ( $result ) {
                    794: 	    &Apache::lonxml::newparser($parser,\$bodytext);
                    795: 	}
                    796:     } elsif ($target eq 'edit') {
                    797: 	$result .=&Apache::edit::tag_start($target,$token);
1.211     albertel  798: 	$result .=&Apache::edit::text_arg(&mt('Test Condition:'),'condition',
1.160     albertel  799: 					  $token,40);
                    800: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                    801:     } elsif ($target eq 'modified') {
                    802: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    803: 						     $safeeval,'condition');
                    804: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.159     albertel  805:     }
1.160     albertel  806:     return $result;
1.4       tsai      807: }
                    808: 
                    809: sub end_while {
1.159     albertel  810:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160     albertel  811:     my $result;
                    812: 
                    813:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                    814: 	$target eq 'tex' || $target eq 'analyze') {
                    815: 	my $code = pop(@Apache::structuretags::whileconds);
                    816: 	my $bodytext = pop(@Apache::structuretags::whilebody);
1.161     albertel  817: 	my $line = pop(@Apache::structuretags::whileline);
                    818: 	my $return = &Apache::run::run($code,$safeeval);
                    819: 	my $starttime=time;
                    820: 	my $error=0;
                    821: 	while ($return) {
                    822: 	    if (time-$starttime >
                    823: 		$Apache::lonnet::perlvar{'lonScriptTimeout'}) {
                    824: 		$return = 0; $error=1; next;
                    825: 	    }
                    826: 	    $result.=&Apache::scripttag::xmlparse($bodytext);
                    827: 	    $return = &Apache::run::run($code,$safeeval);
                    828: 	}
                    829: 	if ($error) {
1.211     albertel  830: 	    &Apache::lonxml::error('<pre>'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occured while running &lt;while$gt; on line').' '.$line.'</pre>');
1.160     albertel  831: 	}
                    832:     } elsif ($target eq "edit") {
                    833: 	$result.= &Apache::edit::tag_end($target,$token,'');
1.159     albertel  834:     }
1.160     albertel  835:     return $result;
1.1       albertel  836: }
1.6       tsai      837: 
1.160     albertel  838: # <randomlist show="1">
1.6       tsai      839: #  <tag1>..</tag1>
                    840: #  <tag2>..</tag2>
                    841: #  <tag3>..</tag3>
1.160     albertel  842: #  ...
1.6       tsai      843: # </randomlist>
                    844: sub start_randomlist {
1.159     albertel  845:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    846:     my $result;
                    847:     if ($target eq 'answer' || $target eq 'grade' || $target eq 'web' ||
                    848: 	$target eq 'tex' || $target eq 'analyze') {
                    849: 	my $body= &Apache::lonxml::get_all_text("/randomlist",$parser);
                    850: 	my $b_parser= HTML::TokeParser->new(\$body);
                    851: 	my $b_tok;
                    852: 	my @randomlist;
                    853: 	my $list_item;
                    854: 	while($b_tok = $b_parser->get_token() ) {
                    855: 	    if($b_tok->[0] eq 'S') { # start tag
                    856: 		# get content of the tag until matching end tag
                    857: 		# get all text upto the matching tag
                    858: 		# and push the content into @randomlist
                    859: 		$list_item = &Apache::lonxml::get_all_text('/'.$b_tok->[1],
                    860: 							   $b_parser);
                    861: 		$list_item = "$b_tok->[4]"."$list_item"."</$b_tok->[1]>";
                    862: 		push(@randomlist,$list_item);
                    863: 		#  print "<br /><b>START-TAG $b_tok->[1], $b_tok->[4],
                    864:                 #         $list_item</b>";
                    865: 	    }
                    866: 	    if($b_tok->[0] eq 'T') { # text
                    867: 		# what to do with text in between tags?
                    868: 		#  print "<b>TEXT $b_tok->[1]</b><br />";
                    869: 	    }
                    870: 	    # if($b_tok->[0] eq 'E') { # end tag, should not happen
                    871: 	    #  print "<b>END-TAG $b_tok->[1]</b><br />";
                    872: 	    # }
                    873: 	}
                    874: 	my @idx_arr = (0 .. $#randomlist);
                    875: 	&Apache::structuretags::shuffle(\@idx_arr);
                    876: 	my $bodytext = '';
                    877: 	my $show=$#randomlist;
                    878: 	my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
                    879: 	$showarg--;
                    880: 	if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; }
                    881: 	for(0 .. $show) {
                    882: 	    $bodytext .= "$randomlist[ $idx_arr[$_] ]";
                    883: 	}
                    884: 	&Apache::lonxml::newparser($parser,\$bodytext);
                    885:     } elsif ($target eq 'edit' ) {
                    886: 	$result .=&Apache::edit::tag_start($target,$token);
                    887: 	$result .=&Apache::edit::text_arg('Maximum Tags to Show:','show',
                    888: 					   $token,5);
                    889: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                    890:     } elsif ($target eq 'modified' ) {
                    891: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    892: 						     $safeeval,'show');
                    893: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                    894:     }
                    895:     return $result;
1.7       tsai      896: }
                    897: 
                    898: sub shuffle {
                    899:     my $a=shift;
                    900:     my $i;
1.70      albertel  901:     if (defined(@$a)) {
1.159     albertel  902: 	&Apache::response::setrandomnumber();
                    903: 	for($i=@$a;--$i;) {
                    904: 	    my $j=int(&Math::Random::random_uniform() * ($i+1));
                    905: 	    next if $i == $j;
                    906: 	    @$a[$i,$j] = @$a[$j,$i];
                    907: 	}
1.7       tsai      908:     }
1.6       tsai      909: }
                    910: 
                    911: sub end_randomlist {
1.159     albertel  912:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    913:     my $result;
                    914:     if ($target eq 'edit' ) {
                    915: 	$result=&Apache::edit::tag_end($target,$token,
                    916: 				       'End Randomly Parsed Block');
                    917:     }
                    918:     return $result;
1.6       tsai      919: }
                    920: 
1.11      albertel  921: sub start_part {
1.159     albertel  922:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    923:     my $result='';
                    924:     my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
                    925:     if ($id eq '') { $id = $Apache::lonxml::curdepth; }
                    926:     $Apache::inputtags::part=$id;
1.177     albertel  927:     push(@Apache::inputtags::partlist,$id);
                    928:     @Apache::inputtags::response=();
1.159     albertel  929:     @Apache::inputtags::previous=();
                    930:     @Apache::inputtags::previous_version=();
1.169     albertel  931:     $Apache::lonhomework::problemstatus=
                    932: 	&Apache::lonnet::EXT("resource.$id.problemstatus");
1.159     albertel  933:     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.214     albertel  934:     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.209     albertel  935:     &Apache::run::run($expression,$safeeval);
1.159     albertel  936: 
                    937:     if ($target eq 'meta') {
1.224     www       938: 	my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
                    939: 	return &Apache::response::mandatory_part_meta.
                    940: 	       &Apache::response::meta_parameter_write('display','string',$display,'Part Description');
1.159     albertel  941:     } elsif ($target eq 'web' || $target eq 'grade' ||
                    942: 	     $target eq 'answer' || $target eq 'tex') {
                    943: 	if ($hidden) {
                    944: 	    my $bodytext=&Apache::lonxml::get_all_text("/part",$parser);
                    945: 	} else {
                    946: 	    my ($status,$accessmsg) = &Apache::lonhomework::check_access($id);
                    947: 	    push (@Apache::inputtags::status,$status);
                    948: 	    my $expression='$external::datestatus="'.$status.'";';
                    949: 	    $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
                    950: 	    &Apache::run::run($expression,$safeeval);
1.216     albertel  951: 	    if (( $status eq 'CLOSED' ) ||
                    952: 		( $status eq 'UNCHECKEDOUT') ||
                    953: 		( $status eq 'BANNED') ||
                    954: 		( $status eq 'UNAVAILABLE') ||
                    955: 		( $status eq 'INVALID_ACCESS')) {
1.159     albertel  956: 		my $bodytext=&Apache::lonxml::get_all_text("/part",$parser);
                    957: 		if ( $target eq "web" ) {
1.211     albertel  958: 		    $result="<br />".&mt('Part is not open to be viewed. It')." $accessmsg<br />";
1.159     albertel  959: 		} elsif ( $target eq 'tex' ) {
1.195     sakharuk  960: 		    if (not $ENV{'form.problem_split'}=~/yes/) {
1.211     albertel  961: 			$result="\\end{minipage}\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\\\begin{minipage}{\\textwidth}";
1.195     sakharuk  962: 		    } else {
1.211     albertel  963: 			$result="\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\";
1.195     sakharuk  964: 		    }
1.159     albertel  965: 		}
                    966: 	    } else {
                    967: 		if ($target eq 'tex') {
1.195     sakharuk  968: 		    if (not $ENV{'form.problem_split'}=~/yes/) {
                    969: 			$result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
                    970: 		    }
1.159     albertel  971: 		    my $weight = &Apache::lonnet::EXT("resource.$id.weight");
1.227.2.1! albertel  972: 		    my $allkeys=&Apache::lonnet::metadata($ENV{'request.uri'},'packages');
1.222     sakharuk  973: 		    my @allkeys = split /,/,$allkeys;
                    974: 		    my $allow_print_points = 0;
                    975: 		    foreach my $partial_key (@allkeys) {
1.227.2.1! albertel  976: 			if ($partial_key=~m/^part_(.*)$/) {
1.222     sakharuk  977: 			    if ($1 ne '0') {$allow_print_points=1;}
                    978: 			}
                    979: 		    }
                    980: 		    if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
1.159     albertel  981: 		}
                    982: 	    }
                    983: 	}
                    984:     } elsif ($target eq 'edit') {
                    985: 	$result.=&Apache::edit::tag_start($target,$token);
                    986: 	$result.=&Apache::edit::text_arg('Part ID:','id',$token).
                    987: 	    &Apache::loncommon::help_open_topic("Part_Tag_Edit_Help").
1.224     www       988: 	    '&nbsp;&nbsp;'.
                    989: &Apache::edit::text_arg('Displayed Part Description:','display',$token).
1.159     albertel  990: 		&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                    991:     } elsif ($target eq 'modified') {
                    992: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.225     albertel  993: 						     $safeeval,'id','display');
1.159     albertel  994: 	if ($constructtag) {
1.225     albertel  995: 	    #limiting ids to only letters numbers, and space
1.224     www       996: 	    $token->[2]->{'id'}=~s/[^A-Za-z0-9 ]//gs;
1.159     albertel  997: 	    $result = &Apache::edit::rebuild_tag($token);
                    998: 	    $result.=&Apache::edit::handle_insert();
                    999: 	}
                   1000:     }
                   1001:     return $result;
1.11      albertel 1002: }
                   1003: 
                   1004: sub end_part {
1.159     albertel 1005:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1006:     &Apache::lonxml::debug("in end_part $target ");
                   1007:     my $status=$Apache::inputtags::status['-1'];
                   1008:     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
                   1009:     my $result='';
                   1010:     if ( $target eq 'meta' ) {
                   1011: 	$result='';
                   1012:     } elsif ( $target eq 'grade' && $status eq 'CAN_ANSWER' && !$hidden) {
                   1013: 	$result=&Apache::inputtags::grade;
                   1014:     } elsif (($target eq 'web' || $target eq 'tex') && !$hidden ) {
                   1015: 	my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
                   1016: 							$target);
1.212     albertel 1017: 	if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {
                   1018: 	    $gradestatus='';
                   1019: 	}
1.159     albertel 1020: 	$result=$gradestatus;
1.181     albertel 1021:     } elsif ($target eq 'edit') {
                   1022: 	$result=&Apache::edit::end_table();
1.159     albertel 1023:     }
                   1024:     pop @Apache::inputtags::status;
                   1025:     $Apache::inputtags::part='';
                   1026:     return $result;
1.11      albertel 1027: }
1.1       albertel 1028: 
1.25      albertel 1029: sub start_preduedate {
1.159     albertel 1030:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1031:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') {
                   1032: 	if ($Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
                   1033: 	    $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER' &&
                   1034: 	    $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
                   1035: 	    &Apache::lonxml::get_all_text("/preduedate",$parser);
                   1036: 	}
1.24      albertel 1037:     }
1.159     albertel 1038:     return '';
1.24      albertel 1039: }
                   1040: 
1.25      albertel 1041: sub end_preduedate {
1.159     albertel 1042:     return '';
1.24      albertel 1043: }
                   1044: 
1.25      albertel 1045: sub start_postanswerdate {
1.159     albertel 1046:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1047:     if ($target eq 'web' || $target eq 'grade' || $target eq 'tex') {
                   1048: 	if ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
                   1049: 	    &Apache::lonxml::get_all_text("/postanswerdate",$parser);
                   1050: 	}
                   1051:     } elsif ($target eq 'tex') {
                   1052: 	return '\vskip 0 mm \noindent';
                   1053:     }
                   1054:     return '';
1.24      albertel 1055: }
                   1056: 
1.25      albertel 1057: sub end_postanswerdate {
1.159     albertel 1058:     return '';
1.24      albertel 1059: }
                   1060: 
1.25      albertel 1061: sub start_notsolved {
1.159     albertel 1062:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1063:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                   1064: 	$target eq 'tex') {
                   1065: 	my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
                   1066: 	&Apache::lonxml::debug("not solved has :$gradestatus:");
                   1067: 	if ($gradestatus =~ /^correct/) {
                   1068: 	    &Apache::lonxml::debug("skipping");
                   1069: 	    &Apache::lonxml::get_all_text("/notsolved",$parser);
                   1070: 	}
1.24      albertel 1071:     }
1.159     albertel 1072:     return '';
1.24      albertel 1073: }
                   1074: 
1.25      albertel 1075: sub end_notsolved {
1.159     albertel 1076:     return '';
1.24      albertel 1077: }
                   1078: 
                   1079: sub start_solved {
1.159     albertel 1080:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1081:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                   1082: 	$target eq 'tex') {
                   1083: 	my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
                   1084: 	if ($gradestatus !~ /^correct/) {
                   1085: 	    &Apache::lonxml::get_all_text("/solved",$parser);
                   1086: 	}
1.24      albertel 1087:     }
1.159     albertel 1088:     return '';
1.24      albertel 1089: }
                   1090: 
                   1091: sub end_solved {
1.159     albertel 1092:     return '';
1.24      albertel 1093: }
1.34      albertel 1094: 
                   1095: sub start_startouttext {
1.159     albertel 1096:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1097:     my @result=(''.'');
                   1098:     if ($target eq 'edit' || $target eq 'modified' ) { @result=('','no'); }
                   1099:     return (@result);
1.34      albertel 1100: }
1.159     albertel 1101: 
1.34      albertel 1102: sub end_startouttext {
1.159     albertel 1103:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1104:     my $result='';
                   1105:     my $text='';
                   1106: 
                   1107:     if ($target eq 'edit') {
                   1108: 	$text=&Apache::lonxml::get_all_text("endouttext",$parser);
1.211     albertel 1109: 	$result.=&Apache::edit::start_table($token)."<tr><td>".&mt('Text Block')."</td>
                   1110: <td>".&mt('Delete:').
1.159     albertel 1111:                  &Apache::edit::deletelist($target,$token)
                   1112: 		 ."</td>
1.42      albertel 1113: <td>".
1.159     albertel 1114:                  &Apache::edit::insertlist($target,$token).
                   1115: 		 &Apache::edit::end_row().
                   1116:                  &Apache::edit::start_spanning_row()."\n"
1.188     bowersj2 1117: 		 . &Apache::loncommon::helpLatexCheatsheet () .
1.159     albertel 1118: 		 &Apache::edit::editfield($token->[1],$text,"",80,4);
                   1119:     }
                   1120:     if ($target eq 'modified') {
1.219     albertel 1121: 	$result='<startouttext />'.&Apache::edit::modifiedfield("endouttext",$parser);
1.159     albertel 1122:     }
                   1123:     if ($target eq 'tex') {
                   1124: 	$result .= '\noindent ';
                   1125:     }
                   1126:     return $result;
1.34      albertel 1127: }
1.159     albertel 1128: 
1.34      albertel 1129: sub start_endouttext {
1.159     albertel 1130:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1131:     my $result='';
                   1132:     if ($target eq "edit" ) { $result="</td></tr>".&Apache::edit::end_table()."\n"; }
                   1133:     if ($target eq "modified") {
                   1134: 	$result='<endouttext />'.
                   1135: 	    &Apache::edit::handle_insertafter('startouttext'); }
                   1136:     return $result;
1.34      albertel 1137: }
1.159     albertel 1138: 
1.34      albertel 1139: sub end_endouttext {
1.159     albertel 1140:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1141:     my @result=('','');
                   1142:     if ($target eq "edit" || $target eq 'modified') { @result=('','no'); }
                   1143:     return (@result);
1.34      albertel 1144: }
1.159     albertel 1145: 
1.45      albertel 1146: sub delete_startouttext {
1.159     albertel 1147:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1148:     #  my $text=&Apache::lonxml::get_all_text("endouttext",$parser);
                   1149:     my $text=$$parser['-1']->get_text("/endouttext");
                   1150:     my $ntoken=$$parser['-1']->get_token();
                   1151:     &Apache::lonxml::debug("Deleting :$text: and :$ntoken->[0]:$ntoken->[1]:$ntoken->[2]: for startouttext");
                   1152:     &Apache::lonxml::end_tag($tagstack,$parstack,$ntoken);
                   1153:     # Deleting 2 parallel tag pairs, but we need the numbers later to look like
                   1154:     # they did the last time round
                   1155:     &Apache::lonxml::increasedepth($ntoken);
                   1156:     &Apache::lonxml::decreasedepth($ntoken);
                   1157:     return 1;
1.193     www      1158: }
                   1159: 
                   1160: sub start_simpleeditbutton {
                   1161:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1162:     my $result='';
                   1163:     if (($target eq 'web') &&
                   1164:         (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) {
1.220     www      1165:         my $url=$ENV{'request.noversionuri'};
1.193     www      1166:         $url=~s/\?.*$//;
1.194     www      1167: 	$result='<table width="100%" bgcolor="#FFFFAA" border="2"><tr><td>'.
1.211     albertel 1168:                 '<a href="'.$url.'/smpedit">'.&mt('Simple Problem Editor').'</a> - '.&mt('Note: it can take up to 10 minutes for changes to take effect for all users.').
1.196     www      1169: &Apache::loncommon::help_open_topic('Caching').'</td></tr></table><br />';
1.193     www      1170:     }
                   1171:     return $result;
                   1172: }
                   1173: 
                   1174: sub end_simpleeditbutton {
                   1175:     return '';
1.45      albertel 1176: }
1.34      albertel 1177: 
1.1       albertel 1178: 1;
                   1179: __END__

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