Annotation of loncom/homework/structuretags.pm, revision 1.37
1.34 albertel 1: # The LearningOnline Network with CAPA
2: # definition of tags that give a structure to a document
1.33 albertel 3: # 2/19 Guy
1.1 albertel 4: package Apache::structuretags;
5:
6: use strict;
7: use Apache::lonnet;
8:
9: sub BEGIN {
1.34 albertel 10: &Apache::lonxml::register('Apache::structuretags',('block','while','randomlist','problem','web','tex','part','preduedate','postanswerdate','solved','notsolved','startouttext','endouttext'));
1.37 ! albertel 11: # &Apache::lonxml::register_insert('problem','',('part','postanswerdate','preduedate'))
1.10 albertel 12: }
13:
14: sub start_web {
15: my ($target,$token,$parstack,$parser,$safeeval)=@_;
16: my $bodytext=&Apache::lonxml::get_all_text("/web",$$parser[$#$parser]);
1.19 albertel 17: if ($target eq 'web') {
18: return $bodytext;
19: }
20: return '';
1.10 albertel 21: }
22:
23: sub end_web {
24: }
25:
26: sub start_tex {
27: my ($target,$token,$parstack,$parser,$safeeval)=@_;
28: my $bodytext=&Apache::lonxml::get_all_text("/tex",$$parser[$#$parser]);
1.19 albertel 29: if ($target eq 'tex') {
30: return $bodytext
31: }
1.10 albertel 32: return '';
33: }
34:
35: sub end_tex {
1.9 albertel 36: }
37:
38: sub start_problem {
39: my ($target,$token,$parstack,$parser,$safeeval)=@_;
1.19 albertel 40:
41: #intialize globals
42: $Apache::inputtags::part='0';
43: @Apache::inputtags::responselist = ();
44:
45: #adeed vars to the scripting enviroment
46: my $expression='$external::part='.$Apache::inputtags::part.';';
47: &Apache::run::run($expression,$safeeval);
1.22 albertel 48: my $status;
49: my $datemsg;
1.36 albertel 50:
51: my $result=&Apache::londefdef::start_html($target,$token,$parstack,$parser,$safeeval);
52:
1.34 albertel 53: if ($target eq 'web' || $target eq 'grade') {
1.22 albertel 54: ($status,$datemsg) = &Apache::lonhomework::check_date('0');
55: push (@Apache::inputtags::status,$status);
1.24 albertel 56: my $expression='$external::datestatus="'.$status.'";';
57: $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
58: &Apache::run::run($expression,$safeeval);
1.22 albertel 59: if ( $status eq 'CLOSED' ) {
1.21 albertel 60: my $bodytext=&Apache::lonxml::get_all_text("/problem",$$parser[$#$parser]);
61: if ( $target eq "web" ) {
1.36 albertel 62: return $result."<body bgcolor=\"#FFFFFF\"> <br />Problem is not open to be viewed. The problem $datemsg<br />";
1.21 albertel 63: }
1.22 albertel 64: }
1.21 albertel 65: }
1.19 albertel 66: if ($target eq 'web') {
1.16 albertel 67: my $args ='';
1.19 albertel 68: if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
1.16 albertel 69: my $name = &Apache::run::run("{$args;".'return $name}',$safeeval);
1.30 albertel 70: if ($name eq '') {
71: $name=&Apache::lonnet::EXT('resource.title');
72: if ($name eq 'con_lost') { $name = ''; }
73: }
74: $Apache::lonhomework::name=$name;
1.22 albertel 75: if ($status eq 'CAN_ANSWER') {
76: # create a page header and exit
1.36 albertel 77: $result.="<head><title>$name</title></head>\n
78: <body bgcolor=\"#FFFFFF\">\n
79: <form name=\"lonhomework\" method=\"POST\" action=\"".$ENV{'request.uri'}."\">".
80: '<input type="hidden" name="submitted" value="yes" />';
81: if ($ENV{'request.state'} eq "construct") {
82: $result.='<input type="hidden" name="problemmode" value="View" />
83: <input type="submit" name="problemmode" value="Edit" /><hr />';
84: }
85: return $result;
1.29 albertel 86: } elsif ($status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER' || $status eq 'CLOSED') {
1.36 albertel 87: return $result."<title>$name</title>\n<body bgcolor=\"#FFFFFF\">\n";
1.22 albertel 88: }
89: }
1.34 albertel 90: if ($target eq 'edit') {
1.36 albertel 91: $result.='<body bgcolor="#FFFFFF">
1.35 albertel 92: <form name="lonhomework" method="POST" action="'.$ENV{'request.uri'}.'">
93: <input type="hidden" name="submitted" value="edit" />
1.36 albertel 94: <input type="hidden" name="problemmode" value="Edit" />
95: <input type="submit" name="problemmode" value="View" />
96: <input type="submit" name="Undo" value="undo" /> <hr />
1.35 albertel 97: ';
1.36 albertel 98: my $temp=&Apache::edit::insertlist($token,$target);
99: $result.=$temp;
100: return $result;
1.34 albertel 101: }
1.37 ! albertel 102: if ($target eq 'modified') {
! 103: $result=$token->[4];
! 104: $result.=&Apache::edit::handle_insert();
! 105: return $result;
! 106: }
1.19 albertel 107: return '';
1.9 albertel 108: }
109:
110: sub end_problem {
1.16 albertel 111: my ($target,$token,$parstack,$parser,$safeeval)=@_;
112: my $result='';
1.24 albertel 113: my $status=$Apache::inputtags::status['-1'];
1.34 albertel 114: if ($target eq 'grade' || $target eq'web' ) {
1.28 albertel 115: if ( $target eq 'grade' && $Apache::inputtags::part eq '0' &&
116: $status eq 'CAN_ANSWER') {
1.19 albertel 117: # if part is zero, no <part>s existed, so we need to the grading
118: &Apache::inputtags::grade;
119: } elsif ($Apache::inputtags::part eq '0') {
120: # if part is zero, no <part>s existed, so we need show the current
121: # grading status
1.20 albertel 122: $result.= &Apache::inputtags::gradestatus($Apache::inputtags::part);
1.19 albertel 123: }
1.22 albertel 124: if ($target eq 'web') {
125: if ($status eq 'CAN_ANSWER') {
126: $result.="</form></body>\n";
1.28 albertel 127: } elsif ($status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER') {
1.22 albertel 128: $result.="</body>\n";
129: }
130: }
1.34 albertel 131: }
132: if ($target eq 'meta') {
1.18 albertel 133: if ($Apache::inputtags::part eq '0') {
1.34 albertel 134:
1.16 albertel 135: $result=&Apache::response::mandatory_part_meta;
136: }
137: }
1.34 albertel 138: if ($target eq 'edit') {
139: &Apache::lonxml::debug("in end_problem with $target, edit");
140: $result='<br /><input type="submit" name="submit" value="Submit Changes" />';
141: }
1.16 albertel 142: return $result;
1.1 albertel 143: }
144:
145: sub start_block {
146: my ($target,$token,$parstack,$parser,$safeeval)=@_;
147:
148: my $code = @$parstack[$#$parstack];
149: $code =~ s/\"//g;
150: $code .=';return $condition;';
1.32 albertel 151: # print "<br />$code<br />";
1.1 albertel 152: my $result = &Apache::run::run($code,$safeeval);
1.24 albertel 153: &Apache::lonxml::debug("block :$code: returned :$result:");
1.1 albertel 154: if ( ! $result ) {
1.9 albertel 155: my $skip=&Apache::lonxml::get_all_text("/block",$$parser[$#$parser]);
1.24 albertel 156: &Apache::lonxml::debug("skipping ahead :$skip: $$parser[$#$parser]");
1.1 albertel 157: }
158: return "";
159: }
160:
161: sub end_block {
1.4 tsai 162: }
163:
164: sub start_while {
165: my ($target,$token,$parstack,$parser,$safeeval)=@_;
166:
167: my $code = @$parstack[$#$parstack];
168: $code =~ s/\"//g;
169: $code .=';return $condition;';
170:
1.5 tsai 171: push( @Apache::structuretags::whileconds, $code);
1.4 tsai 172: my $result = &Apache::run::run($code,$safeeval);
173: my $bodytext=$$parser[$#$parser]->get_text("/while");
1.5 tsai 174: push( @Apache::structuretags::whilebody, $bodytext);
175: if ( $result ) {
1.8 albertel 176: &Apache::lonxml::newparser($parser,\$bodytext);
1.4 tsai 177: }
178: return "";
179: }
180:
181: sub end_while {
1.5 tsai 182: my ($target,$token,$parstack,$parser,$safeeval)=@_;
183: my $code = pop @Apache::structuretags::whileconds;
184: my $bodytext = pop @Apache::structuretags::whilebody;
185: my $result = &Apache::run::run($code,$safeeval);
186: if ( $result ) {
1.8 albertel 187: &Apache::lonxml::newparser($parser,\$bodytext);
1.5 tsai 188: }
189: return "";
1.1 albertel 190: }
1.6 tsai 191:
192: # <randomlist>
193: # <tag1>..</tag1>
194: # <tag2>..</tag2>
195: # <tag3>..</tag3>
196: # ...
197: # </randomlist>
198: sub start_randomlist {
199: my ($target,$token,$parstack,$parser,$safeeval)=@_;
1.9 albertel 200: my $body= &Apache::lonxml::get_all_text("/randomlist",$$parser[$#$parser]);
1.6 tsai 201: my $b_parser= HTML::TokeParser->new(\$body);
202: my $b_tok;
203: my @randomlist;
204: my $list_item;
205:
206: while($b_tok = $b_parser->get_token() ) {
207: if($b_tok->[0] eq 'S') { # start tag
208: # get content of the tag until matching end tag
209: # get all text upto the matching tag
210: # and push the content into @randomlist
1.9 albertel 211: $list_item = &Apache::lonxml::get_all_text('/'.$b_tok->[1],$b_parser);
1.7 tsai 212: $list_item = "$b_tok->[4]"."$list_item"."</$b_tok->[1]>";
1.6 tsai 213: push(@randomlist,$list_item);
1.32 albertel 214: # print "<br /><b>START-TAG $b_tok->[1], $b_tok->[4], $list_item</b>";
1.6 tsai 215: }
216: if($b_tok->[0] eq 'T') { # text
217: # what to do with text in between tags?
1.32 albertel 218: # print "<b>TEXT $b_tok->[1]</b><br />";
1.6 tsai 219: }
220: # if($b_tok->[0] eq 'E') { # end tag, should not happen
1.32 albertel 221: # print "<b>END-TAG $b_tok->[1]</b><br />";
1.6 tsai 222: # }
223: }
1.7 tsai 224: my @idx_arr = (0 .. $#randomlist);
225: &Apache::structuretags::shuffle(\@idx_arr);
226: my $bodytext = '';
227: for(0 .. $#randomlist) {
228: $bodytext .= "$randomlist[ $idx_arr[$_] ]";
229: }
1.8 albertel 230:
231: &Apache::lonxml::newparser($parser,\$bodytext);
1.6 tsai 232: return "";
1.7 tsai 233: }
234:
235: sub shuffle {
236: my $a=shift;
237: my $i;
238: for($i=@$a;--$i;) {
239: my $j=int rand($i+1);
240: next if $i == $j;
241: @$a[$i,$j] = @$a[$j,$i];
242: }
1.6 tsai 243: }
244:
245: sub end_randomlist {
246: }
247:
1.11 albertel 248: sub start_part {
249: my ($target,$token,$parstack,$parser,$safeeval)=@_;
250: my $args ='';
251: if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
252: my $id = &Apache::run::run("{$args;".'return $id}',$safeeval);
1.14 albertel 253: $Apache::inputtags::part=$id;
1.18 albertel 254: @Apache::inputtags::responselist = ();
1.15 www 255: if ($target eq 'meta') {
1.16 albertel 256: return &Apache::response::mandatory_part_meta;
1.37 ! albertel 257: } elsif ($target eq 'web' || $target eq 'grade') {
1.23 albertel 258: my ($status,$datemsg) = &Apache::lonhomework::check_date("OPEN_DATE",$id);
259: push (@Apache::inputtags::status,$status);
260: my $expression='$external::datestatus="'.$status.'";';
261: $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
262: &Apache::run::run($expression,$safeeval);
263: if ( $status eq 'CLOSED' ) {
1.21 albertel 264: my $bodytext=&Apache::lonxml::get_all_text("/part",$$parser[$#$parser]);
265: if ( $target eq "web" ) {
1.32 albertel 266: return "<br />Part is not open to be viewed. It $datemsg<br />";
1.21 albertel 267: }
268: }
1.15 www 269: }
1.19 albertel 270: return '';
1.11 albertel 271: }
272:
273: sub end_part {
274: my ($target,$token,$parstack,$parser,$safeeval)=@_;
1.18 albertel 275: &Apache::lonxml::debug("in end_part $target ");
1.28 albertel 276: my $status=$Apache::inputtags::status['-1'];
1.23 albertel 277: pop @Apache::inputtags::status;
1.19 albertel 278: if ( $target eq 'meta' ) { return ''; }
1.37 ! albertel 279: if ( $target eq 'grade' && $status eq 'CAN_ANSWER') {
! 280: return &Apache::inputtags::grade;
1.28 albertel 281: }
1.37 ! albertel 282: if ($target eq 'web') {
! 283: return &Apache::inputtags::gradestatus($Apache::inputtags::part);
! 284: }
! 285: return '';
1.11 albertel 286: }
1.1 albertel 287:
1.25 albertel 288: sub start_preduedate {
1.24 albertel 289: my ($target,$token,$parstack,$parser,$safeeval)=@_;
1.34 albertel 290: if ($target eq 'web' || $target eq 'grade') {
1.29 albertel 291: if ($Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
292: $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER' ) {
1.26 albertel 293: &Apache::lonxml::get_all_text("/preduedate",$$parser[$#$parser]);
1.24 albertel 294: }
295: }
296: return '';
297: }
298:
1.25 albertel 299: sub end_preduedate {
1.24 albertel 300: return '';
301: }
302:
1.25 albertel 303: sub start_postanswerdate {
1.24 albertel 304: my ($target,$token,$parstack,$parser,$safeeval)=@_;
1.34 albertel 305: if ($target eq 'web' || $target eq 'grade') {
1.24 albertel 306: if ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
1.26 albertel 307: &Apache::lonxml::get_all_text("/postanswerdate",$$parser[$#$parser]);
1.24 albertel 308: }
309: }
310: return '';
311: }
312:
1.25 albertel 313: sub end_postanswerdate {
1.24 albertel 314: return '';
315: }
316:
1.25 albertel 317: sub start_notsolved {
1.24 albertel 318: my ($target,$token,$parstack,$parser,$safeeval)=@_;
1.34 albertel 319: if ($target eq 'web' || $target eq 'grade') {
1.24 albertel 320: my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
321: &Apache::lonxml::debug("not solved has :$gradestatus:");
322: if ($gradestatus =~ /^correct/) {
323: &Apache::lonxml::debug("skipping");
1.26 albertel 324: &Apache::lonxml::get_all_text("/notsolved",$$parser[$#$parser]);
1.24 albertel 325: }
326: }
327: return '';
328: }
329:
1.25 albertel 330: sub end_notsolved {
1.24 albertel 331: return '';
332: }
333:
334: sub start_solved {
335: my ($target,$token,$parstack,$parser,$safeeval)=@_;
1.34 albertel 336: if ($target eq 'web' || $target eq 'grade') {
1.24 albertel 337: my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
338: if ($gradestatus !~ /^correct/) {
339: &Apache::lonxml::get_all_text("/solved",$$parser[$#$parser]);
340: }
341: }
342: return '';
343: }
344:
345: sub end_solved {
346: return '';
347: }
1.34 albertel 348:
349: sub start_startouttext {
350: my ($target,$token,$parstack,$parser,$safeeval)=@_;
1.35 albertel 351: my @result=(''.'');
352: if ($target eq 'edit' || $target eq 'modified' ) { @result=('','no'); }
353: return (@result);
1.34 albertel 354: }
355: sub end_startouttext {
356: my ($target,$token,$parstack,$parser,$safeeval)=@_;
357: my $result='';
1.35 albertel 358: my $text='';
359:
1.34 albertel 360: if ($target eq 'edit') {
1.35 albertel 361: $text=&Apache::lonxml::get_all_text("endouttext",$$parser[$#$parser]);
362: $result=
1.37 ! albertel 363: &Apache::edit::tag_start($target,$token).
! 364: &Apache::edit::editfield($token->[1],$text,"Text Block",50,5);
1.35 albertel 365: }
366: if ($target eq 'modified') {
367: $text=&Apache::lonxml::get_all_text("endouttext",$$parser['-1']);
368: $result='<startouttext />'.&Apache::edit::modifiedfield();
1.34 albertel 369: }
370: return $result;
371: }
372: sub start_endouttext {
373: my ($target,$token,$parstack,$parser,$safeeval)=@_;
374: my $result='';
1.37 ! albertel 375: if ($target eq "edit" ) { $result=&Apache::edit::tag_end($target,$token); }
1.35 albertel 376: if ($target eq "modified") { $result='<endouttext />'; }
1.34 albertel 377: return $result;
378: }
379: sub end_endouttext {
380: my ($target,$token,$parstack,$parser,$safeeval)=@_;
1.35 albertel 381: my @result=('','');
382: if ($target eq "edit" || $target eq 'modified') { @result=('','no'); }
383: return (@result);
1.34 albertel 384: }
385:
386:
1.1 albertel 387: 1;
388: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>