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