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