[LON-CAPA-cvs] cvs: modules /peter/PartialCredit PCC_1.pl PCC_2.pl

riegler riegler@source.lon-capa.org
Thu, 30 Jul 2009 15:58:16 -0000


riegler		Thu Jul 30 15:58:16 2009 EDT

  Added files:                 
    /modules/peter/PartialCredit	PCC_1.pl PCC_2.pl 
  Log:
  perl scripts written by Juliane Wenzel to automatically convert "Schlageter-type" of fill in the blank problem raw texts into lc partial credit problems
  

Index: modules/peter/PartialCredit/PCC_1.pl
+++ modules/peter/PartialCredit/PCC_1.pl
use strict;
use warnings;


my $text = "";
my $task = 'Fill in the gaps:';
my $size = 0;
my $filenumber = 1;

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

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


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

sub createproblem{
	my ($Text_in)= @_;
    #Zeilenumbrueche rausfiltern und mehrfach direkt hintereinander#
	#vorkommende Leerzeichen durch ein einzelnes ersetzen#
	$Text_in =~ s/\n/ /g;
	$Text_in =~ s/ (\s+)/ /g;
	my $assignText = "";
	my $solText = "";
	my $solTextnew = "";
	$solTextnew = createsoluarray($Text_in);
	$assignText = createtextlines($Text_in);
	$solText = createbold($Text_in);
	
	

	writedata('<problem>
	
<startouttext />'.$task.'<endouttext />

<customresponse id="11">

<notsolved>
<startouttext />'."\n".
$assignText."\n".
'<endouttext />
</notsolved>

<solved>
<startouttext />'."\n".
$solText."\n".
'<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>');
	
}

###Erzeuge Textlines###
sub createtextlines{
	my ($assignText)= @_;
	
	$assignText =~ s/(\[[a-zA-Z]+\])/\<textline readonly="no" size="$size" \/\>/g;
	
	return ($assignText);
}

###Filtere Loesungen aus den umklammerten Fragementen###
sub createsoluarray{
	my ($Text) = @_;
	my $count = 0;
	my @sols;
	my $solText = "";

	
	#Ersetze die eckigen Klammern aus $Text durch *#
	$Text =~ s/\[/\*/g;
	$Text =~ s/\]/\*/g;
	   
    #Trenne die Loesungsfragmente an den *#
	my @solutions =	split(/\*/, $Text);
	
	for(my $i = 0; $i <$#solutions+1; $i++){
		if(not($i%2==0)){
		  #$i ungerade, jedes zweite Element is Loesungsteil
		  $sols[$count]=$solutions[$i];
		  $count++; 
		}
	
	}
    #Erzeuge 'Array' als String und finde das laengste Loesungsfragment heraus#
	for(my $j=0; $j <$#sols+1; $j++){
		$solText = $solText."'".$sols[$j]."'".',';
		if($size<length($sols[$j])){
		   $size = length($sols[$j]);
		   
		}	
	}
	$solText = substr($solText,0,length($solText)-1);
	#Textline size so setzen, dass sie 3 Zeichen#
    #laenger ist als das laengste Loesungswort#	
	$size = $size + 3;
	
	return $solText;
}


###Makiere Loesungen mit 'Fett'###
sub createbold{
	my ($solText)=@_;
	$solText =~s/\[/\<b\>/g;
	$solText =~s/\]/\<\/b\>/g;
 	return $solText;
}



### Aufgaben-Datei oeffnen (in.txt) und Zeilen einlesen ###
### und in Augaben- und Loesungstext trennen ###

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

