--- loncom/imspackages/imsprocessor.pm 2006/04/05 23:36:52 1.39 +++ loncom/imspackages/imsprocessor.pm 2009/04/23 17:33:50 1.46 @@ -1,3 +1,8 @@ +# The LearningOnline Network with CAPA +# Processor for IMS Packages +# +# $Id: imsprocessor.pm,v 1.46 2009/04/23 17:33:50 bisitz Exp $ +# # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). @@ -25,6 +30,7 @@ package Apache::imsprocessor; use Apache::lonnet; use Apache::loncleanup; +use Apache::lonlocal; use LWP::UserAgent; use HTTP::Request::Common; use LONCAPA::Configuration; @@ -75,7 +81,7 @@ sub ims_config { survey => 'webctsurvey', doc => 'webcontent' ); - %{$areaname} = ( + %{$areaname} = &Apache::lonlocal::texthash ( announce => 'Announcements', board => 'Discussion Boards', doc => 'Documents, pages, and folders', @@ -308,7 +314,6 @@ sub parse_manifest { 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}; @@ -409,7 +414,7 @@ sub target_resources { } sub copy_resources { - my ($context,$cms,$hrefs,$tempdir,$targets,$url,$crs,$cdom,$destdir,$timenow,$assessmentfiles) = @_; + my ($context,$cms,$hrefs,$tempdir,$targets,$url,$crs,$cdom,$destdir,$timenow,$assessmentfiles,$total) = @_; if ($context eq 'DOCS') { foreach my $key (sort keys %{$hrefs}) { if (grep/^$key$/,@{$targets}) { @@ -466,10 +471,18 @@ sub copy_resources { mkdir("$fulldir",0770); } } + my $renameres; if ($cms eq 'angel') { - rename("$tempdir/_assoc/$key/$file","$destdir/resfiles/$key/$file"); + $renameres = rename("$tempdir/_assoc/$key/$file","$destdir/resfiles/$key/$file"); } elsif ($cms eq 'bb5' || $cms eq 'bb6') { - rename("$tempdir/$key/$file","$destdir/resfiles/$key/$file"); + $renameres = rename("$tempdir/$key/$file","$destdir/resfiles/$key/$file"); + } + if ($renameres) { + if (ref($total) eq 'HASH') { + $$total{'file'} ++; + } + } else { + &Apache::lonnet::logthis("IMS import error: $cms - renaming failed for file $file"); } } elsif ($cms eq 'webctce4') { if ($file =~ m-/my_files/(.+)$-) { @@ -486,7 +499,14 @@ sub copy_resources { } } if (-e "$tempdir/$file") { - rename("$tempdir/$file","$destdir/resfiles/$copyfile"); + my $renameres = rename("$tempdir/$file","$destdir/resfiles/$copyfile"); + if ($renameres) { + if (ref($total) eq 'HASH') { + $$total{'file'} ++; + } + } else { + &Apache::lonnet::logthis("IMS import error: WebCT4 - renaming failed for file $file"); + } } } elsif ($file !~ m-/data/(.+)$-) { &Apache::lonnet::logthis("IMS import error: WebCT4 - file $file is in unexpected location"); @@ -620,7 +640,11 @@ sub process_resinfo { 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); + if ($$resources{$key}{file} eq 'questiondb.xml') { + &process_assessment($cms,$context,$key,$docroot,'quiz',$dirname,$destdir,\%{$$resinfo{$key}},$total,$udom,$uname,$pagesfiles,$sequencesfiles,$randompicks,\$dbparse,$resources,$items,\%catinfo,\%qzdbsettings,$hrefs,\%allquestions); + } else { + &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,\%allquestions); } @@ -735,7 +759,11 @@ sub build_structure { my $curr_id = 1; my $resnum = $$items{$key}{resnum}; my $type = $$resources{$resnum}{type}; - my $contentscount = $$items{$key}{'contentscount'}; + my $contentscount = $$items{$key}{'contentscount'}; + my $seqtitle = $$items{$key}{'title'}; + $seqtitle =~ s|/+|_|g; + $seqtitle =~ s/\s+/_/g; + $seqtitle .= '_'.$key; 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} = "\n"; @@ -773,7 +801,7 @@ sub build_structure { if (grep/^$res$/,@{$packages}) { $packageflag = 1; } - $src = &make_structure($cms,$key,$srcstem,\%flag,\%count,$timestamp,$boardnum,$hrefs,\%pagecontents,$res,$type,$file,$resinfo,$contitem,$uname,$cdom,$contcount,$packageflag,$contitemcount,$$randompicks{$contitem}); + $src = &make_structure($cms,$key,$srcstem,\%flag,\%count,$timestamp,$boardnum,$hrefs,\%pagecontents,$res,$type,$file,$resinfo,$contitem,$uname,$cdom,$contcount,$packageflag,$contitemcount,$$randompicks{$contitem},$title); unless ($flag{$key}{page} == 1) { if ($$randompicks{$contitem}) { $seqtext{$key} .= qq| @@ -813,7 +841,7 @@ sub build_structure { if (grep/^$res$/,@{$packages}) { $packageflag = 1; } - $src = &make_structure($cms,$key,$srcstem,\%flag,\%count,$timestamp,$boardnum,$hrefs,\%pagecontents,$res,$type,$file,$resinfo,$contitem,$uname,$cdom,$contcount,$packageflag,$contitemcount,$$randompicks{$contitem}); + $src = &make_structure($cms,$key,$srcstem,\%flag,\%count,$timestamp,$boardnum,$hrefs,\%pagecontents,$res,$type,$file,$resinfo,$contitem,$uname,$cdom,$contcount,$packageflag,$contitemcount,$$randompicks{$contitem},$title); unless ($flag{$key}{page} == 1) { $seqtext{$key} .= qq|> \n|; @@ -845,7 +873,7 @@ sub build_structure { if (grep/^$res$/,@{$packages}) { $packageflag = 1; } - $src = &make_structure($cms,$key,$srcstem,\%flag,\%count,$timestamp,$boardnum,$hrefs,\%pagecontents,$res,$type,$file,$resinfo,$contitem,$uname,$cdom,$contcount,$packageflag,$contitemcount,$$randompicks{$contitem}); + $src = &make_structure($cms,$key,$srcstem,\%flag,\%count,$timestamp,$boardnum,$hrefs,\%pagecontents,$res,$type,$file,$resinfo,$contitem,$uname,$cdom,$contcount,$packageflag,$contitemcount,$$randompicks{$contitem},$title); if ($flag{$key}{page}) { if ($count{$key}{seq} + $count{$key}{page} + $count{$key}{board} + $count{$key}{file} +1 == 1) { @@ -879,10 +907,15 @@ sub build_structure { } unless (($cms eq 'bb5') && $key eq 'Top') { $seqtext{$key} .= "\n"; - open(LOCFILE,">$destdir/sequences/$key.sequence"); + if ($cms eq 'webctce4' && $key ne 'Top') { + push @{$seqfiles}, "$seqtitle.sequence"; + open(LOCFILE,">$destdir/sequences/$seqtitle.sequence"); + } else { + push @{$seqfiles}, "$key.sequence"; + open(LOCFILE,">$destdir/sequences/$key.sequence"); + } print LOCFILE $seqtext{$key}; close(LOCFILE); - push @{$seqfiles}, "$key.sequence"; } $count{$key}{page} ++; $$total{page} += $count{$key}{page}; @@ -972,10 +1005,16 @@ sub build_structure { } sub make_structure { - my ($cms,$key,$srcstem,$flag,$count,$timestamp,$boardnum,$hrefs,$pagecontents,$res,$type,$file,$resinfo,$contitem,$uname,$cdom,$contcount,$packageflag,$contitemcount,$randompick) = @_; + my ($cms,$key,$srcstem,$flag,$count,$timestamp,$boardnum,$hrefs,$pagecontents,$res,$type,$file,$resinfo,$contitem,$uname,$cdom,$contcount,$packageflag,$contitemcount,$randompick,$title) = @_; my $src =''; if (($cms eq 'angel' && $type eq 'FOLDER') || (($cms eq 'bb5' || $cms eq 'bb6') && (($$resinfo{$res}{'isfolder'} eq 'true') || $key eq 'Top')) || ($cms eq 'webctce4' && $contitemcount > 0)) { $src = $srcstem.'/sequences/'.$contitem.'.sequence'; + if ($cms eq 'webctce4') { + $title =~ s|/+|_|g; + $title =~ s/\s+/_/g; + $title .= '_'.$contitem; + $src = $srcstem.'/sequences/'.$title.'.sequence'; + } $$flag{$key}{page} = 0; $$flag{$key}{seq} = 1; $$count{$key}{seq} ++; @@ -1038,14 +1077,16 @@ sub make_structure { if ($file =~ m-/([^/]+)$-) { $filename = $1; } - $src = $srcstem.'/resfiles/'.$res.'/'.$filename; + $src = $srcstem.'/resfiles/'.$filename; } else { foreach my $file (@{$$hrefs{$res}}) { my $filename; - if ($file =~ m-/([^/]+)$-) { + if ($file =~ m-/my_files/(.+)$-) { + $filename = $1; + } elsif ($file =~ m-/([^/]+)$-) { $filename = $1; } - $src = $srcstem.'/resfiles/'.$res.'/'.$filename; + $src = $srcstem.'/resfiles/'.$filename; } } $$flag{$key}{page} = 0; @@ -1417,7 +1458,7 @@ sub process_staff { Office Hours: - $$settings{office}{hours} + $$settings{office}{hours} |; @@ -2178,6 +2219,10 @@ sub parse_webctvista4_assessment { my ($tagname, $attr) = @_; push @state, $tagname; my @seq = (); + if ("@state" eq "questestinterop assessment") { + $$qzparams{$res}{id} = $attr->{'ident'}; + $$qzparams{$res}{title} = $attr->{'title'}; + } if ("@state" eq "questestinterop assessment section itemref") { $id = $attr->{linkrefid}; push(@{$allids},$id); @@ -2186,7 +2231,6 @@ sub parse_webctvista4_assessment { if ("@state" eq "questestinterop assessment section selection_ordering order") { $$qzparams{$res}{order_type} = $attr->{order_type}; } - }, "tagname, attr"], text_h => [sub { @@ -2414,7 +2458,7 @@ sub parse_webctvista4_question { %{$$settings{$id}{$str_id}{$label}} = (); $$settings{$id}{$str_id}{$label}{fibtype} = $fibtype; if ($$settings{$id}{class} eq 'string') { - $$settings{$id}{text} .= '[blank]'; + $$settings{$id}{text} .= '________'; } } if ("@state" eq "questestinterop item presentation flow response_str render_fib response_label material mattext") { # Paragraph @@ -2448,6 +2492,7 @@ sub parse_webctvista4_question { } elsif (($$settings{$id}{class} eq 'string') || ($$settings{$id}{class} eq 'shortanswer')) { $label = $attr->{respident}; + $$settings{$id}{$label}{case} = $attr->{'case'}; } elsif ($$settings{$id}{class} eq 'match') { $grp = $attr->{respident}; } @@ -2739,8 +2784,13 @@ sub parse_webct4_quizprops { sub parse_webct4_questionDB { my ($docroot,$href,$catinfo,$settings,$allanswers,$allchoices,$allids) = @_; - $href =~ s#[^/]+$##; - my $xmlfile = $docroot.'/'.$href.'questionDB.xml'; #quizDB file + my $xmlfile; + if ($href eq 'questiondb.xml') { + $xmlfile = $docroot.'/'.$href; + } else { + $href =~ s#[^/]+$##; + $xmlfile = $docroot.'/'.$href.'questionDB.xml'; #quizDB file + } my @state = (); my $category; # the current category ID my $id; # the current question ID @@ -2761,14 +2811,19 @@ sub parse_webct4_questionDB { action => '', ); my $currtexttype; - my $currimagtype; + my $currimagtype; + my $is_objectbank; my $p = HTML::Parser->new ( xml_mode => 1, start_h => [sub { my ($tagname, $attr) = @_; - push @state, $tagname; + if (("@state" eq "questestinterop") && ($tagname eq 'objectbank')) { + $is_objectbank = 1; + } else { + push @state, $tagname; + } if ("@state" eq "questestinterop section") { $category = $attr->{ident}; %{$$catinfo{$category}} = (); @@ -2830,6 +2885,12 @@ sub parse_webct4_questionDB { $$settings{$id}{texttype} = $attr->{texttype}; $currtexttype = $attr->{texttype}; } + if ("@state" eq "questestinterop section item presentation flow material matimage") { + $$settings{$id}{imagtype} = $attr->{imagtype}; + $currimagtype = $attr->{imagtype}; + $$settings{$id}{uri} = $attr->{uri}; + + } if ("@state" eq "questestinterop section item presentation flow response_lid") { $$settings{$id}{class} = 'multiplechoice'; $list = $attr->{ident}; @@ -2851,6 +2912,10 @@ sub parse_webct4_questionDB { $$settings{$id}{$list}{$answer_id}{texttype} = $attr->{texttype}; $currtexttype = $attr->{texttype}; } + if ("@state" eq "questestinterop section item presentation flow response_lid render_choice flow_label response_label flow_mat material mattext") { + $$settings{$id}{$list}{$answer_id}{texttype} = $attr->{texttype}; + $currtexttype = $attr->{texttype}; + } # Numerical if ("@state" eq "questestinterop section item presentation material mat_extension webct:x_webct_v01_dynamicmattext") { @@ -2937,7 +3002,9 @@ sub parse_webct4_questionDB { } } if ("@state" eq "questestinterop section item resprocessing respcondition setvar") { - $setvar{varname} = $attr->{varname}; + foreach my $key (keys(%{$attr})) { + $setvar{$key} = $attr->{$key}; + } if ($setvar{varname} eq 'WebCT_Correct') { push(@{$$settings{$id}{$grp}{correctanswer}},$answer_id); } @@ -2968,6 +3035,7 @@ sub parse_webct4_questionDB { } if ("@state" eq "questestinterop section item itemfeedback") { $fdbk = $attr->{ident}; + push(@{$$settings{$id}{feedback}},$fdbk); $$settings{$id}{$fdbk}{view} = $attr->{view}; } if ("@state" eq "questestinterop section item itemfeedback material mattext") { @@ -3011,6 +3079,9 @@ sub parse_webct4_questionDB { if ("@state" eq "questestinterop section item presentation flow response_lid render_choice flow_label response_label material mattext") { $$settings{$id}{$list}{$answer_id}{text} = $text; } + if ("@state" eq "questestinterop section item presentation flow response_lid render_choice flow_label response_label flow_mat material mattext") { + $$settings{$id}{$list}{$answer_id}{text} = $text; + } # Numerical if ("@state" eq "questestinterop section item presentation material mat_extension webct:x_webct_v01_dynamicmattext") { @@ -3049,12 +3120,26 @@ sub parse_webct4_questionDB { } } if ("@state" eq "questestinterop section item resprocessing respcondition setvar") { - if ($setvar{varname} eq "answerValue") { # Multiple Choice + if ($setvar{varname} eq "answerValue") { # Multiple Choice WebCT4.0 if ($text =~ m/^\d+$/) { if ($text > 0) { push(@{$$settings{$id}{$list}{correctanswer}},$answer_id); } } + } elsif ($setvar{varname} eq "que_score") { # Multiple Choice WebCT4.1 + if ($text =~ m/^\d+$/) { + if ($text > 0) { + push(@{$$settings{$id}{$list}{correctanswer}},$answer_id); + } + } + } elsif ($is_objectbank) { #Multiple Choice WebCT 4.1 D2L objectbank + if ($setvar{action} eq "Set") { + if ($text =~ /^\d+\.?\d*$/) { + if ($text > 0.000000001) { + push(@{$$settings{$id}{$list}{correctanswer}},$answer_id); + } + } + } } } if ("@state" eq "questestinterop section item resprocessing itemproc_extension webct:x_webct_v01_autocalculate webct:x_webct_v01_anstolerance") { @@ -3071,7 +3156,11 @@ sub parse_webct4_questionDB { end_h => [sub { my ($tagname) = @_; - pop @state; + if (("@state" eq "questestinterop") && ($tagname eq 'objectbank')) { + $is_objectbank = ''; + } else { + pop @state; + } }, "tagname"], ); $p->unbroken_text(1); @@ -3089,6 +3178,22 @@ sub parse_webct4_questionDB { } } } + } elsif ($$settings{$id}{class} eq 'multiplechoice') { + if (ref($$settings{$id}) eq 'HASH') { + foreach my $list (keys(%{$$settings{$id}})) { + if (ref($$settings{$id}{$list}) eq 'HASH') { + if (defined($$settings{$id}{$list}{rcardinality})) { + if ($$settings{$id}{$list}{rcardinality} eq 'Multiple') { + if (ref($$settings{$id}{$list}{correctanswer}) eq 'ARRAY') { + if (@{$$settings{$id}{$list}{correctanswer}} == 1) { + $$settings{$id}{$list}{rcardinality} = 'Single'; + } + } + } + } + } + } + } } } } @@ -3140,21 +3245,22 @@ sub process_assessment { 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); + &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,$cnum,$qzdbsettings); $$dbparse = 1; } - &parse_webctvista4_assessment($res,$docroot,$hrefs,\@allids,\%qzparams); + &parse_webctvista4_assessment($res,$docroot,$$resources{$res}{file},\@allids,\%qzparams); if ($qzparams{$res}{numpick} < @allids) { $$randompicks{$$resources{$res}{revitm}} = $qzparams{$res}{numpick}; $randompickflag = 1; } } my $dirtitle; - unless ($cms eq 'webctce4') { + unless ($cms eq 'webctce4' || $cms eq 'webctvista4') { $dirtitle = $$settings{'title'}; - $dirtitle =~ s/\W//g; + $dirtitle =~ s/\s+/_/g; + $dirtitle =~ s/:/_/g; $dirtitle .= '_'.$res; if (!-e "$destdir/problems") { mkdir("$destdir/problems",0755); @@ -3166,16 +3272,18 @@ sub process_assessment { } 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); + if (@allids > 0 && $allids[0] ne '') { + &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); + &build_problem_container($cms,$dirtitle,$destdir,$container,$res,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,\@allids,$udom,$uname,$dirname,\$containerdir,$cid,$cdom,$cnum,$catinfo,$qzdbsettings,\%qzparams); } 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,$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); + &write_webct4_questions($cms,\@allquestids,$context,$qzdbsettings,$dirname,\%allanswers,\%allchoices,$total,$cid,$cdom,$cnum,$destdir,$catinfo,$dirtitle); } } @@ -3191,9 +3299,14 @@ sub build_category_sequences { 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; + my $seqname; + if ($cms eq 'webctce4') { + $seqname = $$catinfo{$category}{title}.'_'.$category; + } else { + $seqname = $$catinfo{$category}{title}; + } + $seqname =~ s/\s+/_/g; + $seqname =~ s/:/_/g; push(@{$sequencesfiles},$seqname.'.sequence'); my $catsrc = "$destresdir/sequences/$seqname.sequence"; if ($curr_id == 0) { @@ -3231,28 +3344,35 @@ sub build_category_sequences { } sub build_problem_container { - my ($cms,$dirtitle,$destdir,$container,$res,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,$allids,$udom,$uname,$dirname,$containerdir,$cid,$cdom,$cnum,$catinfo,$settings) = @_; + my ($cms,$dirtitle,$destdir,$container,$res,$total,$sequencesfiles,$pagesfiles,$randompickflag,$context,$allids,$udom,$uname,$dirname,$containerdir,$cid,$cdom,$cnum,$catinfo,$settings,$qzparams) = @_; my $seqdir = "$destdir/sequences"; my $pagedir = "$destdir/pages"; my $curr_id = 0; my $next_id = 1; my $fh; + my $mapname = $res; + if ($cms eq 'webctvista4' && ref($$qzparams{$res}) eq 'HASH') { + if ($$qzparams{$res}{title}) { + $mapname = $$qzparams{$res}{title}; + $mapname =~ s/\s+/_/g; + } + } if ($container eq 'pool' || $randompickflag || $container eq 'database') { - $$containerdir = $seqdir.'/'.$res.'.sequence'; + $$containerdir = $seqdir.'/'.$mapname.'.sequence'; if (!-e "$seqdir") { mkdir("$seqdir",0770); } open($fh,">$$containerdir"); $$total{seq} ++; - push @{$sequencesfiles},$res.'.sequence'; + push @{$sequencesfiles},$mapname.'.sequence'; } else { - $$containerdir = $pagedir.'/'.$res.'.page'; + $$containerdir = $pagedir.'/'.$mapname.'.page'; if (!-e "$destdir/pages") { mkdir("$destdir/pages",0770); } open($fh,">$$containerdir"); $$total{page} ++; - push @{$pagesfiles},$res.'.page'; + push @{$pagesfiles},$mapname.'.page'; } print $fh qq| |; @@ -3265,16 +3385,27 @@ sub build_problem_container { } else { $probtitle{$id} = $$settings{title}; } - $probtitle{$id} =~ s/\s/_/g; - $probtitle{$id} =~ s/\W//g; + $probtitle{$id} =~ s/\s+/_/g; + $probtitle{$id} =~ s/:/_/g; + $probtitle{$id} =~ s/\//_/g; $probtitle{$id} .= '_'.$id; } - if ($cms eq 'webctce4' && $container ne 'database') { + if (($cms eq 'webctce4' && $container ne 'database') || + ($cms eq 'webctvista4')) { + my $probdir; my $catid = $$settings{$$allids[0]}{category}; - my $probdir = $$catinfo{$catid}{title}.'_'.$catid; - $probdir =~ s/\s/_/g; - $probdir =~ s/\W//g; - $probsrc = "$dirname/problems/$probdir/$probtitle{$$allids[0]}.problem"; + if ($catid) { + if ($cms eq 'webctce4') { + $probdir = $$catinfo{$catid}{title}.'_'.$catid; + } else { + $probdir = $$catinfo{$catid}{title}; + } + $probdir =~ s/\s+/_/g; + $probdir =~ s/:/_/g; + $probsrc = "$dirname/problems/$probdir/$probtitle{$$allids[0]}.problem"; + } else { + $probsrc="$dirname/problems/$dirtitle/$probtitle{$$allids[0]}.problem"; + } } else { $probsrc="$dirname/problems/$dirtitle/$probtitle{$$allids[0]}.problem"; } @@ -3293,12 +3424,22 @@ sub build_problem_container { $curr_id = $j; $next_id = $curr_id + 1; if ($context eq 'CSTR') { - if ($cms eq 'webctce4' && $container ne 'database') { + if (($cms eq 'webctce4' && $container ne 'database') || + ($cms eq 'webctvista4')) { + my $probdir; my $catid = $$settings{$$allids[$j]}{category}; - my $probdir = $$catinfo{$catid}{title}.'_'.$catid; - $probdir =~ s/\s/_/g; - $probdir =~ s/\W//g; - $probsrc = "$dirname/problems/$probdir/$probtitle{$$allids[$j]}.problem"; + if ($catid) { + if ($cms eq 'webctce4') { + $probdir = $$catinfo{$catid}{title}.'_'.$catid; + } else { + $probdir = $$catinfo{$catid}{title}; + } + $probdir =~ s/\s/_/g; + $probdir =~ s/:/_/g; + $probsrc = "$dirname/problems/$probdir/$probtitle{$$allids[$j]}.problem"; + } else { + $probsrc = "$dirname/problems/$dirtitle/$probtitle{$$allids[$j]}.problem"; + } } else { $probsrc = "$dirname/problems/$dirtitle/$probtitle{$$allids[$j]}.problem"; } @@ -3696,7 +3837,7 @@ sub write_bb5_questions { } sub write_webct4_questions { - my ($cms,$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,$dirtitle) = @_; my $qnum = 0; foreach my $id (@{$alldbquestids}) { $qnum ++; @@ -3706,10 +3847,12 @@ sub write_webct4_questions { my $questionimage; foreach my $fdbk (@{$$settings{$id}{feedback}}) { my $feedback = $$settings{$id}{$fdbk}{text}; - if ($$settings{$id}{$fdbk}{texttype} eq 'text/html') { - $feedback = &HTML::Entities::decode($feedback); + if ($feedback ne '') { + if ($$settings{$id}{$fdbk}{texttype} eq 'text/html') { + $feedback = &HTML::Entities::decode($feedback); + } + $allfeedback .= $feedback; } - $allfeedback .= $feedback; } if ($$settings{$id}{texttype} eq 'text/html') { if ($$settings{$id}{text}) { @@ -3719,7 +3862,7 @@ sub write_webct4_questions { if ($$settings{$id}{class} eq 'numerical') { foreach my $numid (@{$$settings{$id}{numids}}) { foreach my $var (keys %{$$settings{$id}{$numid}{vars}}) { - if ($cms eq 'webct4ce') { + if ($cms eq 'webctce4') { $$settings{$id}{text} =~ s/{($var)}/\$$1 /g; } elsif ($cms eq 'webctvista4') { $$settings{$id}{text} =~ s/\[($var)\]/\$$1 /g; @@ -3745,8 +3888,9 @@ sub write_webct4_questions { } } $$total{prob} ++; + if (exists($$settings{$id}{uri})) { - if ($cms eq 'webct4ce') { + if ($cms eq 'webctce4') { if ($$settings{$id}{imagtype} =~ /^image\//) { $questionimage = '

