![]() ![]() | ![]() |
- added arg setting for <numericalresponse>
1: # The LearningOnline Network with CAPA 2: # edit mode helpers 3: # 3/20 Guy 4: package Apache::edit; 5: 6: use strict; 7: use Apache::lonnet; 8: 9: # Global Vars 10: # default list of colors to use in editing 11: @Apache::edit::colorlist=('#ffffff','#ff0000','#00ff00','#0000ff','#0ff000','#000ff0','#f0000f'); 12: # depth of nesting of edit 13: $Apache::edit::colordepth=0; 14: 15: sub initialize_edit { 16: $Apache::edit::colordepth=0; 17: } 18: 19: sub tag_start { 20: my ($target,$token,$description) = @_; 21: my $result=''; 22: if ($target eq "edit") { 23: my $tag=$token->[1]; 24: if (!$description) { $description="<$tag>"; } 25: $result.= &start_table($token)."<tr><td>$description</td> 26: <td>Delete". 27: &deletelist($target,$token) 28: ."</td> 29: <td>". 30: &insertlist($target,$token). 31: "</td> 32: </tr><tr><td colspan=\"3\">\n"; 33: } 34: return $result; 35: } 36: 37: sub tag_end { 38: my ($target,$token,$description) = @_; 39: my $result=''; 40: if ($target eq 'edit') { 41: my $tag=$token->[1]; 42: if (!defined($description)) { 43: $result.="</td></tr><tr><td></$tag></td><td colspan=\"2\"> </td>"; 44: } else { 45: if ($description ne '') { $result.="</td></tr><tr><td>$description</td><td colspan=\"2\"> </td>"; } 46: } 47: $result.="</tr>".&end_table()."\n"; 48: } 49: return $result; 50: } 51: 52: sub start_table { 53: my ($token)=@_; 54: my $tag = $token->[1]; 55: my $tagnum; 56: foreach my $namespace (reverse @Apache::lonxml::namespace) { 57: my $testtag=$Apache::lonxml::namespace['-1'].'::'.$tag; 58: $tagnum=$Apache::lonxml::insertlist{"$testtag.num"}; 59: if (defined($tagnum)) { last; } 60: } 61: if (!defined ($tagnum)) { $tagnum=$Apache::lonxml::insertlist{"$tag.num"}; } 62: my $color = $Apache::lonxml::insertlist{"$tagnum.color"}; 63: if (!defined($color)) { 64: $color = $Apache::edit::colorlist[$Apache::edit::colordepth]; 65: } 66: $Apache::edit::colordepth++; 67: my $result="<table bgcolor=\"$color\" width=\"100%\" border=\"5\">"; 68: return $result; 69: } 70: 71: sub end_table { 72: $Apache::edit::colordepth--; 73: my $result="</table>"; 74: return $result; 75: } 76: 77: sub deletelist { 78: my ($target,$token) = @_; 79: my $result = "<select name=\"delete_$Apache::lonxml::curdepth\"> 80: <option></option> 81: <option>Yes</option> 82: </select>"; 83: return $result; 84: } 85: 86: sub handle_delete { 87: if (!$ENV{"form.delete_$Apache::lonxml::curdepth"}) { return ''; } 88: my ($space,$target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 89: my $result=0; 90: if ($space) { 91: my $sub1="$space\:\:delete_$token->[1]"; 92: { 93: no strict 'refs'; 94: if (defined &$sub1) { 95: $result=&$sub1($target,$token,$tagstack,$parstack,$parser,$safeeval,$style); 96: } 97: } 98: } 99: if (!$result) { 100: my $endtag='/'.$token->[1]; 101: my $bodytext=&Apache::lonxml::get_all_text($endtag,$$parser[$#$parser]); 102: $$parser['-1']->get_token(); 103: &Apache::lonxml::debug("Deleting :$bodytext: for $token->[1]"); 104: &Apache::lonxml::end_tag($tagstack,$parstack,$token); 105: } 106: return 1; 107: } 108: 109: sub get_insert_list { 110: my ($token) = @_; 111: my $result=''; 112: my @tagnums= (); 113: #&Apache::lonxml::debug("keys ".join("\n",sort(keys(%Apache::lonxml::insertlist)))); 114: if ($Apache::lonxml::insertlist{"$token->[1].which"}) { 115: push (@tagnums, @{ $Apache::lonxml::insertlist{"$token->[1].which"} }); 116: } 117: foreach my $namespace (@Apache::lonxml::namespace) { 118: if ($Apache::lonxml::insertlist{"$namespace".'::'."$token->[1].which"}) { 119: push (@tagnums, @{ $Apache::lonxml::insertlist{"$namespace".'::'."$token->[1].which"} }); 120: } 121: } 122: if (@tagnums) { 123: foreach my $tagnum (@tagnums) { 124: $result.='<option value="'.$tagnum.'">'.$Apache::lonxml::insertlist{"$tagnum.description"}."</option>\n"; 125: } 126: if ($result) { $result='<option selected="on"></option>'.$result; } 127: } 128: return $result; 129: } 130: 131: sub insertlist { 132: my ($target,$token) = @_; 133: my $result; 134: if ($target eq 'edit') { 135: my $optionlist= &get_insert_list($token); 136: if ($optionlist) { 137: $result = "Insert: 138: <select name=\"insert_$Apache::lonxml::curdepth\"> 139: $optionlist 140: </select>" 141: } else { 142: $result=" "; 143: } 144: } 145: return $result; 146: } 147: 148: sub handle_insert { 149: if ($ENV{"form.insert_$Apache::lonxml::curdepth"} eq '') { return ''; } 150: my $result; 151: my $tagnum = $ENV{"form.insert_$Apache::lonxml::curdepth"}; 152: my $func=$Apache::lonxml::insertlist{"$tagnum.function"}; 153: if ($func eq 'default') { 154: my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"}; 155: my $namespace; 156: if ($newtag =~ /::/) { ($namespace,$newtag) = split(/::/,$newtag); } 157: $result.="\n<$newtag>\n</$newtag>"; 158: } else { 159: if (defined(&$func)) { 160: { 161: no strict 'refs'; 162: $result.=&$func(); 163: } 164: } else { 165: my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"}; 166: &Apache::lonxml::error("Unable to insert tag $newtag, $func was not defined."); 167: } 168: } 169: return $result; 170: } 171: 172: sub insert_responseparam { 173: return ' 174: <responseparam />'; 175: } 176: 177: sub insert_numericalresponse { 178: return ' 179: <numericalresponse answer=""> 180: <textline /> 181: <hintgroup> 182: </hintgroup> 183: </numericalresponse>'; 184: } 185: 186: sub insert_optionresponse { 187: return ' 188: <optionresponse max="10"> 189: <foilgroup options=""> 190: </foilgroup> 191: <hintgroup> 192: </hintgroup> 193: </optionresponse>'; 194: } 195: 196: sub editfield { 197: my ($tag,$data,$description,$minwidth,$minheight)=@_; 198: 199: my $count=0; 200: my $maxlength=-1; 201: map { $count++; 202: if (length($_) > $maxlength) { $maxlength = length ($_); } 203: } split ("\n", $data); 204: if ($maxlength > 80) { $maxlength = 80; } 205: if ($maxlength < $minwidth) { $maxlength = $minwidth; } 206: if ( $count < $minheight) { $count = $minheight; } 207: if ($description) { 208: $description="<br />".$description."<br />"; 209: } 210: return "$description\n <textarea rows=\"$count\" cols=\"$maxlength\" name=homework_edit_".$Apache::lonxml::curdepth.">$data</textarea>\n"; 211: # return "<br />\n<$tag><br />\n <textarea rows=\"$count\" cols=\"$maxlength\" name=homework_edit_".$Apache::lonxml::curdepth.">$data</textarea><br />\n</$tag><br />\n"; 212: } 213: 214: sub modifiedfield { 215: my ($token) = @_; 216: my $result; 217: # foreach my $envkey (sort keys %ENV) { 218: # &Apache::lonxml::debug("$envkey ---- $ENV{$envkey}"); 219: # } 220: # &Apache::lonxml::debug("I want homework_edit_$Apache::lonxml::curdepth"); 221: # &Apache::lonxml::debug($ENV{"form.homework_edit_$Apache::lonxml::curdepth"}); 222: $result=$ENV{"form.homework_edit_$Apache::lonxml::curdepth"}; 223: if (defined $token) { 224: if (defined $token->[4]) { 225: $result=$token->[4].$result; 226: } else { 227: $result=$result.$token->[2]; 228: } 229: } 230: return $result; 231: } 232: 233: sub insert_startouttext { 234: return "<startouttext />\n<endouttext />"; 235: } 236: 237: sub insert_script { 238: return "\n<script type=\"loncapa/perl\">\n</script>"; 239: } 240: 241: # Returns a 1 if the token has been modified and you should rebuild the tag 242: # side-effects, will modify the $token if new values are found 243: sub get_new_args { 244: my ($token,$parstack,$safeeval,@args)=@_; 245: my $rebuild=0; 246: foreach my $arg (@args) { 247: my $value=&Apache::lonxml::get_param($arg,$parstack,$safeeval); 248: my $newvalue=$ENV{"form.$Apache::lonxml::curdepth.$arg"}; 249: &Apache::lonxml::debug(" for:$arg: cur is :$value: new is :$newvalue:"); 250: if ($value ne $newvalue) { 251: $token->[2]->{$arg}=$newvalue; 252: $rebuild=1; 253: } 254: } 255: return $rebuild; 256: } 257: 258: # looks for /> on start tags 259: sub rebuild_tag { 260: my ($token) = @_; 261: my $result; 262: if ($token->[0] eq 'S') { 263: $result = '<'.$token->[1]; 264: while (my ($key,$val)= each(%{$token->[2]})) { 265: &Apache::lonxml::debug("setting :$key: to :$val:"); 266: $result.=' '.$key.'="'.$val.'"'; 267: } 268: if ($token->[4] =~ m:/>$:) { 269: $result.=' />'; 270: } else { 271: $result.='>'; 272: } 273: } elsif ( $token->[0] eq 'E' ) { 274: $result = '</'.$token->[1].'>'; 275: } 276: return $result; 277: } 278: 279: sub text_arg { 280: my ($description,$name,$token,$size) = @_; 281: my $result; 282: if (!defined $size) { $size=20; } 283: my $arg=$token->[2]{$name}; 284: $result=$description.'<input name="'."$Apache::lonxml::curdepth.$name". 285: '" type="text" value="'.$arg.'" size="'.$size.'" />'; 286: return $result; 287: } 288: 289: sub select_arg { 290: my ($description,$name,$list,$token) = @_; 291: my $result; 292: my $optionlist=""; 293: my $selected=$token->[2]{$name}; 294: foreach my $option (@$list) { 295: if ( $selected eq $option ) { 296: $optionlist.="<option selected=\"on\">$option</option>\n"; 297: } else { 298: $optionlist.="<option>$option</option>\n"; 299: } 300: } 301: $result.=$description.'<select name="'."$Apache::lonxml::curdepth.$name".'"> 302: '.$optionlist.' 303: </select></td></tr><tr><td colspan="3">'; 304: return $result; 305: } 306: 307: 1; 308: __END__