Annotation of loncom/homework/structuretags.pm, revision 1.472
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.472 ! raeburn 4: # $Id: structuretags.pm,v 1.471 2010/07/29 21:16:40 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.472 ! raeburn 652: my (%aggregate,%anoncounter);
1.286 albertel 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')) {
1.472 ! raeburn 683: $anoncounter{$symb."\0".$part} = 1;
1.470 raeburn 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: }
1.472 ! raeburn 703: if (keys(%anoncounter) > 0) {
! 704: &Apache::lonnet::cinc('nohist_anonsurveys',\%anoncounter,
! 705: $cdomain,$cname);
! 706: }
1.292 raeburn 707: }
1.289 albertel 708:
1.65 albertel 709: sub checkout_msg {
1.211 albertel 710: my %lt=&Apache::lonlocal::texthash(
711: 'resource'=>'The resource needs to be checked out',
712: '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.',
713: 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',
714: 'checkout'=>'Check out Exam for Viewing',
715: 'checkout?'=>'Check out Exam?');
1.352 albertel 716: my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
1.159 albertel 717: return (<<ENDCHECKOUT);
1.211 albertel 718: <h2>$lt{'resource'}</h2>
719: <p>$lt{'id_expln'}</p>
1.449 bisitz 720: <p class="LC_warning">$lt{'warning'}</p>
1.444 bisitz 721: <form name="checkout" method="post" action="$uri">
1.91 albertel 722: <input type="hidden" name="doescheckout" value="yes" />
1.211 albertel 723: <input type="button" name="checkoutbutton" value="$lt{'checkout'}" onClick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" />
1.65 albertel 724: </form>
725: ENDCHECKOUT
726: }
727:
1.252 albertel 728: sub firstaccess_msg {
1.253 albertel 729: my ($time,$symb)=@_;
1.414 albertel 730: my $result;
731: my @interval=&Apache::lonnet::EXT("resource.0.interval");
732: if ($interval[1] eq 'map') {
733: my ($map)=&Apache::lonnet::decode_symb($symb);
734: my $foldertitle=&Apache::lonnet::gettitle($map);
735:
736: &Apache::lonxml::debug("map is $map title is $foldertitle");
1.418 bisitz 737: $result .= "<h2>".&mt('The resources in "[_1]" are open for a limited time.'
738: .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".'
739: ,$foldertitle,$time)."</h2>";
1.414 albertel 740: } elsif ($interval[1] eq 'course') {
741: my $course = $env{'course.'.$env{'request.course.id'}.'.description'};
1.418 bisitz 742: $result .= "<h2>".&mt('The resources in "[_1]" are open for a limited time.'
743: .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".'
744: ,$course,$time)."</h2>";
1.414 albertel 745: } else {
746: my $title=&Apache::lonnet::gettitle($symb);
1.418 bisitz 747: $result .= "<h2>".&mt('This resource "[_1]" is open for a limited time.'
748: .' Once you click the "Show Resource" button below you have [_2] to complete this resource "[_1]".'
749: ,$title,$time)."</h2>";
1.414 albertel 750: }
1.352 albertel 751: my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
1.418 bisitz 752: my $buttontext = &mt('Show Resource');
753: my $timertext = &mt('Start Timer?');
1.414 albertel 754: $result .= (<<ENDCHECKOUT);
1.444 bisitz 755: <form name="markaccess" method="post" action="$uri">
1.252 albertel 756: <input type="hidden" name="markaccess" value="yes" />
1.418 bisitz 757: <input type="button" name="accessbutton" value="$buttontext" onClick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" />
1.252 albertel 758: </form>
759: ENDCHECKOUT
1.414 albertel 760: return $result;
1.252 albertel 761: }
762:
1.204 albertel 763: sub init_problem_globals {
764: my ($type)=@_;
765: #initialize globals
1.308 foxr 766: # For problems, we start out in part 0 (outside a <part> tag).
767: # and part 0 is used to describe the main body of the <problem>
768: #
1.204 albertel 769: if ($type eq 'problem') {
770: $Apache::inputtags::part='0';
771: @Apache::inputtags::partlist=('0');
1.405 albertel 772: &Apache::lonhomework::set_show_problem_status(&get_problem_status('0'));
1.266 albertel 773: $Apache::lonhomework::ignore_response_errors=0;
1.308 foxr 774:
1.266 albertel 775: } elsif ($type eq 'library') {
1.204 albertel 776: $Apache::inputtags::part='';
777: @Apache::inputtags::partlist=();
1.405 albertel 778: &Apache::lonhomework::reset_show_problem_status();
1.266 albertel 779: $Apache::lonhomework::ignore_response_errors=1;
1.308 foxr 780:
1.304 albertel 781: } elsif ($type eq 'Task') {
782: $Apache::inputtags::part='0';
783: @Apache::inputtags::partlist=('0');
1.405 albertel 784: &Apache::lonhomework::reset_show_problem_status();
1.304 albertel 785: $Apache::lonhomework::ignore_response_errors=1;
1.204 albertel 786: }
787: @Apache::inputtags::responselist = ();
788: @Apache::inputtags::importlist = ();
789: @Apache::inputtags::previous=();
790: @Apache::inputtags::previous_version=();
791: $Apache::structuretags::printanswer='No';
792: @Apache::structuretags::whileconds=();
793: @Apache::structuretags::whilebody=();
794: @Apache::structuretags::whileline=();
795: $Apache::lonhomework::scantronmode=0;
796: undef($Apache::lonhomework::name);
1.358 albertel 797: undef($Apache::lonhomework::default_type);
798: undef($Apache::lonhomework::type);
1.204 albertel 799: }
800:
801: sub reset_problem_globals {
802: my ($type)=@_;
803: undef(%Apache::lonhomework::history);
804: undef(%Apache::lonhomework::results);
805: undef($Apache::inputtags::part);
1.208 albertel 806: #don't undef this, lonhomework.pm takes care of this, we use this to
807: #detect if we try to do 2 problems in one file
808: # undef($Apache::lonhomework::parsing_a_problem);
1.204 albertel 809: undef($Apache::lonhomework::name);
1.358 albertel 810: undef($Apache::lonhomework::default_type);
811: undef($Apache::lonhomework::type);
812: undef($Apache::lonhomework::scantronmode);
813: undef($Apache::lonhomework::ignore_response_errors);
1.405 albertel 814: &Apache::lonhomework::reset_show_problem_status();
1.204 albertel 815: }
816:
1.241 albertel 817: sub set_problem_state {
1.240 albertel 818: my ($part)=@_;
1.284 albertel 819: if ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct') {
1.240 albertel 820: $Apache::lonhomework::history{"resource.$part.solved"}=
821: 'correct_by_student';
822: }
823: }
824:
1.241 albertel 825: sub get_problem_status {
826: my ($part)=@_;
1.267 albertel 827: my $problem_status;
1.284 albertel 828: if ($env{'request.state'} eq 'construct' &&
829: defined($env{'form.problemstatus'})) {
830: $problem_status=$env{'form.problemstatus'};
1.267 albertel 831: } else {
832: $problem_status=&Apache::lonnet::EXT("resource.$part.problemstatus");
833: &Apache::lonxml::debug("problem status for $part is $problem_status");
1.284 albertel 834: &Apache::lonxml::debug("env probstat is ".$env{'form.problemstatus'});
1.241 albertel 835: }
836: return $problem_status;
837: }
838:
1.9 albertel 839: sub start_problem {
1.326 albertel 840: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.19 albertel 841:
1.311 foxr 842: # We'll use the redirection to fix up printing of duedates.
1.321 albertel 843: if (!$Apache::lonxml::metamode) {
844: &Apache::lonxml::startredirection();
845: }
1.311 foxr 846:
1.308 foxr 847: # Problems don't nest and we don't allow more than one <problem> in
848: # a .problem file.
849: #
1.184 albertel 850: if ( $Apache::inputtags::part ne '' ||
851: $Apache::lonhomework::parsing_a_problem) {
852: &Apache::lonxml::error('Only one <problem> allowed in a .problem file');
1.326 albertel 853: #my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,$style);
1.159 albertel 854: return '';
855: }
1.184 albertel 856:
857: $Apache::lonhomework::parsing_a_problem=1;
1.204 albertel 858: &init_problem_globals('problem');
1.166 albertel 859:
1.284 albertel 860: if (defined($env{'scantron.maxquest'})) {
1.166 albertel 861: $Apache::lonhomework::scantronmode=1;
862: }
1.161 albertel 863:
1.159 albertel 864: if ($target ne 'analyze') {
1.415 raeburn 865: my $type = &Apache::lonnet::EXT('resource.0.type');
866: $Apache::lonhomework::type=$type;
1.284 albertel 867: if (($env{'request.state'} eq 'construct') &&
1.410 albertel 868: $env{'form.problemtype'} =~ /\S/) {
1.284 albertel 869: $Apache::lonhomework::type=$env{'form.problemtype'};
1.237 albertel 870: }
1.332 albertel 871: &Apache::lonxml::debug("Found this to be of type :$Apache::lonhomework::type:");
1.159 albertel 872: }
1.164 albertel 873: if ($Apache::lonhomework::type eq '' ) {
1.284 albertel 874: my $uri=$env{'request.uri'};
1.159 albertel 875: if ($uri=~/\.(\w+)$/) {
876: $Apache::lonhomework::type=$1;
877: &Apache::lonxml::debug("Using type of $1");
878: } else {
879: $Apache::lonhomework::type='problem';
880: &Apache::lonxml::debug("Using default type, problem, :$uri:");
881: }
1.87 albertel 882: }
1.301 albertel 883: $Apache::lonhomework::default_type = $Apache::lonhomework::type;
1.58 www 884:
1.363 albertel 885: &initialize_storage();
1.389 albertel 886: if ($target ne 'analyze'
887: && $env{'request.state'} eq 'construct') {
888: &set_problem_state('0');
889: }
890:
1.366 albertel 891: if ($target eq 'web') {
892: &Apache::lonxml::debug(" grading history ");
893: &Apache::lonhomework::showhash(%Apache::lonhomework::history);
894: }
1.363 albertel 895:
1.159 albertel 896: #added vars to the scripting enviroment
1.213 albertel 897: my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.248 albertel 898: $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
1.24 albertel 899: &Apache::run::run($expression,$safeeval);
1.159 albertel 900: my $status;
901: my $accessmsg;
902:
1.343 albertel 903: my $name= &get_resource_name($parstack,$safeeval);
1.350 albertel 904: my ($result,$form_tag_start);
1.354 albertel 905: if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
906: || $target eq 'edit') {
1.350 albertel 907: ($result,$form_tag_start) =
908: &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
909: $name);
910: }
911:
1.284 albertel 912: if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
1.159 albertel 913:
914: if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }
915: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
916: $target eq 'tex') {
1.284 albertel 917: if ($env{'form.markaccess'}) {
1.414 albertel 918: my @interval=&Apache::lonnet::EXT("resource.0.interval");
919: &Apache::lonnet::set_first_access($interval[1]);
1.252 albertel 920: }
1.159 albertel 921: #handle rand seed in construction space
922: my $rndseed=&setup_rndseed($safeeval);
1.367 albertel 923: my ($symb)=&Apache::lonnet::whichuser();
1.333 albertel 924: if ($env{'request.state'} ne "construct" &&
925: ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
1.162 albertel 926: $form_tag_start.='<input type="hidden" name="rndseed" value="'.
1.462 raeburn 927: $rndseed.'" />'.
928: '<input type="submit" name="resetdata"
929: value="'.&mt('New Problem Variation').'" />';
1.334 albertel 930: if (exists($env{'form.username'})) {
931: $form_tag_start.=
1.164 albertel 932: '<input type="hidden" name="username"
1.284 albertel 933: value="'.$env{'form.username'}.'" />';
1.334 albertel 934: }
1.462 raeburn 935: if ($env{'request.role.adv'}) {
936: $form_tag_start.= ' <label class="LC_nobreak">'
937: .'<input type="checkbox" name="showallfoils"';
938: if (defined($env{'form.showallfoils'})) {
939: $form_tag_start.=' checked="checked"';
940: }
941: $form_tag_start.= ' /> '
942: .&mt('Show All Foils')
943: .'</label>';
944: }
1.417 www 945: if ($Apache::lonhomework::type eq 'practice') {
1.428 raeburn 946: $form_tag_start.=&practice_problem_header();
1.417 www 947: }
1.462 raeburn 948: $form_tag_start.='<hr />';
1.162 albertel 949: }
1.324 albertel 950:
951: ($status,$accessmsg,my $slot_name,my $slot) =
952: &Apache::lonhomework::check_slot_access('0','problem');
1.159 albertel 953: push (@Apache::inputtags::status,$status);
1.324 albertel 954:
1.159 albertel 955: my $expression='$external::datestatus="'.$status.'";';
956: $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
957: &Apache::run::run($expression,$safeeval);
958: &Apache::lonxml::debug("Got $status");
1.324 albertel 959:
1.159 albertel 960: if (( $status eq 'CLOSED' ) ||
961: ( $status eq 'UNCHECKEDOUT') ||
1.252 albertel 962: ( $status eq 'NOT_YET_VIEWED') ||
1.159 albertel 963: ( $status eq 'BANNED') ||
1.216 albertel 964: ( $status eq 'UNAVAILABLE') ||
1.324 albertel 965: ( $status eq 'NOT_IN_A_SLOT') ||
1.216 albertel 966: ( $status eq 'INVALID_ACCESS')) {
1.326 albertel 967: my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
968: $style);
1.159 albertel 969: if ( $target eq "web" ) {
1.343 albertel 970: my $msg;
1.159 albertel 971: if ($status eq 'UNAVAILABLE') {
1.245 albertel 972: $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';
1.441 raeburn 973: } elsif ($status eq 'NOT_IN_A_SLOT') {
974: $msg.='<h1>'.&mt('You are not currently signed up to work at this time and/or place.').'</h1>';
1.253 albertel 975: } elsif ($status ne 'NOT_YET_VIEWED') {
1.245 albertel 976: $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';
1.159 albertel 977: }
1.216 albertel 978: if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
1.393 www 979: $msg.=&mt('The problem ').$accessmsg;
1.159 albertel 980: } elsif ($status eq 'UNCHECKEDOUT') {
1.343 albertel 981: $msg.=&checkout_msg();
1.252 albertel 982: } elsif ($status eq 'NOT_YET_VIEWED') {
1.253 albertel 983: $msg.=&firstaccess_msg($accessmsg,$symb);
1.325 albertel 984: } elsif ($status eq 'NOT_IN_A_SLOT') {
1.441 raeburn 985: $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
1.159 albertel 986: }
987: $result.=$msg.'<br />';
988: } elsif ($target eq 'tex') {
1.332 albertel 989: my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''
990: : '\begin{minipage}{\textwidth}';
1.443 foxr 991: $result.='\noindent \vskip 1 mm '.
1.332 albertel 992: $startminipage.'\vskip 0 mm';
1.159 albertel 993: if ($status eq 'UNAVAILABLE') {
1.211 albertel 994: $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
1.159 albertel 995: } else {
1.211 albertel 996: $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";
1.159 albertel 997: }
998: }
1.324 albertel 999: } elsif ($status eq 'NEEDS_CHECKIN') {
1.326 albertel 1000: my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
1001: $style);
1.324 albertel 1002: if ($target eq 'web') {
1.375 albertel 1003: $result .=
1004: &Apache::bridgetask::proctor_validation_screen($slot);
1.324 albertel 1005: } elsif ($target eq 'grade') {
1006: &Apache::bridgetask::proctor_check_auth($slot_name,$slot,
1007: 'problem');
1008: }
1.159 albertel 1009: } elsif ($target eq 'web') {
1.360 albertel 1010: if ($status eq 'CAN_ANSWER'
1011: && $slot_name ne ''
1012: && $Apache::lonhomework::history{'resource.0.checkedin'} eq '') {
1013: # unproctored slot access, self checkin
1014: &Apache::bridgetask::check_in('problem',undef,undef,
1015: $slot_name);
1016: }
1.368 albertel 1017: $result.="\n $form_tag_start \t".
1.227 albertel 1018: '<input type="hidden" name="submitted" value="yes" />';
1019: # create a page header and exit
1.284 albertel 1020: if ($env{'request.state'} eq "construct") {
1021: $result.= &problem_web_to_edit_header($env{'form.rndseed'});
1.428 raeburn 1022: if ($Apache::lonhomework::type eq 'practice') {
1023: $result.= '<input type="submit" name="resetdata" '.
1024: 'value="'.&mt('New Problem Variation').'" />'.
1025: &practice_problem_header().'<hr />';
1026: }
1.227 albertel 1027: }
1028: # if we are viewing someone else preserve that info
1.284 albertel 1029: if (defined $env{'form.grade_symb'}) {
1.227 albertel 1030: foreach my $field ('symb','courseid','domain','username') {
1031: $result .= '<input type="hidden" name="grade_'.$field.
1.284 albertel 1032: '" value="'.$env{"form.grade_$field"}.'" />'."\n";
1.159 albertel 1033: }
1034: }
1035: } elsif ($target eq 'tex') {
1.319 foxr 1036: $result .= 'INSERTTEXFRONTMATTERHERE';
1037:
1.99 sakharuk 1038: }
1.159 albertel 1039: } elsif ($target eq 'edit') {
1.343 albertel 1040: $result .= $form_tag_start.&problem_edit_header();
1.226 albertel 1041: $Apache::lonxml::warnings_error_header=
1042: &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 1043: my $temp=&Apache::edit::insertlist($target,$token);
1044: $result.=$temp;
1045: } elsif ($target eq 'modified') {
1046: $result=$token->[4];
1047: } else {
1048: # page_start returned a starting result, delete it if we don't need it
1049: $result = '';
1.99 sakharuk 1050: }
1.159 albertel 1051: return $result;
1.9 albertel 1052: }
1053:
1054: sub end_problem {
1.159 albertel 1055: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.321 albertel 1056: my $result;
1.310 foxr 1057:
1.321 albertel 1058: if (!$Apache::lonxml::metamode) {
1059: $result = &Apache::lonxml::endredirection(); #started in &start_problem
1.329 albertel 1060: $Apache::lonxml::post_evaluate=0;
1.321 albertel 1061: }
1.319 foxr 1062:
1063: if ($target eq 'tex') {
1.321 albertel 1064: # Figure out the front matter and replace the
1065: # INSERTTEXFRONTMATTERHERE in result with it. note that we do
1066: # this in end_problem because whether or not we display due
1067: # dates depends on whether due dates have already been
1068: # displayed in the problem parts.
1069:
1.319 foxr 1070: my $frontmatter = '';
1071: my $startminipage = '';
1072: if (not $env{'form.problem_split'}=~/yes/) {
1073: $startminipage = '\begin{minipage}{\textwidth}';
1074: }
1075: my $id = $Apache::inputtags::part;
1076: my $weight = &Apache::lonnet::EXT("resource.$id.weight");
1077: my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages');
1078: my @packages = split /,/,$packages;
1079: my $allow_print_points = 0;
1080: foreach my $partial_key (@packages) {
1081: if ($partial_key=~m/^part_0$/) {
1082: $allow_print_points=1;
1083: }
1084: }
1085: my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
1086: if (defined($maxtries) && $maxtries < 0) { $allow_print_points=0; }
1087: if (lc($env{'course.'.$env{'request.course.id'}.
1088: '.disableexampointprint'}) eq 'yes') {
1089: $allow_print_points=0;
1090: }
1091: my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header');
1.443 foxr 1092: 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 1093: my $toc_line='\vskip 1 mm\noindent '.$startminipage.
1094: '\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
1095:
1096: # Figure out what the due date is and if we need to print
1097: # it in the problem header. We have been logging the
1098: # last due date written to file.
1099:
1100: my $duetime = &Apache::lonnet::EXT("resource.$id.duedate");
1101: my $duedate = POSIX::strftime("%c",localtime($duetime));
1.448 bisitz 1102: my $duedate_text = &mt('Due date: [_1]'
1103: ,&Apache::lonlocal::locallocaltime($duetime));
1.319 foxr 1104: my $temp_file;
1105: my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
1106:
1107: # Figure out what the last printed due date is or set it
1108: # to the epoch if no duedates have been printed.
1109:
1110: my $due_file_content = 0; # If the file does not yet exist, time is the epoch.
1111: if (-e $filename) {
1112: $temp_file = Apache::File->new($filename);
1113: my @due_file = <$temp_file>;
1114: $due_file_content = $due_file[$#due_file];
1115: chomp $due_file_content;
1116: }
1117:
1118: # We display the due date iff it is not the same as the last
1119: # duedate in problem header ($due_file_content), and
1120: # none of our parts displayed a duedate.
1121: #
1122: my $parts_with_displayduedate;
1123: if (defined $Apache::outputtags::showonce{'displayduedate'}) {
1124: $parts_with_displayduedate =
1125: scalar(@{$Apache::outputtags::showonce{'displayduedate'}});
1126: } else {
1127: $parts_with_displayduedate = 0;
1128: }
1129: if (($due_file_content != $duetime) && ($parts_with_displayduedate == 0) ) {
1130: $temp_file = Apache::File->new('>'.$filename);
1131: print $temp_file "$duetime\n";
1132: if (not $env{'request.symb'} =~ m/\.page_/) {
1133: if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {
1134: $frontmatter .= $begin_doc.
1.448 bisitz 1135: '\textit{'.$duedate_text.'} '.$toc_line;
1.319 foxr 1136: } else {
1137: $frontmatter.= $begin_doc.$toc_line;
1.463 foxr 1138: if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) {
1139: $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
1140: }
1.319 foxr 1141: }
1142: } else {
1.448 bisitz 1143: $frontmatter .= '\vskip 1mm\textit{'.$duedate_text.'} \\\\\\\\'.$startminipage;
1.319 foxr 1144: }
1145: } else {
1146: if (not $env{'request.symb'} =~ m/\.page_/) {
1147: $frontmatter .= $begin_doc.$toc_line;
1.463 foxr 1148: if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) {
1149: $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
1150: }
1.319 foxr 1151: } else {
1.381 albertel 1152: $frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage;
1.319 foxr 1153: }
1154: }
1155: $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;
1156: }
1157:
1.159 albertel 1158: my $status=$Apache::inputtags::status['-1'];
1159: if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
1160: $target eq 'tex') {
1.249 albertel 1161: if ( $target eq 'grade' && $Apache::inputtags::part eq '0') {
1.159 albertel 1162: # if part is zero, no <part>s existed, so we need to the grading
1.249 albertel 1163: if ($status eq 'CAN_ANSWER' ||$Apache::lonhomework::scantronmode) {
1164: &Apache::inputtags::grade;
1.324 albertel 1165: } elsif ($status eq 'NEEDS_CHECKIN') {
1166: # no need to grade, and don't want to hide data
1.249 albertel 1167: } else {
1168: # move any submission data to .hidden
1169: &Apache::inputtags::hidealldata($Apache::inputtags::part);
1170: }
1.159 albertel 1171: } elsif ( ($target eq 'web' || $target eq 'tex') &&
1172: $Apache::inputtags::part eq '0' &&
1.252 albertel 1173: $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') {
1.159 albertel 1174: # if part is zero, no <part>s existed, so we need show the current
1175: # grading status
1176: my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
1177: $result.= $gradestatus;
1178: }
1179: if (
1.284 albertel 1180: (($target eq 'web') && ($env{'request.state'} ne 'construct')) ||
1.159 albertel 1181: ($target eq 'answer') || ($target eq 'tex')
1182: ) {
1.227 albertel 1183: if ($target ne 'tex' &&
1.284 albertel 1184: $env{'form.answer_output_mode'} ne 'tex') {
1.254 www 1185: $result.="</form>";
1.348 albertel 1186: $result.= &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields());
1.159 albertel 1187: }
1188: if ($target eq 'web') {
1.346 albertel 1189: $result.= &Apache::loncommon::end_page({'discussion' => 1});
1.159 albertel 1190: } elsif ($target eq 'tex') {
1.178 sakharuk 1191: my $endminipage = '';
1.284 albertel 1192: if (not $env{'form.problem_split'}=~/yes/) {
1.178 sakharuk 1193: $endminipage = '\end{minipage}';
1194: }
1.284 albertel 1195: if ($env{'form.print_discussions'} eq 'yes') {
1.263 sakharuk 1196: $result.=&Apache::lonxml::xmlend($target,$parser);
1.159 albertel 1197: } else {
1.262 sakharuk 1198: $result .= '\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}';
1.284 albertel 1199: if (not $env{'request.symb'} =~ m/\.page_/) {
1.262 sakharuk 1200: $result .= $endminipage.'\end{document} ';
1201: } else {
1.382 albertel 1202: $result .= $endminipage;
1.262 sakharuk 1203: }
1.159 albertel 1204: }
1205: }
1206: }
1207: if ($target eq 'grade') {
1208: &Apache::lonhomework::showhash(%Apache::lonhomework::results);
1209: &finalize_storage();
1210: }
1.284 albertel 1211: if ($target eq 'answer' && ($env{'request.state'} eq 'construct')
1212: && $env{'form.answer_output_mode'} ne 'tex') {
1.346 albertel 1213: $result.=&Apache::loncommon::end_page({'discussion' => 1});
1.294 albertel 1214: # normally we get it from above, but in CSTR
1.172 albertel 1215: # we always show answer mode too.
1.159 albertel 1216: }
1217: } elsif ($target eq 'meta') {
1218: if ($Apache::inputtags::part eq '0') {
1.179 albertel 1219: @Apache::inputtags::response=();
1.159 albertel 1220: $result=&Apache::response::mandatory_part_meta;
1221: }
1.215 albertel 1222: $result.=&Apache::response::meta_part_order();
1.258 albertel 1223: $result.=&Apache::response::meta_response_order();
1.159 albertel 1224: } elsif ($target eq 'edit') {
1225: &Apache::lonxml::debug("in end_problem with $target, edit");
1.314 albertel 1226: $result .= &problem_edit_footer();
1.320 albertel 1227: } elsif ($target eq 'modified') {
1228: $result .= $token->[2];
1.159 albertel 1229: }
1.155 albertel 1230:
1.284 albertel 1231: if ($env{'request.state'} eq 'construct' && $target eq 'web') {
1.177 albertel 1232: &Apache::inputtags::check_for_duplicate_ids();
1233: }
1.204 albertel 1234:
1235: &reset_problem_globals('problem');
1.159 albertel 1236:
1237: return $result;
1.48 albertel 1238: }
1239:
1.108 albertel 1240:
1.48 albertel 1241: sub start_library {
1.159 albertel 1242: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.343 albertel 1243: my ($result,$form_tag_start);
1.371 albertel 1244: if ($#$tagstack eq 0 && $$tagstack[0] eq 'library') {
1.244 albertel 1245: &init_problem_globals('library');
1246: $Apache::lonhomework::type='problem';
1247: }
1.159 albertel 1248: if ($target eq 'edit') {
1.343 albertel 1249: ($result,$form_tag_start)=
1250: &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
1251: 'Edit');
1252: $result.=$form_tag_start.&problem_edit_header();
1.159 albertel 1253: my $temp=&Apache::edit::insertlist($target,$token);
1254: $result.=$temp;
1255: } elsif ($target eq 'modified') {
1256: $result=$token->[4];
1.340 albertel 1257: } elsif (($target eq 'web' || $target eq 'webgrade')
1.371 albertel 1258: && ($#$tagstack eq 0 && $$tagstack[0] eq 'library')
1.340 albertel 1259: && $env{'request.state'} eq "construct" ) {
1.159 albertel 1260: my $name=&get_resource_name($parstack,$safeeval);
1.343 albertel 1261: ($result,$form_tag_start)=
1262: &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
1263: $name);
1.159 albertel 1264: my $rndseed=&setup_rndseed($safeeval);
1.343 albertel 1265: $result.=" \n $form_tag_start".
1.159 albertel 1266: '<input type="hidden" name="submitted" value="yes" />';
1267: $result.=&problem_web_to_edit_header($rndseed);
1.428 raeburn 1268: if ($Apache::lonhomework::type eq 'practice') {
1269: $result.= '<input type="submit" name="resetdata" '.
1270: 'value="'.&mt('New Problem Variation').'" />'.
1271: &practice_problem_header().'<hr />';
1272: }
1.159 albertel 1273: }
1274: return $result;
1.48 albertel 1275: }
1276:
1277: sub end_library {
1.159 albertel 1278: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1279: my $result='';
1280: if ($target eq 'edit') {
1281: $result=&problem_edit_footer();
1.371 albertel 1282: } elsif ($target eq 'web'
1283: && ($#$tagstack eq 0 && $$tagstack[0] eq 'library')
1284: && $env{'request.state'} eq "construct") {
1.349 albertel 1285: $result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});
1.159 albertel 1286: }
1.371 albertel 1287: if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {
1288: &reset_problem_globals('library');
1289: }
1.159 albertel 1290: return $result;
1.197 www 1291: }
1292:
1293: sub start_definetag {
1.326 albertel 1294: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.197 www 1295:
1296: my $result;
1297:
1298: my $name = $token->[2]->{'name'};
1.326 albertel 1299: my $skip=&Apache::lonxml::get_all_text("/definetag",$parser,$style);
1.396 albertel 1300: if ($target eq 'web') {
1301: if ($name=~/^\//) {
1302: $result=
1303: '<br /><table class="LC_sty_end"><tr><th>'.
1304: &mt('END [_1]'.'<tt>'.$name.'</tt>').'</th></tr>';
1305: } else {
1306: $result=
1307: '<br /><table class="LC_sty_begin"><tr><th>'.
1308: &mt('BEGIN [_1]'.'<tt>'.$name.'</tt>').'</th></tr>';
1309: }
1310: $skip = &HTML::Entities::encode($skip, '<>&"');
1311: $result.='<tr><td><pre>'.$skip.'</pre></td></tr></table>';
1.197 www 1312: }
1313: return $result;
1314: }
1315:
1316: sub end_definetag {
1317: return '';
1.1 albertel 1318: }
1319:
1320: sub start_block {
1.201 albertel 1321: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.131 albertel 1322:
1323: my $result;
1.1 albertel 1324:
1.339 albertel 1325: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1326: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.159 albertel 1327: my $code = $token->[2]->{'condition'};
1.385 albertel 1328: if (defined($code) && $code ne '') {
1.137 albertel 1329: if (!$Apache::lonxml::default_homework_loaded) {
1330: &Apache::lonxml::default_homework_load($safeeval);
1331: }
1.131 albertel 1332: $result = &Apache::run::run($code,$safeeval);
1333: &Apache::lonxml::debug("block :$code: returned :$result:");
1334: } else {
1335: $result='1';
1336: }
1337: if ( ! $result ) {
1.201 albertel 1338: my $skip=&Apache::lonxml::get_all_text("/block",$parser,$style);
1.131 albertel 1339: &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
1340: }
1341: $result='';
1342: } elsif ($target eq 'edit') {
1343: $result .=&Apache::edit::tag_start($target,$token);
1344: $result .=&Apache::edit::text_arg('Test Condition:','condition',
1345: $token,40);
1346: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1347: } elsif ($target eq 'modified') {
1348: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1349: $safeeval,'condition');
1350: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.38 albertel 1351: }
1.131 albertel 1352: return $result;
1.1 albertel 1353: }
1354:
1355: sub end_block {
1.167 www 1356: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1357: my $result;
1358: if ($target eq "edit") {
1359: $result.= &Apache::edit::tag_end($target,$token,'');
1360: }
1361: return $result;
1362: }
1363:
1364: sub start_languageblock {
1.201 albertel 1365: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.167 www 1366:
1367: my $result;
1368:
1.339 albertel 1369: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1370: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.201 albertel 1371: my $include = $token->[2]->{'include'};
1372: my $exclude = $token->[2]->{'exclude'};
1.436 raeburn 1373: my @preferred_languages=&Apache::lonlocal::preferred_languages();
1.394 www 1374: # This should not even happen, since we should at least have the server language
1.398 www 1375: if (!$preferred_languages[0]) { $preferred_languages[0]='en'; }
1376: # Now loop over all languages in order of preference
1377: foreach my $preferred_language (@preferred_languages) {
1.394 www 1378: # If the languageblock has no arguments, show the contents
1.399 www 1379: $result=1;
1380: my $found=0;
1.394 www 1381: # Do we have an include argument?
1.398 www 1382: if ($include) {
1.394 www 1383: # If include is specified, by default, don't render the block
1.399 www 1384: $result=0;
1.398 www 1385: foreach my $included_language (split(/\,/,$include)) {
1.394 www 1386: # ... but if my preferred language is included, render it
1.398 www 1387: if ($included_language eq $preferred_language) {
1.399 www 1388: $result=1;
1389: $found=1;
1.398 www 1390: }
1391: }
1392: }
1.394 www 1393: # Do we have an exclude argument?
1.398 www 1394: if ($exclude) {
1.399 www 1395: $result=1;
1.398 www 1396: foreach my $excluded_language (split(/\,/,$exclude)) {
1397: if ($excluded_language eq $preferred_language) {
1.399 www 1398: $result=0;
1399: $found=1;
1.398 www 1400: }
1401: }
1402: }
1.399 www 1403: if ($found) { last; }
1.398 www 1404: }
1.201 albertel 1405: if ( ! $result ) {
1406: my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser,
1407: $style);
1408: &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
1409: }
1410: $result='';
1.167 www 1411: } elsif ($target eq 'edit') {
1412: $result .=&Apache::edit::tag_start($target,$token);
1.211 albertel 1413: $result .=&Apache::edit::text_arg(&mt('Include Language:'),'include',
1.167 www 1414: $token,40);
1.211 albertel 1415: $result .=&Apache::edit::text_arg(&mt('Exclude Language:'),'exclude',
1.167 www 1416: $token,40);
1417: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1418: } elsif ($target eq 'modified') {
1419: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.168 albertel 1420: $safeeval,'include',
1421: 'exclude');
1.167 www 1422: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1423: }
1424: return $result;
1425: }
1426:
1427: sub end_languageblock {
1.170 www 1428: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1429: my $result;
1.201 albertel 1430: if ($target eq "edit") {
1.170 www 1431: $result.= &Apache::edit::tag_end($target,$token,'');
1432: }
1433: return $result;
1434: }
1435:
1.397 albertel 1436: {
1437: my %available_texts;
1438: sub start_translated {
1439: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1440: &Apache::lonxml::register('Apache::structuretags',('lang'));
1441: undef(%available_texts);
1442: }
1443:
1444: sub end_translated {
1445: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1446: my $result;
1447: #show the translation on viewable targets
1448: if ($target eq 'web' || $target eq 'tex' || $target eq 'webgrade'||
1449: # or non-viewable targets, if it's embedded in something that
1450: # wants the output
1451: (($target eq 'answer' || $target eq 'analyze'|| $target eq 'grade')
1452: && &Apache::lonxml::in_redirection() ) ) {
1453: my @possibilities = keys(%available_texts);
1454: my $which =
1455: &Apache::loncommon::languages(\@possibilities) || 'default';
1456: $result = $available_texts{$which};
1457: }
1458: undef(%available_texts);
1459: &Apache::lonxml::deregister('Apache::structuretags',('lang'));
1460: return $result;
1461: }
1462:
1463:
1464: sub start_lang {
1465: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1466: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1467: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1468: &Apache::lonxml::startredirection();
1469: }
1470: return '';
1471: }
1472:
1473: sub end_lang {
1474: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1475: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1476: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1477: my $result = &Apache::lonxml::endredirection();
1478: my $which = &Apache::lonxml::get_param('which',$parstack,
1479: $safeeval);
1.431 raeburn 1480: if ($which=~/\w/) {
1481: $available_texts{$which} = $result;
1482: }
1483: my $otherlangs = &Apache::lonxml::get_param('other',$parstack,
1484: $safeeval);
1485: foreach my $language (split(/\s*\,\s*/,$otherlangs)) {
1486: if ($language=~/\w/) {
1487: $available_texts{$language} = $result;
1488: }
1.427 bisitz 1489: }
1490:
1.397 albertel 1491: }
1492: return '';
1493: }
1494: }
1495:
1.170 www 1496: sub start_instructorcomment {
1.201 albertel 1497: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.170 www 1498:
1499: my $result;
1500:
1.339 albertel 1501: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1502: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.468 raeburn 1503: $result=($env{'request.role'}=~/^(in|cc|co|au|ca|li)/);
1.284 albertel 1504: if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) {
1.201 albertel 1505: my $skip=&Apache::lonxml::get_all_text("/instructorcomment",
1506: $parser,$style);
1.170 www 1507: &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
1508: }
1509: $result='';
1510: } elsif ($target eq 'edit') {
1511: $result .=&Apache::edit::tag_start($target,$token);
1512: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1513: }
1514: return $result;
1515: }
1516:
1517: sub end_instructorcomment {
1.159 albertel 1518: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160 albertel 1519: my $result;
1520: if ($target eq "edit") {
1521: $result.= &Apache::edit::tag_end($target,$token,'');
1522: }
1523: return $result;
1.4 tsai 1524: }
1525:
1526: sub start_while {
1.326 albertel 1527: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159 albertel 1528:
1.160 albertel 1529: my $result;
1.339 albertel 1530: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1531: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.160 albertel 1532: my $code = $token->[2]->{'condition'};
1.4 tsai 1533:
1.160 albertel 1534: push( @Apache::structuretags::whileconds, $code);
1535: if (!$Apache::lonxml::default_homework_loaded) {
1536: &Apache::lonxml::default_homework_load($safeeval);
1537: }
1538: my $result = &Apache::run::run($code,$safeeval);
1.326 albertel 1539: my $bodytext=&Apache::lonxml::get_all_text("/while",$parser,$style);
1.160 albertel 1540: push( @Apache::structuretags::whilebody, $bodytext);
1.161 albertel 1541: push( @Apache::structuretags::whileline, $token->[5]);
1542: &Apache::lonxml::debug("s code $code got -$result-");
1.160 albertel 1543: if ( $result ) {
1544: &Apache::lonxml::newparser($parser,\$bodytext);
1545: }
1546: } elsif ($target eq 'edit') {
1547: $result .=&Apache::edit::tag_start($target,$token);
1.211 albertel 1548: $result .=&Apache::edit::text_arg(&mt('Test Condition:'),'condition',
1.160 albertel 1549: $token,40);
1550: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1551: } elsif ($target eq 'modified') {
1552: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1553: $safeeval,'condition');
1554: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.159 albertel 1555: }
1.160 albertel 1556: return $result;
1.4 tsai 1557: }
1558:
1559: sub end_while {
1.159 albertel 1560: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160 albertel 1561: my $result;
1562:
1.339 albertel 1563: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1564: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.160 albertel 1565: my $code = pop(@Apache::structuretags::whileconds);
1566: my $bodytext = pop(@Apache::structuretags::whilebody);
1.161 albertel 1567: my $line = pop(@Apache::structuretags::whileline);
1568: my $return = &Apache::run::run($code,$safeeval);
1569: my $starttime=time;
1570: my $error=0;
1571: while ($return) {
1572: if (time-$starttime >
1573: $Apache::lonnet::perlvar{'lonScriptTimeout'}) {
1.378 albertel 1574: $return = 0; $error=1; next;
1.161 albertel 1575: }
1576: $result.=&Apache::scripttag::xmlparse($bodytext);
1.380 albertel 1577: if ($target eq 'grade' || $target eq 'answer' ||
1578: $target eq 'analyze') {
1579: # grade/answer/analyze should produce no output but if we
1580: # are redirecting, the redirecter should know what to do
1581: # with the output
1582: if (!$Apache::lonxml::redirection) { undef($result); }
1583: }
1.161 albertel 1584: $return = &Apache::run::run($code,$safeeval);
1585: }
1586: if ($error) {
1.430 bisitz 1587: &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 1588: }
1589: } elsif ($target eq "edit") {
1590: $result.= &Apache::edit::tag_end($target,$token,'');
1.159 albertel 1591: }
1.160 albertel 1592: return $result;
1.1 albertel 1593: }
1.6 tsai 1594:
1.160 albertel 1595: # <randomlist show="1">
1.6 tsai 1596: # <tag1>..</tag1>
1597: # <tag2>..</tag2>
1598: # <tag3>..</tag3>
1.160 albertel 1599: # ...
1.6 tsai 1600: # </randomlist>
1601: sub start_randomlist {
1.326 albertel 1602: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159 albertel 1603: my $result;
1.339 albertel 1604: if ($target eq 'answer' || $target eq 'grade' || $target eq 'web' ||
1605: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.331 albertel 1606: my $body= &Apache::lonxml::get_all_text("/randomlist",$parser);
1.305 albertel 1607: my $b_parser= HTML::LCParser->new(\$body);
1608: $b_parser->xml_mode(1);
1609: $b_parser->marked_sections(1);
1.159 albertel 1610: my $b_tok;
1611: my @randomlist;
1612: my $list_item;
1613: while($b_tok = $b_parser->get_token() ) {
1614: if($b_tok->[0] eq 'S') { # start tag
1615: # get content of the tag until matching end tag
1616: # get all text upto the matching tag
1617: # and push the content into @randomlist
1618: $list_item = &Apache::lonxml::get_all_text('/'.$b_tok->[1],
1619: $b_parser);
1620: $list_item = "$b_tok->[4]"."$list_item"."</$b_tok->[1]>";
1621: push(@randomlist,$list_item);
1622: # print "<br /><b>START-TAG $b_tok->[1], $b_tok->[4],
1623: # $list_item</b>";
1624: }
1625: if($b_tok->[0] eq 'T') { # text
1626: # what to do with text in between tags?
1627: # print "<b>TEXT $b_tok->[1]</b><br />";
1628: }
1629: # if($b_tok->[0] eq 'E') { # end tag, should not happen
1630: # print "<b>END-TAG $b_tok->[1]</b><br />";
1631: # }
1632: }
1.303 albertel 1633: if (@randomlist) {
1634: my @idx_arr = (0 .. $#randomlist);
1635: &Apache::structuretags::shuffle(\@idx_arr);
1636: my $bodytext = '';
1637: my $show=$#randomlist;
1638: my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
1639: $showarg--;
1640: if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; }
1.439 raeburn 1641: if (($target eq 'analyze') && ($env{'form.check_parts_withrandomlist'})) {
1642: my @currlist;
1643: my $part = $Apache::inputtags::part;
1644: if ($part ne '') {
1645: if (ref($Apache::lonhomework::analyze{'parts_withrandomlist'}) eq 'ARRAY') {
1646: my @currlist = @{$Apache::lonhomework::analyze{'parts_withrandomlist'}};
1647: if (!(grep(/^\Q$part\E$/,@currlist))) {
1648: push(@{$Apache::lonhomework::analyze{'parts_withrandomlist'}},$part);
1649: }
1650: } else {
1651: push(@{$Apache::lonhomework::analyze{'parts_withrandomlist'}},$part);
1652: }
1653: }
1654: }
1.303 albertel 1655: for(0 .. $show) {
1656: $bodytext .= "$randomlist[ $idx_arr[$_] ]";
1657: }
1658: &Apache::lonxml::newparser($parser,\$bodytext);
1.159 albertel 1659: }
1660: } elsif ($target eq 'edit' ) {
1661: $result .=&Apache::edit::tag_start($target,$token);
1662: $result .=&Apache::edit::text_arg('Maximum Tags to Show:','show',
1663: $token,5);
1664: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1665: } elsif ($target eq 'modified' ) {
1666: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1667: $safeeval,'show');
1668: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1669: }
1670: return $result;
1.7 tsai 1671: }
1672:
1673: sub shuffle {
1674: my $a=shift;
1675: my $i;
1.303 albertel 1676: if (ref($a) eq 'ARRAY' && @$a) {
1.251 albertel 1677: &Apache::response::pushrandomnumber();
1.159 albertel 1678: for($i=@$a;--$i;) {
1679: my $j=int(&Math::Random::random_uniform() * ($i+1));
1680: next if $i == $j;
1681: @$a[$i,$j] = @$a[$j,$i];
1682: }
1.251 albertel 1683: &Apache::response::poprandomnumber();
1.7 tsai 1684: }
1.6 tsai 1685: }
1686:
1687: sub end_randomlist {
1.159 albertel 1688: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1689: my $result;
1690: if ($target eq 'edit' ) {
1691: $result=&Apache::edit::tag_end($target,$token,
1692: 'End Randomly Parsed Block');
1693: }
1694: return $result;
1.6 tsai 1695: }
1696:
1.283 albertel 1697: sub ordered_show_check {
1698: my $last_part=$Apache::inputtags::partlist[-2];
1699: my $in_order=
1700: &Apache::lonnet::EXT('resource.'.$Apache::inputtags::part.'.ordered');
1701: my $in_order_show=1;
1702: if ($last_part ne '0' && lc($in_order) eq 'yes') {
1703: $in_order_show=&Apache::response::check_status($last_part);
1704: }
1705: return $in_order_show;
1706: }
1707:
1.469 www 1708:
1709: sub start_startpartmarker {
1710: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1711: my $result='';
1712: if ($target eq 'edit') {
1713: $result=&Apache::edit::tag_start($target,$token);
1714: $result.=&mt('Marker for the start of a part. Place end marker below to wrap in-between tags into a new part.').'</td></tr>';
1715: $result.=&Apache::edit::end_table();
1716:
1717: }
1718: return $result;
1719: }
1720:
1721: sub end_startpartmarker {
1722: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1723: my @result;
1724: if ($target eq 'edit') { $result[1]='no'; }
1725: return @result;
1726: }
1727:
1728: sub start_endpartmarker {
1729: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1730: my $result='';
1731: if ($target eq 'edit') {
1732: $result=&Apache::edit::tag_start($target,$token);
1733: $result.=&mt('Marker for the end of a part. Place start marker above to wrap in-between tags into a new part.').'</td></tr>';
1734: $result.=&Apache::edit::end_table();
1735:
1736: }
1737: return $result;
1738: }
1739:
1740: sub end_endpartmarker {
1741: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1742: my @result;
1743: if ($target eq 'edit') { $result[1]='no'; }
1744: return @result;
1745: }
1746:
1747:
1748:
1749:
1750:
1.11 albertel 1751: sub start_part {
1.326 albertel 1752: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.321 albertel 1753: if (!$Apache::lonxml::metamode) {
1754: &Apache::lonxml::startredirection(); # we'll use redirection to fix up
1755: # duedates.
1756: }
1.159 albertel 1757: my $result='';
1.386 albertel 1758: my $id= &Apache::lonxml::get_id($parstack,$safeeval);
1.159 albertel 1759: $Apache::inputtags::part=$id;
1.177 albertel 1760: push(@Apache::inputtags::partlist,$id);
1761: @Apache::inputtags::response=();
1.159 albertel 1762: @Apache::inputtags::previous=();
1763: @Apache::inputtags::previous_version=();
1.405 albertel 1764: &Apache::lonhomework::set_show_problem_status(&get_problem_status($id));
1.403 albertel 1765: &Apache::response::reset_params();
1766:
1.159 albertel 1767: my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.259 albertel 1768: my $newtype=&Apache::lonnet::EXT("resource.$id.type");
1769: if ($newtype) { $Apache::lonhomework::type=$newtype; }
1.283 albertel 1770: my $in_order_show=&ordered_show_check();
1.214 albertel 1771: my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.259 albertel 1772: $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
1.209 albertel 1773: &Apache::run::run($expression,$safeeval);
1.159 albertel 1774:
1775: if ($target eq 'meta') {
1.224 www 1776: my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
1777: return &Apache::response::mandatory_part_meta.
1778: &Apache::response::meta_parameter_write('display','string',$display,'Part Description');
1.159 albertel 1779: } elsif ($target eq 'web' || $target eq 'grade' ||
1780: $target eq 'answer' || $target eq 'tex') {
1.283 albertel 1781: if ($hidden || !$in_order_show) {
1.326 albertel 1782: my $bodytext=&Apache::lonxml::get_all_text("/part",$parser,$style);
1.159 albertel 1783: } else {
1784: my ($status,$accessmsg) = &Apache::lonhomework::check_access($id);
1785: push (@Apache::inputtags::status,$status);
1786: my $expression='$external::datestatus="'.$status.'";';
1787: $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
1788: &Apache::run::run($expression,$safeeval);
1.284 albertel 1789: if ($env{'request.state'} eq 'construct') {
1.241 albertel 1790: &set_problem_state($Apache::inputtags::part);
1.240 albertel 1791: }
1.216 albertel 1792: if (( $status eq 'CLOSED' ) ||
1793: ( $status eq 'UNCHECKEDOUT') ||
1.252 albertel 1794: ( $status eq 'NOT_YET_VIEWED') ||
1.216 albertel 1795: ( $status eq 'BANNED') ||
1796: ( $status eq 'UNAVAILABLE') ||
1797: ( $status eq 'INVALID_ACCESS')) {
1.326 albertel 1798: my $bodytext=&Apache::lonxml::get_all_text("/part",$parser,
1799: $style);
1.159 albertel 1800: if ( $target eq "web" ) {
1.211 albertel 1801: $result="<br />".&mt('Part is not open to be viewed. It')." $accessmsg<br />";
1.159 albertel 1802: } elsif ( $target eq 'tex' ) {
1.284 albertel 1803: if (not $env{'form.problem_split'}=~/yes/) {
1.211 albertel 1804: $result="\\end{minipage}\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\\\begin{minipage}{\\textwidth}";
1.195 sakharuk 1805: } else {
1.211 albertel 1806: $result="\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\";
1.195 sakharuk 1807: }
1.159 albertel 1808: }
1809: } else {
1810: if ($target eq 'tex') {
1.284 albertel 1811: if (not $env{'form.problem_split'}=~/yes/) {
1.264 sakharuk 1812: if ($$tagstack[-2] eq 'td') {
1.388 foxr 1813: $result.='\noindent \begin{minipage}{\textwidth}\noindent';
1.264 sakharuk 1814: } else {
1815: $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
1816: }
1.195 sakharuk 1817: }
1.159 albertel 1818: my $weight = &Apache::lonnet::EXT("resource.$id.weight");
1.284 albertel 1819: my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages');
1.222 sakharuk 1820: my @allkeys = split /,/,$allkeys;
1821: my $allow_print_points = 0;
1822: foreach my $partial_key (@allkeys) {
1.230 albertel 1823: if ($partial_key=~m/^part_(.*)$/) {
1.222 sakharuk 1824: if ($1 ne '0') {$allow_print_points=1;}
1825: }
1826: }
1.275 albertel 1827: my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
1828: if (defined($maxtries) && $maxtries < 0) {
1829: $allow_print_points=0;
1830: }
1.302 albertel 1831: if (lc($env{'course.'.$env{'request.course.id'}.
1832: '.disableexampointprint'}) eq 'yes') {
1833: $allow_print_points=0;
1834: }
1.463 foxr 1835: if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) {
1836: $result .= '\vskip 10mm\fbox{\textit{'.$weight.' pt}}';
1837:
1838: }
1.233 www 1839: } elsif ($target eq 'web') {
1.356 www 1840: $result.='<a name="'.&escape($Apache::inputtags::part).'" />';
1.159 albertel 1841: }
1842: }
1843: }
1844: } elsif ($target eq 'edit') {
1845: $result.=&Apache::edit::tag_start($target,$token);
1846: $result.=&Apache::edit::text_arg('Part ID:','id',$token).
1847: &Apache::loncommon::help_open_topic("Part_Tag_Edit_Help").
1.224 www 1848: ' '.
1849: &Apache::edit::text_arg('Displayed Part Description:','display',$token).
1.159 albertel 1850: &Apache::edit::end_row().&Apache::edit::start_spanning_row();
1851: } elsif ($target eq 'modified') {
1852: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.225 albertel 1853: $safeeval,'id','display');
1.159 albertel 1854: if ($constructtag) {
1.225 albertel 1855: #limiting ids to only letters numbers, and space
1.224 www 1856: $token->[2]->{'id'}=~s/[^A-Za-z0-9 ]//gs;
1.159 albertel 1857: $result = &Apache::edit::rebuild_tag($token);
1858: }
1859: }
1860: return $result;
1.11 albertel 1861: }
1862:
1863: sub end_part {
1.159 albertel 1864: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1865: &Apache::lonxml::debug("in end_part $target ");
1866: my $status=$Apache::inputtags::status['-1'];
1867: my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.283 albertel 1868: my $in_order_show=&ordered_show_check();
1.321 albertel 1869: my $result;
1870: if (!$Apache::lonxml::metamode) {
1871: $result = &Apache::lonxml::endredirection(); # started in &start_part
1.329 albertel 1872: $Apache::lonxml::post_evaluate=0;
1.321 albertel 1873: }
1.312 albertel 1874: if ($target eq 'grade') {
1.249 albertel 1875: if (($status eq 'CAN_ANSWER' || $Apache::lonhomework::scantronmode) &&
1.283 albertel 1876: !$hidden && $in_order_show) {
1.311 foxr 1877: $result.=&Apache::inputtags::grade;
1.249 albertel 1878: } else {
1879: # move any submission data to .hidden
1880: &Apache::inputtags::hidealldata($Apache::inputtags::part);
1881: }
1.283 albertel 1882: } elsif (($target eq 'web' || $target eq 'tex') &&
1883: !$hidden && $in_order_show) {
1.159 albertel 1884: my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
1885: $target);
1.212 albertel 1886: if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {
1887: $gradestatus='';
1888: }
1.311 foxr 1889: $result.=$gradestatus;
1.265 sakharuk 1890: if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';}
1.181 albertel 1891: } elsif ($target eq 'edit') {
1.311 foxr 1892: $result.=&Apache::edit::end_table();
1.322 albertel 1893: } elsif ($target eq 'modified') {
1894: $result .= $token->[2];
1.159 albertel 1895: }
1896: pop @Apache::inputtags::status;
1897: $Apache::inputtags::part='';
1.295 albertel 1898: $Apache::lonhomework::type = $Apache::lonhomework::default_type;
1.159 albertel 1899: return $result;
1.11 albertel 1900: }
1.1 albertel 1901:
1.25 albertel 1902: sub start_preduedate {
1.326 albertel 1903: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.339 albertel 1904: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1905: $target eq 'tex' || $target eq 'webgrade') {
1.236 albertel 1906: &Apache::lonxml::debug("State in preduedate is ". $Apache::inputtags::status['-1']);
1.300 albertel 1907: if (!$Apache::lonhomework::scantronmode &&
1908: $Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
1.236 albertel 1909: $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
1910: &Apache::lonxml::debug("Wha? ". ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER'));
1.326 albertel 1911: &Apache::lonxml::get_all_text("/preduedate",$parser,$style);
1.159 albertel 1912: }
1.24 albertel 1913: }
1.159 albertel 1914: return '';
1.24 albertel 1915: }
1916:
1.25 albertel 1917: sub end_preduedate {
1.159 albertel 1918: return '';
1.24 albertel 1919: }
1920:
1.369 foxr 1921: # In all the modes where <postanswerdate> text is
1922: # displayable, all we do is eat up the text between the start/stop
1923: # tags if the conditions are not right to display it.
1.25 albertel 1924: sub start_postanswerdate {
1.326 albertel 1925: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.370 foxr 1926: my $pav = &Apache::lonnet::allowed('pav', $env{'request.course.id'}) ||
1927: &Apache::lonnet::allowed('pav',
1928: $env{'request.course.id'}.'/'.$env{'request.course.sec'});
1.369 foxr 1929: if ($target eq 'web' || $target eq 'grade' || $target eq 'webgrade' ||
1.370 foxr 1930: $target eq 'tex' ) {
1.300 albertel 1931: if ($Apache::lonhomework::scantronmode ||
1.370 foxr 1932: $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER' ||
1933: (($target eq 'tex') && !$pav)) {
1.326 albertel 1934: &Apache::lonxml::get_all_text("/postanswerdate",$parser,$style);
1.159 albertel 1935: }
1936: }
1937: return '';
1.24 albertel 1938: }
1939:
1.25 albertel 1940: sub end_postanswerdate {
1.159 albertel 1941: return '';
1.24 albertel 1942: }
1943:
1.25 albertel 1944: sub start_notsolved {
1.326 albertel 1945: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159 albertel 1946: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1.339 albertel 1947: $target eq 'tex' || $target eq 'webgrade') {
1.159 albertel 1948: my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
1949: &Apache::lonxml::debug("not solved has :$gradestatus:");
1.239 albertel 1950: if ($gradestatus =~ /^correct/ &&
1951: &Apache::response::show_answer()) {
1.159 albertel 1952: &Apache::lonxml::debug("skipping");
1.326 albertel 1953: &Apache::lonxml::get_all_text("/notsolved",$parser,$style);
1.159 albertel 1954: }
1.24 albertel 1955: }
1.159 albertel 1956: return '';
1.24 albertel 1957: }
1958:
1.25 albertel 1959: sub end_notsolved {
1.159 albertel 1960: return '';
1.24 albertel 1961: }
1962:
1963: sub start_solved {
1.326 albertel 1964: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159 albertel 1965: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1966: $target eq 'tex') {
1967: my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
1.239 albertel 1968: if ($gradestatus !~ /^correct/ ||
1969: !&Apache::response::show_answer()) {
1.326 albertel 1970: &Apache::lonxml::get_all_text("/solved",$parser,$style);
1.159 albertel 1971: }
1.24 albertel 1972: }
1.159 albertel 1973: return '';
1.24 albertel 1974: }
1975:
1976: sub end_solved {
1.248 albertel 1977: return '';
1978: }
1979:
1980: sub start_problemtype {
1.326 albertel 1981: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.248 albertel 1982: my $result;
1.339 albertel 1983: if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1984: $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.248 albertel 1985: my $mode=lc(&Apache::lonxml::get_param('mode',$parstack,$safeeval));
1986: if (!defined($mode)) { $mode='show'; }
1987: my $for=&Apache::lonxml::get_param('for',$parstack,$safeeval);
1988: my $found=0;
1989: foreach my $type (split(',',$for)) {
1990: if ($Apache::lonhomework::type eq lc($type)) { $found=1; }
1991: }
1992: if ($mode eq 'show' && !$found) {
1.326 albertel 1993: &Apache::lonxml::get_all_text("/problemtype",$parser,$style);
1.248 albertel 1994: }
1995: if ($mode eq 'hide' && $found) {
1.326 albertel 1996: &Apache::lonxml::get_all_text("/problemtype",$parser,$style);
1.248 albertel 1997: }
1998: } elsif ($target eq 'edit') {
1999: $result .=&Apache::edit::tag_start($target,$token);
2000: $result.=&Apache::edit::select_arg('Mode:','mode',
2001: [['show','Show'],
2002: ['hide','Hide']]
2003: ,$token);
2004: $result .=&Apache::edit::checked_arg('When used as type(s):','for',
2005: [ ['exam','Exam/Quiz Problem'],
2006: ['survey','Survey'],
1.465 raeburn 2007: ['surveycred','Survey (with credit)'],
2008: ['anonsurvey','Anonymous Survey'],
2009: ['anonsurveycred','Anonymous Survey (with credit)'],
1.428 raeburn 2010: ['problem','Homework Problem'],
2011: ['practice','Practice Problem'] ]
1.248 albertel 2012: ,$token);
2013: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
2014: } elsif ($target eq 'modified') {
2015: my $constructtag=&Apache::edit::get_new_args($token,$parstack,
2016: $safeeval,'mode','for');
2017: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
2018: }
2019: return $result;
2020: }
2021:
2022: sub end_problemtype {
1.159 albertel 2023: return '';
1.24 albertel 2024: }
1.34 albertel 2025:
2026: sub start_startouttext {
1.159 albertel 2027: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
2028: my @result=(''.'');
2029: if ($target eq 'edit' || $target eq 'modified' ) { @result=('','no'); }
1.404 albertel 2030:
2031: my $nesting =
2032: &Apache::lonxml::set_state('outtext',
2033: &Apache::lonxml::get_state('outtext')+1);
2034: if ($nesting > 1 && $env{'request.state'} eq 'construct') {
2035: &Apache::lonxml::error("Nesting of <startouttext /> not allowed, on line ".$token->[5]);
2036: }
1.159 albertel 2037: return (@result);
1.34 albertel 2038: }
1.159 albertel 2039:
1.34 albertel 2040: sub end_startouttext {
1.326 albertel 2041: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159 albertel 2042: my $result='';
2043: my $text='';
2044: if ($target eq 'edit') {
1.424 foxr 2045: my $areaid = 'homework_edit_'.$Apache::lonxml::curdepth;
1.326 albertel 2046: $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style);
1.437 raeburn 2047: $result.=&Apache::edit::start_table($token)."<tr><td>".&mt('Text Block')."</td>"
1.438 bisitz 2048: .'<td><span class="LC_nobreak">'.&mt('Delete?').' '
1.437 raeburn 2049: .&Apache::edit::deletelist($target,$token)
2050: .'</span></td>';
1.425 raeburn 2051: unless ($env{'environment.wysiwygeditor'} eq 'on') {
1.434 foxr 2052: $result .= '<td align="left">'
2053: .&Apache::lonhtmlcommon::dragmath_button($areaid,1)
2054: .'</td>'
2055: .'<td>'
2056: .&Apache::edit::insertlist($target,$token)
2057: .'</td>';
2058: }
1.425 raeburn 2059: $result.='<td align="right" valign="top">' .
1.434 foxr 2060: &Apache::loncommon::helpLatexCheatsheet().
1.159 albertel 2061: &Apache::edit::end_row().
1.362 albertel 2062: &Apache::edit::start_spanning_row()."\n".
1.255 www 2063: &Apache::edit::editfield($token->[1],$text,"",80,8,1);
1.159 albertel 2064: }
2065: if ($target eq 'modified') {
1.219 albertel 2066: $result='<startouttext />'.&Apache::edit::modifiedfield("endouttext",$parser);
1.159 albertel 2067: }
2068: if ($target eq 'tex') {
2069: $result .= '\noindent ';
2070: }
2071: return $result;
1.34 albertel 2072: }
1.159 albertel 2073:
1.34 albertel 2074: sub start_endouttext {
1.159 albertel 2075: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
2076: my $result='';
2077: if ($target eq "edit" ) { $result="</td></tr>".&Apache::edit::end_table()."\n"; }
2078: if ($target eq "modified") {
2079: $result='<endouttext />'.
1.377 albertel 2080: &Apache::edit::handle_insertafter('startouttext');
2081: }
1.404 albertel 2082:
2083: my $nesting =
2084: &Apache::lonxml::set_state('outtext',
2085: &Apache::lonxml::get_state('outtext')-1);
2086: if ($nesting < 0 && $env{'request.state'} eq 'construct') {
2087: &Apache::lonxml::error(" Extraneous <endouttext /> not allowed on line ".$token->[5]);
2088: &Apache::lonxml::set_state('outtext', 0);
2089: }
1.159 albertel 2090: return $result;
1.34 albertel 2091: }
1.159 albertel 2092:
1.34 albertel 2093: sub end_endouttext {
1.159 albertel 2094: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
2095: my @result=('','');
2096: if ($target eq "edit" || $target eq 'modified') { @result=('','no'); }
2097: return (@result);
1.34 albertel 2098: }
1.159 albertel 2099:
1.45 albertel 2100: sub delete_startouttext {
1.326 albertel 2101: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
2102: # my $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style);
1.159 albertel 2103: my $text=$$parser['-1']->get_text("/endouttext");
2104: my $ntoken=$$parser['-1']->get_token();
2105: &Apache::lonxml::debug("Deleting :$text: and :$ntoken->[0]:$ntoken->[1]:$ntoken->[2]: for startouttext");
2106: &Apache::lonxml::end_tag($tagstack,$parstack,$ntoken);
2107: # Deleting 2 parallel tag pairs, but we need the numbers later to look like
2108: # they did the last time round
2109: &Apache::lonxml::increasedepth($ntoken);
2110: &Apache::lonxml::decreasedepth($ntoken);
2111: return 1;
1.193 www 2112: }
2113:
2114: sub start_simpleeditbutton {
2115: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
2116: my $result='';
1.284 albertel 2117: if (($env{'form.simple_edit_button'} ne 'off') &&
1.273 albertel 2118: ($target eq 'web') &&
1.330 albertel 2119: (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
1.284 albertel 2120: my $url=$env{'request.noversionuri'};
1.193 www 2121: $url=~s/\?.*$//;
1.367 albertel 2122: my ($symb) = &Apache::lonnet::whichuser();
1.451 bisitz 2123: # Warning makes more sense and is more important on edit screen
1.442 bisitz 2124: # $result='<p class="LC_warning">'
2125: # .&mt('Note: it can take up to 10 minutes for changes to take effect for all users.')
2126: # .&Apache::loncommon::help_open_topic('Caching')
2127: # .'</p>';
1.451 bisitz 2128: $result.=&Apache::lonhtmlcommon::start_funclist()
2129: .&Apache::lonhtmlcommon::add_item_funclist(
2130: '<a href="'.$url.'/smpedit?symb='.&escape($symb).'">'
2131: .&mt('Edit').'</a>')
2132: .&Apache::lonhtmlcommon::end_funclist();
1.442 bisitz 2133:
1.193 www 2134: }
2135: return $result;
2136: }
2137:
2138: sub end_simpleeditbutton {
2139: return '';
1.45 albertel 2140: }
1.34 albertel 2141:
1.428 raeburn 2142: sub practice_problem_header {
2143: return '<span class="LC_info"><h3>'.&mt('Practice Problem').'</h3></span>'.
2144: '<span class="LC_info">'.&mt('Submissions are not permanently recorded').
2145: '</span>';
2146: }
2147:
1.1 albertel 2148: 1;
2149: __END__
1.435 jms 2150:
2151: =pod
2152:
2153: =back
2154:
2155: =cut
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>