Annotation of loncom/homework/structuretags.pm, revision 1.471
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.471 ! raeburn 4: # $Id: structuretags.pm,v 1.470 2010/07/29 18:00:06 raeburn 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.254 www 28: ###
1.54 www 29:
1.435 jms 30: =pod
31:
32: =head1 NAME
33:
34: Apache::structuretags
35:
36: =head1 SYNOPSIS
37:
38:
39: This is part of the LearningOnline Network with CAPA project
40: described at http://www.lon-capa.org.
41:
42:
43: =head1 NOTABLE SUBROUTINES
44:
45: =over
46:
47: =item
48:
49: =back
50:
51: =cut
52:
1.133 sakharuk 53:
1.1 albertel 54: package Apache::structuretags;
55:
56: use strict;
57: use Apache::lonnet;
1.101 sakharuk 58: use Apache::File();
1.147 www 59: use Apache::lonmenu;
1.210 albertel 60: use Apache::lonlocal;
1.231 sakharuk 61: use Apache::lonxml;
1.434 foxr 62: use Apache::londefdef;
1.338 albertel 63: use Apache::lonenc();
1.267 albertel 64: use Time::HiRes qw( gettimeofday tv_interval );
1.356 www 65: use lib '/home/httpd/lib/perl/';
66: use LONCAPA;
67:
1.78 harris41 68: BEGIN {
1.469 www 69: &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag'));
1.10 albertel 70: }
71:
72: sub start_web {
1.326 albertel 73: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.383 albertel 74: if ($target ne 'edit' && $target ne 'modified') {
75: my $bodytext=&Apache::lonxml::get_all_text("/web",$parser,$style);
76: if ($target eq 'web' || $target eq 'webgrade') {
77: return $bodytext;
78: }
79: } elsif ($target eq "edit" ) {
80: my $bodytext =
81: &Apache::lonxml::get_all_text_unbalanced("/web",$parser);
82: my $result = &Apache::edit::tag_start($target,$token);
83: $result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
84: return $result;
85: } elsif ( $target eq "modified" ) {
86: return $token->[4].&Apache::edit::modifiedfield("/web",$parser);
1.159 albertel 87: }
88: return '';
1.10 albertel 89: }
90:
91: sub end_web {
1.44 ng 92: return '';
1.10 albertel 93: }
94:
95: sub start_tex {
1.326 albertel 96: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.198 sakharuk 97: my $result='';
1.383 albertel 98: if ($target ne 'edit' && $target ne 'modified') {
99: my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser,$style);
100: if ($target eq 'tex') {
1.434 foxr 101:
102: # If inside a table, occurrences of \\ must be removed;
103: # else the table blows up.
104:
105: if (&Apache::londefdef::is_inside_of($tagstack, "table")) {
106: $bodytext =~ s/\\\\//g;
107: }
1.432 foxr 108: return $bodytext.'{}';
1.383 albertel 109: }
110: } elsif ($target eq "edit" ) {
111: my $bodytext =
112: &Apache::lonxml::get_all_text_unbalanced("/tex",$parser);
113: my $result = &Apache::edit::tag_start($target,$token);
114: $result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
115: return $result;
116: } elsif ( $target eq "modified" ) {
117: return $token->[4].&Apache::edit::modifiedfield("/tex",$parser);
1.159 albertel 118: }
1.198 sakharuk 119: return $result;;
1.10 albertel 120: }
121:
122: sub end_tex {
1.44 ng 123: return '';
1.9 albertel 124: }
125:
1.400 albertel 126: sub homework_js {
127: return &Apache::loncommon::resize_textarea_js().
1.416 raeburn 128: &setmode_javascript().
1.400 albertel 129: <<'JS';
130: <script type="text/javascript">
131: function setSubmittedPart (part) {
132: this.document.lonhomework.submitted.value="part_"+part;
133: }
134:
135: function image_response_click (which, e) {
136: init_geometry();
137: if (!e) { e = window.event; } //IE
138: var input_element = document.lonhomework.elements[which];
1.401 albertel 139: var token_element = document.lonhomework.elements[which+'_token'];
1.400 albertel 140: var token = token_element.value;
1.401 albertel 141: var img_element = document.getElementById(which+'_imageresponse');
1.400 albertel 142: var x= e.clientX-getX(img_element)+Geometry.getHorizontalScroll();
143: var y= e.clientY-getY(img_element)+Geometry.getVerticalScroll();
144: var click = x+':'+y;
145: input_element.value = click;
146: img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click;
147: }
1.416 raeburn 148:
1.400 albertel 149: </script>
150: JS
151: }
152:
1.416 raeburn 153: sub setmode_javascript {
154: return <<"ENDSCRIPT";
155: <script type="text/javascript">
156: function setmode(form,probmode) {
157: form.problemmode.value = probmode;
158: form.submit();
159: }
160: </script>
161: ENDSCRIPT
162: }
163:
1.48 albertel 164: sub page_start {
1.345 albertel 165: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,
166: $extra_head)=@_;
1.159 albertel 167: my %found;
1.207 albertel 168: foreach my $taginside (@$tagstack) {
1.159 albertel 169: foreach my $taglookedfor ('html','body','form') {
170: if ($taginside =~ /^$taglookedfor$/i) {$found{$taglookedfor} = 1;}
171: }
172: }
173:
1.343 albertel 174: if ($target eq 'tex') {
175: return
176: &Apache::londefdef::start_html($target,$token,$tagstack,
177: $parstack,$parser,$safeeval);
178: }
179:
1.400 albertel 180: $extra_head .= &homework_js();
1.374 albertel 181:
1.434 foxr 182: if ($env{'environment.wysiwygeditor'} eq 'on') {
183: $extra_head .= &Apache::lonhtmlcommon::dragmath_js("FCKEditMathPopup");
184: } else {
185: $extra_head .= &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");
1.425 raeburn 186: }
187:
1.344 albertel 188: my %body_args;
189: if (defined($found{'html'})) {
190: $body_args{'skip_phases'}{'head'}=1;
191: } else {
1.343 albertel 192:
1.345 albertel 193: $extra_head .= &Apache::lonhtmlcommon::spellheader();
1.343 albertel 194:
1.379 albertel 195: $extra_head .= &Apache::londefdef::generate_css_links();
196:
1.384 albertel 197: if ($env{'request.state'} eq 'construct') {
1.343 albertel 198: $extra_head.=&Apache::edit::js_change_detection().
199: "<script type=\"text/javascript\">\n".
200: "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".
201: &Apache::loncommon::browser_and_searcher_javascript().
202: "\n</script>\n";
203: }
1.159 albertel 204: }
1.343 albertel 205:
1.446 bisitz 206: my $pageheader = '';
1.344 albertel 207: if (defined($found{'body'})) {
208: $body_args{'skip_phases'}{'body'}=1;
209: } elsif (!defined($found{'body'})
210: && $env{'request.state'} eq 'construct') {
1.343 albertel 211: if ($target eq 'web' || $target eq 'edit') {
1.450 bisitz 212: # Breadcrumbs for Construction Space
213: &Apache::lonhtmlcommon::clear_breadcrumbs();
214: &Apache::lonhtmlcommon::add_breadcrumb({
215: 'text' => 'Construction Space',
216: 'href' => &Apache::loncommon::authorspace(),
217: });
1.460 droeschl 218: # breadcrumbs (and tools) will be created
219: # in start_page->bodytag->innerregister
220:
1.450 bisitz 221: # FIXME Where are we?
222: # &Apache::lonhtmlcommon::add_breadcrumb({
223: # 'text' => 'Problem Editing', # 'Problem Testing'
224: # 'href' => '',
225: # });
1.460 droeschl 226: $pageheader =&Apache::loncommon::head_subbox(
1.446 bisitz 227: &Apache::loncommon::CSTR_pageheader());
1.297 albertel 228: }
1.272 albertel 229: } elsif (!defined($found{'body'})) {
1.343 albertel 230: my %add_entries;
1.159 albertel 231: my $background=&Apache::lonxml::get_param('background',$parstack,
232: $safeeval);
1.343 albertel 233: if ($background ne '' ) {
234: $add_entries{'background'} = $background;
235: }
1.344 albertel 236:
1.290 albertel 237: my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack,
238: $safeeval);
1.446 bisitz 239: if ($bgcolor eq '' ) { $bgcolor = '#FFFFFF'; }
1.344 albertel 240:
1.446 bisitz 241: $body_args{'bgcolor'} = $bgcolor;
242: # $body_args{'no_title'} = 1;
243: $body_args{'force_register'} = 1;
244: $body_args{'add_entries'} = \%add_entries;
1.466 droeschl 245: if ( $env{'request.state'} eq 'construct') {
1.446 bisitz 246: $body_args{'only_body'} = 1;
247: }
1.344 albertel 248: }
1.365 albertel 249: $body_args{'no_auto_mt_title'} = 1;
1.344 albertel 250: my $page_start = &Apache::loncommon::start_page($name,$extra_head,
251: \%body_args);
1.446 bisitz 252: $page_start .= $pageheader;
1.462 raeburn 253: if (!defined($found{'body'})
254: && $env{'request.state'} ne 'construct'
255: && ($target eq 'web' || $target eq 'webgrade')) {
256:
257: my ($symb,undef,undef,undef,$publicuser)= &Apache::lonnet::whichuser();
258: if ($symb eq '' && !$publicuser) {
259: $page_start .= '<p class="LC_info">'
260: .&mt('Browsing resource, all submissions are temporary.')
261: .'</p>';
1.457 bisitz 262: }
1.344 albertel 263: }
264:
1.409 albertel 265: if (!defined($found{'body'}) && $env{'request.state'} ne 'construct') {
1.343 albertel 266: $page_start .= &Apache::lonxml::message_location();
1.159 albertel 267: }
1.344 albertel 268:
1.159 albertel 269: my $form_tag_start;
270: if (!defined($found{'form'})) {
1.337 albertel 271: $form_tag_start='<form name="lonhomework" enctype="multipart/form-data" method="post" action="';
1.465 raeburn 272: my $uri = &Apache::loncommon::inhibit_menu_check(
1.455 droeschl 273: &Apache::lonenc::check_encrypt($env{'request.uri'}));
1.464 raeburn 274: $uri = &HTML::Entities::encode($uri,'<>&"');
1.327 albertel 275: $form_tag_start.=$uri.'" ';
276: if ($target eq 'edit') {
277: $form_tag_start.=&Apache::edit::form_change_detection();
278: }
1.368 albertel 279: $form_tag_start.='>'."\n";
1.355 albertel 280:
281: my $symb=&Apache::lonnet::symbread();
282: if ($symb =~ /\S/) {
283: $symb=
284: &HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb));
285: $form_tag_start.=
1.368 albertel 286: "\t".'<input type="hidden" name="symb" value="'.$symb.'" />'."\n";
1.355 albertel 287: }
1.159 albertel 288: }
1.343 albertel 289: return ($page_start,$form_tag_start);
1.105 albertel 290: }
291:
1.141 matthew 292: #use Time::HiRes();
1.105 albertel 293: sub get_resource_name {
1.159 albertel 294: my ($parstack,$safeeval)=@_;
1.388 foxr 295: my $name;
1.204 albertel 296: if (defined($Apache::lonhomework::name)) {
1.388 foxr 297: $name = $Apache::lonhomework::name;
298: } else {
299: my ($symb)=&Apache::lonnet::whichuser();
1.392 albertel 300: $name=&Apache::lonnet::gettitle($symb);
1.388 foxr 301: if ($name eq '') {
302: $name=&Apache::lonnet::EXT('resource.title');
303: if ($name eq 'con_lost') { $name = ''; }
304: }
305: if ($name!~/\S+/) {
306: $name=$env{'request.uri'};
307: $name=~s-.*/([^/]+)$-$1-;
308: }
309: # The name has had html tags escaped:
310:
311: $name=~s/</</gs;
312: $name=~s/>/>/gs;
313:
314: $Apache::lonhomework::name=$name;
1.204 albertel 315: }
1.159 albertel 316: return $name;
1.105 albertel 317: }
318:
319: sub setup_rndseed {
1.159 albertel 320: my ($safeeval)=@_;
321: my $rndseed;
1.367 albertel 322: my ($symb)=&Apache::lonnet::whichuser();
1.333 albertel 323: if ($env{'request.state'} eq "construct"
324: || $symb eq ''
325: || $Apache::lonhomework::type eq 'practice'
326: || $Apache::lonhomework::history{'resource.CODE'}) {
1.316 www 327: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.317 albertel 328: ['rndseed']);
1.284 albertel 329: $rndseed=$env{'form.rndseed'};
1.159 albertel 330: if (!$rndseed) {
1.162 albertel 331: $rndseed=$Apache::lonhomework::history{'rndseed'};
332: if (!$rndseed) {
333: $rndseed=time;
334: }
1.284 albertel 335: $env{'form.rndseed'}=$rndseed;
1.162 albertel 336: }
1.374 albertel 337: if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')
338: && $env{'form.submitted'} eq 'yes') ||
1.284 albertel 339: $env{'form.newrandomization'} eq &mt('New Randomization')) {
1.190 albertel 340: srand(time);
341: $rndseed=int(rand(2100000000));
1.284 albertel 342: $env{'form.rndseed'}=$rndseed;
343: delete($env{'form.resetdata'});
344: delete($env{'form.newrandomization'});
1.159 albertel 345: }
1.187 albertel 346: if (defined($rndseed) && $rndseed ne int($rndseed)) {
1.307 albertel 347: $rndseed=join(':',&Apache::lonnet::digest($rndseed));
1.187 albertel 348: }
1.247 albertel 349: if ($Apache::lonhomework::history{'resource.CODE'}) {
350: $rndseed=&Apache::lonnet::rndseed();
351: }
1.221 albertel 352: if ($safeeval) {
353: &Apache::lonxml::debug("Setting rndseed to $rndseed");
1.250 albertel 354: &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);
1.221 albertel 355: }
1.159 albertel 356: }
357: return $rndseed;
1.105 albertel 358: }
359:
1.268 albertel 360: sub remember_problem_state {
361: return '
1.284 albertel 362: <input type="hidden" name="problemstate" value="'.$env{'form.problemstate'}.'" />
363: <input type="hidden" name="problemtype" value="'.$env{'form.problemtype'}.'" />
364: <input type="hidden" name="problemstatus" value="'.$env{'form.problemstatus'}.'" />';
1.268 albertel 365: }
366:
1.423 www 367: sub problem_edit_buttons {
368: return '
1.408 albertel 369: <div class="LC_edit_problem_discards">
1.416 raeburn 370: <input type="button" name="submitmode" accesskey="d" value="'.&mt('Discard Edits and View').'" '.
1.423 www 371: ' onclick="javscript:setmode(this.form,'."'discard'".')" />
1.416 raeburn 372: <input '.&Apache::edit::submit_ask_anyway('setmode(this.form,'."'editxml'".')').' type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" />
1.407 albertel 373: <input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" />
1.408 albertel 374: </div>
375: <div class="LC_edit_problem_saves">
1.416 raeburn 376: <input type="submit" name="submitbutton" accesskey="s" value="'.&mt('Save and Edit').'" />
377: <input type="submit" name="submitbutton" accesskey="v" value="'.&mt('Save and View').'" />
1.423 www 378: </div>';
379: }
380:
381: sub problem_edit_header {
382: return '<input type="hidden" name="submitted" value="edit" /><input type="hidden" name="problemmode" value="edit" />'.
383: &Apache::structuretags::remember_problem_state().'
384: <div class="LC_edit_problem_header">
385: <div class="LC_edit_problem_header_title">
386: '.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'
387: </div>'.
388: &problem_edit_buttons().'
1.459 bisitz 389: <hr style="clear:both;" />
1.409 albertel 390: '.&Apache::lonxml::message_location().'
1.408 albertel 391: </div>
392: '.
1.458 bisitz 393: '<table border="0" width="100%"><tr><td bgcolor="#F8F8F8">';
1.105 albertel 394: }
395:
396: sub problem_edit_footer {
1.412 albertel 397: return '</td></tr></table><br />
398: <div class="LC_edit_problem_footer">
1.453 bisitz 399: <hr />'.
1.423 www 400: &problem_edit_buttons().'
1.459 bisitz 401: <hr style="clear:both;" />
1.412 albertel 402: </div>
403: '.
404:
1.348 albertel 405: &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields()).
1.342 albertel 406: "\n</form>\n".&Apache::loncommon::end_page();
1.105 albertel 407: }
408:
1.235 albertel 409: sub option {
410: my ($value,$name) = @_;
411: my $result ="<option value='".$value."' ";
1.284 albertel 412: if ($env{'form.'.$name} eq $value) {
1.235 albertel 413: $result.=" selected='on' ";
414: }
415: $result.='>';
416: return $result;
417: }
418:
1.105 albertel 419: sub problem_web_to_edit_header {
1.159 albertel 420: my ($rndseed)=@_;
1.406 albertel 421: my $result .= '<div class="LC_edit_problem_header">';
422:
423: if (!$Apache::lonhomework::parsing_a_task) {
424: $result .=
425: '<div class="LC_edit_problem_header_title">'.
426: &mt('Problem Testing').
427: &Apache::loncommon::help_open_topic('Problem_Editor_Testing_Area').
428: '</div>';
429: } else {
430: $result .=
431: '<div class="LC_edit_problem_header_title">'.
432: &mt('Task Testing').
433: '</div>';
434: }
435:
1.315 albertel 436: my $show_all_foils_text =
437: ($Apache::lonhomework::parsing_a_task) ?
1.452 bisitz 438: &mt('Show All Instances')
439: : &mt('Show All Foils');
1.315 albertel 440:
1.452 bisitz 441: my $show_all= '<span class="LC_nobreak"><label for="showallfoils">'
442: .'<input type="checkbox" name="showallfoils"';
1.440 bisitz 443: if (defined($env{'form.showallfoils'})) { $show_all.=' checked="checked"'; }
1.452 bisitz 444: $show_all.= ' /> '.$show_all_foils_text
445: .'</label></span>';
1.406 albertel 446:
447:
1.384 albertel 448:
1.406 albertel 449: $result .= '<div class="LC_edit_problem_header_status_row">';
1.313 albertel 450: if (!$Apache::lonhomework::parsing_a_task) {
451: $result.="
1.406 albertel 452: <div class='LC_edit_problem_header_row1'>
453: <span class=\"LC_nobreak\">
1.405 albertel 454: ".&mt("Problem Status:")."
1.235 albertel 455: <select name='problemstate'>
1.270 albertel 456: <option value=''></option>
1.235 albertel 457: ".&option('CLOSED' ,'problemstate').&mt("Closed")."</option>
458: ".&option('CAN_ANSWER' ,'problemstate').&mt("Answerable")."</option>
459: ".&option('CANNOT_ANSWER_tries' ,'problemstate').&mt("Open with full tries")."</option>
460: ".&option('CANNOT_ANSWER_correct','problemstate').&mt("Open and correct")."</option>
461: ".&option('SHOW_ANSWER' ,'problemstate').&mt("Show Answer")."</option>
462: </select>
1.406 albertel 463: </span>
464: <span class=\"LC_nobreak\">
1.405 albertel 465: ".&mt("Problem Type:")."
1.235 albertel 466: <select name='problemtype'>
1.270 albertel 467: <option value=''></option>
1.242 albertel 468: ".&option('exam' ,'problemtype').&mt("Exam Problem")."</option>
1.428 raeburn 469: ".&option('problem','problemtype').&mt("Homework Problem")."</option>
1.242 albertel 470: ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>
1.465 raeburn 471: ".&option('surveycred' ,'problemtype').&mt("Survey Question (with credit)")."</option>
472: ".&option('anonsurvey' ,'problemtype').&mt("Anonymous Survey Question")."</option>
473: ".&option('anonsurveycred' ,'problemtype').&mt("Anonymous Survey Question (with credit)")."</option>
1.428 raeburn 474: ".&option('practice' ,'problemtype').&mt("Practice Problem")."</option>
1.235 albertel 475: </select>
1.406 albertel 476: </span>
477: $show_all
478: </div>
479: <div class='LC_edit_problem_header_row2'>
480: <span class=\"LC_nobreak\">
1.405 albertel 481: ".&mt("Feedback Mode:")."
1.235 albertel 482: <select name='problemstatus'>
483: <option value=''></option>
1.242 albertel 484: ".&option('yes','problemstatus').&mt("Show Feedback")."</option>
1.405 albertel 485: ".&option('no', 'problemstatus').&mt("Don't Show Incorect/Correct Feedback")."</option>
486: ".&option('no_feedback_ever', 'problemstatus').&mt("Don't Show Any Feedback")."</option>
1.235 albertel 487: </select>
1.406 albertel 488: </span>
489: ";
490:
1.376 albertel 491: } elsif ($Apache::lonhomework::parsing_a_task) {
492: $result.="
1.406 albertel 493: <div class='LC_edit_problem_header_row1'>
494: <span class=\"LC_nobreak\">
1.405 albertel 495: ".&mt("Problem Status:")."
1.376 albertel 496: <select name='problemstate'>
497: <option value=''></option>
498: ".&option('CLOSED' ,'problemstate').&mt("Closed")."</option>
499: ".&option('CAN_ANSWER' ,'problemstate').&mt("Answerable")."</option>
500: ".&option('WEB_GRADE' ,'problemstate').&mt("Criteria Grading")."</option>
501: ".&option('SHOW_ANSWER' ,'problemstate').&mt("Show Feedback")."</option>
502: </select>
1.406 albertel 503: </span>
504: $show_all
505: ";
506: }
507: $result.='
508: <span class="LC_nobreak">
509: '.&mt('Apply style file: ').'
510: <input type="text" name="style_file" value="'.&HTML::Entities::encode($env{'construct.style'},'"<>&').'" />
511: <a href="javascript:openbrowser(\'lonhomework\',\'style_file\',\'sty\')">'.&mt('Select').'</a>
512: </span>
1.422 www 513: </div>
514: <div class="LC_edit_problem_header_row1">'.
515: &Apache::lonxml::renderingoptions().'
1.406 albertel 516: </div>
517: <input type="submit" name="changeproblemmode" value="'.&mt("Change View").'" />
518: <input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" />
519: <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />
520: </div>
1.453 bisitz 521: <hr />
1.406 albertel 522: <div class="LC_edit_problem_header_randomize_row">
523: <input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" />
524: <input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" />
525: <input type="text" name="rndseed" size="10" value="'.
526: $rndseed.'"
527: onchange="javascript:document.lonhomework.changerandseed.click()" />';
528:
529: if (!$Apache::lonhomework::parsing_a_task) {
530: my $numtoanalyze=$env{'form.numtoanalyze'};
531: if (!$numtoanalyze) { $numtoanalyze=20; }
1.408 albertel 532: $result .= '<span class="LC_nobreak">'.
533: &mt('[_1] for [_2] versions.',
1.416 raeburn 534: '<input type="button" name="submitmode" value="'.&mt('Calculate answers').'" '.
1.419 bisitz 535: 'onclick="javascript:setmode(this.form,'."'calcanswers'".')" />'
536: ,'<input type="text" name="numtoanalyze" value="'.
1.408 albertel 537: $numtoanalyze.'" size="5" />').
538: &Apache::loncommon::help_open_topic("Analyze_Problem",'',undef,undef,300).
539: '</span>';
540:
1.313 albertel 541: }
1.406 albertel 542:
543: $result.='
544: </div>
1.453 bisitz 545: <hr />
1.447 bisitz 546: <div>';
1.416 raeburn 547: $result.='<input type="hidden" name="problemmode" value="view" />';
548: $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.
549: 'onclick="javascript:setmode(this.form,'."'edit'".')" />';
550: $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.
551: 'onclick="javascript:setmode(this.form,'."'editxml'".')" />';
1.408 albertel 552: $result.='
553: </div>
1.453 bisitz 554: <hr />
1.409 albertel 555: '.&Apache::lonxml::message_location().'
1.406 albertel 556: </div>';
1.159 albertel 557: return $result;
1.48 albertel 558: }
559:
1.65 albertel 560: sub initialize_storage {
1.357 albertel 561: my ($given_symb) = @_;
1.353 albertel 562: undef(%Apache::lonhomework::results);
563: undef(%Apache::lonhomework::history);
1.357 albertel 564: my ($symb,$courseid,$domain,$name) =
1.367 albertel 565: &Apache::lonnet::whichuser($given_symb);
1.353 albertel 566:
567: # anonymous users (CODEd exams) have no data
568: if ($name eq 'anonymous'
569: && !defined($domain)) {
570: return;
571: }
572:
1.333 albertel 573: if ($env{'request.state'} eq 'construct'
574: || $symb eq ''
575: || $Apache::lonhomework::type eq 'practice') {
576:
577: my $namespace = $symb || $env{'request.uri'};
578: if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||
1.374 albertel 579: ($env{'form.resetdata'} eq &mt('New Problem Variation')
580: && $env{'form.submitted'} eq 'yes') ||
1.333 albertel 581: $env{'form.newrandomization'} eq &mt('New Randomization')) {
582: &Apache::lonnet::tmpreset($namespace,'',$domain,$name);
583: &Apache::lonxml::debug("Attempt reset");
584: }
1.159 albertel 585: %Apache::lonhomework::history=
1.333 albertel 586: &Apache::lonnet::tmprestore($namespace,'',$domain,$name);
1.159 albertel 587: my ($temp)=keys %Apache::lonhomework::history ;
588: &Apache::lonxml::debug("Return message of $temp");
589: } else {
590: %Apache::lonhomework::history=
591: &Apache::lonnet::restore($symb,$courseid,$domain,$name);
592: }
1.353 albertel 593:
1.159 albertel 594: #ignore error conditions
1.67 albertel 595: my ($temp)=keys %Apache::lonhomework::history ;
1.159 albertel 596: if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }
1.65 albertel 597: }
598:
1.435 jms 599: =pod
600:
601: =item finalize_storage()
602:
603: Stores away the result has to a student's environment
604: checks form.grade_ for specific values, other wises stores
605: to the running users environment
606: Will increment totals for attempts, students, and corrects
607: if running user has student role.
608:
609: =cut
610:
611:
1.65 albertel 612: sub finalize_storage {
1.357 albertel 613: my ($given_symb) = @_;
1.159 albertel 614: my $result;
1.289 albertel 615: if (%Apache::lonhomework::results) {
1.323 albertel 616: my @remove = grep(/^INTERNAL_/,keys(%Apache::lonhomework::results));
617: delete(@Apache::lonhomework::results{@remove});
1.357 albertel 618: my ($symb,$courseid,$domain,$name) =
1.367 albertel 619: &Apache::lonnet::whichuser($given_symb);
1.333 albertel 620: if ($env{'request.state'} eq 'construct'
621: || $symb eq ''
622: || $Apache::lonhomework::type eq 'practice') {
623: my $namespace = $symb || $env{'request.uri'};
1.284 albertel 624: $Apache::lonhomework::results{'rndseed'}=$env{'form.rndseed'};
1.159 albertel 625: $result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results,
1.333 albertel 626: $namespace,'',$domain,$name);
1.159 albertel 627: &Apache::lonxml::debug('Construct Store return message:'.$result);
628: } else {
629: $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
630: $symb,$courseid,$domain,$name);
631: &Apache::lonxml::debug('Store return message:'.$result);
1.470 raeburn 632: &store_aggregates($symb,$courseid);
1.159 albertel 633: }
1.323 albertel 634: } else {
635: &Apache::lonxml::debug('Nothing to store');
1.67 albertel 636: }
1.159 albertel 637: return $result;
1.65 albertel 638: }
639:
1.435 jms 640: =pod
641:
642: item store_aggregates()
643:
644: Sends hash of values to be incremented in nohist_resourcetracker.db
645: for the course. Increments total number of attempts, unique students
646: and corrects for each part for an instance of a problem, as appropriate.
647:
648: =cut
649:
1.285 raeburn 650: sub store_aggregates {
651: my ($symb,$courseid) = @_;
1.286 albertel 652: my %aggregate;
653: my @parts;
1.288 albertel 654: my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'};
655: my $cname = $env{'course.'.$env{'request.course.id'}.'.num'};
1.286 albertel 656: foreach my $key (keys(%Apache::lonhomework::results)) {
1.287 albertel 657: if ($key =~ /resource\.([^\.]+)\.tries/) {
1.286 albertel 658: push(@parts, $1);
1.285 raeburn 659: }
660: }
1.286 albertel 661: foreach my $part (@parts) {
1.470 raeburn 662: if ($env{'request.role'} =~/^st/) {
663: if ($Apache::lonhomework::results{'resource.'.$part.'.award'}
664: eq 'APPROX_ANS' ||
665: $Apache::lonhomework::results{'resource.'.$part.'.award'}
666: eq 'EXACT_ANS') {
667: $aggregate{$symb."\0".$part."\0correct"} = 1;
668: }
669: if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) {
670: $aggregate{$symb."\0".$part."\0users"} = 1;
671: } else {
672: my (undef,$last_reset) = &Apache::grades::get_last_resets($symb,$env{'request.course.id'},[$part]);
673: if ($last_reset) {
674: if (&Apache::grades::get_num_tries(\%Apache::lonhomework::history,$last_reset,$part) == 0) {
675: $aggregate{$symb."\0".$part."\0users"} = 1;
676: }
677: }
678: }
679: $aggregate{$symb."\0".$part."\0attempts"} = 1;
1.285 raeburn 680: }
1.470 raeburn 681: if (($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurvey') ||
682: ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurveycred')) {
683: $aggregate{$symb."\0".$part."\0anonymous"} = 1;
684: my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}};
685: if ($needsrelease) {
686: my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};
687: if ($curr_required eq '') {
1.471 ! raeburn 688: &Apache::lonnet::update_released_required($needsrelease);
1.470 raeburn 689: } else {
690: my ($currmajor,$currminor) = split(/\./,$curr_required);
691: my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
692: if (($currmajor < $needsmajor) || ($currmajor == $needsmajor && $currminor < $needsminor)) {
1.471 ! raeburn 693: &Apache::lonnet::update_released_required($needsrelease);
1.470 raeburn 694: }
1.292 raeburn 695: }
696: }
1.285 raeburn 697: }
698: }
1.292 raeburn 699: if (keys (%aggregate) > 0) {
1.289 albertel 700: &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
1.292 raeburn 701: $cdomain,$cname);
702: }
703: }
1.289 albertel 704:
1.65 albertel 705: sub checkout_msg {
1.211 albertel 706: my %lt=&Apache::lonlocal::texthash(
707: 'resource'=>'The resource needs to be checked out',
708: '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.',
709: 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',
710: 'checkout'=>'Check out Exam for Viewing',
711: 'checkout?'=>'Check out Exam?');
1.352 albertel 712: my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
1.159 albertel 713: return (<<ENDCHECKOUT);
1.211 albertel 714: <h2>$lt{'resource'}</h2>
715: <p>$lt{'id_expln'}</p>
1.449 bisitz 716: <p class="LC_warning">$lt{'warning'}</p>
1.444 bisitz 717: <form name="checkout" method="post" action="$uri">
1.91 albertel 718: <input type="hidden" name="doescheckout" value="yes" />
1.211 albertel 719: <input type="button" name="checkoutbutton" value="$lt{'checkout'}" onClick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" />
1.65 albertel 720: </form>
721: ENDCHECKOUT
722: }
723:
1.252 albertel 724: sub firstaccess_msg {
1.253 albertel 725: my ($time,$symb)=@_;
1.414 albertel 726: my $result;
727: my @interval=&Apache::lonnet::EXT("resource.0.interval");
728: if ($interval[1] eq 'map') {
729: my ($map)=&Apache::lonnet::decode_symb($symb);
730: my $foldertitle=&Apache::lonnet::gettitle($map);
731:
732: &Apache::lonxml::debug("map is $map title is $foldertitle");
1.418 bisitz 733: $result .= "<h2>".&mt('The resources in "[_1]" are open for a limited time.'
734: .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".'
735: ,$foldertitle,$time)."</h2>";
1.414 albertel 736: } elsif ($interval[1] eq 'course') {
737: my $course = $env{'course.'.$env{'request.course.id'}.'.description'};
1.418 bisitz 738: $result .= "<h2>".&mt('The resources in "[_1]" are open for a limited time.'
739: .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".'
740: ,$course,$time)."</h2>";
1.414 albertel 741: } else {
742: my $title=&Apache::lonnet::gettitle($symb);
1.418 bisitz 743: $result .= "<h2>".&mt('This resource "[_1]" is open for a limited time.'
744: .' Once you click the "Show Resource" button below you have [_2] to complete this resource "[_1]".'
745: ,$title,$time)."</h2>";
1.414 albertel 746: }
1.352 albertel 747: my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
1.418 bisitz 748: my $buttontext = &mt('Show Resource');
749: my $timertext = &mt('Start Timer?');
1.414 albertel 750: $result .= (<<ENDCHECKOUT);
1.444 bisitz 751: <form name="markaccess" method="post" action="$uri">
1.252 albertel 752: <input type="hidden" name="markaccess" value="yes" />
1.418 bisitz 753: <input type="button" name="accessbutton" value="$buttontext" onClick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" />
1.252 albertel 754: </form>
755: ENDCHECKOUT
1.414 albertel 756: return $result;
1.252 albertel 757: }
758:
1.204 albertel 759: sub init_problem_globals {
760: my ($type)=@_;
761: #initialize globals
1.308 foxr 762: # For problems, we start out in part 0 (outside a <part> tag).
763: # and part 0 is used to describe the main body of the <problem>
764: #
1.204 albertel 765: if ($type eq 'problem') {
766: $Apache::inputtags::part='0';
767: @Apache::inputtags::partlist=('0');
1.405 albertel 768: &Apache::lonhomework::set_show_problem_status(&get_problem_status('0'));
1.266 albertel 769: $Apache::lonhomework::ignore_response_errors=0;
1.308 foxr 770:
1.266 albertel 771: } elsif ($type eq 'library') {
1.204 albertel 772: $Apache::inputtags::part='';
773: @Apache::inputtags::partlist=();
1.405 albertel 774: &Apache::lonhomework::reset_show_problem_status();
1.266 albertel 775: $Apache::lonhomework::ignore_response_errors=1;
1.308 foxr 776:
1.304 albertel 777: } elsif ($type eq 'Task') {
778: $Apache::inputtags::part='0';
779: @Apache::inputtags::partlist=('0');
1.405 albertel 780: &Apache::lonhomework::reset_show_problem_status();
1.304 albertel 781: $Apache::lonhomework::ignore_response_errors=1;
1.204 albertel 782: }
783: @Apache::inputtags::responselist = ();
784: @Apache::inputtags::importlist = ();
785: @Apache::inputtags::previous=();
786: @Apache::inputtags::previous_version=();
787: $Apache::structuretags::printanswer='No';
788: @Apache::structuretags::whileconds=();
789: @Apache::structuretags::whilebody=();
790: @Apache::structuretags::whileline=();
791: $Apache::lonhomework::scantronmode=0;
792: undef($Apache::lonhomework::name);
1.358 albertel 793: undef($Apache::lonhomework::default_type);
794: undef($Apache::lonhomework::type);
1.204 albertel 795: }
796:
797: sub reset_problem_globals {
798: my ($type)=@_;
799: undef(%Apache::lonhomework::history);
800: undef(%Apache::lonhomework::results);
801: undef($Apache::inputtags::part);
1.208 albertel 802: #don't undef this, lonhomework.pm takes care of this, we use this to
803: #detect if we try to do 2 problems in one file
804: # undef($Apache::lonhomework::parsing_a_problem);
1.204 albertel 805: undef($Apache::lonhomework::name);
1.358 albertel 806: undef($Apache::lonhomework::default_type);
807: undef($Apache::lonhomework::type);
808: undef($Apache::lonhomework::scantronmode);
809: undef($Apache::lonhomework::ignore_response_errors);
1.405 albertel 810: &Apache::lonhomework::reset_show_problem_status();
1.204 albertel 811: }
812:
1.241 albertel 813: sub set_problem_state {
1.240 albertel 814: my ($part)=@_;
1.284 albertel 815: if ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct') {
1.240 albertel 816: $Apache::lonhomework::history{"resource.$part.solved"}=
817: 'correct_by_student';
818: }
819: }
820:
1.241 albertel 821: sub get_problem_status {
822: my ($part)=@_;
1.267 albertel 823: my $problem_status;
1.284 albertel 824: if ($env{'request.state'} eq 'construct' &&
825: defined($env{'form.problemstatus'})) {
826: $problem_status=$env{'form.problemstatus'};
1.267 albertel 827: } else {
828: $problem_status=&Apache::lonnet::EXT("resource.$part.problemstatus");
829: &Apache::lonxml::debug("problem status for $part is $problem_status");
1.284 albertel 830: &Apache::lonxml::debug("env probstat is ".$env{'form.problemstatus'});
1.241 albertel 831: }
832: return $problem_status;
833: }
834:
1.9 albertel 835: sub start_problem {
1.326 albertel 836: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.19 albertel 837:
1.311 foxr 838: # We'll use the redirection to fix up printing of duedates.
1.321 albertel 839: if (!$Apache::lonxml::metamode) {
840: &Apache::lonxml::startredirection();
841: }
1.311 foxr 842:
1.308 foxr 843: # Problems don't nest and we don't allow more than one <problem> in
844: # a .problem file.
845: #
1.184 albertel 846: if ( $Apache::inputtags::part ne '' ||
847: $Apache::lonhomework::parsing_a_problem) {
848: &Apache::lonxml::error('Only one <problem> allowed in a .problem file');
1.326 albertel 849: #my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,$style);
1.159 albertel 850: return '';
851: }
1.184 albertel 852:
853: $Apache::lonhomework::parsing_a_problem=1;
1.204 albertel 854: &init_problem_globals('problem');
1.166 albertel 855:
1.284 albertel 856: if (defined($env{'scantron.maxquest'})) {
1.166 albertel 857: $Apache::lonhomework::scantronmode=1;
858: }
1.161 albertel 859:
1.159 albertel 860: if ($target ne 'analyze') {
1.415 raeburn 861: my $type = &Apache::lonnet::EXT('resource.0.type');
862: $Apache::lonhomework::type=$type;
1.284 albertel 863: if (($env{'request.state'} eq 'construct') &&
1.410 albertel 864: $env{'form.problemtype'} =~ /\S/) {
1.284 albertel 865: $Apache::lonhomework::type=$env{'form.problemtype'};
1.237 albertel 866: }
1.332 albertel 867: &Apache::lonxml::debug("Found this to be of type :$Apache::lonhomework::type:");
1.159 albertel 868: }
1.164 albertel 869: if ($Apache::lonhomework::type eq '' ) {
1.284 albertel 870: my $uri=$env{'request.uri'};
1.159 albertel 871: if ($uri=~/\.(\w+)$/) {
872: $Apache::lonhomework::type=$1;
873: &Apache::lonxml::debug("Using type of $1");
874: } else {
875: $Apache::lonhomework::type='problem';
876: &Apache::lonxml::debug("Using default type, problem, :$uri:");
877: }
1.87 albertel 878: }
1.301 albertel 879: $Apache::lonhomework::default_type = $Apache::lonhomework::type;
1.58 www 880:
1.363 albertel 881: &initialize_storage();
1.389 albertel 882: if ($target ne 'analyze'
883: && $env{'request.state'} eq 'construct') {
884: &set_problem_state('0');
885: }
886:
1.366 albertel 887: if ($target eq 'web') {
888: &Apache::lonxml::debug(" grading history ");
889: &Apache::lonhomework::showhash(%Apache::lonhomework::history);
890: }
1.363 albertel 891:
1.159 albertel 892: #added vars to the scripting enviroment
1.213 albertel 893: my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.248 albertel 894: $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
1.24 albertel 895: &Apache::run::run($expression,$safeeval);
1.159 albertel 896: my $status;
897: my $accessmsg;
898:
1.343 albertel 899: my $name= &get_resource_name($parstack,$safeeval);
1.350 albertel 900: my ($result,$form_tag_start);
1.354 albertel 901: if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
902: || $target eq 'edit') {
1.350 albertel 903: ($result,$form_tag_start) =
904: &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
905: $name);
906: }
907:
1.284 albertel 908: if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
1.159 albertel 909:
910: if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }
911: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
912: $target eq 'tex') {
1.284 albertel 913: if ($env{'form.markaccess'}) {
1.414 albertel 914: my @interval=&Apache::lonnet::EXT("resource.0.interval");
915: &Apache::lonnet::set_first_access($interval[1]);
1.252 albertel 916: }
1.159 albertel 917: #handle rand seed in construction space
918: my $rndseed=&setup_rndseed($safeeval);
1.367 albertel 919: my ($symb)=&Apache::lonnet::whichuser();
1.333 albertel 920: if ($env{'request.state'} ne "construct" &&
921: ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
1.162 albertel 922: $form_tag_start.='<input type="hidden" name="rndseed" value="'.
1.462 raeburn 923: $rndseed.'" />'.
924: '<input type="submit" name="resetdata"
925: value="'.&mt('New Problem Variation').'" />';
1.334 albertel 926: if (exists($env{'form.username'})) {
927: $form_tag_start.=
1.164 albertel 928: '<input type="hidden" name="username"
1.284 albertel 929: value="'.$env{'form.username'}.'" />';
1.334 albertel 930: }
1.462 raeburn 931: if ($env{'request.role.adv'}) {
932: $form_tag_start.= ' <label class="LC_nobreak">'
933: .'<input type="checkbox" name="showallfoils"';
934: if (defined($env{'form.showallfoils'})) {
935: $form_tag_start.=' checked="checked"';
936: }
937: $form_tag_start.= ' /> '
938: .&mt('Show All Foils')
939: .'</label>';
940: }
1.417 www 941: if ($Apache::lonhomework::type eq 'practice') {
1.428 raeburn 942: $form_tag_start.=&practice_problem_header();
1.417 www 943: }
1.462 raeburn 944: $form_tag_start.='<hr />';
1.162 albertel 945: }
1.324 albertel 946:
947: ($status,$accessmsg,my $slot_name,my $slot) =
948: &Apache::lonhomework::check_slot_access('0','problem');
1.159 albertel 949: push (@Apache::inputtags::status,$status);
1.324 albertel 950:
1.159 albertel 951: my $expression='$external::datestatus="'.$status.'";';
952: $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
953: &Apache::run::run($expression,$safeeval);
954: &Apache::lonxml::debug("Got $status");
1.324 albertel 955:
1.159 albertel 956: if (( $status eq 'CLOSED' ) ||
957: ( $status eq 'UNCHECKEDOUT') ||
1.252 albertel 958: ( $status eq 'NOT_YET_VIEWED') ||
1.159 albertel 959: ( $status eq 'BANNED') ||
1.216 albertel 960: ( $status eq 'UNAVAILABLE') ||
1.324 albertel 961: ( $status eq 'NOT_IN_A_SLOT') ||
1.216 albertel 962: ( $status eq 'INVALID_ACCESS')) {
1.326 albertel 963: my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
964: $style);
1.159 albertel 965: if ( $target eq "web" ) {
1.343 albertel 966: my $msg;
1.159 albertel 967: if ($status eq 'UNAVAILABLE') {
1.245 albertel 968: $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';
1.441 raeburn 969: } elsif ($status eq 'NOT_IN_A_SLOT') {
970: $msg.='<h1>'.&mt('You are not currently signed up to work at this time and/or place.').'</h1>';
1.253 albertel 971: } elsif ($status ne 'NOT_YET_VIEWED') {
1.245 albertel 972: $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';
1.159 albertel 973: }
1.216 albertel 974: if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
1.393 www 975: $msg.=&mt('The problem ').$accessmsg;
1.159 albertel 976: } elsif ($status eq 'UNCHECKEDOUT') {
1.343 albertel 977: $msg.=&checkout_msg();
1.252 albertel 978: } elsif ($status eq 'NOT_YET_VIEWED') {
1.253 albertel 979: $msg.=&firstaccess_msg($accessmsg,$symb);
1.325 albertel 980: } elsif ($status eq 'NOT_IN_A_SLOT') {
1.441 raeburn 981: $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
1.159 albertel 982: }
983: $result.=$msg.'<br />';
984: } elsif ($target eq 'tex') {
1.332 albertel 985: my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''
986: : '\begin{minipage}{\textwidth}';
1.443 foxr 987: $result.='\noindent \vskip 1 mm '.
1.332 albertel 988: $startminipage.'\vskip 0 mm';
1.159 albertel 989: if ($status eq 'UNAVAILABLE') {
1.211 albertel 990: $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
1.159 albertel 991: } else {
1.211 albertel 992: $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";
1.159 albertel 993: }
994: }
1.324 albertel 995: } elsif ($status eq 'NEEDS_CHECKIN') {
1.326 albertel 996: my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
997: $style);
1.324 albertel 998: if ($target eq 'web') {
1.375 albertel 999: $result .=
1000: &Apache::bridgetask::proctor_validation_screen($slot);
1.324 albertel 1001: } elsif ($target eq 'grade') {
1002: &Apache::bridgetask::proctor_check_auth($slot_name,$slot,
1003: 'problem');
1004: }
1.159 albertel 1005: } elsif ($target eq 'web') {
1.360 albertel 1006: if ($status eq 'CAN_ANSWER'
1007: && $slot_name ne ''
1008: && $Apache::lonhomework::history{'resource.0.checkedin'} eq '') {
1009: # unproctored slot access, self checkin
1010: &Apache::bridgetask::check_in('problem',undef,undef,
1011: $slot_name);
1012: }
1.368 albertel 1013: $result.="\n $form_tag_start \t".
1.227 albertel 1014: '<input type="hidden" name="submitted" value="yes" />';
1015: # create a page header and exit
1.284 albertel 1016: if ($env{'request.state'} eq "construct") {
1017: $result.= &problem_web_to_edit_header($env{'form.rndseed'});
1.428 raeburn 1018: if ($Apache::lonhomework::type eq 'practice') {
1019: $result.= '<input type="submit" name="resetdata" '.
1020: 'value="'.&mt('New Problem Variation').'" />'.
1021: &practice_problem_header().'<hr />';
1022: }
1.227 albertel 1023: }
1024: # if we are viewing someone else preserve that info
1.284 albertel 1025: if (defined $env{'form.grade_symb'}) {
1.227 albertel 1026: foreach my $field ('symb','courseid','domain','username') {
1027: $result .= '<input type="hidden" name="grade_'.$field.
1.284 albertel 1028: '" value="'.$env{"form.grade_$field"}.'" />'."\n";
1.159 albertel 1029: }
1030: }
1031: } elsif ($target eq 'tex') {
1.319 foxr 1032: $result .= 'INSERTTEXFRONTMATTERHERE';
1033:
1.99 sakharuk 1034: }
1.159 albertel 1035: } elsif ($target eq 'edit') {
1.343 albertel 1036: $result .= $form_tag_start.&problem_edit_header();
1.226 albertel 1037: $Apache::lonxml::warnings_error_header=
1038: &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 1039: my $temp=&Apache::edit::insertlist($target,$token);
1040: $result.=$temp;
1041: } elsif ($target eq 'modified') {
1042: $result=$token->[4];
1043: } else {
1044: # page_start returned a starting result, delete it if we don't need it
1045: $result = '';
1.99 sakharuk 1046: }
1.159 albertel 1047: return $result;
1.9 albertel 1048: }
1049:
1050: sub end_problem {
1.159 albertel 1051: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.321 albertel 1052: my $result;
1.310 foxr 1053:
1.321 albertel 1054: if (!$Apache::lonxml::metamode) {
1055: $result = &Apache::lonxml::endredirection(); #started in &start_problem
1.329 albertel 1056: $Apache::lonxml::post_evaluate=0;
1.321 albertel 1057: }
1.319 foxr 1058:
1059: if ($target eq 'tex') {
1.321 albertel 1060: # Figure out the front matter and replace the
1061: # INSERTTEXFRONTMATTERHERE in result with it. note that we do
1062: # this in end_problem because whether or not we display due
1063: # dates depends on whether due dates have already been
1064: # displayed in the problem parts.
1065:
1.319 foxr 1066: my $frontmatter = '';
1067: my $startminipage = '';
1068: if (not $env{'form.problem_split'}=~/yes/) {
1069: $startminipage = '\begin{minipage}{\textwidth}';
1070: }
1071: my $id = $Apache::inputtags::part;
1072: my $weight = &Apache::lonnet::EXT("resource.$id.weight");
1073: my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages');
1074: my @packages = split /,/,$packages;
1075: my $allow_print_points = 0;
1076: foreach my $partial_key (@packages) {
1077: if ($partial_key=~m/^part_0$/) {
1078: $allow_print_points=1;
1079: }
1080: }
1081: my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
1082: if (defined($maxtries) && $maxtries < 0) { $allow_print_points=0; }
1083: if (lc($env{'course.'.$env{'request.course.id'}.
1084: '.disableexampointprint'}) eq 'yes') {
1085: $allow_print_points=0;
1086: }
1087: my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header');
1.443 foxr 1088: my $begin_doc=' \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$env{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent ';
1.319 foxr 1089: my $toc_line='\vskip 1 mm\noindent '.$startminipage.
1090: '\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
1091:
1092: # Figure out what the due date is and if we need to print
1093: # it in the problem header. We have been logging the
1094: # last due date written to file.
1095:
1096: my $duetime = &Apache::lonnet::EXT("resource.$id.duedate");
1097: my $duedate = POSIX::strftime("%c",localtime($duetime));
1.448 bisitz 1098: my $duedate_text = &mt('Due date: [_1]'
1099: ,&Apache::lonlocal::locallocaltime($duetime));
1.319 foxr 1100: my $temp_file;
1101: my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
1102:
1103: # Figure out what the last printed due date is or set it
1104: # to the epoch if no duedates have been printed.
1105:
1106: my $due_file_content = 0; # If the file does not yet exist, time is the epoch.
1107: if (-e $filename) {
1108: $temp_file = Apache::File->new($filename);
1109: my @due_file = <$temp_file>;
1110: $due_file_content = $due_file[$#due_file];
1111: chomp $due_file_content;
1112: }
1113:
1114: # We display the due date iff it is not the same as the last
1115: # duedate in problem header ($due_file_content), and
1116: # none of our parts displayed a duedate.
1117: #
1118: my $parts_with_displayduedate;
1119: if (defined $Apache::outputtags::showonce{'displayduedate'}) {
1120: $parts_with_displayduedate =
1121: scalar(@{$Apache::outputtags::showonce{'displayduedate'}});
1122: } else {
1123: $parts_with_displayduedate = 0;
1124: }
1125: if (($due_file_content != $duetime) && ($parts_with_displayduedate == 0) ) {
1126: $temp_file = Apache::File->new('>'.$filename);
1127: print $temp_file "$duetime\n";
1128: if (not $env{'request.symb'} =~ m/\.page_/) {
1129: if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {
1130: $frontmatter .= $begin_doc.
1.448 bisitz 1131: '\textit{'.$duedate_text.'} '.$toc_line;
1.319 foxr 1132: } else {
1133: $frontmatter.= $begin_doc.$toc_line;
1.463 foxr 1134: if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) {
1135: $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
1136: }
1.319 foxr 1137: }
1138: } else {
1.448 bisitz 1139: $frontmatter .= '\vskip 1mm\textit{'.$duedate_text.'} \\\\\\\\'.$startminipage;
1.319 foxr 1140: }
1141: } else {
1142: if (not $env{'request.symb'} =~ m/\.page_/) {
1143: $frontmatter .= $begin_doc.$toc_line;
1.463 foxr 1144: if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) {
1145: $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
1146: }
1.319 foxr 1147: } else {
1.381 albertel 1148: $frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage;
1.319 foxr 1149: }
1150: }
1151: $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;
1152: }
1153:
1.159 albertel 1154: my $status=$Apache::inputtags::status['-1'];
1155: if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
1156: $target eq 'tex') {
1.249 albertel 1157: if ( $target eq 'grade' && $Apache::inputtags::part eq '0') {
1.159 albertel 1158: # if part is zero, no <part>s existed, so we need to the grading
1.249 albertel 1159: if ($status eq 'CAN_ANSWER' ||$Apache::lonhomework::scantronmode) {
1160: &Apache::inputtags::grade;
1.324 albertel 1161: } elsif ($status eq 'NEEDS_CHECKIN') {
1162: # no need to grade, and don't want to hide data
1.249 albertel 1163: } else {
1164: # move any submission data to .hidden
1165: &Apache::inputtags::hidealldata($Apache::inputtags::part);
1166: }
1.159 albertel 1167: } elsif ( ($target eq 'web' || $target eq 'tex') &&
1168: $Apache::inputtags::part eq '0' &&
1.252 albertel 1169: $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') {
1.159 albertel 1170: # if part is zero, no <part>s existed, so we need show the current
1171: # grading status
1172: my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
1173: $result.= $gradestatus;
1174: }
1175: if (
1.284 albertel 1176: (($target eq 'web') && ($env{'request.state'} ne 'construct')) ||
1.159 albertel 1177: ($target eq 'answer') || ($target eq 'tex')
1178: ) {
1.227 albertel 1179: if ($target ne 'tex' &&
1.284 albertel 1180: $env{'form.answer_output_mode'} ne 'tex') {
1.254 www 1181: $result.="</form>";
1.348 albertel 1182: $result.= &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields());
1.159 albertel 1183: }
1184: if ($target eq 'web') {
1.346 albertel 1185: $result.= &Apache::loncommon::end_page({'discussion' => 1});
1.159 albertel 1186: } elsif ($target eq 'tex') {
1.178 sakharuk 1187: my $endminipage = '';
1.284 albertel 1188: if (not $env{'form.problem_split'}=~/yes/) {
1.178 sakharuk 1189: $endminipage = '\end{minipage}';
1190: }
1.284 albertel 1191: if ($env{'form.print_discussions'} eq 'yes') {
1.263 sakharuk 1192: $result.=&Apache::lonxml::xmlend($target,$parser);
1.159 albertel 1193: } else {
1.262 sakharuk 1194: $result .= '\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}';
1.284 albertel 1195: if (not $env{'request.symb'} =~ m/\.page_/) {
1.262 sakharuk 1196: $result .= $endminipage.'\end{document} ';
1197: } else {
1.382 albertel 1198: $result .= $endminipage;
1.262 sakharuk 1199: }
1.159 albertel 1200: }
1201: }
1202: }
1203: if ($target eq 'grade') {
1204: &Apache::lonhomework::showhash(%Apache::lonhomework::results);
1205: &finalize_storage();
1206: }
1.284 albertel 1207: if ($target eq 'answer' && ($env{'request.state'} eq 'construct')
1208: && $env{'form.answer_output_mode'} ne 'tex') {
1.346 albertel 1209: $result.=&Apache::loncommon::end_page({'discussion' => 1});
1.294 albertel 1210: # normally we get it from above, but in CSTR
1.172 albertel 1211: # we always show answer mode too.
1.159 albertel 1212: }
1213: } elsif ($target eq 'meta') {
1214: if ($Apache::inputtags::part eq '0') {
1.179 albertel 1215: @Apache::inputtags::response=();
1.159 albertel 1216: $result=&Apache::response::mandatory_part_meta;
1217: }
1.215 albertel 1218: $result.=&Apache::response::meta_part_order();
1.258 albertel 1219: $result.=&Apache::response::meta_response_order();
1.159 albertel 1220: } elsif ($target eq 'edit') {
1221: &Apache::lonxml::debug("in end_problem with $target, edit");
1.314 albertel 1222: $result .= &problem_edit_footer();
1.320 albertel 1223: } elsif ($target eq 'modified') {
1224: $result .= $token->[2];
1.159 albertel 1225: }
1.155 albertel 1226:
1.284 albertel 1227: if ($env{'request.state'} eq 'construct' && $target eq 'web') {
1.177 albertel 1228: &Apache::inputtags::check_for_duplicate_ids();
1229: }
1.204 albertel 1230:
1231: &reset_problem_globals('problem');
1.159 albertel 1232:
1233: return $result;
1.48 albertel 1234: }
1235:
1.108 albertel 1236:
1.48 albertel 1237: sub start_library {
1.159 albertel 1238: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.343 albertel 1239: my ($result,$form_tag_start);
1.371 albertel 1240: if ($#$tagstack eq 0 && $$tagstack[0] eq 'library') {
1.244 albertel 1241: &init_problem_globals('library');
1242: $Apache::lonhomework::type='problem';
1243: }
1.159 albertel 1244: if ($target eq 'edit') {
1.343 albertel 1245: ($result,$form_tag_start)=
1246: &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
1247: 'Edit');
1248: $result.=$form_tag_start.&problem_edit_header();
1.159 albertel 1249: my $temp=&Apache::edit::insertlist($target,$token);
1250: $result.=$temp;
1251: } elsif ($target eq 'modified') {
1252: $result=$token->[4];
1.340 albertel 1253: } elsif (($target eq 'web' || $target eq 'webgrade')
1.371 albertel 1254: && ($#$tagstack eq 0 && $$tagstack[0] eq 'library')
1.340 albertel 1255: && $env{'request.state'} eq "construct" ) {
1.159 albertel 1256: my $name=&get_resource_name($parstack,$safeeval);
1.343 albertel 1257: ($result,$form_tag_start)=
1258: &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
1259: $name);
1.159 albertel 1260: my $rndseed=&setup_rndseed($safeeval);
1.343 albertel 1261: $result.=" \n $form_tag_start".
1.159 albertel 1262: '<input type="hidden" name="submitted" value="yes" />';
1263: $result.=&problem_web_to_edit_header($rndseed);
1.428 raeburn 1264: if ($Apache::lonhomework::type eq 'practice') {
1265: $result.= '<input type="submit" name="resetdata" '.
1266: 'value="'.&mt('New Problem Variation').'" />'.
1267: &practice_problem_header().'<hr />';
1268: }
1.159 albertel 1269: }
1270: return $result;
1.48 albertel 1271: }
1272:
1273: sub end_library {
1.159 albertel 1274: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1275: my $result='';
1276: if ($target eq 'edit') {
1277: $result=&problem_edit_footer();
1.371 albertel 1278: } elsif ($target eq 'web'
1279: && ($#$tagstack eq 0 && $$tagstack[0] eq 'library')
1280: && $env{'request.state'} eq "construct") {
1.349 albertel 1281: $result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});
1.159 albertel 1282: }
1.371 albertel 1283: if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {
1284: &reset_problem_globals('library');
1285: }
1.159 albertel 1286: return $result;
1.197 www 1287: }
1288:
1289: sub start_definetag {
1.326 albertel 1290: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.197 www 1291:
1292: my $result;
1293:
1294: my $name = $token->[2]->{'name'};
1.326 albertel 1295: my $skip=&Apache::lonxml::get_all_text("/definetag",$parser,$style);
1.396 albertel 1296: if ($target eq 'web') {
1297: if ($name=~/^\//) {
1298: $result=
1299: '<br /><table class="LC_sty_end"><tr><th>'.
1300: &mt('END [_1]'.'<tt>'.$name.'</tt>').'</th></tr>';
1301: } else {
1302: $result=
1303: '<br /><table class="LC_sty_begin"><tr><th>'.
1304: &mt('BEGIN [_1]'.'<tt>'.$name.'</tt>').'</th></tr>';
1305: }
1306: $skip = &HTML::Entities::encode($skip, '<>&"');
1307: $result.='<tr><td><pre>'.$skip.'</pre></td></tr></table>';
1.197 www 1308: }
1309: return $result;
1310: }
1311:
1312: sub end_definetag {
1313: return '';
1.1 albertel 1314: }
1315:
1316: sub start_block {
1.201 albertel 1317: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.131 albertel 1318:
1319: my $result;
1.1 albertel 1320:
1.339 albertel 1321: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1322: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.159 albertel 1323: my $code = $token->[2]->{'condition'};
1.385 albertel 1324: if (defined($code) && $code ne '') {
1.137 albertel 1325: if (!$Apache::lonxml::default_homework_loaded) {
1326: &Apache::lonxml::default_homework_load($safeeval);
1327: }
1.131 albertel 1328: $result = &Apache::run::run($code,$safeeval);
1329: &Apache::lonxml::debug("block :$code: returned :$result:");
1330: } else {
1331: $result='1';
1332: }
1333: if ( ! $result ) {
1.201 albertel 1334: my $skip=&Apache::lonxml::get_all_text("/block",$parser,$style);
1.131 albertel 1335: &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
1336: }
1337: $result='';
1338: } elsif ($target eq 'edit') {
1339: $result .=&Apache::edit::tag_start($target,$token);
1340: $result .=&Apache::edit::text_arg('Test Condition:','condition',
1341: $token,40);
1342: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1343: } elsif ($target eq 'modified') {
1344: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1345: $safeeval,'condition');
1346: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.38 albertel 1347: }
1.131 albertel 1348: return $result;
1.1 albertel 1349: }
1350:
1351: sub end_block {
1.167 www 1352: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1353: my $result;
1354: if ($target eq "edit") {
1355: $result.= &Apache::edit::tag_end($target,$token,'');
1356: }
1357: return $result;
1358: }
1359:
1360: sub start_languageblock {
1.201 albertel 1361: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.167 www 1362:
1363: my $result;
1364:
1.339 albertel 1365: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1366: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.201 albertel 1367: my $include = $token->[2]->{'include'};
1368: my $exclude = $token->[2]->{'exclude'};
1.436 raeburn 1369: my @preferred_languages=&Apache::lonlocal::preferred_languages();
1.394 www 1370: # This should not even happen, since we should at least have the server language
1.398 www 1371: if (!$preferred_languages[0]) { $preferred_languages[0]='en'; }
1372: # Now loop over all languages in order of preference
1373: foreach my $preferred_language (@preferred_languages) {
1.394 www 1374: # If the languageblock has no arguments, show the contents
1.399 www 1375: $result=1;
1376: my $found=0;
1.394 www 1377: # Do we have an include argument?
1.398 www 1378: if ($include) {
1.394 www 1379: # If include is specified, by default, don't render the block
1.399 www 1380: $result=0;
1.398 www 1381: foreach my $included_language (split(/\,/,$include)) {
1.394 www 1382: # ... but if my preferred language is included, render it
1.398 www 1383: if ($included_language eq $preferred_language) {
1.399 www 1384: $result=1;
1385: $found=1;
1.398 www 1386: }
1387: }
1388: }
1.394 www 1389: # Do we have an exclude argument?
1.398 www 1390: if ($exclude) {
1.399 www 1391: $result=1;
1.398 www 1392: foreach my $excluded_language (split(/\,/,$exclude)) {
1393: if ($excluded_language eq $preferred_language) {
1.399 www 1394: $result=0;
1395: $found=1;
1.398 www 1396: }
1397: }
1398: }
1.399 www 1399: if ($found) { last; }
1.398 www 1400: }
1.201 albertel 1401: if ( ! $result ) {
1402: my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser,
1403: $style);
1404: &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
1405: }
1406: $result='';
1.167 www 1407: } elsif ($target eq 'edit') {
1408: $result .=&Apache::edit::tag_start($target,$token);
1.211 albertel 1409: $result .=&Apache::edit::text_arg(&mt('Include Language:'),'include',
1.167 www 1410: $token,40);
1.211 albertel 1411: $result .=&Apache::edit::text_arg(&mt('Exclude Language:'),'exclude',
1.167 www 1412: $token,40);
1413: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1414: } elsif ($target eq 'modified') {
1415: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.168 albertel 1416: $safeeval,'include',
1417: 'exclude');
1.167 www 1418: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1419: }
1420: return $result;
1421: }
1422:
1423: sub end_languageblock {
1.170 www 1424: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1425: my $result;
1.201 albertel 1426: if ($target eq "edit") {
1.170 www 1427: $result.= &Apache::edit::tag_end($target,$token,'');
1428: }
1429: return $result;
1430: }
1431:
1.397 albertel 1432: {
1433: my %available_texts;
1434: sub start_translated {
1435: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1436: &Apache::lonxml::register('Apache::structuretags',('lang'));
1437: undef(%available_texts);
1438: }
1439:
1440: sub end_translated {
1441: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1442: my $result;
1443: #show the translation on viewable targets
1444: if ($target eq 'web' || $target eq 'tex' || $target eq 'webgrade'||
1445: # or non-viewable targets, if it's embedded in something that
1446: # wants the output
1447: (($target eq 'answer' || $target eq 'analyze'|| $target eq 'grade')
1448: && &Apache::lonxml::in_redirection() ) ) {
1449: my @possibilities = keys(%available_texts);
1450: my $which =
1451: &Apache::loncommon::languages(\@possibilities) || 'default';
1452: $result = $available_texts{$which};
1453: }
1454: undef(%available_texts);
1455: &Apache::lonxml::deregister('Apache::structuretags',('lang'));
1456: return $result;
1457: }
1458:
1459:
1460: sub start_lang {
1461: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1462: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1463: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1464: &Apache::lonxml::startredirection();
1465: }
1466: return '';
1467: }
1468:
1469: sub end_lang {
1470: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1471: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1472: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1473: my $result = &Apache::lonxml::endredirection();
1474: my $which = &Apache::lonxml::get_param('which',$parstack,
1475: $safeeval);
1.431 raeburn 1476: if ($which=~/\w/) {
1477: $available_texts{$which} = $result;
1478: }
1479: my $otherlangs = &Apache::lonxml::get_param('other',$parstack,
1480: $safeeval);
1481: foreach my $language (split(/\s*\,\s*/,$otherlangs)) {
1482: if ($language=~/\w/) {
1483: $available_texts{$language} = $result;
1484: }
1.427 bisitz 1485: }
1486:
1.397 albertel 1487: }
1488: return '';
1489: }
1490: }
1491:
1.170 www 1492: sub start_instructorcomment {
1.201 albertel 1493: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.170 www 1494:
1495: my $result;
1496:
1.339 albertel 1497: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1498: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.468 raeburn 1499: $result=($env{'request.role'}=~/^(in|cc|co|au|ca|li)/);
1.284 albertel 1500: if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) {
1.201 albertel 1501: my $skip=&Apache::lonxml::get_all_text("/instructorcomment",
1502: $parser,$style);
1.170 www 1503: &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
1504: }
1505: $result='';
1506: } elsif ($target eq 'edit') {
1507: $result .=&Apache::edit::tag_start($target,$token);
1508: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1509: }
1510: return $result;
1511: }
1512:
1513: sub end_instructorcomment {
1.159 albertel 1514: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160 albertel 1515: my $result;
1516: if ($target eq "edit") {
1517: $result.= &Apache::edit::tag_end($target,$token,'');
1518: }
1519: return $result;
1.4 tsai 1520: }
1521:
1522: sub start_while {
1.326 albertel 1523: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159 albertel 1524:
1.160 albertel 1525: my $result;
1.339 albertel 1526: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1527: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.160 albertel 1528: my $code = $token->[2]->{'condition'};
1.4 tsai 1529:
1.160 albertel 1530: push( @Apache::structuretags::whileconds, $code);
1531: if (!$Apache::lonxml::default_homework_loaded) {
1532: &Apache::lonxml::default_homework_load($safeeval);
1533: }
1534: my $result = &Apache::run::run($code,$safeeval);
1.326 albertel 1535: my $bodytext=&Apache::lonxml::get_all_text("/while",$parser,$style);
1.160 albertel 1536: push( @Apache::structuretags::whilebody, $bodytext);
1.161 albertel 1537: push( @Apache::structuretags::whileline, $token->[5]);
1538: &Apache::lonxml::debug("s code $code got -$result-");
1.160 albertel 1539: if ( $result ) {
1540: &Apache::lonxml::newparser($parser,\$bodytext);
1541: }
1542: } elsif ($target eq 'edit') {
1543: $result .=&Apache::edit::tag_start($target,$token);
1.211 albertel 1544: $result .=&Apache::edit::text_arg(&mt('Test Condition:'),'condition',
1.160 albertel 1545: $token,40);
1546: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1547: } elsif ($target eq 'modified') {
1548: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1549: $safeeval,'condition');
1550: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.159 albertel 1551: }
1.160 albertel 1552: return $result;
1.4 tsai 1553: }
1554:
1555: sub end_while {
1.159 albertel 1556: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160 albertel 1557: my $result;
1558:
1.339 albertel 1559: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1560: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.160 albertel 1561: my $code = pop(@Apache::structuretags::whileconds);
1562: my $bodytext = pop(@Apache::structuretags::whilebody);
1.161 albertel 1563: my $line = pop(@Apache::structuretags::whileline);
1564: my $return = &Apache::run::run($code,$safeeval);
1565: my $starttime=time;
1566: my $error=0;
1567: while ($return) {
1568: if (time-$starttime >
1569: $Apache::lonnet::perlvar{'lonScriptTimeout'}) {
1.378 albertel 1570: $return = 0; $error=1; next;
1.161 albertel 1571: }
1572: $result.=&Apache::scripttag::xmlparse($bodytext);
1.380 albertel 1573: if ($target eq 'grade' || $target eq 'answer' ||
1574: $target eq 'analyze') {
1575: # grade/answer/analyze should produce no output but if we
1576: # are redirecting, the redirecter should know what to do
1577: # with the output
1578: if (!$Apache::lonxml::redirection) { undef($result); }
1579: }
1.161 albertel 1580: $return = &Apache::run::run($code,$safeeval);
1581: }
1582: if ($error) {
1.430 bisitz 1583: &Apache::lonxml::error('<pre>'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occurred while running <while> on line').' '.$line.'</pre>');
1.160 albertel 1584: }
1585: } elsif ($target eq "edit") {
1586: $result.= &Apache::edit::tag_end($target,$token,'');
1.159 albertel 1587: }
1.160 albertel 1588: return $result;
1.1 albertel 1589: }
1.6 tsai 1590:
1.160 albertel 1591: # <randomlist show="1">
1.6 tsai 1592: # <tag1>..</tag1>
1593: # <tag2>..</tag2>
1594: # <tag3>..</tag3>
1.160 albertel 1595: # ...
1.6 tsai 1596: # </randomlist>
1597: sub start_randomlist {
1.326 albertel 1598: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159 albertel 1599: my $result;
1.339 albertel 1600: if ($target eq 'answer' || $target eq 'grade' || $target eq 'web' ||
1601: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.331 albertel 1602: my $body= &Apache::lonxml::get_all_text("/randomlist",$parser);
1.305 albertel 1603: my $b_parser= HTML::LCParser->new(\$body);
1604: $b_parser->xml_mode(1);
1605: $b_parser->marked_sections(1);
1.159 albertel 1606: my $b_tok;
1607: my @randomlist;
1608: my $list_item;
1609: while($b_tok = $b_parser->get_token() ) {
1610: if($b_tok->[0] eq 'S') { # start tag
1611: # get content of the tag until matching end tag
1612: # get all text upto the matching tag
1613: # and push the content into @randomlist
1614: $list_item = &Apache::lonxml::get_all_text('/'.$b_tok->[1],
1615: $b_parser);
1616: $list_item = "$b_tok->[4]"."$list_item"."</$b_tok->[1]>";
1617: push(@randomlist,$list_item);
1618: # print "<br /><b>START-TAG $b_tok->[1], $b_tok->[4],
1619: # $list_item</b>";
1620: }
1621: if($b_tok->[0] eq 'T') { # text
1622: # what to do with text in between tags?
1623: # print "<b>TEXT $b_tok->[1]</b><br />";
1624: }
1625: # if($b_tok->[0] eq 'E') { # end tag, should not happen
1626: # print "<b>END-TAG $b_tok->[1]</b><br />";
1627: # }
1628: }
1.303 albertel 1629: if (@randomlist) {
1630: my @idx_arr = (0 .. $#randomlist);
1631: &Apache::structuretags::shuffle(\@idx_arr);
1632: my $bodytext = '';
1633: my $show=$#randomlist;
1634: my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
1635: $showarg--;
1636: if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; }
1.439 raeburn 1637: if (($target eq 'analyze') && ($env{'form.check_parts_withrandomlist'})) {
1638: my @currlist;
1639: my $part = $Apache::inputtags::part;
1640: if ($part ne '') {
1641: if (ref($Apache::lonhomework::analyze{'parts_withrandomlist'}) eq 'ARRAY') {
1642: my @currlist = @{$Apache::lonhomework::analyze{'parts_withrandomlist'}};
1643: if (!(grep(/^\Q$part\E$/,@currlist))) {
1644: push(@{$Apache::lonhomework::analyze{'parts_withrandomlist'}},$part);
1645: }
1646: } else {
1647: push(@{$Apache::lonhomework::analyze{'parts_withrandomlist'}},$part);
1648: }
1649: }
1650: }
1.303 albertel 1651: for(0 .. $show) {
1652: $bodytext .= "$randomlist[ $idx_arr[$_] ]";
1653: }
1654: &Apache::lonxml::newparser($parser,\$bodytext);
1.159 albertel 1655: }
1656: } elsif ($target eq 'edit' ) {
1657: $result .=&Apache::edit::tag_start($target,$token);
1658: $result .=&Apache::edit::text_arg('Maximum Tags to Show:','show',
1659: $token,5);
1660: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1661: } elsif ($target eq 'modified' ) {
1662: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1663: $safeeval,'show');
1664: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1665: }
1666: return $result;
1.7 tsai 1667: }
1668:
1669: sub shuffle {
1670: my $a=shift;
1671: my $i;
1.303 albertel 1672: if (ref($a) eq 'ARRAY' && @$a) {
1.251 albertel 1673: &Apache::response::pushrandomnumber();
1.159 albertel 1674: for($i=@$a;--$i;) {
1675: my $j=int(&Math::Random::random_uniform() * ($i+1));
1676: next if $i == $j;
1677: @$a[$i,$j] = @$a[$j,$i];
1678: }
1.251 albertel 1679: &Apache::response::poprandomnumber();
1.7 tsai 1680: }
1.6 tsai 1681: }
1682:
1683: sub end_randomlist {
1.159 albertel 1684: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1685: my $result;
1686: if ($target eq 'edit' ) {
1687: $result=&Apache::edit::tag_end($target,$token,
1688: 'End Randomly Parsed Block');
1689: }
1690: return $result;
1.6 tsai 1691: }
1692:
1.283 albertel 1693: sub ordered_show_check {
1694: my $last_part=$Apache::inputtags::partlist[-2];
1695: my $in_order=
1696: &Apache::lonnet::EXT('resource.'.$Apache::inputtags::part.'.ordered');
1697: my $in_order_show=1;
1698: if ($last_part ne '0' && lc($in_order) eq 'yes') {
1699: $in_order_show=&Apache::response::check_status($last_part);
1700: }
1701: return $in_order_show;
1702: }
1703:
1.469 www 1704:
1705: sub start_startpartmarker {
1706: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1707: my $result='';
1708: if ($target eq 'edit') {
1709: $result=&Apache::edit::tag_start($target,$token);
1710: $result.=&mt('Marker for the start of a part. Place end marker below to wrap in-between tags into a new part.').'</td></tr>';
1711: $result.=&Apache::edit::end_table();
1712:
1713: }
1714: return $result;
1715: }
1716:
1717: sub end_startpartmarker {
1718: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1719: my @result;
1720: if ($target eq 'edit') { $result[1]='no'; }
1721: return @result;
1722: }
1723:
1724: sub start_endpartmarker {
1725: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1726: my $result='';
1727: if ($target eq 'edit') {
1728: $result=&Apache::edit::tag_start($target,$token);
1729: $result.=&mt('Marker for the end of a part. Place start marker above to wrap in-between tags into a new part.').'</td></tr>';
1730: $result.=&Apache::edit::end_table();
1731:
1732: }
1733: return $result;
1734: }
1735:
1736: sub end_endpartmarker {
1737: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1738: my @result;
1739: if ($target eq 'edit') { $result[1]='no'; }
1740: return @result;
1741: }
1742:
1743:
1744:
1745:
1746:
1.11 albertel 1747: sub start_part {
1.326 albertel 1748: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.321 albertel 1749: if (!$Apache::lonxml::metamode) {
1750: &Apache::lonxml::startredirection(); # we'll use redirection to fix up
1751: # duedates.
1752: }
1.159 albertel 1753: my $result='';
1.386 albertel 1754: my $id= &Apache::lonxml::get_id($parstack,$safeeval);
1.159 albertel 1755: $Apache::inputtags::part=$id;
1.177 albertel 1756: push(@Apache::inputtags::partlist,$id);
1757: @Apache::inputtags::response=();
1.159 albertel 1758: @Apache::inputtags::previous=();
1759: @Apache::inputtags::previous_version=();
1.405 albertel 1760: &Apache::lonhomework::set_show_problem_status(&get_problem_status($id));
1.403 albertel 1761: &Apache::response::reset_params();
1762:
1.159 albertel 1763: my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.259 albertel 1764: my $newtype=&Apache::lonnet::EXT("resource.$id.type");
1765: if ($newtype) { $Apache::lonhomework::type=$newtype; }
1.283 albertel 1766: my $in_order_show=&ordered_show_check();
1.214 albertel 1767: my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.259 albertel 1768: $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
1.209 albertel 1769: &Apache::run::run($expression,$safeeval);
1.159 albertel 1770:
1771: if ($target eq 'meta') {
1.224 www 1772: my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
1773: return &Apache::response::mandatory_part_meta.
1774: &Apache::response::meta_parameter_write('display','string',$display,'Part Description');
1.159 albertel 1775: } elsif ($target eq 'web' || $target eq 'grade' ||
1776: $target eq 'answer' || $target eq 'tex') {
1.283 albertel 1777: if ($hidden || !$in_order_show) {
1.326 albertel 1778: my $bodytext=&Apache::lonxml::get_all_text("/part",$parser,$style);
1.159 albertel 1779: } else {
1780: my ($status,$accessmsg) = &Apache::lonhomework::check_access($id);
1781: push (@Apache::inputtags::status,$status);
1782: my $expression='$external::datestatus="'.$status.'";';
1783: $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
1784: &Apache::run::run($expression,$safeeval);
1.284 albertel 1785: if ($env{'request.state'} eq 'construct') {
1.241 albertel 1786: &set_problem_state($Apache::inputtags::part);
1.240 albertel 1787: }
1.216 albertel 1788: if (( $status eq 'CLOSED' ) ||
1789: ( $status eq 'UNCHECKEDOUT') ||
1.252 albertel 1790: ( $status eq 'NOT_YET_VIEWED') ||
1.216 albertel 1791: ( $status eq 'BANNED') ||
1792: ( $status eq 'UNAVAILABLE') ||
1793: ( $status eq 'INVALID_ACCESS')) {
1.326 albertel 1794: my $bodytext=&Apache::lonxml::get_all_text("/part",$parser,
1795: $style);
1.159 albertel 1796: if ( $target eq "web" ) {
1.211 albertel 1797: $result="<br />".&mt('Part is not open to be viewed. It')." $accessmsg<br />";
1.159 albertel 1798: } elsif ( $target eq 'tex' ) {
1.284 albertel 1799: if (not $env{'form.problem_split'}=~/yes/) {
1.211 albertel 1800: $result="\\end{minipage}\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\\\begin{minipage}{\\textwidth}";
1.195 sakharuk 1801: } else {
1.211 albertel 1802: $result="\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\";
1.195 sakharuk 1803: }
1.159 albertel 1804: }
1805: } else {
1806: if ($target eq 'tex') {
1.284 albertel 1807: if (not $env{'form.problem_split'}=~/yes/) {
1.264 sakharuk 1808: if ($$tagstack[-2] eq 'td') {
1.388 foxr 1809: $result.='\noindent \begin{minipage}{\textwidth}\noindent';
1.264 sakharuk 1810: } else {
1811: $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
1812: }
1.195 sakharuk 1813: }
1.159 albertel 1814: my $weight = &Apache::lonnet::EXT("resource.$id.weight");
1.284 albertel 1815: my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages');
1.222 sakharuk 1816: my @allkeys = split /,/,$allkeys;
1817: my $allow_print_points = 0;
1818: foreach my $partial_key (@allkeys) {
1.230 albertel 1819: if ($partial_key=~m/^part_(.*)$/) {
1.222 sakharuk 1820: if ($1 ne '0') {$allow_print_points=1;}
1821: }
1822: }
1.275 albertel 1823: my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
1824: if (defined($maxtries) && $maxtries < 0) {
1825: $allow_print_points=0;
1826: }
1.302 albertel 1827: if (lc($env{'course.'.$env{'request.course.id'}.
1828: '.disableexampointprint'}) eq 'yes') {
1829: $allow_print_points=0;
1830: }
1.463 foxr 1831: if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) {
1832: $result .= '\vskip 10mm\fbox{\textit{'.$weight.' pt}}';
1833:
1834: }
1.233 www 1835: } elsif ($target eq 'web') {
1.356 www 1836: $result.='<a name="'.&escape($Apache::inputtags::part).'" />';
1.159 albertel 1837: }
1838: }
1839: }
1840: } elsif ($target eq 'edit') {
1841: $result.=&Apache::edit::tag_start($target,$token);
1842: $result.=&Apache::edit::text_arg('Part ID:','id',$token).
1843: &Apache::loncommon::help_open_topic("Part_Tag_Edit_Help").
1.224 www 1844: ' '.
1845: &Apache::edit::text_arg('Displayed Part Description:','display',$token).
1.159 albertel 1846: &Apache::edit::end_row().&Apache::edit::start_spanning_row();
1847: } elsif ($target eq 'modified') {
1848: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.225 albertel 1849: $safeeval,'id','display');
1.159 albertel 1850: if ($constructtag) {
1.225 albertel 1851: #limiting ids to only letters numbers, and space
1.224 www 1852: $token->[2]->{'id'}=~s/[^A-Za-z0-9 ]//gs;
1.159 albertel 1853: $result = &Apache::edit::rebuild_tag($token);
1854: }
1855: }
1856: return $result;
1.11 albertel 1857: }
1858:
1859: sub end_part {
1.159 albertel 1860: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1861: &Apache::lonxml::debug("in end_part $target ");
1862: my $status=$Apache::inputtags::status['-1'];
1863: my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.283 albertel 1864: my $in_order_show=&ordered_show_check();
1.321 albertel 1865: my $result;
1866: if (!$Apache::lonxml::metamode) {
1867: $result = &Apache::lonxml::endredirection(); # started in &start_part
1.329 albertel 1868: $Apache::lonxml::post_evaluate=0;
1.321 albertel 1869: }
1.312 albertel 1870: if ($target eq 'grade') {
1.249 albertel 1871: if (($status eq 'CAN_ANSWER' || $Apache::lonhomework::scantronmode) &&
1.283 albertel 1872: !$hidden && $in_order_show) {
1.311 foxr 1873: $result.=&Apache::inputtags::grade;
1.249 albertel 1874: } else {
1875: # move any submission data to .hidden
1876: &Apache::inputtags::hidealldata($Apache::inputtags::part);
1877: }
1.283 albertel 1878: } elsif (($target eq 'web' || $target eq 'tex') &&
1879: !$hidden && $in_order_show) {
1.159 albertel 1880: my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
1881: $target);
1.212 albertel 1882: if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {
1883: $gradestatus='';
1884: }
1.311 foxr 1885: $result.=$gradestatus;
1.265 sakharuk 1886: if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';}
1.181 albertel 1887: } elsif ($target eq 'edit') {
1.311 foxr 1888: $result.=&Apache::edit::end_table();
1.322 albertel 1889: } elsif ($target eq 'modified') {
1890: $result .= $token->[2];
1.159 albertel 1891: }
1892: pop @Apache::inputtags::status;
1893: $Apache::inputtags::part='';
1.295 albertel 1894: $Apache::lonhomework::type = $Apache::lonhomework::default_type;
1.159 albertel 1895: return $result;
1.11 albertel 1896: }
1.1 albertel 1897:
1.25 albertel 1898: sub start_preduedate {
1.326 albertel 1899: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.339 albertel 1900: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1901: $target eq 'tex' || $target eq 'webgrade') {
1.236 albertel 1902: &Apache::lonxml::debug("State in preduedate is ". $Apache::inputtags::status['-1']);
1.300 albertel 1903: if (!$Apache::lonhomework::scantronmode &&
1904: $Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
1.236 albertel 1905: $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
1906: &Apache::lonxml::debug("Wha? ". ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER'));
1.326 albertel 1907: &Apache::lonxml::get_all_text("/preduedate",$parser,$style);
1.159 albertel 1908: }
1.24 albertel 1909: }
1.159 albertel 1910: return '';
1.24 albertel 1911: }
1912:
1.25 albertel 1913: sub end_preduedate {
1.159 albertel 1914: return '';
1.24 albertel 1915: }
1916:
1.369 foxr 1917: # In all the modes where <postanswerdate> text is
1918: # displayable, all we do is eat up the text between the start/stop
1919: # tags if the conditions are not right to display it.
1.25 albertel 1920: sub start_postanswerdate {
1.326 albertel 1921: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.370 foxr 1922: my $pav = &Apache::lonnet::allowed('pav', $env{'request.course.id'}) ||
1923: &Apache::lonnet::allowed('pav',
1924: $env{'request.course.id'}.'/'.$env{'request.course.sec'});
1.369 foxr 1925: if ($target eq 'web' || $target eq 'grade' || $target eq 'webgrade' ||
1.370 foxr 1926: $target eq 'tex' ) {
1.300 albertel 1927: if ($Apache::lonhomework::scantronmode ||
1.370 foxr 1928: $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER' ||
1929: (($target eq 'tex') && !$pav)) {
1.326 albertel 1930: &Apache::lonxml::get_all_text("/postanswerdate",$parser,$style);
1.159 albertel 1931: }
1932: }
1933: return '';
1.24 albertel 1934: }
1935:
1.25 albertel 1936: sub end_postanswerdate {
1.159 albertel 1937: return '';
1.24 albertel 1938: }
1939:
1.25 albertel 1940: sub start_notsolved {
1.326 albertel 1941: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159 albertel 1942: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1.339 albertel 1943: $target eq 'tex' || $target eq 'webgrade') {
1.159 albertel 1944: my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
1945: &Apache::lonxml::debug("not solved has :$gradestatus:");
1.239 albertel 1946: if ($gradestatus =~ /^correct/ &&
1947: &Apache::response::show_answer()) {
1.159 albertel 1948: &Apache::lonxml::debug("skipping");
1.326 albertel 1949: &Apache::lonxml::get_all_text("/notsolved",$parser,$style);
1.159 albertel 1950: }
1.24 albertel 1951: }
1.159 albertel 1952: return '';
1.24 albertel 1953: }
1954:
1.25 albertel 1955: sub end_notsolved {
1.159 albertel 1956: return '';
1.24 albertel 1957: }
1958:
1959: sub start_solved {
1.326 albertel 1960: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159 albertel 1961: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1962: $target eq 'tex') {
1963: my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
1.239 albertel 1964: if ($gradestatus !~ /^correct/ ||
1965: !&Apache::response::show_answer()) {
1.326 albertel 1966: &Apache::lonxml::get_all_text("/solved",$parser,$style);
1.159 albertel 1967: }
1.24 albertel 1968: }
1.159 albertel 1969: return '';
1.24 albertel 1970: }
1971:
1972: sub end_solved {
1.248 albertel 1973: return '';
1974: }
1975:
1976: sub start_problemtype {
1.326 albertel 1977: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.248 albertel 1978: my $result;
1.339 albertel 1979: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1980: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.248 albertel 1981: my $mode=lc(&Apache::lonxml::get_param('mode',$parstack,$safeeval));
1982: if (!defined($mode)) { $mode='show'; }
1983: my $for=&Apache::lonxml::get_param('for',$parstack,$safeeval);
1984: my $found=0;
1985: foreach my $type (split(',',$for)) {
1986: if ($Apache::lonhomework::type eq lc($type)) { $found=1; }
1987: }
1988: if ($mode eq 'show' && !$found) {
1.326 albertel 1989: &Apache::lonxml::get_all_text("/problemtype",$parser,$style);
1.248 albertel 1990: }
1991: if ($mode eq 'hide' && $found) {
1.326 albertel 1992: &Apache::lonxml::get_all_text("/problemtype",$parser,$style);
1.248 albertel 1993: }
1994: } elsif ($target eq 'edit') {
1995: $result .=&Apache::edit::tag_start($target,$token);
1996: $result.=&Apache::edit::select_arg('Mode:','mode',
1997: [['show','Show'],
1998: ['hide','Hide']]
1999: ,$token);
2000: $result .=&Apache::edit::checked_arg('When used as type(s):','for',
2001: [ ['exam','Exam/Quiz Problem'],
2002: ['survey','Survey'],
1.465 raeburn 2003: ['surveycred','Survey (with credit)'],
2004: ['anonsurvey','Anonymous Survey'],
2005: ['anonsurveycred','Anonymous Survey (with credit)'],
1.428 raeburn 2006: ['problem','Homework Problem'],
2007: ['practice','Practice Problem'] ]
1.248 albertel 2008: ,$token);
2009: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
2010: } elsif ($target eq 'modified') {
2011: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
2012: $safeeval,'mode','for');
2013: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
2014: }
2015: return $result;
2016: }
2017:
2018: sub end_problemtype {
1.159 albertel 2019: return '';
1.24 albertel 2020: }
1.34 albertel 2021:
2022: sub start_startouttext {
1.159 albertel 2023: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
2024: my @result=(''.'');
2025: if ($target eq 'edit' || $target eq 'modified' ) { @result=('','no'); }
1.404 albertel 2026:
2027: my $nesting =
2028: &Apache::lonxml::set_state('outtext',
2029: &Apache::lonxml::get_state('outtext')+1);
2030: if ($nesting > 1 && $env{'request.state'} eq 'construct') {
2031: &Apache::lonxml::error("Nesting of <startouttext /> not allowed, on line ".$token->[5]);
2032: }
1.159 albertel 2033: return (@result);
1.34 albertel 2034: }
1.159 albertel 2035:
1.34 albertel 2036: sub end_startouttext {
1.326 albertel 2037: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159 albertel 2038: my $result='';
2039: my $text='';
2040: if ($target eq 'edit') {
1.424 foxr 2041: my $areaid = 'homework_edit_'.$Apache::lonxml::curdepth;
1.326 albertel 2042: $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style);
1.437 raeburn 2043: $result.=&Apache::edit::start_table($token)."<tr><td>".&mt('Text Block')."</td>"
1.438 bisitz 2044: .'<td><span class="LC_nobreak">'.&mt('Delete?').' '
1.437 raeburn 2045: .&Apache::edit::deletelist($target,$token)
2046: .'</span></td>';
1.425 raeburn 2047: unless ($env{'environment.wysiwygeditor'} eq 'on') {
1.434 foxr 2048: $result .= '<td align="left">'
2049: .&Apache::lonhtmlcommon::dragmath_button($areaid,1)
2050: .'</td>'
2051: .'<td>'
2052: .&Apache::edit::insertlist($target,$token)
2053: .'</td>';
2054: }
1.425 raeburn 2055: $result.='<td align="right" valign="top">' .
1.434 foxr 2056: &Apache::loncommon::helpLatexCheatsheet().
1.159 albertel 2057: &Apache::edit::end_row().
1.362 albertel 2058: &Apache::edit::start_spanning_row()."\n".
1.255 www 2059: &Apache::edit::editfield($token->[1],$text,"",80,8,1);
1.159 albertel 2060: }
2061: if ($target eq 'modified') {
1.219 albertel 2062: $result='<startouttext />'.&Apache::edit::modifiedfield("endouttext",$parser);
1.159 albertel 2063: }
2064: if ($target eq 'tex') {
2065: $result .= '\noindent ';
2066: }
2067: return $result;
1.34 albertel 2068: }
1.159 albertel 2069:
1.34 albertel 2070: sub start_endouttext {
1.159 albertel 2071: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
2072: my $result='';
2073: if ($target eq "edit" ) { $result="</td></tr>".&Apache::edit::end_table()."\n"; }
2074: if ($target eq "modified") {
2075: $result='<endouttext />'.
1.377 albertel 2076: &Apache::edit::handle_insertafter('startouttext');
2077: }
1.404 albertel 2078:
2079: my $nesting =
2080: &Apache::lonxml::set_state('outtext',
2081: &Apache::lonxml::get_state('outtext')-1);
2082: if ($nesting < 0 && $env{'request.state'} eq 'construct') {
2083: &Apache::lonxml::error(" Extraneous <endouttext /> not allowed on line ".$token->[5]);
2084: &Apache::lonxml::set_state('outtext', 0);
2085: }
1.159 albertel 2086: return $result;
1.34 albertel 2087: }
1.159 albertel 2088:
1.34 albertel 2089: sub end_endouttext {
1.159 albertel 2090: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
2091: my @result=('','');
2092: if ($target eq "edit" || $target eq 'modified') { @result=('','no'); }
2093: return (@result);
1.34 albertel 2094: }
1.159 albertel 2095:
1.45 albertel 2096: sub delete_startouttext {
1.326 albertel 2097: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
2098: # my $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style);
1.159 albertel 2099: my $text=$$parser['-1']->get_text("/endouttext");
2100: my $ntoken=$$parser['-1']->get_token();
2101: &Apache::lonxml::debug("Deleting :$text: and :$ntoken->[0]:$ntoken->[1]:$ntoken->[2]: for startouttext");
2102: &Apache::lonxml::end_tag($tagstack,$parstack,$ntoken);
2103: # Deleting 2 parallel tag pairs, but we need the numbers later to look like
2104: # they did the last time round
2105: &Apache::lonxml::increasedepth($ntoken);
2106: &Apache::lonxml::decreasedepth($ntoken);
2107: return 1;
1.193 www 2108: }
2109:
2110: sub start_simpleeditbutton {
2111: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
2112: my $result='';
1.284 albertel 2113: if (($env{'form.simple_edit_button'} ne 'off') &&
1.273 albertel 2114: ($target eq 'web') &&
1.330 albertel 2115: (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
1.284 albertel 2116: my $url=$env{'request.noversionuri'};
1.193 www 2117: $url=~s/\?.*$//;
1.367 albertel 2118: my ($symb) = &Apache::lonnet::whichuser();
1.451 bisitz 2119: # Warning makes more sense and is more important on edit screen
1.442 bisitz 2120: # $result='<p class="LC_warning">'
2121: # .&mt('Note: it can take up to 10 minutes for changes to take effect for all users.')
2122: # .&Apache::loncommon::help_open_topic('Caching')
2123: # .'</p>';
1.451 bisitz 2124: $result.=&Apache::lonhtmlcommon::start_funclist()
2125: .&Apache::lonhtmlcommon::add_item_funclist(
2126: '<a href="'.$url.'/smpedit?symb='.&escape($symb).'">'
2127: .&mt('Edit').'</a>')
2128: .&Apache::lonhtmlcommon::end_funclist();
1.442 bisitz 2129:
1.193 www 2130: }
2131: return $result;
2132: }
2133:
2134: sub end_simpleeditbutton {
2135: return '';
1.45 albertel 2136: }
1.34 albertel 2137:
1.428 raeburn 2138: sub practice_problem_header {
2139: return '<span class="LC_info"><h3>'.&mt('Practice Problem').'</h3></span>'.
2140: '<span class="LC_info">'.&mt('Submissions are not permanently recorded').
2141: '</span>';
2142: }
2143:
1.1 albertel 2144: 1;
2145: __END__
1.435 jms 2146:
2147: =pod
2148:
2149: =back
2150:
2151: =cut
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>