# 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=$namespace.'::'.$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_formularesponse { return ' '; } sub insert_numericalresponse { return ' '; } sub insert_stringresponse { return ' '; } sub insert_optionresponse { return ' '; } sub insert_radiobuttonresponse { return ' '; } sub insert_displayduedate { return ''; } sub insert_displaytitle { return ''; } sub insert_hintpart { return ' '; } sub insert_numericalhint { return ' '; } sub insert_startouttext { return "\n"; } sub insert_script { return "\n"; } 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; } # 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__