# The LearningOnline Network with CAPA # edit mode helpers # 3/20 Guy package Apache::edit; use strict; use Apache::lonnet; # Global Vars # default list of colors to use in editing @Apache::edit::colorlist=('#ffffff','#ff0000','#00ff00','#0000ff','#0ff000','#000ff0','#f0000f'); # depth of nesting of edit $Apache::edit::colordepth=0; sub initialize_edit { $Apache::edit::colordepth=0; } sub tag_start { my ($target,$token,$description) = @_; my $result=''; if ($target eq "edit") { my $tag=$token->[1]; if (!$description) { $description=&Apache::lonxml::description($token); if (!$description) { $description="<$tag>"; } } $result.= &start_table($token)."$description Delete". &deletelist($target,$token) ." ". &insertlist($target,$token). " \n"; #". # &movebuttons($target,$token). # "\n"; } return $result; } sub tag_end { my ($target,$token,$description) = @_; my $result=''; if ($target eq 'edit') { my $tag=$token->[1]; if (!defined($description)) { $result.="</$tag> "; } else { if ($description ne '') { $result.="$description "; } } $result.="".&end_table()."\n"; } return $result; } sub start_table { my ($token)=@_; my $tag = $token->[1]; my $tagnum; foreach my $namespace (reverse @Apache::lonxml::namespace) { my $testtag=$Apache::lonxml::namespace['-1'].'::'.$tag; $tagnum=$Apache::lonxml::insertlist{"$testtag.num"}; if (defined($tagnum)) { last; } } if (!defined ($tagnum)) { $tagnum=$Apache::lonxml::insertlist{"$tag.num"}; } my $color = $Apache::lonxml::insertlist{"$tagnum.color"}; if (!defined($color)) { $color = $Apache::edit::colorlist[$Apache::edit::colordepth]; } $Apache::edit::colordepth++; my $result=""; return $result; } sub end_table { $Apache::edit::colordepth--; my $result="
"; return $result; } sub movebuttons { my ($target,$token) = @_; my $result=''; $result.=''; return $result; } sub deletelist { my ($target,$token) = @_; my $result = ""; return $result; } sub handle_delete { if (!$ENV{"form.delete_$Apache::lonxml::curdepth"}) { return ''; } my ($space,$target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=0; if ($space) { my $sub1="$space\:\:delete_$token->[1]"; { no strict 'refs'; if (defined &$sub1) { $result=&$sub1($target,$token,$tagstack,$parstack,$parser,$safeeval,$style); } } } if (!$result) { my $endtag='/'.$token->[1]; my $bodytext=&Apache::lonxml::get_all_text($endtag,$$parser[$#$parser]); $$parser['-1']->get_token(); &Apache::lonxml::debug("Deleting :$bodytext: for $token->[1]"); &Apache::lonxml::end_tag($tagstack,$parstack,$token); } return 1; } sub get_insert_list { my ($token) = @_; my $result=''; my @tagnums= (); #&Apache::lonxml::debug("keys ".join("\n",sort(keys(%Apache::lonxml::insertlist)))); if ($Apache::lonxml::insertlist{"$token->[1].which"}) { push (@tagnums, @{ $Apache::lonxml::insertlist{"$token->[1].which"} }); } foreach my $namespace (@Apache::lonxml::namespace) { if ($Apache::lonxml::insertlist{"$namespace".'::'."$token->[1].which"}) { push (@tagnums, @{ $Apache::lonxml::insertlist{"$namespace".'::'."$token->[1].which"} }); } } if (@tagnums) { foreach my $tagnum (@tagnums) { $result.='\n"; } if ($result) { $result=''.$result; } } return $result; } sub insertlist { my ($target,$token) = @_; my $result; if ($target eq 'edit') { my $optionlist= &get_insert_list($token); if ($optionlist) { $result = "Insert: " } else { $result=" "; } } return $result; } sub handle_insert { if ($ENV{"form.insert_$Apache::lonxml::curdepth"} eq '') { return ''; } my $result; my $tagnum = $ENV{"form.insert_$Apache::lonxml::curdepth"}; my $func=$Apache::lonxml::insertlist{"$tagnum.function"}; if ($func eq 'default') { my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"}; my $namespace; if ($newtag =~ /::/) { ($namespace,$newtag) = split(/::/,$newtag); } $result.="\n<$newtag>\n"; } else { if (defined(&$func)) { { no strict 'refs'; $result.=&$func(); } } else { my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"}; &Apache::lonxml::error("Unable to insert tag $newtag, $func was not defined."); } } return $result; } sub insert_responseparam { return ' '; } sub insert_numericalresponse { return ' '; } sub insert_stringresponse { return ' '; } sub insert_optionresponse { return ' '; } sub insert_displayduedate { return ''; } sub insert_displaytitle { return ''; } sub insert_hintpart { return ' '; } sub insert_numericalhint { return ' '; } sub editfield { my ($tag,$data,$description,$minwidth,$minheight)=@_; my $count=0; my $maxlength=-1; map { $count++; if (length($_) > $maxlength) { $maxlength = length ($_); } } split ("\n", $data); if ($maxlength > 80) { $maxlength = 80; } if ($maxlength < $minwidth) { $maxlength = $minwidth; } if ( $count < $minheight) { $count = $minheight; } if ($description) { $description="
".$description."
"; } return "$description\n   \n"; # return "
\n<$tag>
\n   
\n</$tag>
\n"; } sub modifiedfield { my ($token) = @_; my $result; # foreach my $envkey (sort keys %ENV) { # &Apache::lonxml::debug("$envkey ---- $ENV{$envkey}"); # } # &Apache::lonxml::debug("I want homework_edit_$Apache::lonxml::curdepth"); # &Apache::lonxml::debug($ENV{"form.homework_edit_$Apache::lonxml::curdepth"}); $result=$ENV{"form.homework_edit_$Apache::lonxml::curdepth"}; if (defined $token) { if (defined $token->[4]) { $result=$token->[4].$result; } else { $result=$result.$token->[2]; } } return $result; } sub insert_startouttext { return "\n"; } sub insert_script { return "\n"; } # Returns a 1 if the token has been modified and you should rebuild the tag # side-effects, will modify the $token if new values are found sub get_new_args { my ($token,$parstack,$safeeval,@args)=@_; my $rebuild=0; foreach my $arg (@args) { #just want the string that it was set to my $value=$token->[2]->{$arg}; my $newvalue=$ENV{"form.$Apache::lonxml::curdepth.$arg"}; &Apache::lonxml::debug(" for:$arg: cur is :$value: new is :$newvalue:"); if ($value ne $newvalue) { $token->[2]->{$arg}=$newvalue; $rebuild=1; } } return $rebuild; } # looks for /> on start tags sub rebuild_tag { my ($token) = @_; my $result; if ($token->[0] eq 'S') { $result = '<'.$token->[1]; while (my ($key,$val)= each(%{$token->[2]})) { $val=~s:^\s+|\s+$::g; $val=~s:"::g; #" &Apache::lonxml::debug("setting :$key: to :$val:"); $result.=' '.$key.'="'.$val.'"'; } if ($token->[4] =~ m:/>$:) { $result.=' />'; } else { $result.='>'; } } elsif ( $token->[0] eq 'E' ) { $result = '[1].'>'; } return $result; } sub text_arg { my ($description,$name,$token,$size) = @_; my $result; if (!defined $size) { $size=20; } my $arg=$token->[2]{$name}; $result=$description.''; return $result; } sub select_arg { my ($description,$name,$list,$token) = @_; my $result; my $optionlist=""; my $selected=$token->[2]{$name}; foreach my $option (@$list) { if ( $selected eq $option ) { $optionlist.="\n"; } else { $optionlist.="\n"; } } $result.=$description.''; return $result; } sub select_or_text_arg { my ($description,$name,$list,$token,$size) = @_; my $result; my $optionlist=""; my $found=0; my $selected=$token->[2]{$name}; foreach my $option (@$list) { if ( $selected eq $option ) { $optionlist.="\n"; $found=1; } else { $optionlist.="\n"; } } $optionlist.="\n"; if ($found) { $result.=$description.''; } else { $result.=&text_arg($description,$name,$token,$size); } return $result; } 1; __END__ 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.