[LON-CAPA-cvs] cvs: modules /bisitz/scripts create_partialcredits_problems.pl

bisitz bisitz@source.lon-capa.org
Fri, 03 Jul 2009 11:50:17 -0000


bisitz		Fri Jul  3 11:50:17 2009 EDT

  Added files:                 
    /modules/bisitz/scripts	create_partialcredits_problems.pl 
  Log:
  Script to convert an input text file with problem text and gap text
  to a custom response problem with partial credits.
  First version, fully functional.
  
  Credits: Juliane Wenzel
  
  

Index: modules/bisitz/scripts/create_partialcredits_problems.pl
+++ modules/bisitz/scripts/create_partialcredits_problems.pl
# Create Partial Credits Problems
# $Id: create_partialcredits_problems.pl,v 1.1 2009/07/03 11:50:17 bisitz Exp $
#
# (C) Juliane Wenzel, 03.07.2009

use strict;
use warnings;


my $solution = 0;
my $solutiontext = "";
my $assignmenttext = "";
my $task = 'Fill in the gaps:';
my $size = 0;
my @solutionsarray;

### Subroutine die ###
### Daten in Datei schreibt ###

sub writedata{
        my $text=shift;
        open(DATEI,">out.problem");
        print DATEI "$text";
    close(DATEI);}


### Subroutine die ###
### .problem-Datei erzeugt ###

sub createproblem{
        my ($assignText, $solText)= @_;
        my $assignTextnew = "";
        my $solTextnew = "";
        $solTextnew = createsoluarray($assignText,$solText);
        $assignTextnew = createtextlines($assignText);
        $solText = createbold($assignText,$solText,@solutionsarray);
        writedata('<problem>
<startouttext />'.$task.'<endouttext />
<customresponse id="11">
<notsolved>
<startouttext />'.
$assignTextnew.'<endouttext />
</notsolved>
<solved>
<startouttext />'.
$solText.'<endouttext />
</solved>

    <answer type="loncapa/perl">@answer=('.$solTextnew.');
$correct=0;
for ($i=0;$i<=$#$submission;$i++) {
    $$submission[$i]=~s/\s//gs;
    if ($$submission[$i] eq $answer[$i]) { $correct++; }
}
if ($correct==$#answer+1) { return '."'EXACT_ANS'".'; }
if ($correct==0) { return '."'INCORRECT'".'; }
return('."'ASSIGNED_SCORE'".',$correct/($#answer+1));</answer>
</customresponse>
</problem>');
        
}

###Ersetzt die Unterstriche durch Textlines###
sub createtextlines{
        my ($assignText)= @_;
        $assignText =~ s/___+/\<textline readonly="no" size="$size" \/\>/g;

        return ($assignText);
}

###Erzeuge Loesungen aus dem Loesungstext###
sub createsoluarray{
        my ($assignText,$solText)=@_;
        #Zeilenumbrueche rausfiltern und mehrfach direkt hintereinander#
        #vorkommende Leerzeichen durch ein einzelndes ersetzen#
        $assignText =~ s/\n//g;
        $solText =~ s/\n//g;
        $assignText =~ s/ (\s+)/ /g;
        $solText =~ s/(\s+)/ /g;
        
        #Ersetze die Stellen aus $solText, die auch in $assignText vorkommen,#
        #durch *. Dadurch bleiben nur die Loesungsfragmente und * ueber#
        while($assignText =~ m/([^_]+)/gi){
        $solText =~ s/\Q$1\E/\*/;
    }
    #Trenne die Loesungsfragmente an den *#
        my @solutions = split(/\*/, $solText);
        shift @solutions;
        
        #Falls letztes Arrayelement leer ist diese entfernen#
        if(not($solutions[$#solutions] =~ m/.+/gi)){
                splice(@solutions,-1);
        }
        @solutionsarray=@solutions;
        $solText = "";
        $size = length($solutions[0]);
        #Erzeuge 'Array' als String und finde das laengste Loesungsfragment heraus#
        for(my $i = 0; $i <$#solutions+1; $i++){
                $solText = $solText."'".$solutions[$i]."'".','; 
                if($size<length($solutions[$i])){
                   $size = length($solutions[$i]);
                }       
        }
        #Textline size so setzen, dass sie 3 Zeichen#
        #laenger ist als das laengste Loesungswort#
        $size = $size + 3;
        $solText = substr($solText,0,length($solText)-1);
        
        return $solText;
}


###Makiere Loesungen mit 'Fett'###
sub createbold{
        my ($assignText, $solText,@solutions)=@_;
        my $count=0;
    while($assignText =~ m/([_]+)/gi){
         $assignText =~ s/\Q$1\E/\<b\>$solutions[$count]\<\/b\>/;
         $count++;
        }
        
        return $assignText;
}



### Aufgaben-Datei oeffnen und Zeilen einlesen ###
### und in Augaben- und Loesungstext trennen ###

open (DATEI_IN,"<in.txt") || die;

while (<DATEI_IN>){
my $line = $_;
        if(!$solution and not($line =~ /^#/)){
                $assignmenttext = $assignmenttext.$_;
        }
        if($solution){
                $solutiontext = $solutiontext.$_;
        }
        if($line =~ /^###/){
                $solution = 1;
        }
}

createproblem($assignmenttext,$solutiontext);

close DATEI_IN;