while (<DATEI_IN>){
my $line = $_;
	if(not($line =~ /^#/)){
   		$text = $text.$_;
	}
	
	if($line =~ /^###/){
		createproblem($text);
	    $text="";
	    $filenumber++;
	}
}
createproblem($text);


close DATEI_IN;

Index: modules/peter/PartialCredit/PCC_2.pl
+++ modules/peter/PartialCredit/PCC_2.pl
### Skript, wenn Textluecken mit [ ] gekennzeichnet
use strict;
use warnings;


my $text = "";
my $task = 'Fill in the gaps:';
my $size = 0;
my $filenumber = 1;

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

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


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

sub createproblem
{
	my ($Text_in)= @_;
    #Zeilenumbrueche rausfiltern und mehrfach direkt hintereinander#
	#vorkommende Leerzeichen durch ein einzelnes ersetzen#
	$Text_in =~ s/\n/ /g;
	$Text_in =~ s/ \s+/ /g;
	my $assignText = "";
	my $solText = "";
	my $solTextnew = "";
	$solTextnew = createsoluarray($Text_in);
	$assignText = createtextlines($Text_in);
	$solText = createbold($Text_in);
	
	

	writedata('<problem>
	
<startouttext />'.$task.'<endouttext />

<customresponse id="11">

<notsolved>
<startouttext />'."\n".
$assignText."\n".
'<endouttext />
</notsolved>

<solved>
<startouttext />'."\n".
$solText."\n".
'<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>');
	
}

###Erzeuge Textlines und span setzen###
sub createtextlines
{
	my ($assignText)= @_;
	
	my $temp;
	my $temp2;
 	
 	#Anfang des Span durch ** makieren#
    while ($assignText =~ m/([a-zA-Z]*\[)/g)
    {
		$temp = $1;
		$temp2 = substr($temp,0,length($temp)-1);
		$assignText =~ s/\Q$temp\E/\*\*$temp2\#\#/;
	}

	$assignText =~ s/\#\#/\[/g;

	#Ende des Span durch ++ makieren#
 	while ($assignText =~ m/(\][^\s]*)/g)
 	{
		$temp = $1;
		$temp2 = $1;
		$temp2 =~ s/\]/\#\#/g;
		$assignText =~ s/\Q$temp\E/$temp2\+\+/;
    }
    
    $assignText =~ s/\#\#/\]/g;

	$assignText =~ s/\*\*/\<span style="white-space:nowrap"\>/g;
	$assignText =~ s/\+\+/\<\/span>/g;
	$assignText =~ s/\[[a-zA-Z]+\]/\<textline readonly="no" size="$size" \/\>/g;

    return $assignText;
}

###Filtere Loesungen aus den umklammerten Fragementen###
sub createsoluarray
{
	my ($Text) = @_;
	my $count = 0;
	my @sols;
	my $solText = "";

	
    #Trenne an eckigen Klammern#
    my @solutions =    split(/\[|\]/, $Text); 
    	
	for(my $i = 0; $i <$#solutions+1; $i++)
	{
		if($i%2==1)
		{
		  #$i ungerade, jedes zweite Element is Loesungsteil#
		  $sols[$count]=$solutions[$i];
		  $count++; 
		}
	
	}
    #Erzeuge 'Array' als String und finde das laengste Loesungsfragment heraus#
    foreach my $sol (@sols)
    {
          $solText.= "'$sol',";
             if($size<length($sol))
             {
             $size = length($sol);
       		 }   
    } 
	$solText = substr($solText,0,length($solText)-1);
	#Textline size so setzen, dass sie 3 Zeichen#
    #laenger ist als das laengste Loesungswort#	
	$size = $size + 3;
	
	return $solText;
}


###Makiere Loesungen mit bold###
sub createbold
{
	my ($solText)=@_;
	$solText =~s/\[/\<b\>/g;
	$solText =~s/\]/\<\/b\>/g;
 	return $solText;
}



### Aufgaben-Datei oeffnen (in.txt) und Zeilen einlesen ###
### und in Augaben- und Loesungstext trennen ###

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

while (<DATEI_IN>)
{
my $line = $_;
	if(not($line =~ /^#/))
	{
   		$text = $text.$_;
	}
	
	if($line =~ /^###/)
	{
		createproblem($text);
	    $text="";
	    $filenumber++;
	}
}
createproblem($text);


close DATEI_IN;