--- loncom/imspackages/imsprocessor.pm 2005/05/03 18:38:37 1.20
+++ loncom/imspackages/imsprocessor.pm 2006/04/04 08:16:41 1.35
@@ -24,6 +24,7 @@
package Apache::imsprocessor;
use Apache::lonnet;
+use Apache::loncleanup;
use LWP::UserAgent;
use HTTP::Request::Common;
use LONCAPA::Configuration;
@@ -31,7 +32,7 @@ use strict;
sub ims_config {
my ($areas,$cmsmap,$areaname) = @_;
- @{$areas} = ("doc","extlink","announce","staff","board","quiz","survey","pool","users");
+ @{$areas} = ("doc","extlink","announce","staff","board","quiz","survey","pool","users","question");
%{$$cmsmap{bb5}} = (
announce => 'resource/x-bb-announcement',
board => 'resource/x-bb-discussionboard',
@@ -43,7 +44,17 @@ sub ims_config {
survey => 'assessment/x-bb-survey',
users => 'course/x-bb-user',
);
- %{$$cmsmap{bb6}} = %{$$cmsmap{bb5}};
+ %{$$cmsmap{bb6}} = (
+ announce => 'resource/x-bb-announcement',
+ board => 'resource/x-bb-discussionboard',
+ doc => 'resource/x-bb-document',
+ extlink => 'resource/x-bb-externallink',
+ pool => 'assessment/x-bb-qti-pool',
+ quiz => 'assessment/x-bb-qti-test',
+ staff => 'resource/x-bb-staffinfo',
+ survey => 'assessment/x-bb-survey',
+ users => 'course/x-bb-user',
+ );
$$cmsmap{bb6}{conference} = 'resource/x-bb-conference';
%{$$cmsmap{angel}} = (
board => 'BOARD',
@@ -53,11 +64,17 @@ sub ims_config {
survey => 'FORM',
);
@{$$cmsmap{angel}{doc}} = ('FILE','PAGE');
- %{$$cmsmap{webct4}} = (
+ %{$$cmsmap{webctce4}} = (
quiz => 'webctquiz',
survey => 'webctsurvey',
doc => 'webcontent'
);
+ %{$$cmsmap{webctvista4}} = (
+ question => 'webct.question',
+ quiz => 'webct.assessment',
+ survey => 'webctsurvey',
+ doc => 'webcontent'
+ );
%{$areaname} = (
announce => 'Announcements',
board => 'Discussion Boards',
@@ -65,6 +82,7 @@ sub ims_config {
extlink => 'Links to external sites',
pool => 'Question pools',
quiz => 'Quizzes',
+ question => 'Assessment Questions',
staff => 'Staff information',
survey => 'Surveys',
users => 'Enrollment',
@@ -147,14 +165,10 @@ sub process_manifest {
bb6 => 'organization',
bb5 => 'tableofcontents',
angel => 'organization',
- webct4 => 'organization',
+ webctce4 => 'organization',
+ webctvista4 => 'organization'
);
- my %contents = ();
- my @state = ();
- my $itm = '';
- my $identifier = '';
my @seq = "Top";
- my $lastitem;
%{$$items{'Top'}} = (
contentscount => 0,
resnum => 'toplevel',
@@ -176,6 +190,20 @@ sub process_manifest {
}
my $xmlfile = $tempdir.'/imsmanifest.xml';
+ &parse_manifest($cms,$phase,$tempdir,$xmlfile,\%toc,$includedres,
+ $includeditems,$items,$resources,$resinfo,$hrefs,\@seq);
+ return 'ok' ;
+}
+
+sub parse_manifest {
+ my ($cms,$phase,$tempdir,$xmlfile,$toc,$includedres,$includeditems,$items,
+ $resources,$resinfo,$hrefs,$seq) = @_;
+ my @state = ();
+ my $itm = '';
+ my %contents = ();
+ my $identifier = '';
+ my @allidentifiers = ();
+ my $lastitem;
my $p = HTML::Parser->new
(
xml_mode => 1,
@@ -184,14 +212,14 @@ sub process_manifest {
my ($tagname, $attr) = @_;
push @state, $tagname;
my $start = @state - 3;
- if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq $toc{$cms}) ) {
+ if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq $$toc{$cms}) ) {
if ($state[-1] eq 'item') {
$itm = $attr->{identifier};
if ($$includeditems{$itm} || $phase ne 'build') {
%{$$items{$itm}} = ();
$$items{$itm}{contentscount} = 0;
@{$$items{$itm}{contents}} = ();
- if ($cms eq 'bb5' || $cms eq 'bb6' || $cms eq 'webct4') {
+ if ($cms eq 'bb5' || $cms eq 'bb6' || $cms eq 'webctce4' || $cms eq 'webctvista4') {
$$items{$itm}{resnum} = $attr->{identifierref};
if ($cms eq 'bb5') {
$$items{$itm}{title} = $attr->{title};
@@ -205,32 +233,32 @@ sub process_manifest {
%{$$resources{$$items{$itm}{resnum}}} = ();
}
$$resources{$$items{$itm}{resnum}}{revitm} = $itm;
- if ($start > @seq) {
+ if ($start > @{$seq}) {
unless ($lastitem eq '') {
- push @seq, $lastitem;
- unless ( defined($contents{$seq[-1]}) ) {
- @{$contents{$seq[-1]}} = ();
+ push @{$seq}, $lastitem;
+ unless ( defined($contents{$$seq[-1]}) ) {
+ @{$contents{$$seq[-1]}} = ();
}
- push @{$contents{$seq[-1]}},$itm;
- $$items{$itm}{parentseq} = $seq[-1];
+ push @{$contents{$$seq[-1]}},$itm;
+ $$items{$itm}{parentseq} = $$seq[-1];
}
- } elsif ($start < @seq) {
- my $diff = @seq - $start;
+ } elsif ($start < @{$seq}) {
+ my $diff = @{$seq} - $start;
while ($diff > 0) {
- pop @seq;
+ pop @{$seq};
$diff --;
}
- if (@seq) {
- push @{$contents{$seq[-1]}}, $itm;
+ if (@{$seq}) {
+ push @{$contents{$$seq[-1]}}, $itm;
}
} else {
- push @{$contents{$seq[-1]}}, $itm;
+ push @{$contents{$$seq[-1]}}, $itm;
}
my $path;
- if (@seq > 1) {
- $path = join(',',@seq);
- } elsif (@seq > 0) {
- $path = $seq[0];
+ if (@{$seq} > 1) {
+ $path = join(',',@{$seq});
+ } elsif (@{$seq} > 0) {
+ $path = $$seq[0];
}
$$items{$itm}{filepath} = $path;
if ($cms eq 'bb5' || $cms eq 'bb6') {
@@ -241,24 +269,29 @@ sub process_manifest {
$$resinfo{$$items{$itm}{resnum}}{'isfolder'} = 'true';
}
}
- $$items{$seq[-1]}{contentscount} ++;
+ $$items{$$seq[-1]}{contentscount} ++;
+ $$resources{$$items{$itm}{resnum}}{seqref} = $seq;
$lastitem = $itm;
}
}
- if ($cms eq 'webct4') {
+ if ($cms eq 'webctce4') {
if (($state[-1] eq "webct:properties") && (@state > 4)) {
$$items{$itm}{properties} = $attr->{identifierref};
}
}
} elsif ("@state" eq "manifest resources resource" ) {
$identifier = $attr->{identifier};
+ push(@allidentifiers,$identifier);
if ($$includedres{$identifier} || $phase ne 'build') {
if ($cms eq 'bb5' || $cms eq 'bb6') {
$$resources{$identifier}{file} = $attr->{file};
$$resources{$identifier}{type} = $attr->{type};
- } elsif ($cms eq 'webct4') {
+ } elsif ($cms eq 'webctce4') {
$$resources{$identifier}{type} = $attr->{type};
$$resources{$identifier}{file} = $attr->{href};
+ } elsif ($cms eq 'webctvista4') {
+ $$resources{$identifier}{type} = $attr->{type};
+ $$resources{$identifier}{'webct:coType'} = $attr->{'webct:coType'};
} elsif ($cms eq 'angel') {
$identifier = substr($identifier,3);
if ($attr->{href} =~ m-^_assoc/$identifier/(.+)$-) {
@@ -269,14 +302,38 @@ sub process_manifest {
}
} elsif ("@state" eq "manifest resources resource file") {
if ($$includedres{$identifier} || $phase ne 'build') {
- if ($cms eq 'bb5' || $cms eq 'bb6' || $cms eq 'webct4') {
+ if ($cms eq 'webctvista4') {
+ $$resources{$identifier}{file} = $attr->{href};
+ }
+ if ($cms eq 'bb5' || $cms eq 'bb6' ||
+ $cms eq 'webctce4' || $cms eq 'webctvista4') {
push @{$$hrefs{$identifier}},$attr->{href};
+
+ if ($$resources{$identifier}{type} eq
+ 'webct.manifest') {
+ my $manifestfile = $tempdir.'/'.$attr->{href};
+ my $currseqref = [];
+ if ($itm) {
+ $currseqref =
+ $$resources{$$items{$itm}{resnum}}{seqref};
+ }
+ &parse_manifest($cms,$phase,$tempdir,$manifestfile,
+ $toc,$includedres,$includeditems,
+ $items,$resources,$resinfo,
+ $hrefs,$currseqref);
+ }
} elsif ($cms eq 'angel') {
if ($attr->{href} =~ m/^_assoc\\$identifier\\(.+)$/) {
push @{$$hrefs{$identifier}},$1;
} elsif ($attr->{href} =~ m/^Icons\\icon(\w+)\.gif/) {
$$resources{$identifier}{type} = $1;
}
+ }
+ }
+ } elsif ("@state" eq "manifest webct:ContentObject") {
+ foreach my $ident (@allidentifiers) {
+ if ($$resources{$ident}{type} eq 'ims_qtiasiv1p2') {
+ $$resources{$ident}{type} = $attr->{'webct:coType'};
}
}
}
@@ -287,12 +344,12 @@ sub process_manifest {
if ("@state" eq "manifest metadata lom general title langstring") {
$$items{'Top'}{title} = $text;
}
- if ($state[0] eq "manifest" && $state[1] eq "organizations" && $state[2] eq $toc{$cms} && $state[-1] eq "title") {
+ if ($state[0] eq "manifest" && $state[1] eq "organizations" && $state[2] eq $$toc{$cms} && $state[-1] eq "title") {
if ($$includeditems{$itm} || $phase ne 'build') {
- if ($cms eq 'angel' || $cms eq 'bb6') {
+ if ($cms eq 'angel' || $cms eq 'bb6' || $cms eq 'webctvista4') {
$$items{$itm}{title} = $text;
}
- if ($cms eq 'webct4') {
+ if ($cms eq 'webctce4') {
$$items{$itm}{title} = $text;
$$items{$itm}{title} =~ s/(<[^>]*>)//g;
}
@@ -307,11 +364,9 @@ sub process_manifest {
);
$p->parse_file($xmlfile);
$p->eof;
-
foreach my $itm (keys %contents) {
@{$$items{$itm}{contents}} = @{$contents{$itm}};
}
- return 'ok' ;
}
sub get_imports {
@@ -354,14 +409,14 @@ sub target_resources {
}
sub copy_resources {
- my ($context,$cms,$hrefs,$tempdir,$targets,$url,$crs,$cdom,$chome,$destdir,$timenow) = @_;
+ my ($context,$cms,$hrefs,$tempdir,$targets,$url,$crs,$cdom,$destdir,$timenow,$assessmentfiles) = @_;
if ($context eq 'DOCS') {
foreach my $key (sort keys %{$hrefs}) {
if (grep/^$key$/,@{$targets}) {
%{$$url{$key}} = ();
foreach my $file (@{$$hrefs{$key}}) {
my $source = $tempdir.'/'.$key.'/'.$file;
- if ($cms eq 'webct4') {
+ if ($cms eq 'webctce4' || $cms eq 'webctvista4') {
$source = $tempdir.'/'.$file;
}
my $filename = '';
@@ -373,16 +428,16 @@ sub copy_resources {
}
$file =~ s-\\-/-g;
my $copyfile = $file;
- if ($cms eq 'webct4') {
+ if ($cms eq 'webctce4' || $cms eq 'webctvista4') {
if ($file =~ m-/my_files/(.+)$-) {
$copyfile = $1;
}
}
- unless (($cms eq 'webct4') && ($copyfile =~ m/questionDB\.xml$/ || $copyfile =~ m/quiz_QIZ_\d+\.xml$/ || $copyfile =~ m/properties_QIZ_\d+\.xml$/)) {
+ unless ((($cms eq 'webctce4') && ($copyfile =~ m/questionDB\.xml$/ || $copyfile =~ m/quiz_QIZ_\d+\.xml$/ || $copyfile =~ m/properties_QIZ_\d+\.xml$/)) || (($cms eq 'webctvista4') && (grep/^$key$/,@{$assessmentfiles}) && $file =~ /\.xml$/)) {
$copyfile = $fpath.$copyfile;
my $fileresult;
if (-e $source) {
- $fileresult = &Apache::lonnet::process_coursefile('copy',$crs,$cdom,$chome,$copyfile,$source);
+ $fileresult = &Apache::lonnet::process_coursefile('copy',$crs,$cdom,$copyfile,$source);
}
}
}
@@ -416,7 +471,7 @@ sub copy_resources {
} elsif ($cms eq 'bb5' || $cms eq 'bb6') {
rename("$tempdir/$key/$file","$destdir/resfiles/$key/$file");
}
- } elsif ($cms eq 'webct4') {
+ } elsif ($cms eq 'webctce4') {
if ($file =~ m-/my_files/(.+)$-) {
my $copyfile = $1;
if ($copyfile =~ m-^[^/]+/[^/]+-) {
@@ -450,6 +505,8 @@ sub process_resinfo {
my $dbparse = 0;
my $announce_handling = 'include';
my $longcrs = '';
+ my %allassessments = ();
+ my %allquestions = ();
my %qzdbsettings = ();
my %catinfo = ();
if ($crs =~ m/^(\d)(\d)(\d)/) {
@@ -500,10 +557,10 @@ sub process_resinfo {
}
} elsif ($$resources{$key}{type} eq "resource/x-bb-staffinfo") {
%{$$resinfo{$key}} = ();
- &process_staff($key,$docroot,$dirname,$destdir,\%{$$resinfo{$key}},$resrcfiles);
+ &process_staff($key,$docroot,$destdir,\%{$$resinfo{$key}},$resrcfiles);
} elsif ($$resources{$key}{type} eq "resource/x-bb-externallink") {
%{$$resinfo{$key}} = ();
- &process_link($key,$docroot,$dirname,$destdir,\%{$$resinfo{$key}},$resrcfiles);
+ &process_link($key,$docroot,$destdir,\%{$$resinfo{$key}},$resrcfiles);
} elsif ($$resources{$key}{type} eq "resource/x-bb-discussionboard") {
%{$$resinfo{$key}} = ();
unless ($db_handling eq 'ignore') {
@@ -513,17 +570,17 @@ sub process_resinfo {
$board_id ++;
$board_count ++;
}
- } elsif ($$resources{$key}{type} eq "assessment/x-bb-pool") {
+ } elsif ($$resources{$key}{type} =~/assessment\/x\-bb\-(qti\-)?pool/) {
%{$$resinfo{$key}} = ();
- &process_assessment($cms,$context,$key,$docroot,'pool',$dirname,$destdir,\%{$$resinfo{$key}},$total,$udom,$uname,$pagesfiles,$sequencesfiles,$randompicks,\$dbparse,$resources,$items,\%catinfo,\%qzdbsettings,$hrefs);
+ &process_assessment($cms,$context,$key,$docroot,'pool',$dirname,$destdir,\%{$$resinfo{$key}},$total,$udom,$uname,$pagesfiles,$sequencesfiles,$randompicks,\$dbparse,$resources,$items,\%catinfo,\%qzdbsettings,$hrefs,\%allquestions);
push @{$pools}, $key;
- } elsif ($$resources{$key}{type} eq "assessment/x-bb-quiz") {
+ } elsif ($$resources{$key}{type} =~ /assessment\/x\-bb\-(qti\-)?quiz/) {
%{$$resinfo{$key}} = ();
- &process_assessment($cms,$context,$key,$docroot,'quiz',$dirname,$destdir,\%{$$resinfo{$key}},$total,$udom,$uname,$pagesfiles,$sequencesfiles,$randompicks,\$dbparse,$resources,$items,\%catinfo,\%qzdbsettings,$hrefs);
+ &process_assessment($cms,$context,$key,$docroot,'quiz',$dirname,$destdir,\%{$$resinfo{$key}},$total,$udom,$uname,$pagesfiles,$sequencesfiles,$randompicks,\$dbparse,$resources,$items,\%catinfo,\%qzdbsettings,$hrefs,\%allquestions);
push @{$quizzes}, $key;
- } elsif ($$resources{$key}{type} eq "assessment/x-bb-survey") {
+ } elsif ($$resources{$key}{type} =~ /assessment\/x\-bb\-(qti\-)?survey/) {
%{$$resinfo{$key}} = ();
- &process_assessment($cms,$context,$key,$docroot,'survey',$dirname,$destdir,\%{$$resinfo{$key}},$total,$udom,$uname,$pagesfiles,$sequencesfiles,$randompicks,\$dbparse,$resources,$items,\%catinfo,\%qzdbsettings,$hrefs);
+ &process_assessment($cms,$context,$key,$docroot,'survey',$dirname,$destdir,\%{$$resinfo{$key}},$total,$udom,$uname,$pagesfiles,$sequencesfiles,$randompicks,\$dbparse,$resources,$items,\%catinfo,\%qzdbsettings,$hrefs,\%allquestions);
push @{$surveys}, $key;
} elsif ($$resources{$key}{type} eq "assessment/x-bb-group") {
%{$$resinfo{$key}} = ();
@@ -558,17 +615,58 @@ sub process_resinfo {
if (@{$pools}) {
$$items{'Top'}{'contentscount'} ++;
}
- } elsif ($cms eq 'webct4') {
+ } elsif ($cms eq 'webctce4') {
foreach my $key (sort keys %{$resources}) {
if (grep/^$key$/,@{$targets}) {
if ($$resources{$key}{type} eq "webcontent") {
%{$$resinfo{$key}} = ();
&webct4_content($key,$docroot,$destdir,\%{$$resinfo{$key}},$udom,$uname,$$resources{$key}{type},$$items{$$resources{$key}{revitm}}{title},$resrcfiles);
} elsif ($$resources{$key}{type} eq "webctquiz") {
- &process_assessment($cms,$context,$key,$docroot,'quiz',$dirname,$destdir,\%{$$resinfo{$key}},$total,$udom,$uname,$pagesfiles,$sequencesfiles,$randompicks,\$dbparse,$resources,$items,\%catinfo,\%qzdbsettings,$hrefs);
+ &process_assessment($cms,$context,$key,$docroot,'quiz',$dirname,$destdir,\%{$$resinfo{$key}},$total,$udom,$uname,$pagesfiles,$sequencesfiles,$randompicks,\$dbparse,$resources,$items,\%catinfo,\%qzdbsettings,$hrefs,\%allquestions);
}
}
}
+ } elsif ($cms eq 'webctvista4') {
+ foreach my $key (sort keys %{$resources}) {
+ if (grep/^$key$/,@{$targets}) {
+ %{$$resinfo{$key}} = ();
+ if ($$resources{$key}{type} eq 'webct.question') {
+ $allquestions{$key} = 1;
+ } elsif ($$resources{$key}{type} eq 'webct.assessment') {
+ $allassessments{$key} = 1;
+ }
+ }
+ }
+ if (keys(%allassessments) > 0) {
+ foreach my $key (sort(keys(%allassessments))) {
+ &process_assessment($cms,$context,$key,$docroot,'quiz',$dirname,$destdir,\%{$$resinfo{$key}},$total,$udom,$uname,$pagesfiles,$sequencesfiles,$randompicks,\$dbparse,$resources,$items,\%catinfo,\%qzdbsettings,$hrefs,\%allquestions);
+ }
+ } elsif (keys(%allquestions) > 0) {
+ my %catinfo = ();
+ my @allids = ();
+ my @allquestids = ();
+ my %allanswers = ();
+ my %allchoices = ();
+ my $containerdir;
+ my $newdir;
+ my $cid;
+ my $randompickflag = 0;
+ if ($context eq 'DOCS') {
+ $cid = $env{'request.course.id'};
+ }
+ my $destresdir = $destdir;
+ if ($context eq 'CSTR') {
+ $destresdir =~ s|/home/$uname/public_html/|/res/$udom/$uname/|;
+ } elsif ($context eq 'DOCS') {
+ $destresdir =~ s|^/home/httpd/html/userfiles|/uploaded|;
+ }
+ foreach my $res (sort(keys(%allquestions))) {
+ my $parent = $allquestions{$res};
+ &parse_webctvista4_question($res,$docroot,$resources,$hrefs,\%qzdbsettings,\@allquestids,\%allanswers,\%allchoices,$parent,\%catinfo);
+ }
+ &build_category_sequences($destdir,\%catinfo,$sequencesfiles,$pagesfiles,$destresdir,$newdir,$cms,$total,$randompickflag,$context,$udom,$uname,$dirname,$cid,$cdom,$crs,\%qzdbsettings);
+ &write_webct4_questions($cms,\@allquestids,$context,\%qzdbsettings,$dirname,\%allanswers,\%allchoices,$total,$cid,$cdom,$crs,$destdir,\%catinfo);
+ }
}
$$total{'board'} = $board_count;
@@ -638,7 +736,7 @@ sub build_structure {
my $resnum = $$items{$key}{resnum};
my $type = $$resources{$resnum}{type};
my $contentscount = $$items{$key}{'contentscount'};
- if (($cms eq 'angel' && $type eq "FOLDER") || (($cms eq 'bb5' || $cms eq 'bb6') && $$resinfo{$resnum}{'isfolder'} eq "true") && (($type eq "resource/x-bb-document") || ($type eq "resource/x-bb-staffinfo") || ($type eq "resource/x-bb-externallink")) || ($cms eq 'webct4' && $contentscount > 0)) {
+ if (($cms eq 'angel' && $type eq "FOLDER") || (($cms eq 'bb5' || $cms eq 'bb6') && $$resinfo{$resnum}{'isfolder'} eq "true") && (($type eq "resource/x-bb-document") || ($type eq "resource/x-bb-staffinfo") || ($type eq "resource/x-bb-externallink")) || ($cms eq 'webctce4' && $contentscount > 0)) {
unless (($cms eq 'bb5') && $key eq 'Top') {
$seqtext{$key} = "|;
- if (!-e "$destdir/problems") {
- mkdir("$destdir/problems",0755);
- }
- if (!-e "$destdir/problems/$seqname") {
- mkdir("$destdir/problems/$seqname",0755);
- }
- $newdir = "$destdir/problems/$seqname";
- my $dbcontainerdir;
- &build_problem_container($cms,$seqname,$destdir,'database',$seqname,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,\@{$$catinfo{$category}{contents}},$udom,$uname,$dirname,\$dbcontainerdir,$cid,$cdom,$cnum,$catinfo,$qzdbsettings);
- }
- close($fh);
- &write_webct4_questions(\@alldbquestids,$context,$qzdbsettings,$dirname,\%alldbanswers,\%alldbchoices,$total,$cid,$cdom,$cnum,$destdir,$catinfo);
+ &build_category_sequences($destdir,$catinfo,$sequencesfiles,$pagesfiles,$destresdir,$newdir,$cms,$total,$randompickflag,$context,$udom,$uname,$dirname,$cid,$cdom,$cnum,$qzdbsettings);
+ &write_webct4_questions($cms,\@alldbquestids,$context,$qzdbsettings,$dirname,\%alldbanswers,\%alldbchoices,$total,$cid,$cdom,$cnum,$destdir,$catinfo);
$$dbparse = 1;
}
&parse_webct4_assessment($res,$docroot,$$resources{$res}{file},$container,\@allids);
@@ -2360,9 +3117,23 @@ sub process_assessment {
$randompickflag = 1;
}
}
+ } elsif ($cms eq 'webctvista4') {
+ unless($$dbparse) {
+ foreach my $res (sort keys %{$allquestions}) {
+ my $parent = $$allquestions{$res};
+ &parse_webctvista4_question($res,$docroot,$resources,$hrefs,$settings,\@allquestids,\%allanswers,\%allchoices,$parent,$catinfo);
+ }
+ &build_category_sequences($destdir,$catinfo,$sequencesfiles,$pagesfiles,$destresdir,$newdir,$cms,$total,$randompickflag,$context,$udom,$uname,$dirname,$cid,$cdom,$cnum,$qzdbsettings);
+ $$dbparse = 1;
+ }
+ &parse_webctvista4_assessment($res,$docroot,$hrefs,\@allids,\%qzparams);
+ if ($qzparams{$res}{numpick} < @allids) {
+ $$randompicks{$$resources{$res}{revitm}} = $qzparams{$res}{numpick};
+ $randompickflag = 1;
+ }
}
my $dirtitle;
- unless ($cms eq 'webct4') {
+ unless ($cms eq 'webctce4') {
$dirtitle = $$settings{'title'};
$dirtitle =~ s/\W//g;
$dirtitle .= '_'.$res;
@@ -2375,7 +3146,7 @@ sub process_assessment {
$newdir = "$destdir/problems/$dirtitle";
}
- if ($cms eq 'webct4') {
+ if ($cms eq 'webctce4') {
&build_problem_container($cms,$dirtitle,$destdir,$container,$res,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,\@allids,$udom,$uname,$dirname,\$containerdir,$cid,$cdom,$cnum,$catinfo,$qzdbsettings);
} else {
&build_problem_container($cms,$dirtitle,$destdir,$container,$res,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,\@allids,$udom,$uname,$dirname,\$containerdir,$cid,$cdom,$cnum,$catinfo,$settings);
@@ -2383,8 +3154,61 @@ sub process_assessment {
if ($cms eq 'bb5') {
&write_bb5_questions(\@allids,$containerdir,$context,$settings,$dirname,$destdir,$res,\%allanswers,\%allchoices,$total,$newdir,$cid,$cdom,$cnum,$docroot);
} elsif ($cms eq 'bb6') {
- &write_bb6_questions(\@allids,$containerdir,$context,$settings,$dirname,$destdir,$res,\%allanswers,\%allchoices,$total,$newdir,$cid,$cdom,$cnum);
+ &write_bb6_questions(\@allids,$containerdir,$context,$settings,$dirname,$destdir,$res,$total,$newdir,$cid,$cdom,$cnum,$docroot);
+ } elsif ($cms eq 'webctvista4') {
+ &write_webct4_questions($cms,\@allquestids,$context,$settings,$dirname,\%allanswers,\%allchoices,$total,$cid,$cdom,$cnum,$destdir,$catinfo);
+ }
+}
+
+sub build_category_sequences {
+ my ($destdir,$catinfo,$sequencesfiles,$pagesfiles,$destresdir,$newdir,$cms,$total,$randompickflag,$context,$udom,$uname,$dirname,$cid,$cdom,$cnum,$qzdbsettings) = @_;
+ if (!-e "$destdir/sequences") {
+ mkdir("$destdir/sequences",0755);
+ }
+ my $numcats = scalar(keys %{$catinfo});
+ my $curr_id = 0;
+ my $next_id = 1;
+ my $fh;
+ open($fh,">$destdir/sequences/question_database.sequence");
+ push @{$sequencesfiles},'question_database.sequence';
+ foreach my $category (sort keys %{$catinfo}) {
+ my $seqname = $$catinfo{$category}{title}.'_'.$category;
+ $seqname =~ s/\s/_/g;
+ $seqname =~ s/\W//g;
+ push(@{$sequencesfiles},$seqname.'.sequence');
+ my $catsrc = "$destresdir/sequences/$seqname.sequence";
+ if ($curr_id == 0) {
+ print $fh qq||;
+ }
+ if ($numcats == 1) {
+ print $fh qq|
+
+\n|;
+ } else {
+ $curr_id = $next_id;
+ $next_id = $curr_id + 1;
+ $catsrc = "$destresdir/sequences/$seqname.sequence";
+ print $fh qq|
+
+\n|;
+ } else {
+ print $fh qq|>\n|;
+ }
+ }
+ print $fh qq||;
+ if (!-e "$destdir/problems") {
+ mkdir("$destdir/problems",0755);
+ }
+ if (!-e "$destdir/problems/$seqname") {
+ mkdir("$destdir/problems/$seqname",0755);
+ }
+ $$newdir = "$destdir/problems/$seqname";
+ my $dbcontainerdir;
+ &build_problem_container($cms,$seqname,$destdir,'database',$seqname,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,\@{$$catinfo{$category}{contents}},$udom,$uname,$dirname,\$dbcontainerdir,$cid,$cdom,$cnum,$catinfo,$qzdbsettings);
}
+ close($fh);
}
sub build_problem_container {
@@ -2417,7 +3241,7 @@ sub build_problem_container {
my $probsrc = "/res/lib/templates/simpleproblem.problem";
if ($context eq 'CSTR') {
foreach my $id (@{$allids}) {
- if ($cms eq 'webct4') {
+ if (($cms eq 'webctce4') || ($cms eq 'webctvista4')) {
$probtitle{$id} = $$settings{$id}{title};
} else {
$probtitle{$id} = $$settings{title};
@@ -2426,7 +3250,7 @@ sub build_problem_container {
$probtitle{$id} =~ s/\W//g;
$probtitle{$id} .= '_'.$id;
}
- if ($cms eq 'webct4' && $container ne 'database') {
+ if ($cms eq 'webctce4' && $container ne 'database') {
my $catid = $$settings{$$allids[0]}{category};
my $probdir = $$catinfo{$catid}{title}.'_'.$catid;
$probdir =~ s/\s/_/g;
@@ -2450,7 +3274,7 @@ sub build_problem_container {
$curr_id = $j;
$next_id = $curr_id + 1;
if ($context eq 'CSTR') {
- if ($cms eq 'webct4' && $container ne 'database') {
+ if ($cms eq 'webctce4' && $container ne 'database') {
my $catid = $$settings{$$allids[$j]}{category};
my $probdir = $$catinfo{$catid}{title}.'_'.$catid;
$probdir =~ s/\s/_/g;
@@ -2477,13 +3301,19 @@ sub build_problem_container {
sub write_bb5_questions {
my ($allids,$containerdir,$context,$settings,$dirname,$destdir,$res,$allanswers,$allchoices,$total,$newdir,$cid,$cdom,$cnum,$docroot) = @_;
my $qnum = 0;
+ my $pathstart;
+ if ($context eq 'CSTR') {
+ $pathstart = '../..';
+ } else {
+ $pathstart = $dirname;
+ }
foreach my $id (@{$allids}) {
if ($$settings{$id}{ishtml} eq 'true') {
$$settings{$id}{text} = &HTML::Entities::decode($$settings{$id}{text});
}
if ($$settings{$id}{text} =~ m#]*>#) {
if (&retrieve_image($context,$res,$dirname,$cdom,$cnum,$docroot,$destdir,$1,$2) eq 'ok') {
- $$settings{$id}{text} =~ s#(]*>)#$1../../resfiles/$res/webimages/$3$4#g;
+ $$settings{$id}{text} =~ s#(]*>)#$1$pathstart/resfiles/$res/webimages/$3$4#g;
}
}
$$settings{$id}{text} =~ s#(]+)/*>#$1 />#gi;
@@ -2531,9 +3361,9 @@ sub write_bb5_questions {
my ($image,$imglink,$url);
if ( defined($$settings{$id}{image}) ) {
if ( $$settings{$id}{style} eq 'embed' ) {
- $image = qq|
|;
+ $image = qq|
|;
} else {
- $imglink = qq|
Link to file
|;
+ $imglink = qq|
Link to file
|;
}
}
if ( defined($$settings{$id}{url}) ) {
@@ -2578,9 +3408,9 @@ sub write_bb5_questions {
my ($ans_image,$ans_link);
if ( defined($$settings{$id}{$$allanswers{$id}[$k]}{image}) ) {
if ( $$settings{$id}{$$allanswers{$id}[$k]}{style} eq 'embed' ) {
- $ans_image .= qq|
|;
+ $ans_image .= qq|
|;
} else {
- $ans_link .= qq|
Link to file
|;
+ $ans_link .= qq|
Link to file
|;
}
}
$output .= $ans_image.$ans_link.''."\n";
@@ -2847,7 +3677,7 @@ sub write_bb5_questions {
}
sub write_webct4_questions {
- my ($alldbquestids,$context,$settings,$dirname,$allanswers,$allchoices,$total,$cid,$cdom,$cnum,$destdir,$catinfo) = @_;
+ my ($cms,$alldbquestids,$context,$settings,$dirname,$allanswers,$allchoices,$total,$cid,$cdom,$cnum,$destdir,$catinfo) = @_;
my $qnum = 0;
foreach my $id (@{$alldbquestids}) {
$qnum ++;
@@ -2863,20 +3693,18 @@ sub write_webct4_questions {
$allfeedback .= $feedback;
}
if ($$settings{$id}{texttype} eq 'text/html') {
- $$settings{$id}{text} = &HTML::Entities::decode($$settings{$id}{text});
- $$settings{$id}{text} = &Apache::lonxml::htmlclean($$settings{$id}{text});
- $$settings{$id}{text} =~ s#(]+)(/?>)#$1../../resfiles/$2 />#gi;
- $$settings{$id}{text} =~ s#<([bh])r>#<$1r />#g;
-# $$settings{$id}{text} =~ s#
#
#g;
-# $$settings{$id}{text} =~ s#
##;
-# $$settings{$id}{text} =~ s###g;
- $$settings{$id}{text} =~ s##
#g;
- $$settings{$id}{text} =~ s#
##g;
- }
+ if ($$settings{$id}{text}) {
+ $$settings{$id}{text} = &text_cleanup($$settings{$id}{text});
+ }
+ }
if ($$settings{$id}{class} eq 'numerical') {
foreach my $numid (@{$$settings{$id}{numids}}) {
foreach my $var (keys %{$$settings{$id}{$numid}{vars}}) {
- $$settings{$id}{text} =~ s/{($var)}/\$$1 /g;
+ if ($cms eq 'webct4ce') {
+ $$settings{$id}{text} =~ s/{($var)}/\$$1 /g;
+ } elsif ($cms eq 'webctvista4') {
+ $$settings{$id}{text} =~ s/\[($var)\]/\$$1 /g;
+ }
}
}
}
@@ -2892,20 +3720,34 @@ sub write_webct4_questions {
$resourcedata{$symb.'randomize'} = 'yes';
$resourcedata{$symb.'maxfoils'} = 10;
if ($context eq 'CSTR') {
- $output = qq|
+ unless ($$settings{$id}{class} eq 'numerical') {
+ $output = qq|
|;
+ }
}
$$total{prob} ++;
if (exists($$settings{$id}{uri})) {
- if ($$settings{$id}{imagtype} =~ /^image\//) {
- $questionimage = ''."\n";
+ if ($cms eq 'webct4ce') {
+ if ($$settings{$id}{imagtype} =~ /^image\//) {
+ $questionimage = ''."\n";
+ } else {
+ $questionimage = ''."\n";
+ }
+ } elsif ($cms eq 'webctvista4') {
+ if ($$settings{$id}{uri} =~ /(gif|jpg|png)$/i) {
+ $questionimage = ''."\n";
+ $questionimage =~ s#(//+)#/#g;
+ } else {
+ $questionimage = ''.$$settings{$id}{uri}.'';
+ }
}
}
if ($$settings{$id}{class} eq "paragraph") {
+ my $pre_fill_answer = $$settings{$id}{PARA}{PARA}{PRE_FILL_ANSWER};
if ($context eq 'CSTR') {
$output .= qq|$$settings{$id}{text}
$questionimage
-
+ $pre_fill_answer
$allfeedback
@@ -2954,7 +3796,7 @@ sub write_webct4_questions {
}
if ($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{texttype} eq 'text/html') {
$$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} = &HTML::Entities::decode($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text});
- $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} = &Apache::lonxml::htmlclean($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text});
+ $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} = &Apache::loncleanup::htmlclean($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text});
$$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} =~ s#(]+)>#$1../../resfiles/$2 />#gi;
$$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} =~ s#?p>##g;
@@ -3028,7 +3870,7 @@ sub write_webct4_questions {
$$settings{$id}{$grp}{$answer_id}{text} = &HTML::Entities::decode($$settings{$id}{$grp}{$answer_id}{text});
$test_for_html = &test_for_html($$settings{$id}{$grp}{$answer_id}{text});
- $$settings{$id}{$grp}{$answer_id}{text} = &Apache::lonxml::chtmlclean($$settings{$id}{$grp}{$answer_id}{text});
+ $$settings{$id}{$grp}{$answer_id}{text} = &Apache::loncleanup::htmlclean($$settings{$id}{$grp}{$answer_id}{text});
$$settings{$id}{$grp}{$answer_id}{text} =~ s#(
-
+
|;
}
} else {
@@ -3091,7 +3933,7 @@ sub write_webct4_questions {
for (my $k=0; $k<@{$$allchoices{$id}}; $k++) {
if ($$settings{$id}{$$allchoices{$id}[$k]}{texttype} eq 'text/html') {
$$settings{$id}{$$allchoices{$id}[$k]}{text} = &HTML::Entities::decode($$settings{$id}{$$allchoices{$id}[$k]}{text});
- $$settings{$id}{$$allchoices{$id}[$k]}{text} = &Apache::lonxml::htmlclean($$settings{$id}{$$allchoices{$id}[$k]}{text});
+ $$settings{$id}{$$allchoices{$id}[$k]}{text} = &Apache::loncleanup::htmlclean($$settings{$id}{$$allchoices{$id}[$k]}{text});
$$settings{$id}{$$allchoices{$id}[$k]}{text} =~ s#(= $max) {
- $max = $$settings{$id}{strings}{$label}[$k];
- }
+ }
+ if ($numerical) {
+ my $numans;
+ my $tol;
+ if (@{$$settings{$id}{strings}{$label}} == 1) {
+ $tol = '5%';
+ $numans = $$settings{$id}{strings}{$label}[0];
+ } else {
+ my $min = $$settings{$id}{strings}{$label}[0];
+ my $max = $$settings{$id}{strings}{$label}[0];
+ for (my $k=1; $k<@{$$settings{$id}{strings}{$label}}; $k++) {
+ if ($$settings{$id}{strings}{$label}[$k] <= $min) {
+ $min = $$settings{$id}{strings}{$label}[$k];
}
- $numans = ($max + $min)/2;
- if ($numans == 0) {
- my $dev = abs($max - $numans);
- if (abs($numans - $min) > $dev) {
- $dev = abs($numans - $min);
- }
- $tol = $dev;
- } else {
- $tol = 100*($max - $min)/($numans*2);
- $tol .= '%';
+ if ($$settings{$id}{strings}{$label}[$k] >= $max) {
+ $max = $$settings{$id}{strings}{$label}[$k];
}
}
- if ($context eq 'CSTR') {
- if (@{$$settings{$id}{str}} > 1) {
- $output .= qq|
-$labelnum.
-|;
+ $numans = ($max + $min)/2;
+ if ($numans == 0) {
+ my $dev = abs($max - $numans);
+ if (abs($numans - $min) > $dev) {
+ $dev = abs($numans - $min);
}
+ $tol = $dev;
+ } else {
+ $tol = 100*($max - $min)/($numans*2);
+ $tol .= '%';
+ }
+ }
+ if ($context eq 'CSTR') {
+ if (@{$$settings{$id}{str}} > 1) {
$output .= qq|
+$labelnum.
+|;
+ }
+ $output .= qq|
|;
+ }
+ } else {
+ if ($context eq 'DOCS') {
+ $resourcedata{$symb.'hiddenparts'} = '!string';
+ $resourcedata{$symb.'questiontype'} = 'string';
+ $resourcedata{$symb.'maxfoils'} = @{$$allanswers{$id}{strings}{$label}};
+ $resourcedata{$symb.'hiddenparts'} = '!string';
+ if ($$settings{$id}{$label}{case} eq "No") {
+ $resourcedata{$symb.'stringtype'} = 'ci';
+ } elsif ($$settings{$id}{$label}{case} eq "Yes") {
+ $resourcedata{$symb.'stringtype'} = 'cs';
}
+ $resourcedata{$symb.'stringanswer'} = $$settings{$id}{strings}{$label}[0];
} else {
- if ($context eq 'DOCS') {
- $resourcedata{$symb.'hiddenparts'} = '!string';
- $resourcedata{$symb.'questiontype'} = 'string';
- $resourcedata{$symb.'maxfoils'} = @{$$allanswers{$id}{strings}{$label}};
- $resourcedata{$symb.'hiddenparts'} = '!string';
- if ($$settings{$id}{$label}{case} eq "No") {
- $resourcedata{$symb.'stringtype'} = 'ci';
- } elsif ($$settings{$id}{$label}{case} eq "Yes") {
- $resourcedata{$symb.'stringtype'} = 'cs';
- }
- $resourcedata{$symb.'stringanswer'} = $$settings{$id}{strings}{$label}[0];
- } else {
- if (@{$$settings{$id}{str}} > 1) { $output .= qq|
+ if (@{$$settings{$id}{str}} > 1) {
+ $output .= qq|
$labelnum.
|;
+ }
+ if (@{$$settings{$id}{strings}{$label}} == 1) {
+ my $casetype;
+ if ($$settings{$id}{$label}{case} eq "No") {
+ $casetype = 'ci';
+ } elsif ($$settings{$id}{$label}{case} eq "Yes") {
+ $casetype = 'cs';
}
- if (@{$$settings{$id}{strings}{$label}} == 1) {
- my $casetype;
- if ($$settings{$id}{$label}{case} eq "No") {
- $casetype = 'ci';
- } elsif ($$settings{$id}{$label}{case} eq "Yes") {
- $casetype = 'cs';
- }
- $output .= qq|
+ $output .= qq|
|;
- } else {
- my @answertext = ();
- for (my $k=0; $k<@{$$settings{$id}{strings}{$label}}; $k++) {
- $$settings{$id}{strings}{$label}[$k] =~ s/\|/\|/g;
- push @answertext, $$settings{$id}{strings}{$label}[$k];
- }
- my $regexpans = join('|',@answertext);
- $regexpans = '/^('.$regexpans.')\b/';
- $output .= qq|
+ } else {
+ my @answertext = ();
+ for (my $k=0; $k<@{$$settings{$id}{strings}{$label}}; $k++) {
+ $$settings{$id}{strings}{$label}[$k] =~ s/\|/\|/g;
+ push @answertext, $$settings{$id}{strings}{$label}[$k];
+ }
+ my $regexpans = join('|',@answertext);
+ $regexpans = '/^('.$regexpans.')\b/';
+ $output .= qq|
|;
- }
}
}
}
}
} elsif ($$settings{$id}{class} eq 'numerical') {
+ my %mathfns = (
+ 'abs' => 'abs',
+ 'acos' => 'acos',
+ 'asin' => 'asin',
+ 'atan' => 'atan',
+ 'ceil' => 'ceil',
+ 'cos' => 'cos',
+ 'exp' => 'exp',
+ 'fact' => 'factorial',
+ 'floor' => 'floor',
+ 'int' => 'int',
+ 'ln' => 'log',
+ 'log' => 'log',
+ 'max' => 'max',
+ 'min' => 'min',
+ 'round' => 'roundto',
+ 'sin' => 'sin',
+ 'sqrt' => 'sqrt',
+ 'tan' => 'tan',
+ );
my $scriptblock = qq|
|;
if ($context eq 'CSTR') {
- $output = $scriptblock.$output;
+ $output = "\n".$scriptblock.$output;
my $ansformat = '';
my $sigfig = '0,15';
if ($$settings{$id}{$numid}{format} eq 'sig') {
@@ -3290,7 +4166,7 @@ sub write_webct4_questions {
$ansformat = 'format="'.$ansformat.'"';
}
my $tolerance = $$settings{$id}{$numid}{tolerance};
- if ($$settings{$id}{$numid}{toltype} eq 'percent') {
+ if (lc($$settings{$id}{$numid}{toltype}) eq 'percent') {
$tolerance .= '%';
}
my $unit = '';
@@ -3299,7 +4175,7 @@ sub write_webct4_questions {
}
my $unitentry = '';
if ($unit ne '') {
- $unitentry = 'unit='.$unit;
+ $unitentry = 'unit="'.$unit.'"';
}
$output .= qq|
@@ -3338,6 +4214,17 @@ sub write_webct4_questions {
}
}
+sub text_cleanup {
+ my ($text) = @_;
+ $text =~ s/(\&)(nbsp|gt|lt)(?!;)/$1$2;$3/gi;
+ $text = &Apache::loncleanup::htmlclean($text);
+ $text =~ s#(]+?)(/?>)#$1../../resfiles/$2 />#gi;
+ $text =~ s#<([bh])r>#<$1r />#g;
+ $text =~ s##
#g;
+ $text =~ s#
##g;
+ return $text;
+}
+
sub test_for_html {
my ($source) = @_;
my @tags = ();
@@ -3356,7 +4243,373 @@ sub test_for_html {
}
sub write_bb6_questions {
- my ($allids,$containerdir,$context,$settings,$dirname,$destdir,$res,$allanswers,$allchoices) = @_;
+ my ($allids,$containerdir,$context,$settings,$dirname,$destdir,$res,$total,$newdir,$cid,$cdom,$cnum,$docroot) = @_;
+ my $qnum = 0;
+ foreach my $id (@{$allids}) {
+ my $questiontext = $$settings{$id}{question}{text};
+ my $question_texttype = $$settings{$id}{question}{texttype};
+ &process_html(\$questiontext,'bb6',$question_texttype,$context,$res,$dirname,$cdom,$cnum,$docroot,$destdir);
+ $qnum ++;
+ my $output;
+ my $permcontainer = $containerdir;
+ $permcontainer =~ s#/home/httpd/html/userfiles#uploaded#;
+ my $symb = $cid.'.'.$permcontainer.'___'.$qnum.'___lib/templates/simpleproblem.problem.0.';
+ my %resourcedata = ();
+ for (my $i=0; $i<10; $i++) {
+ my $iter = $i+1;
+ $resourcedata{$symb.'text'.$iter} = "";
+ $resourcedata{$symb.'value'.$iter} = "unused";
+ $resourcedata{$symb.'position'.$iter} = "random";
+ }
+ $resourcedata{$symb.'randomize'} = 'yes';
+ $resourcedata{$symb.'maxfoils'} = 10;
+ if ($context eq 'CSTR') {
+ $output = qq|
+|;
+ }
+ $$total{prob} ++;
+ $questiontext .= &add_images_links('question',$context,$settings,$id,$dirname,$res);
+ if ($$settings{$id}{class} eq "Essay") {
+ if ($context eq 'CSTR') {
+ $output .= qq|$questiontext
+
+
+
+|;
+ } else {
+ $resourcedata{$symb.'questiontext'} = $questiontext;
+ $resourcedata{$symb.'hiddenparts'} = '!essay';
+ $resourcedata{$symb.'questiontype'} = 'essay';
+ }
+ } else {
+ if ($context eq 'CSTR') {
+ $output .= qq|$questiontext\n|;
+ } else {
+ $resourcedata{$symb.'questiontext'} = $questiontext;
+ }
+ my $numfoils = @{$$settings{$id}{answers}};
+ if (($$settings{$id}{class} eq 'Multiple Choice') ||
+ ($$settings{$id}{class} eq 'True/False')) {
+ if ($context eq 'CSTR') {
+ $output .= qq|
+
+
+|;
+ } else {
+ $resourcedata{$symb.'hiddenparts'} = '!radio';
+ $resourcedata{$symb.'questiontype'} = 'radio';
+ $resourcedata{$symb.'maxfoils'} = $numfoils;
+ }
+ for (my $k=0; $k<$numfoils; $k++) {
+ my $iter = $k+1;
+ my $answer_id = $$settings{$id}{answers}[$k];
+ my $answer_text = $$settings{$id}{$answer_id}{text};
+ my $texttype = $$settings{$id}{$answer_id}{texttype};
+ &process_html(\$answer_text,'bb6',$texttype,$context,$res,$dirname,$cdom,$cnum,$docroot,$destdir);
+ $answer_text .= &add_images_links('response',$context,$settings,$id,$dirname,$res);
+ $output .= " '."\n";
+ $resourcedata{$symb.'text'.$iter} = $answer_text;
+ }
+ if ($context eq 'CSTR') {
+ chomp($output);
+ $output .= qq|
+
+
+
+
+
+
+
+
+
+|;
+ }
+ } elsif ($$settings{$id}{class} eq 'Multiple Answer') {
+ if ($context eq 'CSTR') {
+ $output .= qq|
+
+
+|;
+ } else {
+ $resourcedata{$symb.'newopt'} = '';
+ $resourcedata{$symb.'delopt'} = '';
+ $resourcedata{$symb.'options'} = "('True','False')";
+ $resourcedata{$symb.'hiddenparts'} = '!option';
+ $resourcedata{$symb.'questiontype'} = 'option';
+ $resourcedata{$symb.'maxfoils'} = $numfoils;
+ }
+ for (my $k=0; $k<$numfoils; $k++) {
+ my $iter = $k+1;
+ my $answer_id = $$settings{$id}{answers}[$k];
+ my $answer_text = $$settings{$id}{$answer_id}{text};
+ my $texttype = $$settings{$id}{$answer_id}{texttype};
+ &process_html(\$answer_text,'bb6',$texttype,$context,$res,$dirname,$cdom,$cnum,$docroot,$destdir);
+ $answer_text .= &add_images_links('response',$context,$settings,$id,$dirname,$res);
+
+ $output .= " \n";
+ $resourcedata{$symb.'text'.$iter} = $answer_text;
+ }
+ if ($context eq 'CSTR') {
+ chomp($output);
+ $output .= qq|
+
+
+
+
+
+
+
+
+
+|;
+ }
+ } elsif ($$settings{$id}{class} eq 'Ordering') {
+ my @allorder = ();
+ if ($context eq 'CSTR') {
+ $output .= qq|
+
+
+|;
+ } else {
+ $resourcedata{$symb.'newopt'} = '';
+ $resourcedata{$symb.'delopt'} = '';
+ $resourcedata{$symb.'hiddenparts'} = '!option';
+ $resourcedata{$symb.'questiontype'} = 'option';
+ $resourcedata{$symb.'maxfoils'} = $numfoils;
+ }
+ for (my $k=0; $k<$numfoils; $k++) {
+ my $answer_id = $$settings{$id}{answers}[$k];
+ my $answer_text = $$settings{$id}{$answer_id}{text};
+ my $texttype = $$settings{$id}{$answer_id}{texttype};
+ &process_html(\$answer_text,'bb6',$texttype,$context,$res,$dirname,$cdom,$cnum,$docroot,$destdir);
+ $answer_text .= &add_images_links('response',$context,$settings,$id,$dirname,$res);
+ my $iter = $k+1;
+ if ($context eq 'CSTR') {
+ $output .= " ".$answer_text."\n";
+ } else {
+ $resourcedata{$symb.'text'.$iter} = $answer_text;
+ $resourcedata{$symb.'value'.$iter} = $$settings{$id}{$answer_id}{order};
+ if (!grep/^$$settings{$id}{$answer_id}{order}$/,@allorder) {
+ push(@allorder,$$settings{$id}{$answer_id}{order});
+ }
+ }
+ }
+ if ($context eq 'CSTR') {
+ chomp($output);
+ $output .= qq|
+
+
+|;
+ } else {
+ @allorder = sort {$a <=> $b} @allorder;
+ $resourcedata{$symb.'options'} = "('".join("','",@allorder)."')";
+ }
+ } elsif ($$settings{$id}{class} eq 'Fill in the Blank') {
+ my $numerical = 1;
+ if ($context eq 'DOCS') {
+ $numerical = 0;
+ } else {
+ for (my $k=0; $k<@{$$settings{$id}{correctanswer}}; $k++) {
+ if ($$settings{$id}{correctanswer}[$k] =~ m/([^\d\.]|\.\.)/) {
+ $numerical = 0;
+ }
+ }
+ }
+ if ($numerical) {
+ my $numans;
+ my $tol;
+ if (@{$$settings{$id}{correctanswer}} == 1) {
+ $tol = 5;
+ $numans = $$settings{$id}{correctanswer}[0];
+ } else {
+ my $min = $$settings{$id}{correctanswer}[0];;
+ my $max = $min;
+ for (my $k=1; $k<@{$$settings{$id}{correctanswer}}; $k++) {
+ if ($$settings{$id}{correctanswer}[$k] <= $min) {
+ $min = $$settings{$id}{correctanswer}[$k];
+ }
+ if ($$settings{$id}{correctanswer}[$k] >= $max) {
+ $max = $$settings{$id}{correctanswer}[$k];
+ }
+ }
+ $numans = ($max + $min)/2;
+ $tol = 100*($max - $min)/($numans*2);
+ $tol = 5;
+ }
+ if ($context eq 'CSTR') {
+ $output .= qq|
+
+
+
+
+
+
+
+
+
+
+
+
+|;
+ }
+ } else {
+ if ($context eq 'DOCS') {
+ $resourcedata{$symb.'hiddenparts'} = '!string';
+ $resourcedata{$symb.'questiontype'} = 'string';
+ $resourcedata{$symb.'maxfoils'} = 1;
+ $resourcedata{$symb.'hiddenparts'} = '!string';
+ $resourcedata{$symb.'stringtype'} = 'ci';
+ $resourcedata{$symb.'stringanswer'} = $$settings{$id}{correctanswer}[0];
+ } else {
+ if (@{$$settings{$id}{correctanswer}} == 1) {
+ $output .= qq|
+
+
+
+
+
+
+
+
+
+
+
+|;
+ } else {
+ my @answertext = ();
+ for (my $k=0; $k<@{$$settings{$id}{correctanswer}}; $k++) {
+ my $answer_text = $$settings{$id}{correctanswer}[$k];
+ $answer_text =~ s/\|/\|/g;
+ push @answertext, $answer_text;
+ }
+ my $regexpans = join('|',@answertext);
+ $regexpans = '/^('.$regexpans.')\b/';
+ $output .= qq|
+
+
+
+
+
+
+
+
+
+
+
+|;
+ }
+ }
+ }
+ } elsif ($$settings{$id}{class} eq "Matching") {
+ my @allmatchers = ();
+ my %matchtext = ();
+ if ($context eq 'CSTR') {
+ $output .= qq|
+
+
+
+|;
+ } else {
+ $resourcedata{$symb.'newopt'} = '';
+ $resourcedata{$symb.'delopt'} = '';
+ $resourcedata{$symb.'hiddenparts'} = '!option';
+ $resourcedata{$symb.'questiontype'} = 'option';
+ $resourcedata{$symb.'maxfoils'} = $numfoils;
+ }
+ for (my $k=0; $k<$$settings{$id}{allchoices}; $k++) {
+ my $choice_id = 'rightmatch'.$k;
+ my $choice_text = $$settings{$id}{$choice_id}{text};
+ my $texttype = $$settings{$id}{$choice_id}{texttype};
+ my $choice_plaintext = &remove_html($choice_text);
+ &process_html(\$choice_text,'bb6',$texttype,$context,$res,$dirname,$cdom,$cnum,$docroot,$destdir);
+ $choice_text .= &add_images_links($choice_id,$context,$settings,$id,$dirname,$res);
+ push(@allmatchers,$choice_plaintext);
+ if ($context eq 'CSTR') {
+ $output .= qq|
+-
+$choice_text
+
+ |;
+ }
+ }
+ if ($context eq 'CSTR') {
+ $output .= qq|
+
+|;
+ }
+ for (my $k=0; $k<$numfoils; $k++) {
+ my $answer_id = $$settings{$id}{answers}[$k];
+ my $answer_text = $$settings{$id}{$answer_id}{text};
+ my $texttype = $$settings{$id}{$answer_id}{texttype};
+ &process_html(\$answer_text,'bb6',$texttype,$context,$res,$dirname,$cdom,$cnum,$docroot,$destdir);
+ $answer_text .= &add_images_links($answer_id,$context,$settings,$id,$dirname,$res);
+ if ($context eq 'CSTR') {
+ $output .= '
+
+ '.$answer_text.'
+
+';
+ } else {
+ my $iter = $k+1;
+ $resourcedata{$symb.'value'.$iter} = "$allmatchers[$$settings{$id}{$$settings{$id}{$answer_id}{correctanswer}}{order}]";
+ $resourcedata{$symb.'text'.$iter} = $answer_text;
+ }
+ }
+ if ($context eq 'CSTR') {
+ $output .= qq|
+
+
+|;
+ } else {
+ $resourcedata{$symb.'options'} = "('".join("','",@allmatchers)."')";
+ }
+ }
+ }
+ if ($context eq 'CSTR') {
+
+ $output .= qq|
+
+ $$settings{$id}{solutionfeedback}{text}
+
+
+|;
+ my $title = $$settings{title};
+ $title =~ s/\s/_/g;
+ $title =~ s/\W//g;
+ $title .= '_'.$id;
+ open(PROB,">:utf8", "$newdir/$title.problem");
+ print PROB $output;
+ close PROB;
+ } else {
+# put %resourcedata;
+ my $reply=&Apache::lonnet::cput
+ ('resourcedata',\%resourcedata,$cdom,$cnum);
+ }
+ }
}
sub retrieve_image {
@@ -3378,12 +4631,11 @@ sub retrieve_image {
print $fh $contents;
close($fh);
if ($context eq 'DOCS') {
- my $chome = &Apache::lonnet::homeserver($cname,$cdom);
my $copyfile = $dirname.'/'.$filename;
my $source = "$docroot/$res/webimages/$filename";
my $fileresult;
if (-e $source) {
- $fileresult = &Apache::lonnet::process_coursefile('copy',$cname,$cdom,$chome,$copyfile,$source);
+ $fileresult = &Apache::lonnet::process_coursefile('copy',$cname,$cdom,$copyfile,$source);
}
return $fileresult;
} elsif ($context eq 'CSTR') {
@@ -3943,5 +5195,59 @@ $linktag
}
}
+sub process_html {
+ my ($text,$caller,$html_cond,$context,$res,$dirname,$cdom,$cnum,$docroot,$destdir) = @_;
+ my $pathstart;
+ if ($context eq 'CSTR') {
+ $pathstart = '../..';
+ } else {
+ $pathstart = $dirname;
+ }
+ if ($caller eq 'bb5') {
+ if ($html_cond eq 'true') {
+ $$text = &HTML::Entities::decode($$text);
+ }
+ } elsif ($caller eq 'bb6') {
+ if ($html_cond eq 'HTML') {
+ $$text = &HTML::Entities::decode($$text);
+ }
+ }
+ if ($$text =~ m#]*>#) {
+ if (&retrieve_image($context,$res,$dirname,$cdom,$cnum,$docroot,$destdir,$1,$2) eq 'ok') {
+ $$text =~ s#(]*>)#$1$pathstart/resfiles/$res/webimages/$3$4#g;
+ }
+ }
+ $$text =~ s#(]+)/*>#$1 />#gi;
+ $$text =~ s#
#
#g;
+ return;
+}
+
+sub add_images_links {
+ my ($type,$context,$settings,$id,$dirname,$res) = @_;
+ my ($image,$imglink,$url,$pathstart);
+ if ($context eq 'CSTR') {
+ $pathstart = '../..';
+ } else {
+ $pathstart = $dirname;
+ }
+ if ((defined($$settings{$id}{$type}{image})) && ($$settings{$id}{$type}{image} ne '')) {
+ if ( $$settings{$id}{$type}{style} eq 'Inline' ) {
+ $image = qq|
|;
+ } else {
+ $imglink = qq|
$$settings{$id}{$type}{label}
|;
+ }
+ }
+ if ((defined($$settings{$id}{$type}{link})) && ($$settings{$id}{$type}{link} ne '' )) {
+ $url = qq|
$$settings{$id}{$type}{linkname}
|;
+ }
+ return $image.$imglink.$url;
+}
+
+sub remove_html {
+ my ($choice_text) = @_;
+ return $choice_text;
+}
+
+
1;
__END__