'."\n"; } else { @@ -3768,9 +3912,6 @@ sub write_webct4_questions { $pre_fill_answer - - $allfeedback - |; } else { $resourcedata{$symb.'questiontext'} = '

'.$$settings{$id}{text}.'

'.$questionimage; @@ -4055,7 +4196,7 @@ $$settings{$id}{$list}{jumbledtext}[$k] ($$settings{$id}{class} eq 'shortanswer')) { my $labelnum = 0; my @str_labels = (); - if ($cms eq 'webct4ce') { + if ($cms eq 'webctce4') { foreach my $str_id (@{$$settings{$id}{str}}) { foreach my $label (@{$$settings{$id}{$str_id}{labels}}) { push(@str_labels,$label); @@ -4215,7 +4356,7 @@ $$settings{$id}{$list}{jumbledtext}[$k] } $increment .= '1'; } - if ($cms eq 'webct4ce') { + if ($cms eq 'webctce4') { $formula =~ s/{($var)}/(\$$1)/g; } elsif ($cms eq 'webctvista4') { $formula =~ s/\[($var)\]/(\$$1)/g; @@ -4265,19 +4406,36 @@ $$settings{$id}{$list}{jumbledtext}[$k] } } if ($context eq 'CSTR') { + my $probdir; my $catid = $$settings{$id}{category}; - my $probdir = $$catinfo{$catid}{title}.'_'.$catid; - $probdir =~ s/\s/_/g; - $probdir =~ s/\W//g; + if ($catid) { + if ($cms eq 'webctce4') { + $probdir = $$catinfo{$catid}{title}.'_'.$catid; + } else { + $probdir = $$catinfo{$catid}{title}; + } + $probdir =~ s/\s/_/g; + $probdir =~ s/://g; + } elsif (defined($dirtitle)) { + $probdir = $dirtitle; + } if (!-e "$destdir/problems/$probdir") { mkdir("$destdir/problems/$probdir",0755); } + if ($allfeedback ne '') { + $output .= qq| + + $allfeedback + +|; + } $output .= qq| |; my $title = $$settings{$id}{title}; $title =~ s/\s/_/g; - $title =~ s/\W//g; - $title .= '_'.$id; + $title =~ s/:/_/g; + $title =~ s/\//_/g; + $title .= '_'.$id; open(PROB,">$destdir/problems/$probdir/$title.problem"); print PROB $output; close PROB; @@ -5245,20 +5403,18 @@ sub angel_content { # ---------------------------------------------------------------- WebCT content sub webct4_content { my ($res,$docroot,$destdir,$settings,$dom,$user,$type,$title,$resrcfiles) = @_; - if (!open(FILE,">$destdir/resfiles/$res.html")) { - &Apache::lonnet::logthis("IMS import error: Cannot open file - $destdir/resfiles/$res.html - $!"); - } else { - push(@{$resrcfiles}, "$res.html"); - my $linktag = ''; - if (defined($$settings{url})) { - $linktag = qq|$destdir/resfiles/$res.html")) { + &Apache::lonnet::logthis("IMS import error: Cannot open file - $destdir/resfiles/$res.html - $!"); + } else { + push(@{$resrcfiles}, "$res.html"); + my $linktag = qq|$title|; } else { $linktag .= qq|>$$settings{url}|; } - } - print FILE qq| + print FILE qq| $title @@ -5266,7 +5422,8 @@ sub webct4_content { $linktag |; - close(FILE); + close(FILE); + } } } 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.