--- loncom/publisher/testbankimport.pm 2004/02/17 23:03:34 1.1 +++ loncom/publisher/testbankimport.pm 2005/11/08 17:58:35 1.7 @@ -1,21 +1,46 @@ +# Handler for parsing text upload problem descriptions into .problems +# $Id: testbankimport.pm,v 1.7 2005/11/08 17:58:35 albertel Exp $ +# +# Copyright Michigan State University Board of Trustees +# +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). +# +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ +# + package Apache::testbankimport; - use strict; - use Apache::Constants qw(:common :http :methods); - use Apache::loncacc; - use Apache::loncommon(); - use Apache::Log(); - use Apache::lonnet; - use HTML::Entities(); - use Apache::lonlocal; - use Apache::lonupload; - use File::Basename(); +use strict; +use Apache::Constants qw(:common :http :methods); +use Apache::loncacc; +use Apache::loncommon(); +use Apache::lonnet; +use HTML::Entities(); +use Apache::lonlocal; +use Apache::lonupload; +use File::Basename(); # ---------------------------------------------------------------- Display Control sub display_control { # figure out what page we're on and where we're heading. - my $page = $ENV{'form.page'}; - my $command = $ENV{'form.go'}; + my $page = $env{'form.page'}; + my $command = $env{'form.go'}; my $current_page = &calculate_page($page,$command); return $current_page; } @@ -60,13 +85,13 @@ function setElements() { var iter = 0 var selParam = 0 END_SCRIPT - if (exists($ENV{'form.blocks'}) ) { + if (exists($env{'form.blocks'}) ) { $$jsref .= qq| - document.forms.display.blocks.value = $ENV{'form.blocks'}\n|; - } elsif (exists($ENV{'form.qnumformat'}) ) { + document.forms.display.blocks.value = $env{'form.blocks'}\n|; + } elsif (exists($env{'form.qnumformat'}) ) { $$jsref .= <<"TO_HERE"; for (iter=0; iter "Multiple Choice", @@ -832,10 +866,10 @@ END_OF_FUNC # ---------------------------------------------------------------- Display Three sub display_three { my ($r,$uname,$fn,$page,$textref,$qcount) = @_; - my $qnumformat = $ENV{'form.qnumformat'}; - my $filename = $ENV{'form.filename'}; - my $source = $ENV{'form.go'}; - my $blocks = $ENV{'form.blocks'}; + my $qnumformat = $env{'form.qnumformat'}; + my $filename = $env{'form.filename'}; + my $source = $env{'form.go'}; + my $blocks = $env{'form.blocks'}; my @items = (); my @bgcolors = ('#ffffff','#eeeeee'); my @types = ("MC","MA","TF","Ess","FIB","Ord"); @@ -850,18 +884,18 @@ sub display_three { my %multparts = (); my $numitems = 0; for (my $i=0; $i<$blocks; $i++) { - if (($ENV{"form.start_$i"} ne '') && ($ENV{"form.end_$i"} ne '')) { - $start[$i] = $ENV{"form.start_$i"}; - $end[$i] = $ENV{"form.end_$i"}; + if (($env{"form.start_$i"} ne '') && ($env{"form.end_$i"} ne '')) { + $start[$i] = $env{"form.start_$i"}; + $end[$i] = $env{"form.end_$i"}; $nums[$i] = $end[$i]-$start[$i] +1; - $qtype[$i] = $ENV{"form.qtype_$i"}; + $qtype[$i] = $env{"form.qtype_$i"}; if (($qtype[$i] eq "MC") || ($qtype[$i] eq "MA") || ($qtype[$i] eq "Ord")) { - $foilformats[$i] = $ENV{"form.foilformat_$i"}; + $foilformats[$i] = $env{"form.foilformat_$i"}; } else { $foilformats[$i] = ''; } if (($qtype[$i] eq "MA") || ($qtype[$i] eq "FIB") || ($qtype[$i] eq "TF") || ($qtype[$i] eq "Ord")) { - $ansrtypes[$i] = $ENV{"form.ansr_$i"}; + $ansrtypes[$i] = $env{"form.ansr_$i"}; } else { $ansrtypes[$i] = ''; } @@ -924,17 +958,31 @@ END_OF_ONE $foiltag = $alphabet[$k-1].'.'; } elsif ($foilformats[$i] eq "lcparen") { $foiltag = '('.$alphabet[$k-1].')'; + } elsif ($foilformats[$i] eq "lconeparen") { + $foiltag = $alphabet[$k-1].')'; + } elsif ($foilformats[$i] eq "lcdotparen") { + $foiltag = $alphabet[$k-1].'.)'; } elsif ($foilformats[$i] eq "ucperiod") { $foiltag = $alphabet[$k-1].'.'; $foiltag =~ tr/a-z/A-Z/; } elsif ($foilformats[$i] eq "ucparen") { $foiltag = '('.$alphabet[$k-1].')'; $foiltag =~ tr/a-z/A-Z/; + } elsif ($foilformats[$i] eq "uconeparen") { + $foiltag = $alphabet[$k-1].')'; + $foiltag =~ tr/a-z/A-Z/; + } elsif ($foilformats[$i] eq "ucdotparen") { + $foiltag = $alphabet[$k-1].'.)'; + $foiltag =~ tr/a-z/A-Z/; } elsif ($foilformats[$i] eq "romperiod") { $foiltag = $romans[$k-1].'.'; } elsif ($foilformats[$i] eq "romparen") { $foiltag = '('.$romans[$k-1].')'; - } + } elsif ($foilformats[$i] eq "romoneparen") { + $foiltag = $romans[$k-1].')'; + } elsif ($foilformats[$i] eq "romdotparen") { + $foiltag = $romans[$k-1].'.)'; + } $r->print(qq|$foiltag $multparts{$j}[$k]
\n|); } } @@ -1045,9 +1093,9 @@ Please choose a destination LON-CAPA dir # ---------------------------------------------------------------- Final Display sub final_display { my ($r,$uname,$fn,$page,$textref) = @_; - my $qnumformat = $ENV{'form.qnumformat'}; - my $blocks = $ENV{'form.blocks'}; - my $newdir = $ENV{'form.newdir'}; + my $qnumformat = $env{'form.qnumformat'}; + my $blocks = $env{'form.blocks'}; + my $newdir = $env{'form.newdir'}; my $linkdir = $newdir; if ($linkdir =~ m#^/home/$uname/public_html/(.+)$#) { $linkdir = '/priv/'.$uname.'/'.$1; @@ -1064,21 +1112,21 @@ sub final_display { my %multparts = (); my $numitems = 0; for (my $i=0; $i<$blocks; $i++) { - $start[$i] = $ENV{"form.start_$i"}; - $end[$i] = $ENV{"form.end_$i"}; + $start[$i] = $env{"form.start_$i"}; + $end[$i] = $env{"form.end_$i"}; if (($end[$i] - $start[$i]) >= 0) { $nums[$i] = $end[$i] - $start[$i]+1; } else { $nums[$i] = 0; } - $qtype[$i] = $ENV{"form.qtype_$i"}; + $qtype[$i] = $env{"form.qtype_$i"}; if (($qtype[$i] eq "MC") || ($qtype[$i] eq "MA") || ($qtype[$i] eq "Ord")) { - $foilformats[$i] = $ENV{"form.foilformat_$i"}; + $foilformats[$i] = $env{"form.foilformat_$i"}; } else { $foilformats[$i] = ''; } if (($qtype[$i] eq "MA") || ($qtype[$i] eq "FIB") || ($qtype[$i] eq "TF") || ($qtype[$i] eq "Ord")) { - $ansrtypes[$i] = $ENV{"form.ansr_$i"}; + $ansrtypes[$i] = $env{"form.ansr_$i"}; } $numitems += $nums[$i]; } @@ -1104,16 +1152,16 @@ sub final_display { for (my $k=$numitems+$start[$i]-1; $k<$numitems+$end[$i]; $k++) { @{$answers{$k}} = (); if ($qtype[$i] eq "MC") { - lc $items[$k]; + $items[$k] =~ tr/A-Z/a-z/; $items[$k] =~ s/\W//g; - if ($foilformats[$i] eq "lcperiod" || $foilformats[$i] eq "lcparen" || $foilformats[$i] eq "ucparen" || $foilformats[$i] eq "ucperiod") { + if ($foilformats[$i] eq "lcperiod" || $foilformats[$i] eq "lcparen" || $foilformats[$i] eq "lconeparen" || $foilformats[$i] eq "lcdotparen" || $foilformats[$i] eq "ucparen" || $foilformats[$i] eq "ucperiod" || $foilformats[$i] eq "uconeparen" || $foilformats[$i] eq "ucdotparen") { for (my $j=0; $j<@alphabet; $j++) { if ($alphabet[$j] eq $items[$k]) { push @{$answers{$k}}, $j; last; } } - } elsif (($foilformats[$i] eq "romparen") || ($foilformats[$i] eq "romperiod")) { + } elsif (($foilformats[$i] eq "romparen") || ($foilformats[$i] eq "romperiod") || ($foilformats[$i] eq "romoneparen") || ($foilformats[$i] eq "romdotparen")) { for (my $j=0; $j<@romans; $j++) { if ($romans[$j] eq $items[$k]) { push @{$answers{$k}}, $j; @@ -1122,7 +1170,7 @@ sub final_display { } } } elsif (($qtype[$i] eq "MA") || ($qtype[$i] eq "Ord")) { - lc $items[$k]; + $items[$k] =~ tr/A-Z/a-z/; my @corrects = split/$patterns{$ansrtypes[$i]}/,$items[$k]; foreach my $correct (@corrects) { $correct =~s/\W//g; @@ -1133,7 +1181,7 @@ sub final_display { last; } } - } elsif (($foilformats[$i] eq "romparen") || ($foilformats[$i] eq "romperiod")) { + } elsif (($foilformats[$i] eq "romparen") || ($foilformats[$i] eq "romperiod") || ($foilformats[$i] eq "romoneparen") || ($foilformats[$i] eq "romdotparen")) { for (my $j=0; $j<@romans; $j++) { if ($romans[$j] eq $correct) { push @{$answers{$k}}, $j; @@ -1384,7 +1432,7 @@ sub file_split { } elsif ($qnumformat eq "trailparen") { $qpattern = '\d{1'.$numpat.'\)'; } - my @questions = split/[\r\n\f]+\s?$qpattern\s?/,$text_in; + my @questions = split/[\r\n\f]+\s*$qpattern\s*/,$text_in; # my @questions = split/\n\s\d{1,3}\.\s/,$text_in; shift @questions; my %multparts = (); @@ -1396,20 +1444,30 @@ sub file_split { $splitstr = '[a-z]\.'; } elsif (${$foilsref}[$i] eq "lcparen") { $splitstr = '\([a-z]\)'; + } elsif (${$foilsref}[$i] eq "lconeparen") { + $splitstr = '[a-z]\)'; + } elsif (${$foilsref}[$i] eq "lcdotparen") { + $splitstr = '[a-z]\.\)'; } elsif (${$foilsref}[$i] eq "ucperiod") { $splitstr = '[A-Z]\.'; } elsif (${$foilsref}[$i] eq "ucparen") { $splitstr = '\([A-Z]\)'; + } elsif (${$foilsref}[$i] eq "uconeparen") { + $splitstr = '[A-Z]\)'; + } elsif (${$foilsref}[$i] eq "ucdotparen") { + $splitstr = '[A-Z]\.\)'; } elsif (${$foilsref}[$i] eq "romperiod") { $splitstr = '[ivx]+\.'; } elsif (${$foilsref}[$i] eq "romparen") { $splitstr = '\([ivx]+\)'; + } elsif (${$foilsref}[$i] eq "romoneparen") { + $splitstr = '[ivx]+\)'; + } elsif (${$foilsref}[$i] eq "romdotparen") { + $splitstr = '[ivx]+\.\)'; } for (my $j=${$startsref}[$i]-1; $j<${$endsref}[$i]; $j++) { - @{$multparts{$j}} = split/[\r\n\f]+\s?$splitstr\s?/,$questions[$j]; + @{$multparts{$j}} = split/[\r\n\f]+\s*$splitstr\s*/,$questions[$j]; chomp(@{$multparts{$j}}); - foreach my $foil (@{$multparts{$j}}) { - } } } elsif (${$qtyperef}[$i] eq "FIB") { for (my $j=${$startsref}[$i]-1; $j<${$endsref}[$i]; $j++) { @@ -1521,12 +1579,12 @@ sub create_mcq { $tol = 5; $numans = $$answerref[0]; } else { - my $min = 0; - my $max = 0; - for (my $i=0; $i<@{$answerref}; $i++) { - if ($$answerref[$i]<$min) { + my $min = $$answerref[0]; + my $max = $$answerref[0]; + for (my $i=1; $i<@{$answerref}; $i++) { + if ($$answerref[$i]<=$min) { $min = $$answerref[$i]; - } elsif ($$answerref[$i] > $max) { + } elsif ($$answerref[$i] >= $max) { $max = $$answerref[$i]; } } @@ -1646,16 +1704,16 @@ sub handler { # # phase two: re-attach user # - if ($ENV{'form.uploaduname'}) { - $ENV{'form.filename'}='/priv/'.$ENV{'form.uploaduname'}.'/'. - $ENV{'form.filename'}; + if ($env{'form.uploaduname'}) { + $env{'form.filename'}='/priv/'.$env{'form.uploaduname'}.'/'. + $env{'form.filename'}; } ($uname,$udom)= - &Apache::loncacc::constructaccess($ENV{'form.filename'}, + &Apache::loncacc::constructaccess($env{'form.filename'}, $r->dir_config('lonDefDomain')); unless (($uname) && ($udom)) { $r->log_reason($uname.' at '.$udom. - ' trying to publish file '.$ENV{'form.filename'}. + ' trying to publish file '.$env{'form.filename'}. ' - not authorized', $r->filename); return HTTP_NOT_ACCEPTABLE; @@ -1663,14 +1721,14 @@ sub handler { my $fn; my $badfile = 0; - if ($ENV{'form.filename'}) { - $fn=$ENV{'form.filename'}; + if ($env{'form.filename'}) { + $fn=$env{'form.filename'}; $fn=~s/^http\:\/\/[^\/]+\///; $fn=~s/^\///; $fn=~s/(\~|priv\/)(\w+)//; $fn=~s/\/+/\//g; } else { - $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}. + $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}. ' unspecified filename for upload', $r->filename); return HTTP_NOT_FOUND; } @@ -1684,7 +1742,7 @@ sub handler { my @text = (); my $loadentries = ''; - if ($ENV{'form.phase'} eq 'three') { + if ($env{'form.phase'} eq 'three') { if (-e "$dirpath$fn") { open(TESTBANK,"<$dirpath$fn"); @text = ; @@ -1698,7 +1756,7 @@ sub handler { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - if ($ENV{'form.phase'} eq 'three') { + if ($env{'form.phase'} eq 'three') { $current_page = &display_control(); my @PAGES = ('Welcome','Blocks','Format','Target','Confirmation'); $page_name = $PAGES[$current_page]; @@ -1707,10 +1765,10 @@ sub handler { $loadentries = 'onLoad= "setElements()"'; &jscript_one(\$javascript); } elsif ($page_name eq 'Format') { - $qcount = question_count($ENV{'form.qnumformat'},\@text); + $qcount = question_count($env{'form.qnumformat'},\@text); &jscript_two(\$javascript,$qcount); } elsif ($page_name eq 'Target') { - if ($ENV{'form.go'} eq "PreviousPage") { + if ($env{'form.go'} eq "PreviousPage") { $loadentries = 'onLoad = "setElements()"'; } &jscript_three($fullpath,\$javascript); @@ -1723,12 +1781,12 @@ sub handler { $r->print(&Apache::loncommon::bodytag('Upload testbank questions to Construction Space',undef,$loadentries)); - if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})) { + if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) { $r->print('

'.&mt('Co-Author').': '.$uname. &mt(' at ').$udom.'

'); } - if ($ENV{'form.phase'} eq 'three') { + if ($env{'form.phase'} eq 'three') { if ($badfile) { &file_error($r,$uname,$fn,$current_page); } else { @@ -1738,7 +1796,7 @@ sub handler { &display_three ($r,$uname,$fn,$current_page,\@text,$qcount) if $page_name eq 'Target'; &final_display ($r,$uname,$fn,$current_page,\@text) if $page_name eq 'Confirmation'; } - } elsif ($ENV{'form.phase'} eq 'two') { + } elsif ($env{'form.phase'} eq 'two') { my $flag = &Apache::lonupload::phasetwo($r,$fn,$uname,$udom,'testbank'); if ($flag eq 'ok') { my $current_page = 0;