--- loncom/publisher/testbankimport.pm 2004/02/17 23:03:34 1.1 +++ loncom/publisher/testbankimport.pm 2004/08/05 21:08:24 1.5 @@ -1,15 +1,41 @@ +# Handler for parsing text upload problem descriptions into .problems +# $Id: testbankimport.pm,v 1.5 2004/08/05 21:08:24 raeburn 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::Log(); +use Apache::lonnet; +use HTML::Entities(); +use Apache::lonlocal; +use Apache::lonupload; +use File::Basename(); # ---------------------------------------------------------------- Display Control sub display_control { @@ -222,8 +248,14 @@ function colSet(caller) { poolForm.elements[caller*5+4].options[2] = new Option("A.","ucperiod",false,false) poolForm.elements[caller*5+4].options[3] = new Option("(a)","lcparen",false,false) poolForm.elements[caller*5+4].options[4] = new Option("(A)","ucparen",false,false) - poolForm.elements[caller*5+4].options[5] = new Option("(i)","romparen",false,false) - poolForm.elements[caller*5+4].options[6] = new Option("i.","romperiod",false,false) + poolForm.elements[caller*5+4].options[5] = new Option("a)","lconeparen",false,false) + poolForm.elements[caller*5+4].options[6] = new Option("A)","uconeparen",false,false) + poolForm.elements[caller*5+4].options[7] = new Option("a.)","lcdotparen",false,false) + poolForm.elements[caller*5+4].options[8] = new Option("A.)","ucdotparen",false,false) + poolForm.elements[caller*5+4].options[9] = new Option("(i)","romparen",false,false) + poolForm.elements[caller*5+4].options[10] = new Option("i)","romoneparen",false,false) + poolForm.elements[caller*5+4].options[11] = new Option("i.)","romdotparen",false,false) + poolForm.elements[caller*5+4].options[12] = new Option("i.","romperiod",false,false) poolForm.elements[caller*5+4].selectedIndex = 0 } else { @@ -255,7 +287,10 @@ function colSet(caller) { if (poolForm.elements[caller*5+3].options[poolForm.elements[caller*5+3].selectedIndex].value == "TF") { poolForm.elements[caller*5+5].options[0] = new Option("Please Select","-1",true,true) poolForm.elements[caller*5+5].options[1] = new Option("True or False","word",false,false) - poolForm.elements[caller*5+5].options[2] = new Option("T or F","lett",false,false) + poolForm.elements[caller*5+5].options[2] = new Option("true or false","word",false,false) + poolForm.elements[caller*5+5].options[3] = new Option("TRUE or FALSE","word",false,false) + poolForm.elements[caller*5+5].options[4] = new Option("T or F","lett",false,false) + poolForm.elements[caller*5+5].options[5] = new Option("t or f","lett",false,false) } else { poolForm.elements[caller*5+5].options[0] = new Option("Not required","0",true,true) @@ -924,17 +959,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|); } } @@ -1104,16 +1153,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 +1171,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 +1182,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 +1433,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 +1445,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 +1580,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]; } }