version 1.1, 2004/02/10 23:36:32
|
version 1.4, 2004/02/29 00:55:39
|
Line 1
|
Line 1
|
package Apache::imsimport; |
package Apache::imsimport; |
|
|
use strict; |
use strict; |
use Apache::Constants qw(:common :http :methods); |
use Apache::Constants qw(:common :http :methods); |
use Apache::loncacc; |
use Apache::loncacc; |
use Apache::loncommon(); |
use Apache::loncommon(); |
use Apache::Log(); |
use Apache::Log(); |
use Apache::lonnet; |
use Apache::lonnet; |
use HTML::Parser; |
use HTML::Parser; |
use HTML::Entities(); |
use HTML::Entities(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonupload; |
use Apache::lonupload; |
use File::Basename(); |
use File::Basename(); |
# ---------------------------------------------------------------- Display Control |
# ---------------------------------------------------------------- Display Control |
sub display_control { |
sub display_control { # figure out what page we're on and where we're heading. |
# figure out what page we're on and where we're heading. |
|
my $page = $ENV{'form.page'}; |
my $page = $ENV{'form.page'}; |
my $command = $ENV{'form.go'}; |
my $command = $ENV{'form.go'}; |
my $current_page = &calculate_page($page,$command); |
my $current_page = &calculate_page($page,$command); |
return $current_page; |
return $current_page; |
} |
} |
|
|
# CALCULATE THE CURRENT PAGE |
# ---------------------------------------------------------------- Calculate Page |
sub calculate_page($$) { |
sub calculate_page($$) { |
my ($prev,$dir) = @_; |
my ($prev,$dir) = @_; |
return 0 if $prev eq ''; # start with first page |
return 0 if $prev eq ''; |
return $prev + 1 if $dir eq 'NextPage'; |
return $prev + 1 if $dir eq 'NextPage'; |
return $prev - 1 if $dir eq 'PreviousPage'; |
return $prev - 1 if $dir eq 'PreviousPage'; |
return $prev if $dir eq 'ExitPage'; |
return $prev if $dir eq 'ExitPage'; |
Line 32 sub calculate_page($$) {
|
Line 31 sub calculate_page($$) {
|
|
|
# ---------------------------------------------------------------- Jscript Zero |
# ---------------------------------------------------------------- Jscript Zero |
sub jscript_zero { |
sub jscript_zero { |
my ($fullpath,$jsref) = @_; |
my ($fullpath,$jsref,$uname,$dom) = @_; |
my $source = ''; |
my $source = ''; |
if (exists($ENV{'form.go'}) ) { |
if (exists($ENV{'form.go'}) ) { |
$source = $ENV{'form.go'}; |
$source = $ENV{'form.go'}; |
} |
} |
|
my %crsentry = (); |
|
my $course_list; |
|
my $title_list; |
|
my @crslist = (); |
|
@crslist = &get_ccroles($uname,$dom,\%crsentry); |
|
if (@crslist > 0) { |
|
$crsentry{$crslist[0]} =~ s/("|,)//g; |
|
$title_list = '"'.$crsentry{$crslist[0]}.'"'; |
|
if (@crslist > 1) { |
|
for (my $i=1; $i<@crslist; $i++) { |
|
$crsentry{$crslist[$i]} =~ s/("|,)//g; |
|
$title_list .= ',"'.$crsentry{$crslist[$i]}.'"'; |
|
} |
|
} |
|
} |
|
$course_list = '"'.join('","',@crslist).'"'; |
|
|
$$jsref = <<"END_OF_ONE"; |
$$jsref = <<"END_OF_ONE"; |
function verify() { |
function verify() { |
if ((document.forms.dataForm.newdir.value == '') || (!document.forms.dataForm.newdir.value)) { |
if ((document.forms.dataForm.newdir.value == '') || (!document.forms.dataForm.newdir.value)) { |
Line 46 function verify() {
|
Line 62 function verify() {
|
if (document.forms.dataForm.source.selectedIndex == 0) { |
if (document.forms.dataForm.source.selectedIndex == 0) { |
alert("You must choose the Course Management System from which the IMS package was exported"); |
alert("You must choose the Course Management System from which the IMS package was exported"); |
return false |
return false |
} |
} |
return true |
return true |
} |
} |
|
|
function nextPage() { |
function nextPage() { |
if (verify()) { |
if (verify()) { |
document.forms.dataForm.go.value="NextPage" |
document.forms.dataForm.go.value="NextPage" |
Line 80 function createWin() {
|
Line 96 function createWin() {
|
newWindow.document.close() |
newWindow.document.close() |
newWindow.focus() |
newWindow.focus() |
} |
} |
|
|
|
function setCourse(caller) { |
|
courseID_array = new Array($course_list) |
|
courseTitle_array = new Array($title_list) |
|
var step1Form = document.forms.dataForm |
|
var curVal = step1Form.elements[caller*2+3].options[step1Form.elements[caller*2+3].selectedIndex].value |
|
step1Form.elements[caller*2+4].length = 0 |
|
if (step1Form.elements[caller*2+3].options[step1Form.elements[caller*2+3].selectedIndex].value == "-1") { |
|
step1Form.elements[caller*2+4].options[0] = new Option("<--- Set type ","-1",true,true) |
|
} |
|
else { |
|
if ((step1Form.elements[caller*2+3].selectedIndex == 2 ) || (step1Form.elements[caller*2+3].selectedIndex == 3)) { |
|
step1Form.elements[caller*2+4].options[0] = new Option("Please Select","-1",true,true) |
|
if (courseID_array.length > 0) { |
|
step1Form.elements[caller*2+4].options[0] = new Option("Please Select","-1",true,true) |
|
for (var i=0; i<courseID_array.length; i++) { |
|
step1Form.elements[caller*2+4].options[i+1] = new Option(courseTitle_array[i],courseID_array[i],false,false) |
|
} |
|
} |
|
else { |
|
step1Form.elements[caller*2+4].options[0] = new Option("No courses available","-2",true,true) |
|
step1Form.elements[caller*2+3].selectedIndex == 1 |
|
} |
|
step1Form.elements[caller*2+4].selectedIndex = 0 |
|
} |
|
else { |
|
step1Form.elements[caller*2+4].options[0] = new Option("Not required","0",true,true) |
|
} |
|
} |
|
} |
|
|
END_OF_ONE |
END_OF_ONE |
|
|
} |
} |
|
|
# ---------------------------------------------------------------- Display Zero |
# ---------------------------------------------------------------- Display Zero |
sub display_zero { |
sub display_zero { |
my ($r,$uname,$fn,$page) = @_; |
my ($r,$uname,$fn,$page,$fullpath) = @_; |
|
|
$r->print(<<"END_OF_ONE"); |
$r->print(<<"END_OF_ONE"); |
<h3><font face='arial,helvetica,sans-serif'>Step 1: Selection of IMS package type and destination directory for the package contents</b> </font></h3> |
|
<form name="dataForm" method="post"> |
<form name="dataForm" method="post"> |
<table border='0' bgcolor='#CCFFDD' cellspacing='0' cellpadding ='0' width='100%'> |
<table border='0' bgcolor='#CCFFDD' cellspacing='0' cellpadding ='0' width='100%'> |
<tr> |
<tr> |
Line 100 sub display_zero {
|
Line 145 sub display_zero {
|
</td> |
</td> |
</tr> |
</tr> |
<tr bgcolor='#ccddaa'> |
<tr bgcolor='#ccddaa'> |
<td width='30' align='top'> |
<td valign='middle'><img src='/res/adm/pages/bl_step1.gif'> |
</td> |
</td> |
<td width='100%' align='left'> |
<td width='100%' align='left'> |
<font size='+1' face='arial,helvetica,sans-serif'><b>Specify the Course Management system used to create the package.</b></font> |
<font face='arial,helvetica,sans-serif'><b>Specify the Course Management system used to create the package.</b> |
|
</font> |
</td> |
</td> |
</tr> |
</tr> |
<tr> |
<tr> |
Line 113 sub display_zero {
|
Line 159 sub display_zero {
|
<td> </td> |
<td> </td> |
<td> |
<td> |
<font face='Arial,Helvetica,sans-serif'> |
<font face='Arial,Helvetica,sans-serif'> |
Please choose the CMS used to create your IMS content package.</font> |
Please choose the CMS used to create your IMS content package. |
</td> |
|
</tr> |
|
<tr> |
|
<td colspan='2'> </td> |
|
</tr> |
|
<tr> |
|
<tr> |
|
<td> </td> |
|
<td> |
|
<font face='Arial,Helvetica,sans-serif'> |
|
<select name="source"> |
<select name="source"> |
<option value='-1' selected="true">Please select |
<option value='-1' selected="true">Please select |
<option value='bb5'>Blackboard 4 or 5 |
<option value='bb5'>Blackboard 5 |
<option value='bb6'>Blackboard 6 |
|
<option value='angel'>ANGEL |
<option value='angel'>ANGEL |
<option value='webct'>WebCT |
|
</select> |
</select> |
|
</font> |
</td> |
</td> |
</tr> |
</tr> |
<tr> |
<tr> |
<td colspan='2'> </td> |
<td colspan='2'> </td> |
</tr> |
</tr> |
|
<tr> |
|
<td colspan='2'> </td> |
|
</tr> |
<tr bgcolor='#ccddaa'> |
<tr bgcolor='#ccddaa'> |
<td width='30' align='top'> |
<td valign='middle'><img src='/res/adm/pages/bl_step2.gif'> |
</td> |
</td> |
<td width='100%' align='left'> |
<td width='100%' align='left'> |
<font size='+1' face='arial,helvetica,sans-serif'><b>Create a directory where you will unpack your IMS package.</b></font> |
<font face='arial,helvetica,sans-serif'><b>Create a directory where you will unpack your IMS package.</b> </font></td> |
</td> |
|
</tr> |
</tr> |
<tr> |
<tr> |
<td colspan='2'> </td> |
<td colspan='2'> </td> |
</tr> |
</tr> |
<tr> |
|
<td> </td> |
<td> </td> |
<td> |
<td> |
<font face='Arial,Helvetica,sans-serif'> |
<font face='Arial,Helvetica,sans-serif'> |
Please choose a destination LON-CAPA directory in which to store the contents of the IMS package file</font> |
Please choose a destination LON-CAPA directory in which to store the contents of the IMS package file. <input type="button" name="createdir" value="Create Directory" onClick="javascript:createWin()"><input type="hidden" name="newdir" value=""></font> |
|
</td> |
|
</tr> |
|
<tr> |
|
<td colspan='2'> <br /><br /></td> |
|
</tr> |
|
<tr bgcolor='#ccddaa'> |
|
<td valign='middle'><img src='/res/adm/pages/bl_step3.gif'> |
|
</td> |
|
<td width='100%' align='left'> |
|
<font face='arial,helvetica,sans-serif'><b>Indicate how any discussion boards and user data in the package should be handled</b></font> |
</td> |
</td> |
</tr> |
</tr> |
<tr> |
<tr> |
Line 158 Please choose a destination LON-CAPA dir
|
Line 204 Please choose a destination LON-CAPA dir
|
</tr> |
</tr> |
<tr> |
<tr> |
<td> </td> |
<td> </td> |
<td><input type="button" name="createdir" value="Create Directory" onClick="javascript:createWin()"><input type="hidden" name="newdir" value=""></td> |
<td> |
|
<table border='0' cellspacing='0' cellpadding='1' bgcolor='#000000'> |
|
<tr> |
|
<td> |
|
<table border='0' cellspacing='0' cellpadding='0' bgcolor='#ffffff' width='100%'> |
|
<tr> |
|
<td> |
|
<table border='0' cellspacing='1' cellpadding='1' bgcolor='#CCFFDD' width='100%'> |
|
<tr bgcolor='#ccddaa'> |
|
<td align='center'><font face='arial,helvetica,sans-serif'><b>Type of data</b></font></td> |
|
<td align='center'><font face='arial,helvetica,sans-serif'><b>Action</b></font></td> |
|
<td align='center'><font face='arial,helvetica,sans-serif'><b>Target course</b></font></td> |
|
</tr> |
|
<tr bgcolor='#eeeeee'> |
|
<td align='left'><font face='arial,helvetica,sans-serif'> Discussion boards  </font></td> |
|
<td align='left'><font face='arial,helvetica,sans-serif'> |
|
<select name='bb_handling' onChange="setCourse('0')"> |
|
<option value='-1'>Select |
|
<option value='ignore'>Disregard |
|
<option value='topics'>Import topics only |
|
<option value='importall'>Import topics & posts |
|
</select> |
|
</font> |
|
</td> |
|
<td align='left'> <font face='arial,helvetica,sans-serif'> |
|
<select name='bb_crs'> |
|
<option value='-1'><--Pick action first |
|
</select> |
|
</font> |
|
</td> |
|
</tr> |
|
<tr bgcolor='#dddddd'> |
|
<td align='left'><font face='arial,helvetica,sans-serif'> User information</font> </td> |
|
<td align='left'> |
|
<select name='user_handling' onChange="setCourse('1')"> |
|
<option value='-1'>Select |
|
<option value='ignore'>Disregard |
|
<option value='students'>Enroll students only |
|
<option value='enrollall'>Emroll all users |
|
</select> |
|
</font> |
|
</td> |
|
<td align='left'> |
|
<font face='arial,helvetica,sans-serif'> |
|
<select name='user_crs'> |
|
<option value='-1'><--Pick action first |
|
</select> |
|
</font> |
|
</td> |
|
</tr> |
|
</table> |
|
</td> |
|
</tr> |
|
</table> |
|
</td> |
|
</tr> |
|
</table> |
|
</td> |
</tr> |
</tr> |
<tr> |
<tr> |
<td colspan='2'> </td> |
<td colspan='2'> <br /><br /></td> |
</tr> |
</tr> |
<tr> |
<tr> |
<td> </td> |
<td> </td> |
<td><font face='arial,helvetica,sans-serif'>If you have created a destination directory you should use the "Next Page" button to complete the process of unpacking your IMS package.</font></td> |
<td><font face='arial,helvetica,sans-serif'>If you have created a destination directory, and have made your selections for the disposition of bulletin boards and user information, you should click the 'Convert' button to unpack your IMS package.</font></td> |
</tr> |
</tr> |
<tr> |
<tr> |
<td colspan='2'> |
<td colspan='2'> |
Line 183 Please choose a destination LON-CAPA dir
|
Line 286 Please choose a destination LON-CAPA dir
|
<td colspan='2'> |
<td colspan='2'> |
<table border='0' cellspacing='0' cellpadding='0' width="100%"> |
<table border='0' cellspacing='0' cellpadding='0' width="100%"> |
<tr> |
<tr> |
<td align='left'> |
<td align='left'> |
|
<input type='button' name='exitpage' value='Exit now' onClick="javascript:location.href='$fullpath'"> |
</td> |
</td> |
<td align='right'> |
<td align='right'> |
<input type="button" name="nextpage" value="Continue to step 2" onClick="javascript:nextPage()"> |
<input type="button" name="nextpage" value="Convert" onClick="javascript:nextPage()"> |
</td> |
</td> |
</tr> |
</tr> |
</table> |
</table> |
Line 200 Please choose a destination LON-CAPA dir
|
Line 304 Please choose a destination LON-CAPA dir
|
END_OF_ONE |
END_OF_ONE |
} |
} |
|
|
# ---------------------------------------------------------------- Display One |
# ---------------------------------------------------------------- Expand Blackboard 5 imsmanifest |
|
|
sub expand_bb5 { |
sub expand_bb5 { |
my ($r,$uname,$udom,$fn,$page) = @_; |
my ($r,$uname,$udom,$fn,$page,$bb_crs,$bb_cdom,$bb_handling,$users_crs,$users_cdom,$users_handling,$announce_handling) = @_; |
my @state = (); |
my @state = (); |
my @seq = "Top"; |
my @seq = "Top"; |
my $lastitem; |
my $lastitem; |
|
my %revitm = (); |
my %resnum = (); |
my %resnum = (); |
my %title = (); |
my %title = (); |
my %filepath = (); |
my %filepath = (); |
Line 221 sub expand_bb5 {
|
Line 325 sub expand_bb5 {
|
my %resinfo = (); |
my %resinfo = (); |
my $numfolders = 0; |
my $numfolders = 0; |
my $numpages = 0; |
my $numpages = 0; |
|
my @timestamp = (); |
|
my @boards = (); |
|
my @groups = (); |
|
my @announcements = (); |
|
my @quizzes = (); |
|
my @surveys = (); |
|
my $board_count = 0; |
|
my $board_id = time; |
|
my $totseq = 0; |
|
my $totpage = 0; |
|
my $totquiz = 0; |
|
my $totsurv = 0; |
|
my $totprob = 0; |
my $docroot = $ENV{'form.newdir'}; |
my $docroot = $ENV{'form.newdir'}; |
if (!-e "$docroot/temp") { |
if (!-e "$docroot/temp") { |
mkdir "$docroot/temp"; |
mkdir "$docroot/temp"; |
Line 232 sub expand_bb5 {
|
Line 349 sub expand_bb5 {
|
my $dirname = "/res/$udom/$uname/$newdir"; |
my $dirname = "/res/$udom/$uname/$newdir"; |
my $zipfile = '/home/'.$uname.'/public_html'.$fn; |
my $zipfile = '/home/'.$uname.'/public_html'.$fn; |
if ($fn =~ m|\.zip$|i) { |
if ($fn =~ m|\.zip$|i) { |
open(OUTPUT, "unzip -o $zipfile -d $docroot/temp 2> /dev/null |"); |
open(OUTPUT, "unzip -o $zipfile -d $docroot/temp 2> /dev/null |"); |
while (<OUTPUT>) { |
while (<OUTPUT>) { |
print "$_<br />"; |
print "$_<br />"; |
} |
} |
close(OUTPUT); |
close(OUTPUT); |
} |
} else { |
|
return 'nozip'; |
|
} |
|
|
|
unless (-e "$docroot/temp/imsmanifest.xml") { |
|
return 'nomanifest'; |
|
} |
my $xmlfile = $docroot.'/temp/imsmanifest.xml'; |
my $xmlfile = $docroot.'/temp/imsmanifest.xml'; |
# print STDERR "XML file is $xmlfile\n"; |
|
my $p = HTML::Parser->new |
my $p = HTML::Parser->new |
( |
( |
xml_mode => 1, |
xml_mode => 1, |
Line 252 sub expand_bb5 {
|
Line 373 sub expand_bb5 {
|
my $start = $num; |
my $start = $num; |
my $statestr = ''; |
my $statestr = ''; |
foreach (@state) { |
foreach (@state) { |
$statestr .= "$_ "; |
$statestr .= "$_ "; |
} |
} |
if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq "tableofcontents") ) { |
if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq "tableofcontents") ) { |
my $searchstr = "manifest organizations tableofcontents"; |
my $searchstr = "manifest organizations tableofcontents"; |
while ($num > 0) { |
while ($num > 0) { |
$searchstr .= " item"; |
$searchstr .= " item"; |
$num --; |
$num --; |
} |
} |
if (("@state" eq $searchstr) && (@state > 3)) { |
if (("@state" eq $searchstr) && (@state > 3)) { |
my $itm = $attr->{identifier}; |
my $itm = $attr->{identifier}; |
$resnum{$itm} = $attr->{identifierref}; |
$resnum{$itm} = $attr->{identifierref}; |
$title{$itm} = $attr->{title}; |
$revitm{$resnum{$itm}} = $itm; |
if ($start > @seq) { |
$title{$itm} = $attr->{title}; |
unless ($lastitem eq '') { |
$contentscount{$itm} = 0; |
push @seq, $lastitem; |
if ($start > @seq) { |
unless ( defined($contents{$seq[-1]}) ) { |
unless ($lastitem eq '') { |
@{$contents{$seq[-1]}} = (); |
push @seq, $lastitem; |
|
unless ( defined($contents{$seq[-1]}) ) { |
|
@{$contents{$seq[-1]}} = (); |
|
} |
|
push @{$contents{$seq[-1]}},$itm; |
|
$parentseq{$itm} = $seq[-1]; |
} |
} |
push @{$contents{$seq[-1]}},$itm; |
|
$parentseq{$itm} = $seq[-1]; |
|
} |
} |
|
elsif ($start < @seq) { |
|
my $diff = @seq - $start; |
|
while ($diff > 0) { |
|
pop @seq; |
|
$diff --; |
|
} |
|
if (@seq) { |
|
push @{$contents{$seq[-1]}}, $itm; |
|
} |
|
} else { |
|
push @{$contents{$seq[-1]}}, $itm; |
|
} |
|
my $path; |
|
if (@seq > 1) { |
|
$path = join(',',@seq); |
|
} elsif (@seq > 0) { |
|
$path = $seq[0]; |
|
} |
|
$filepath{$itm} = $path; |
|
$contentscount{$seq[-1]} ++; |
|
$lastitem = $itm; |
} |
} |
elsif ($start < @seq) { |
|
my $diff = @seq - $start; |
|
while ($diff > 0) { |
|
pop @seq; |
|
$diff --; |
|
} |
|
if (@seq) { |
|
push @{$contents{$seq[-1]}}, $itm; |
|
} |
|
} else { |
|
push @{$contents{$seq[-1]}}, $itm; |
|
} |
|
my $path; |
|
if (@seq > 1) { |
|
$path = join(',',@seq); |
|
} elsif (@seq > 0) { |
|
$path = $seq[0]; |
|
} |
|
$filepath{$itm} = $path; |
|
$contentscount{$seq[-1]} ++; |
|
$lastitem = $itm; |
|
} |
|
} elsif ("@state" eq "manifest resources resource" ) { |
} elsif ("@state" eq "manifest resources resource" ) { |
$identifier = $attr->{identifier}; |
$identifier = $attr->{identifier}; |
$base{$identifier} = $attr->{baseurl}; |
$base{$identifier} = $attr->{baseurl}; |
$file{$identifier} = $attr->{file}; |
$file{$identifier} = $attr->{file}; |
$type{$identifier} = $attr->{type}; |
$type{$identifier} = $attr->{type}; |
} elsif ("@state" eq "manifest resources resource file") { |
} elsif ("@state" eq "manifest resources resource file") { |
push@{$href{$identifier}},$attr->{href}; |
push @{$href{$identifier}},$attr->{href}; |
} |
} |
}, "tagname, attr"], |
}, "tagname, attr"], |
text_h => |
text_h => |
Line 319 sub expand_bb5 {
|
Line 442 sub expand_bb5 {
|
$p->parse_file($xmlfile); |
$p->parse_file($xmlfile); |
$p->eof; |
$p->eof; |
|
|
my $topnum = 0; |
|
my $destdir = $docroot; |
my $destdir = $docroot; |
# print STDERR "Destdir is $destdir\n"; |
my $seqstem ="/res/$udom/$uname/$newdir/sequences"; |
if (!-e "$destdir") { |
if (!-e "$destdir") { |
mkdir("$destdir",0755); |
mkdir("$destdir",0755); |
} |
} |
Line 337 sub expand_bb5 {
|
Line 459 sub expand_bb5 {
|
if (!-e "$destdir/problems") { |
if (!-e "$destdir/problems") { |
mkdir("$destdir/problems",0755); |
mkdir("$destdir/problems",0755); |
} |
} |
open(FILE,">$destdir/sequences/ims_import.sequence"); |
|
print FILE "<map>\n"; |
|
|
|
foreach my $key (sort keys %href) { |
foreach my $key (sort keys %href) { |
foreach my $file (@{$href{$key}}) { |
foreach my $file (@{$href{$key}}) { |
my $filepath = $file; |
my $filepath = $file; |
Line 362 sub expand_bb5 {
|
Line 481 sub expand_bb5 {
|
&process_content($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname); |
&process_content($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname); |
} elsif ($type{$key} eq "resource/x-bb-staffinfo") { |
} elsif ($type{$key} eq "resource/x-bb-staffinfo") { |
%{$resinfo{$key}} = (); |
%{$resinfo{$key}} = (); |
&process_staff($key,$docroot,$destdir,\%{$resinfo{$key}}); |
&process_staff($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}}); |
} elsif ($type{$key} eq "resource/x-bb-externallink") { |
} elsif ($type{$key} eq "resource/x-bb-externallink") { |
%{$resinfo{$key}} = (); |
%{$resinfo{$key}} = (); |
&process_link($key,$docroot,$destdir,\%{$resinfo{$key}}); |
&process_link($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}}); |
} elsif ($type{$key} eq "resource/x-bb-discussionboard") { |
} elsif ($type{$key} eq "resource/x-bb-discussionboard") { |
%{$resinfo{$key}} = (); |
%{$resinfo{$key}} = (); |
&process_db($key,$docroot,$destdir,\%{$resinfo{$key}}); |
unless ($bb_handling eq 'ignore') { |
} elsif ($type{$key} eq "resource/x-bb-announcement") { |
push @boards, $key; |
%{$resinfo{$key}} = (); |
$timestamp[$board_count] = $board_id; |
&process_announce($key,$docroot,$destdir,\%{$resinfo{$key}}); |
&process_db($key,$docroot,$destdir,$board_id,$bb_crs,$bb_cdom,$bb_handling,$uname,\%{$resinfo{$key}}); |
|
$board_id ++; |
|
$board_count ++; |
|
} |
} elsif ($type{$key} eq "assessment/x-bb-pool") { |
} elsif ($type{$key} eq "assessment/x-bb-pool") { |
%{$resinfo{$key}} = (); |
%{$resinfo{$key}} = (); |
&process_assessment($key,$docroot,'pool',$dirname,$destdir,\%{$resinfo{$key}}); |
&process_assessment($key,$docroot,'pool',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob,$udom,$uname); |
} elsif ($type{$key} eq "assessment/x-bb-quiz") { |
} elsif ($type{$key} eq "assessment/x-bb-quiz") { |
%{$resinfo{$key}} = (); |
%{$resinfo{$key}} = (); |
&process_assessment($key,$docroot,'quiz',$dirname,$destdir,\%{$resinfo{$key}}); |
&process_assessment($key,$docroot,'quiz',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob,$udom,$uname); |
|
push @quizzes, $key; |
|
|
} elsif ($type{$key} eq "assessment/x-bb-survey") { |
} elsif ($type{$key} eq "assessment/x-bb-survey") { |
%{$resinfo{$key}} = (); |
%{$resinfo{$key}} = (); |
&process_assessment($key,$docroot,'survey',$dirname,$destdir,\%{$resinfo{$key}}); |
&process_assessment($key,$docroot,'survey',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob,$udom,$uname); |
|
push @surveys, $key; |
} elsif ($type{$key} eq "assessment/x-bb-group") { |
} elsif ($type{$key} eq "assessment/x-bb-group") { |
%{$resinfo{$key}} = (); |
%{$resinfo{$key}} = (); |
|
push @groups, $key; |
&process_group($key,$docroot,$destdir,\%{$resinfo{$key}}); |
&process_group($key,$docroot,$destdir,\%{$resinfo{$key}}); |
} elsif ($type{$key} eq "resource/x-bb-user") { |
} elsif ($type{$key} eq "resource/x-bb-user") { |
%{$resinfo{$key}} = (); |
%{$resinfo{$key}} = (); |
&process_user($key,$docroot,$destdir,\%{$resinfo{$key}}); |
unless ($users_handling eq 'ignore') { |
|
&process_user($key,$docroot,$destdir,\%{$resinfo{$key}},$users_crs,$users_cdom,$users_handling); |
|
} |
|
} elsif ($type{$key} eq "resource/x-bb-announcement") { |
|
unless ($announce_handling eq 'ignore') { |
|
push @announcements, $key; |
|
%{$resinfo{$key}} = (); |
|
&process_announce($key,$docroot,$destdir,\%{$resinfo{$key}},\%resinfo,$seqstem,\%revitm); |
|
} |
} |
} |
} |
} |
|
if (@announcements) { |
|
$contentscount{Top} ++; |
|
} |
|
if (@boards) { |
|
$contentscount{Top} ++; |
|
} |
|
if (@quizzes) { |
|
$contentscount{Top} ++; |
|
$totquiz = @quizzes; |
|
} |
|
if (@surveys) { |
|
$contentscount{Top} ++; |
|
$totsurv = @surveys; |
|
} |
|
|
|
my $topnum = 0; |
my $nextnum = 0; |
my $nextnum = 0; |
open(TOPFILE,">$destdir/sequences/ims_import.sequence"); |
open(TOPFILE,">$destdir/sequences/ims_import.sequence"); |
print TOPFILE "<map>\n"; |
print TOPFILE "<map>\n"; |
Line 404 sub expand_bb5 {
|
Line 553 sub expand_bb5 {
|
my %seqflag = (); |
my %seqflag = (); |
my %seqcount = (); |
my %seqcount = (); |
|
|
|
if (@announcements) { |
|
&process_specials('announcements',\@announcements,\$topnum,\%contentscount,$destdir,$udom,$uname,$newdir,\@timestamp,\%resinfo); |
|
} |
|
|
foreach my $key (sort keys %resnum) { |
foreach my $key (sort keys %resnum) { |
# print STDERR "$key $filepath{$key} $resnum{$key} $title{$key}\n"; |
|
$pageflag{$key} = 0; |
$pageflag{$key} = 0; |
$seqflag{$key} = 0; |
$seqflag{$key} = 0; |
$seqcount{$key} = 0; |
$seqcount{$key} = 0; |
Line 453 sub expand_bb5 {
|
Line 605 sub expand_bb5 {
|
$areacount = 0; |
$areacount = 0; |
} else { |
} else { |
if ($filepath{$key} eq "Top,$areakey") { |
if ($filepath{$key} eq "Top,$areakey") { |
# print STDERR "$key $filepath{$key} $resnum{$key} $title{$key}\n"; |
|
my $src = ''; |
my $src = ''; |
if ($areacount == 0) { |
if ($areacount == 0) { |
if ($resinfo{$resnum{$key}}{'isfolder'} eq "true") { |
if ($resinfo{$resnum{$key}}{'isfolder'} eq "true") { |
Line 512 sub expand_bb5 {
|
Line 663 sub expand_bb5 {
|
my $next_id = 1; |
my $next_id = 1; |
my $curr_id = 0; |
my $curr_id = 0; |
if ( (($type{$resnum{$key}} eq "resource/x-bb-document") || ($type{$resnum{$key}} eq "resource/x-bb-staffinfo") || ($type{$resnum{$key}} eq "resource/x-bb-externallink")) && ($resinfo{$resnum{$key}}{'isfolder'} eq "true") ) { |
if ( (($type{$resnum{$key}} eq "resource/x-bb-document") || ($type{$resnum{$key}} eq "resource/x-bb-staffinfo") || ($type{$resnum{$key}} eq "resource/x-bb-externallink")) && ($resinfo{$resnum{$key}}{'isfolder'} eq "true") ) { |
# if ( ($type{$resnum{$key}} eq "resource/x-bb-staffinfo") && ($resinfo{$resnum{$key}}{'isfolder'} eq "true") ) { |
|
# print "$key $filepath{$key} $resnum{$key} $title{$key}\n"; |
|
# print "Folder for item - $key - res - $resnum{$key}\n"; |
|
# print "$key, $contentscount{$key}\n"; |
|
# foreach (@{$contents{$key}}) { |
|
# print "$key, $_\n"; |
|
# } |
|
# print STDERR "Contents Count for $key is $contentscount{$key}\n"; |
|
open(LOCFILE,">$destdir/sequences/$key.sequence"); |
open(LOCFILE,">$destdir/sequences/$key.sequence"); |
print LOCFILE "<map>\n"; |
print LOCFILE "<map>\n"; |
|
$totseq ++; |
if ($contentscount{$key} == 0) { |
if ($contentscount{$key} == 0) { |
print LOCFILE qq|<resource id="1" src="" type="start"></resource> |
print LOCFILE qq|<resource id="1" src="" type="start"></resource> |
<link from="1" to="2" index="1"></link> |
<link from="1" to="2" index="1"></link> |
Line 603 sub expand_bb5 {
|
Line 747 sub expand_bb5 {
|
} else { |
} else { |
print LOCFILE qq| type="finish"></resource>\n|; |
print LOCFILE qq| type="finish"></resource>\n|; |
} |
} |
print STDERR "seqcount is $seqcount{$key}, pagecount is $pagecount{$key} for $key\n"; |
|
} else { |
} else { |
$curr_id ++; |
$curr_id ++; |
$next_id ++; |
$next_id ++; |
Line 618 sub expand_bb5 {
|
Line 761 sub expand_bb5 {
|
} |
} |
} |
} |
} |
} |
|
|
|
if ($fileopen) { |
|
if ($areacount == 0) { |
|
print AREAFILE qq|<resource id="1" src="" type="start"> |
|
<link from="1" to="2" index="1"></link> |
|
<resource id="2" src="" type="finish">\n|; |
|
} elsif ($areacount == 1) { |
|
print AREAFILE qq|<resource id="2" src="" type="finish">\n|; |
|
} else { |
|
print AREAFILE qq|$lastentry\n|; |
|
} |
|
print AREAFILE "</map>\n"; |
|
close(AREAFILE); |
|
$fileopen = 0; |
|
} |
|
if (@boards > 0) { |
|
&process_specials('boards',\@boards,\$topnum,\%contentscount,$destdir,$udom,$uname,$newdir,\@timestamp,\%resinfo); |
|
} |
|
if (@quizzes) { |
|
&process_specials('quizzes',\@quizzes,\$topnum,\%contentscount,$destdir,$udom,$uname,$newdir,\@timestamp,\%resinfo); |
|
} |
|
if (@surveys) { |
|
&process_specials('surveys',\@surveys,\$topnum,\%contentscount,$destdir,$udom,$uname,$newdir,\@timestamp,\%resinfo); |
|
} |
print TOPFILE "</map>"; |
print TOPFILE "</map>"; |
close(TOPFILE); |
close(TOPFILE); |
foreach my $key (sort keys %pagecontents) { |
foreach my $key (sort keys %pagecontents) { |
for (my $i=0; $i<@{$pagecontents{$key}}; $i++) { |
for (my $i=0; $i<@{$pagecontents{$key}}; $i++) { |
my $filestem = "/res/$udom/$uname/$newdir"; |
my $filestem = "/res/$udom/$uname/$newdir"; |
my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page'; |
my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page'; |
|
$totpage ++; |
open(PAGEFILE,">$filename"); |
open(PAGEFILE,">$filename"); |
print PAGEFILE qq|<map> |
print PAGEFILE qq|<map> |
<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][0]}.html" id="1" type="start" title="$title{$pagecontents{$key}[$i][0]}"></resource> |
<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][0]}.html" id="1" type="start" title="$title{$pagecontents{$key}[$i][0]}"></resource> |
Line 647 sub expand_bb5 {
|
Line 815 sub expand_bb5 {
|
close(PAGEFILE); |
close(PAGEFILE); |
} |
} |
} |
} |
system(" rm -r $docroot/temp"); |
system(" rm -r $docroot/temp"); # Need to add sanity checking |
|
return('ok',$totseq,$totpage,$board_count,$totquiz,$totsurv,$totprob); |
|
} |
|
|
|
# ---------------------------------------------------------------- Process Blackboard specials - announcements, bulletin boards, quizzes and surveys |
|
sub process_specials { |
|
my ($type,$items,$topnum,$contentscount,$destdir,$udom,$uname,$newdir,$timestamp,$resinfo) = @_; |
|
my $src = ''; |
|
my $itemsrc = ''; |
|
my $nextnum = 0; |
|
my $seqstem = '/res/'.$udom.'/'.$uname.'/'.$newdir; |
|
my %seqnames = ( |
|
boards => 'bulletinboards', |
|
quizzes => 'quizzes', |
|
surveys => 'surveys', |
|
announcements => 'announcements', |
|
); |
|
my %seqtitles = ( |
|
boards => 'Course Bulletin Boards', |
|
quizzes => 'Course Quizzes', |
|
surveys => 'Course Surveys', |
|
announcements => 'Course Announcements', |
|
); |
|
$$topnum ++; |
|
if ($type eq 'announcements') { |
|
$src = "$seqstem/pages/$seqnames{$type}.page"; |
|
} else { |
|
$src = "$seqstem/sequences/$seqnames{$type}.sequence"; |
|
} |
|
print TOPFILE qq|<resource id="$$topnum" src="$src" title="$seqtitles{$type}"|; |
|
$nextnum = $$topnum +1; |
|
if ($$topnum == 1) { |
|
print TOPFILE qq| type="start"></resource> |
|
<link from="$$topnum" to="$nextnum" index="$$topnum"></link>\n|; |
|
if ($$topnum == $$contentscount{'Top'}) { |
|
print TOPFILE qq|<resource id="$nextnum" src="" type="finish"></resource>\n|; |
|
} |
|
} else { |
|
if ($$topnum == $$contentscount{'Top'}) { |
|
print TOPFILE qq| type="finish"></resource>\n|; |
|
} else { |
|
print TOPFILE qq|></resource> |
|
<link from="$$topnum" to="$nextnum" index="$$topnum"></link>\n|; |
|
} |
|
} |
|
|
|
if ($type eq "announcements") { |
|
open(ITEM,">$destdir/pages/$seqnames{$type}.page"); |
|
} else { |
|
open(ITEM,">$destdir/sequences/$seqnames{$type}.sequence"); |
|
} |
|
|
|
if ($type eq 'boards') { |
|
$itemsrc = "/adm/$udom/$uname/$$timestamp[0]/bulletinboard"; |
|
} elsif ($type eq 'announcements') { |
|
$itemsrc = "/res/$udom/$uname/$newdir/resfiles/$$items[0].html"; |
|
} else { |
|
$itemsrc = "/res/$udom/$uname/$newdir/pages/$$items[0].page"; |
|
} |
|
print ITEM qq|<map> |
|
<resource id="1" src="$itemsrc" title="$$resinfo{$$items[0]}{title}" type="start"></resource> |
|
<link from="1" to="2" index="1"></link>|; |
|
if (@{$items} == 1) { |
|
print ITEM qq| |
|
<resource id="2" src="" type="finish"></resource>\n|; |
|
} else { |
|
for (my $i=1; $i<@{$items}; $i++) { |
|
my $curr = $i+1; |
|
my $next = $i+2; |
|
if ($type eq 'boards') { |
|
$itemsrc = "/adm/$udom/$uname/$$timestamp[$i]/bulletinboard"; |
|
} elsif ($type eq 'announcements') { |
|
$itemsrc = "/res/$udom/$uname/$newdir/resfiles/$$items[$i].html"; |
|
} else { |
|
$itemsrc = "/res/$udom/$uname/$newdir/pages/$$items[$i].page"; |
|
} |
|
print ITEM qq|<resource id="$curr" src="$itemsrc" title="$$resinfo{$$items[$i]}{title}"|; |
|
if (@{$items} == $i+1) { |
|
print ITEM qq| type="finish"></resource>\n|; |
|
} else { |
|
print ITEM qq|></resource> |
|
<link from="$curr" to="$next" index="$next">\n|; |
|
} |
|
} |
|
} |
|
print ITEM qq|</map>|; |
|
close(ITEM); |
} |
} |
|
|
|
# ---------------------------------------------------------------- Process Blackboard users |
sub process_user { |
sub process_user { |
my ($res,$docroot,$destdir,$settings) = @_; |
my ($res,$docroot,$destdir,$settings,$user_crs,$user_cdom,$user_handling) = @_; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my $filecount = 0; |
my $filecount = 0; |
my @state; |
my @state; |
Line 665 sub process_user {
|
Line 920 sub process_user {
|
[sub { |
[sub { |
my ($tagname, $attr) = @_; |
my ($tagname, $attr) = @_; |
push @state, $tagname; |
push @state, $tagname; |
if (@state eq " USERS USER") { |
if (@state eq "USERS USER") { |
$userid = $attr->{value}; |
$userid = $attr->{value}; |
%{$$$settings{$userid}} = (); |
%{$$settings{$userid}} = (); |
@{$$settings{$userid}{links}} = (); |
@{$$settings{$userid}{links}} = (); |
} elsif (@state eq "USERS USER LOGINID") { |
} elsif (@state eq "USERS USER LOGINID") { |
$$settings{$userid}{loginid} = $attr->{value}; |
$$settings{$userid}{loginid} = $attr->{value}; |
Line 718 sub process_user {
|
Line 973 sub process_user {
|
$p->unbroken_text(1); |
$p->unbroken_text(1); |
$p->parse_file($xmlfile); |
$p->parse_file($xmlfile); |
$p->eof; |
$p->eof; |
|
|
|
my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf'); |
|
my $xmlstem = $$configvars{'lonDaemons'}."/tmp/".$user_cdom."_".$user_crs."_"; |
|
|
|
foreach my $user_id (keys %{$settings}) { |
|
if ($$settings{$user_id}{user_role} eq "s") { |
|
|
|
} elsif ($user_handling eq 'enrollall') { |
|
|
|
} |
|
} |
} |
} |
|
|
|
# ---------------------------------------------------------------- Process Blackboard groups |
sub process_group { |
sub process_group { |
my ($res,$docroot,$destdir,$settings) = @_; |
my ($res,$docroot,$destdir,$settings) = @_; |
my $xmlfile = $docroot."/".$res.".dat"; |
my $xmlfile = $docroot."/".$res.".dat"; |
Line 770 sub process_group {
|
Line 1037 sub process_group {
|
$p->eof; |
$p->eof; |
} |
} |
|
|
|
# ---------------------------------------------------------------- Process Blackboard Staff |
sub process_staff { |
sub process_staff { |
my ($res,$docroot,$destdir,$settings) = @_; |
my ($res,$docroot,$dirname,$destdir,$settings) = @_; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my $filecount = 0; |
my $filecount = 0; |
my @state; |
my @state; |
Line 787 sub process_staff {
|
Line 1055 sub process_staff {
|
push @state, $tagname; |
push @state, $tagname; |
if (@state eq "STAFFINFO TITLE") { |
if (@state eq "STAFFINFO TITLE") { |
$$settings{title} = $attr->{value}; |
$$settings{title} = $attr->{value}; |
} elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") { |
} elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") { |
$$settings{textcolor} = $attr->{value}; |
$$settings{textcolor} = $attr->{value}; |
} elsif (@state eq "STAFFINFO BIOGRAPHY FLAGS ISHTML") { |
} elsif (@state eq "STAFFINFO BIOGRAPHY FLAGS ISHTML") { |
$$settings{ishtml} = $attr->{value}; |
$$settings{ishtml} = $attr->{value}; |
} elsif ("@state" eq "STAFFINFO FLAGS ISAVAILABLE" ) { |
} elsif ("@state" eq "STAFFINFO FLAGS ISAVAILABLE" ) { |
$$settings{isavailable} = $attr->{value}; |
$$settings{isavailable} = $attr->{value}; |
} elsif ("@state" eq "STAFFINFO FLAGS ISFOLDER" ) { |
} elsif ("@state" eq "STAFFINFO FLAGS ISFOLDER" ) { |
Line 834 sub process_staff {
|
Line 1102 sub process_staff {
|
$p->unbroken_text(1); |
$p->unbroken_text(1); |
$p->parse_file($xmlfile); |
$p->parse_file($xmlfile); |
$p->eof; |
$p->eof; |
|
|
|
my $fontcol = ''; |
|
if (defined($$settings{textcolor})) { |
|
$fontcol = qq|color="$$settings{textcolor}"|; |
|
} |
|
if (defined($$settings{text})) { |
|
if ($$settings{ishtml} eq "true") { |
|
$$settings{text} = &HTML::Entities::decode($$settings{text}); |
|
} |
|
} |
|
my $staffentry = qq| |
|
<table border="0" cellpadding="0" cellspacing="0" width="100%"> |
|
<tr> |
|
<td colspan="2"><hr /><font face="arial,helv" size="3"><b>$$settings{name}{formaltitle} $$settings{name}{given} $$settings{name}{family}</b></font> |
|
</td> |
|
</tr> |
|
<tr> |
|
<td valign="top"> |
|
<table width="100% border="0" cols="2" cellpadding="0" cellspacing="0">|; |
|
if ( defined($$settings{email}) && $$settings{email} ne '') { |
|
$staffentry .= qq| |
|
<tr> |
|
<td width="100" valign="top"> |
|
<font face="arial" size="2"><b>Email:</b></font> |
|
</td> |
|
<td> |
|
<font face="arial" size="2"><a href="mailto:$$settings{email}">$$settings{email}</a></font> |
|
</td> |
|
</tr> |
|
|; |
|
} |
|
if (defined($$settings{phone}) && $$settings{phone} ne '') { |
|
$staffentry .= qq| |
|
<tr> |
|
<td width="100" valign="top"> |
|
<font face="arial" size="2"><b>Phone:</b></font> |
|
</td> |
|
<td> |
|
<font face="arial" size="2">$$settings{phone}</font> |
|
</td> |
|
</tr> |
|
|; |
|
} |
|
if (defined($$settings{office}{address}) && $$settings{office}{address} ne '') { |
|
$staffentry .= qq| |
|
<tr> |
|
<td width="100" valign="top"> |
|
<font face="arial" size="2"><b>Address:</b></font> |
|
</td> |
|
<td> |
|
<font face="arial" size="2">$$settings{office}{address}</font> |
|
</td> |
|
</tr> |
|
|; |
|
} |
|
if (defined($$settings{office}{hours}) && $$settings{office}{hours} ne '') { |
|
$staffentry .= qq| |
|
<tr> |
|
<td width="100" valign="top"> |
|
<font face="arial" size="2"><b>Office Hours:</b></font> |
|
</td> |
|
<td> |
|
<font face=arial size=2>$$settings{office}{hours}</font> |
|
</td> |
|
</tr> |
|
|; |
|
} |
|
if ( defined($$settings{homepage}) && $$settings{homepage} ne '') { |
|
$staffentry .= qq| |
|
<tr> |
|
<td width="100" valign="top"> |
|
<font face="arial" size="2"><b>Personal Link:</b></font> |
|
</td> |
|
<td> |
|
<font face="arial" size="2"><a href="$$settings{homepage}">$$settings{homepage}</a></font> |
|
</td> |
|
</tr> |
|
|; |
|
} |
|
if (defined($$settings{text}) && $$settings{text} ne '') { |
|
$staffentry .= qq| |
|
<tr> |
|
<td colspan="2"> |
|
<font face="arial" size="2" $fontcol><b>Other Information:</b><br/>$$settings{text}</font> |
|
</td> |
|
</tr> |
|
|; |
|
} |
|
$staffentry .= qq| |
|
</table> |
|
</td> |
|
<td align="right" valign="top"> |
|
|; |
|
if ( defined($$settings{image}) ) { |
|
$staffentry .= qq| |
|
<img src="$dirname/resfiles/$res/$$settings{image}"> |
|
|; |
|
} |
|
$staffentry .= qq| |
|
</td> |
|
</tr> |
|
</table> |
|
|; |
|
open(FILE,">$destdir/resfiles/$res.html"); |
|
print FILE qq|<html> |
|
<head> |
|
<title>$$settings{title}</title> |
|
</head> |
|
<body bgcolor='#ffffff'> |
|
$staffentry |
|
</body> |
|
</html>|; |
|
close(FILE); |
} |
} |
|
|
|
# ---------------------------------------------------------------- Process Blackboard Links |
sub process_link { |
sub process_link { |
my ($res,$docroot,$destdir,$settings) = @_; |
my ($res,$docroot,$dirname,$destdir,$settings) = @_; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my @state = (); |
my @state = (); |
%{$$settings{name}} = (); |
my $p = HTML::Parser->new |
%{$$settings{office}} = (); |
|
|
|
my $p = HTML::Parser->new |
|
( |
( |
xml_mode => 1, |
xml_mode => 1, |
start_h => |
start_h => |
[sub { |
[sub { |
my ($tagname, $attr) = @_; |
my ($tagname, $attr) = @_; |
push @state, $tagname; |
push @state, $tagname; |
if (@state eq "EXTERNALLINK TITLE") { |
if (@state eq "EXTERNALLINK TITLE") { |
$$settings{title} = $attr->{value}; |
$$settings{title} = $attr->{value}; |
} elsif (@state eq "EXTERNALLINK TEXTCOLOR") { |
} elsif (@state eq "EXTERNALLINK TEXTCOLOR") { |
$$settings{textcolor} = $attr->{value}; |
$$settings{textcolor} = $attr->{value}; |
} elsif (@state eq "EXTERNALLINK DESCRIPTION FLAGS ISHTML") { |
} elsif (@state eq "EXTERNALLINK DESCRIPTION FLAGS ISHTML") { |
$$settings{ishtml} = $attr->{value}; |
$$settings{ishtml} = $attr->{value}; |
} elsif ("@state" eq "EXTERNALLINKS FLAGS ISAVAILABLE" ) { |
} elsif ("@state" eq "EXTERNALLINK FLAGS ISAVAILABLE" ) { |
$$settings{isavailable} = $attr->{value}; |
$$settings{isavailable} = $attr->{value}; |
} elsif ("@state" eq "EXTERNALLINKS FLAGS LAUNCHINNEWWINDOW" ) { |
} elsif ("@state" eq "EXTERNALLINK FLAGS LAUNCHINNEWWINDOW" ) { |
$$settings{newwindow} = $attr->{value}; |
$$settings{newwindow} = $attr->{value}; |
} elsif ("@state" eq "EXTERNALLINKS FLAGS ISFOLDER" ) { |
} elsif ("@state" eq "EXTERNALLINK FLAGS ISFOLDER" ) { |
$$settings{isfolder} = $attr->{value}; |
$$settings{isfolder} = $attr->{value}; |
} elsif ("@state" eq "EXTERNALLINKS POSITION" ) { |
} elsif ("@state" eq "EXTERNALLINK POSITION" ) { |
$$settings{position} = $attr->{value}; |
$$settings{position} = $attr->{value}; |
} elsif ("@state" eq "EXTERNALLINKS URL" ) { |
} elsif ("@state" eq "EXTERNALLINK URL" ) { |
$$settings{url} = $attr->{value}; |
$$settings{url} = $attr->{value}; |
|
} |
|
}, "tagname, attr"], |
|
text_h => |
|
[sub { |
|
my ($text) = @_; |
|
if ("@state" eq "EXTERNALLINK DESCRIPTION TEXT") { |
|
$$settings{text} = $text; |
|
} |
|
}, "dtext"], |
|
end_h => |
|
[sub { |
|
my ($tagname) = @_; |
|
pop @state; |
|
}, "tagname"], |
|
); |
|
$p->unbroken_text(1); |
|
$p->parse_file($xmlfile); |
|
$p->eof; |
|
|
|
my $linktag = ''; |
|
my $fontcol = ''; |
|
if (defined($$settings{textcolor})) { |
|
$fontcol = qq|<font color="$$settings{textcolor}">|; |
|
} |
|
if (defined($$settings{text})) { |
|
if ($$settings{ishtml} eq "true") { |
|
$$settings{text} = &HTML::Entities::decode($$settings{text}); |
} |
} |
}, "tagname, attr"], |
} |
text_h => |
|
[sub { |
if (defined($$settings{url}) ) { |
my ($text) = @_; |
$linktag = qq|<a href="$$settings{url}"|; |
if ("@state" eq "EXTERNALLINKS DESCRIPTION TEXT") { |
if ($$settings{newwindow} eq "true") { |
$$settings{text} = $text; |
$linktag .= qq| target="launch"|; |
} |
} |
}, "dtext"], |
$linktag .= qq|>$$settings{title}</a>|; |
end_h => |
} |
[sub { |
|
my ($tagname) = @_; |
open(FILE,">$destdir/resfiles/$res.html"); |
pop @state; |
print FILE qq|<html> |
}, "tagname"], |
<head> |
); |
<title>$$settings{title}</title> |
$p->unbroken_text(1); |
</head> |
$p->parse_file($xmlfile); |
<body bgcolor='#ffffff'> |
$p->eof; |
$fontcol |
|
$linktag |
|
$$settings{text} |
|
|; |
|
if (defined($$settings{textcolor})) { |
|
print FILE qq|</font>|; |
|
} |
|
print FILE qq| |
|
</body> |
|
</html>|; |
|
close(FILE); |
} |
} |
|
|
|
# ---------------------------------------------------------------- Process Blackboard Discussion Boards |
sub process_db { |
sub process_db { |
my ($res,$docroot,$destdir,$settings) = @_; |
my ($res,$docroot,$destdir,$timestamp,$crs,$cdom,$handling,$uname,$settings) = @_; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my @state = (); |
my @state = (); |
my %threads; # all quotes, keyed by message ID |
my @allmsgs = (); |
my $msg_id; # the current message ID |
my %msgidx = (); |
my %message; # the current message being accumulated for $msg_id |
my $longcrs = ''; |
|
if ($crs =~ m/^(\d)(\d)(\d)/) { |
|
$longcrs = $1.'/'.$2.'/'.$3.'/'.$crs; |
|
} |
|
my %threads; # all threads, keyed by message ID |
|
my $msg_id; # the current message ID |
|
my %message; # the current message being accumulated for $msg_id |
|
|
my $p = HTML::Parser->new |
my $p = HTML::Parser->new |
( |
( |
xml_mode => 1, |
xml_mode => 1, |
start_h => |
start_h => |
[sub { |
[sub { |
my ($tagname, $attr) = @_; |
my ($tagname, $attr) = @_; |
push @state, $tagname; |
push @state, $tagname; |
my $depth = 0; |
my $depth = 0; |
my @seq = (); |
my @seq = (); |
if (@state eq "FORUM TITLE") { |
if ("@state" eq "FORUM TITLE") { |
$$settings{title} = $attr->{value}; |
$$settings{title} = $attr->{value}; |
} elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") { |
} elsif ("@state" eq "FORUM DESCRIPTION TEXTCOLOR") { |
$$settings{textcolor} = $attr->{value}; |
$$settings{textcolor} = $attr->{value}; |
} elsif (@state eq "FORUM DESCRIPTION FLAGS ISHTML") { |
} elsif ("@state" eq "FORUM DESCRIPTION FLAGS ISHTML") { |
$$settings{ishtml} = $attr->{value}; |
$$settings{ishtml} = $attr->{value}; |
} elsif (@state eq "FORUM DESCRIPTION FLAGS ISNEWLINELITERAL") { |
} elsif ("@state" eq "FORUM DESCRIPTION FLAGS ISNEWLINELITERAL") { |
$$settings{newline} = $attr->{value}; |
$$settings{newline} = $attr->{value}; |
} elsif ("@state" eq "FORUM POSITION" ) { |
} elsif ("@state" eq "FORUM POSITION" ) { |
$$settings{position} = $attr->{value}; |
$$settings{position} = $attr->{value}; |
} elsif ("@state" eq "FORUM FLAGS ISREADONLY") { |
} elsif ("@state" eq "FORUM FLAGS ISREADONLY") { |
$$settings{isavailable} = $attr->{value}; |
$$settings{isreadonly} = $attr->{value}; |
} elsif ("@state" eq "FORUM FLAGS ISAVAILABLE" ) { |
} elsif ("@state" eq "FORUM FLAGS ISAVAILABLE" ) { |
$$settings{isavailable} = $attr->{value}; |
$$settings{isavailable} = $attr->{value}; |
} elsif ("@state" eq "FORUM FLAGS ALLOWANONYMOUSPOSTINGS" ) { |
} elsif ("@state" eq "FORUM FLAGS ALLOWANONYMOUSPOSTINGS" ) { |
$$settings{isfolder} = $attr->{value}; |
$$settings{allowanon} = $attr->{value}; |
} elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) { |
} elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) { |
if ($state[@state-1] eq "MSG") { |
if ($state[-1] eq "MSG") { |
$depth = @state - 3; |
unless ($msg_id eq '') { |
if ($depth > @seq) { |
push @{$threads{$msg_id}}, { %message }; |
unless ($msg_id eq '') { |
$depth = @state - 3; |
push @seq, $msg_id; |
if ($depth > @seq) { |
} |
push @seq, $msg_id; |
} |
} |
if ($depth < @seq) { |
} |
pop @seq; |
if ($depth < @seq) { |
} |
pop @seq; |
$msg_id = $attr->{value}; |
} |
%message = (); |
$msg_id = $attr->{id}; |
$message{depth} = $depth; |
push @allmsgs, $msg_id; |
if ($depth > 0) { |
$msgidx{$msg_id} = @allmsgs; |
$message{parent} = $seq[-1]; |
%message = (); |
} else { |
$message{depth} = $depth; |
$message{parent} = "None"; |
if ($depth > 0) { |
} |
$message{parent} = $seq[-1]; |
} elsif ($state[@state-1] eq "TITLE") { |
} else { |
$message{title} = $attr->{value}; |
$message{parent} = "None"; |
} elsif ( ( $state[@state-3] eq "MESSAGETEXT" ) && ( $state[@state-2] eq "FLAGS" ) && ( $state[@state-1] eq "ISHTML" ) ) { |
} |
$message{ishtml} = $attr->{value}; |
} elsif ($state[-1] eq "TITLE") { |
} elsif ( ( $state[@state-3] eq "MESSAGETEXT" ) && ( $state[@state-2] eq "FLAGS" ) && ( $state[@state-1] eq "ISNEWLINELITERAL" ) ) { |
$message{title} = $attr->{value}; |
$message{newline} = $attr->{value}; |
} elsif ( ( $state[-3] eq "MESSAGETEXT" ) && ( $state[-2] eq "FLAGS" ) && ( $state[-1] eq "ISHTML" ) ) { |
} elsif ( ( $state[@state-2] eq "DATES" ) && ( $state[@state-1] eq "CREATED" ) ) { |
$message{ishtml} = $attr->{value}; |
$message{created} = $attr->{value}; |
} elsif ( ( $state[-3] eq "MESSAGETEXT" ) && ( $state[-2] eq "FLAGS" ) && ( $state[-1] eq "ISNEWLINELITERAL" ) ) { |
} elsif ( $state[@state-2] eq "FLAGS") { |
$message{newline} = $attr->{value}; |
if ($state[@state-1] eq "ISANONYMOUS") { |
} elsif ( ( $state[-2] eq "DATES" ) && ( $state[-1] eq "CREATED" ) ) { |
$message{isanonymous} = $attr->{value}; |
$message{created} = $attr->{value}; |
} |
} elsif ( $state[@state-2] eq "FLAGS") { |
} elsif ( $state[@state-2] eq "USER" ) { |
if ($state[@state-1] eq "ISANONYMOUS") { |
if ($state[@state-1] eq "USERID") { |
$message{isanonymous} = $attr->{value}; |
$message{userid} = $attr->{value}; |
} |
} elsif ($state[@state-1] eq "USERNAME") { |
} elsif ( $state[-2] eq "USER" ) { |
$message{username} = $attr->{value}; |
if ($state[-1] eq "USERID") { |
} elsif ($state[@state-1] eq "EMAIL") { |
$message{userid} = $attr->{value}; |
$message{email} = $attr->{value}; |
} elsif ($state[@state-1] eq "USERNAME") { |
} |
$message{username} = $attr->{value}; |
} elsif ( ($state[@state-2] eq "FILELIST") && ($state[@state-2] eq "IMAGE") ) { |
} elsif ($state[@state-1] eq "EMAIL") { |
$message{attachment} = $attr->{value}; |
$message{email} = $attr->{value}; |
|
} |
|
} elsif ( ($state[-2] eq "FILELIST") && ($state[-1] eq "IMAGE") ) { |
|
$message{attachment} = $attr->{value}; |
|
} |
|
} |
|
}, "tagname, attr"], |
|
text_h => |
|
[sub { |
|
my ($text) = @_; |
|
if ("@state" eq "FORUM DESCRIPTION TEXT") { |
|
$$settings{text} = $text; |
|
} elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) { |
|
if ( ($state[-2] eq "MESSAGETEXT") && ($state[-1] eq "TEXT") ){ |
|
$message{text} = $text; |
|
} |
|
} |
|
}, "dtext"], |
|
end_h => |
|
[sub { |
|
my ($tagname) = @_; |
|
if ( $state[-1] eq "MESSAGETHREADS" ) { |
|
push @{$threads{$msg_id}}, { %message }; |
|
} |
|
pop @state; |
|
}, "tagname"], |
|
); |
|
$p->unbroken_text(1); |
|
$p->parse_file($xmlfile); |
|
$p->eof; |
|
|
|
if (defined($$settings{text})) { |
|
if ($$settings{ishtml} eq "false") { |
|
if ($$settings{isnewline} eq "true") { |
|
$$settings{text} =~ s#\n#<br/>#g; |
} |
} |
|
} else { |
|
$$settings{text} = &HTML::Entities::decode($$settings{text}); |
} |
} |
}, "tagname, attr"], |
if (defined($$settings{fontcolor}) ) { |
text_h => |
$$settings{text} = "<font color=\"".$$settings{textcolor}."\">".$$settings{text}."</font>"; |
[sub { |
|
my ($text) = @_; |
|
if ("@state" eq "FORUM DESCRIPTION TEXT") { |
|
$$settings{text} = $text; |
|
} elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) { |
|
if ( ($state[@state-2] eq "MESSAGETEXT") && ($state[@state-1] eq "TEXT") ){ |
|
$message{text} = $text; |
|
} |
|
} |
} |
}, "dtext"], |
} |
end_h => |
my $boardname = 'bulletinpage_'.$timestamp; |
[sub { |
my %boardinfo = ( |
my ($tagname) = @_; |
'aaa_title' => $$settings{title}, |
if ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) { |
'bbb_content' => $$settings{text}, |
if ($state[@state-1] eq "MSG") { |
'ccc_webreferences' => '', |
push @{$threads{$msg_id}}, { %message }; |
'uploaded.lastmodified' => time, |
|
); |
|
|
|
my $putresult = &Apache::lonnet::put($boardname,\%boardinfo,$cdom,$crs); |
|
if ($handling eq 'importall') { |
|
foreach my $msg_id (@allmsgs) { |
|
foreach my $message ( @{$threads{$msg_id}} ) { |
|
my %contrib = ( |
|
'sendername' => $$message{userid}, |
|
'senderdomain' => $cdom, |
|
'screenname' => '', |
|
'plainname' => $$message{username}, |
|
); |
|
unless ($$message{parent} eq 'None') { |
|
$contrib{replyto} = $msgidx{$$message{parent}}; |
|
} |
|
if (defined($$message{isanonymous}) ) { |
|
if ($$message{isanonymous} eq 'true') { |
|
$contrib{'anonymous'} = 'true'; |
|
} |
|
} |
|
if ( defined($$message{attachment}) ) { |
|
my $url = $$message{attachment}; |
|
my $oldurl = $url; |
|
my $newurl = $url; |
|
unless ($url eq '') { |
|
$newurl =~ s/\//_/g; |
|
unless ($longcrs eq '') { |
|
if (!-e "/home/httpd/lonUsers/$cdom/$longcrs/userfiles") { |
|
mkdir("/home/httpd/lonUsers/$cdom/$longcrs/userfiles",0755); |
|
} |
|
if (!-e "/home/httpd/lonUsers/$cdom/$longcrs/userfiles/$newurl") { |
|
system("cp $destdir/resfiles/$res/$$message{attachment} /home/httpd/lonUsers/$cdom/$longcrs/userfiles/$newurl"); |
|
} |
|
$contrib{attachmenturl} = '/uploaded/'.$cdom.'/'.$crs.'/'.$newurl; |
|
} |
|
} |
|
} |
|
if (defined($$message{title}) ) { |
|
$contrib{'message'} = $$message{title}; |
|
} |
|
if (defined($$message{text})) { |
|
if ($$message{ishtml} eq "false") { |
|
if ($$message{isnewline} eq "true") { |
|
$$message{text} =~ s#\n#<br/>#g; |
|
} |
|
} else { |
|
$$message{text} = &HTML::Entities::decode($$message{text}); |
|
} |
|
$contrib{'message'} .= '<br /><br />'.$$message{text}; |
|
my $symb = 'bulletin___'.$timestamp.'___adm/wrapper/adm/'.$cdom.'/'.$uname.'/'.$timestamp.'/bulletinboard'; |
|
my $postresult = &addposting($symb,\%contrib,$cdom,$crs); |
|
} |
} |
} |
} |
} |
pop @state; |
} |
}, "tagname"], |
|
); |
|
$p->unbroken_text(1); |
|
$p->parse_file($xmlfile); |
|
$p->eof; |
|
} |
} |
|
|
|
# ---------------------------------------------------------------- Add Posting to Bulletin Board |
|
sub addposting { |
|
my ($symb,$contrib,$cdom,$crs)=@_; |
|
my $status=''; |
|
if (($symb) && ($$contrib{message})) { |
|
my $crsdom = $cdom.'_'.$crs; |
|
&Apache::lonnet::store($contrib,$symb,$crsdom,$cdom,$crs); |
|
my %storenewentry=($symb => time); |
|
&Apache::lonnet::put('discussiontimes',\%storenewentry,$cdom,$crs); |
|
} |
|
my %record=&Apache::lonnet::restore('_discussion'); |
|
my ($temp)=keys %record; |
|
unless ($temp=~/^error\:/) { |
|
my %newrecord=(); |
|
$newrecord{'resource'}=$symb; |
|
$newrecord{'subnumber'}=$record{'subnumber'}+1; |
|
&Apache::lonnet::cstore(\%newrecord,'_discussion'); |
|
$status = 'ok'; |
|
} else { |
|
$status.='Failed.'; |
|
} |
|
return $status; |
|
} |
|
# ---------------------------------------------------------------- Process Blackboard Assessments - pools, quizzes, surveys |
sub process_assessment { |
sub process_assessment { |
my ($res,$docroot,$container,$dirname,$destdir,$settings) = @_; |
my ($res,$docroot,$container,$dirname,$destdir,$settings,$totpageref,$totprobref,,$udom,$uname) = @_; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
# print "XML file is $xmlfile\n"; |
# print "XML file is $xmlfile\n"; |
my @state = (); |
my @state = (); |
my @allids = (); |
my @allids = (); |
my %allanswers = (); |
my %allanswers = (); |
my %allchoices = (); |
my %allchoices = (); |
my $id; # the current question ID |
my $resdir = ''; |
my $answer_id; # the current answer ID |
if ($docroot =~ m|public_html/(.+)$|) { |
my %toptag = ( pool => 'POOL', |
$resdir = $1; |
|
} |
|
my $id; # the current question ID |
|
my $answer_id; # the current answer ID |
|
my %toptag = ( pool => 'POOL', |
quiz => 'ASSESSMENT', |
quiz => 'ASSESSMENT', |
survey => 'ASSESSMENT' |
survey => 'ASSESSMENT' |
); |
); |
# print "process_assessment is called, incoming: $res,$docroot,$container,$destdir\n"; |
|
|
|
my $p = HTML::Parser->new |
my $p = HTML::Parser->new |
( |
( |
xml_mode => 1, |
xml_mode => 1, |
start_h => |
start_h => |
Line 1017 sub process_assessment {
|
Line 1542 sub process_assessment {
|
my @seq = (); |
my @seq = (); |
my $class; |
my $class; |
my $state_str = join(" ",@state); |
my $state_str = join(" ",@state); |
# print "Current state is $state_str\n"; |
|
if ($container eq "pool") { |
if ($container eq "pool") { |
if ("@state" eq "POOL TITLE") { |
if ("@state" eq "POOL TITLE") { |
$$settings{title} = $attr->{value}; |
$$settings{title} = $attr->{value}; |
# print "Title is $attr->{value}\n"; |
|
} |
} |
} else { |
} else { |
if ("@state" eq "ASSESSMENT TITLE") { |
if ("@state" eq "ASSESSMENT TITLE") { |
Line 1046 sub process_assessment {
|
Line 1569 sub process_assessment {
|
} |
} |
if ("@state" eq "$toptag{$container} QUESTIONLIST QUESTION") { |
if ("@state" eq "$toptag{$container} QUESTIONLIST QUESTION") { |
$id = $attr->{id}; |
$id = $attr->{id}; |
push @allids, $id; |
unless ($container eq 'pool') { |
|
push @allids, $id; |
|
} |
%{$$settings{$id}} = (); |
%{$$settings{$id}} = (); |
@{$allanswers{$id}} = (); |
@{$allanswers{$id}} = (); |
$$settings{$id}{class} = $attr->{class}; |
$$settings{$id}{class} = $attr->{class}; |
Line 1056 sub process_assessment {
|
Line 1581 sub process_assessment {
|
@{$$settings{$id}{correctanswer}} = (); |
@{$$settings{$id}{correctanswer}} = (); |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[-1] =~ m/^QUESTION_(\w+)$/) ) { |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[-1] =~ m/^QUESTION_(\w+)$/) ) { |
$id = $attr->{id}; |
$id = $attr->{id}; |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "FLAGS") && ($state[4] eq "ISHTML") ) { |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "FLAGS") ) { |
$$settings{$id}{html} = $attr->{value}; |
if ($state[4] eq "ISHTML") { |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "FLAGS") && ($state[4] eq "ISNEWLINELITERAL") ) { |
$$settings{$id}{html} = $attr->{value}; |
$$settings{$id}{newline} = $attr->{value}; |
} elsif ($state[4] eq "ISNEWLINELITERAL") { |
|
$$settings{$id}{newline} = $attr->{value}; |
|
} |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "IMAGE") ) { |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "IMAGE") ) { |
$$settings{$id}{image} = $attr->{value}; |
$$settings{$id}{image} = $attr->{value}; |
$$settings{$id}{style} = $attr->{style}; |
$$settings{$id}{style} = $attr->{style}; |
Line 1082 sub process_assessment {
|
Line 1609 sub process_assessment {
|
$$settings{$id}{$answer_id}{position} = $attr->{position}; |
$$settings{$id}{$answer_id}{position} = $attr->{position}; |
$$settings{$id}{$answer_id}{placement} = $attr->{placement}; |
$$settings{$id}{$answer_id}{placement} = $attr->{placement}; |
$$settings{$id}{$answer_id}{type} = 'choice'; |
$$settings{$id}{$answer_id}{type} = 'choice'; |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") && ($state[3] eq "IMAGE") ) { |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") ) { |
$$settings{$id}{$answer_id}{image} = $attr->{value}; |
if ($state[3] eq "IMAGE") { |
$$settings{$id}{$answer_id}{style} = $attr->{style}; |
$$settings{$id}{$answer_id}{image} = $attr->{value}; |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") && ($state[3] eq "URL") ) { |
$$settings{$id}{$answer_id}{style} = $attr->{style}; |
$$settings{$id}{$answer_id}{url} = $attr->{value}; |
} elsif ($state[3] eq "URL") { |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "CHOICE") && ($state[3] eq "IMAGE") ) { |
$$settings{$id}{$answer_id}{url} = $attr->{value}; |
$$settings{$id}{$answer_id}{image} = $attr->{value}; |
} |
$$settings{$id}{$answer_id}{style} = $attr->{style}; |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "CHOICE") ) { |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "CHOICE") && ($state[3] eq "URL") ) { |
if ($state[3] eq "IMAGE") { |
$$settings{$id}{$answer_id}{url} = $attr->{value}; |
$$settings{$id}{$answer_id}{image} = $attr->{value}; |
|
$$settings{$id}{$answer_id}{style} = $attr->{style}; |
|
} elsif ($state[3] eq "URL") { |
|
$$settings{$id}{$answer_id}{url} = $attr->{value}; |
|
} |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "GRADABLE") && ($state[3] eq "CORRECTANSWER") ) { |
} elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "GRADABLE") && ($state[3] eq "CORRECTANSWER") ) { |
my $corr_answer = $attr->{answer_id}; |
my $corr_answer = $attr->{answer_id}; |
push @{$$settings{$id}{correctanswer}}, $corr_answer; |
push @{$$settings{$id}{correctanswer}}, $corr_answer; |
# print "Answer $corr_answer for question $id is correct\n"; |
|
my $type = $1; |
my $type = $1; |
if ($type eq 'TRUEFALSE') { |
if ($type eq 'TRUEFALSE') { |
$$settings{$id}{$corr_answer}{answer_position} = $attr->{position}; |
$$settings{$id}{$corr_answer}{answer_position} = $attr->{position}; |
Line 1134 sub process_assessment {
|
Line 1664 sub process_assessment {
|
pop @state; |
pop @state; |
}, "tagname"], |
}, "tagname"], |
); |
); |
$p->unbroken_text(1); |
$p->unbroken_text(1); |
$p->parse_file($xmlfile); |
$p->parse_file($xmlfile); |
$p->eof; |
$p->eof; |
|
|
my $dirtitle = $$settings{'title'}; |
my $dirtitle = $$settings{'title'}; |
$dirtitle =~ s/\W//g; |
$dirtitle =~ s/\W//g; |
$dirtitle .= '_'.$res; |
$dirtitle .= '_'.$res; |
if (!-e "$destdir/problems/$dirtitle") { |
if (!-e "$destdir/problems/$dirtitle") { |
mkdir("$destdir/problems/$dirtitle",0755); |
mkdir("$destdir/problems/$dirtitle",0755); |
} |
} |
my $newdir = "$destdir/problems/$dirtitle"; |
my $newdir = "$destdir/problems/$dirtitle"; |
foreach my $id (@allids) { |
my $pagedir = "$destdir/pages"; |
# print "Current ID is $id, type is $$settings{$id}{class} \n"; |
my $curr_id = 0; |
if ($$settings{$id}{class} eq "QUESTION_ESSAY") { |
my $next_id = 1; |
my $output; |
unless ($container eq 'pool') { |
if ($container eq 'pool') { |
open(PAGEFILE,">$pagedir/$res.page"); |
$output = qq|<problem> |
print PAGEFILE qq|<map> |
<startouttext />$$settings{$id}{text}<endouttext /> |
|
|; |
|
} else { |
|
$output = qq|<problem> |
|
<startouttext />$$settings{$id}{text}<endouttext /> |
|
|; |
|
} |
|
$output .= qq| |
|
<essayresponse> |
|
<textfield></textfield> |
|
</essayresponse> |
|
<postanswerdate> |
|
$$settings{$id}{feedbackcorr} |
|
</postanswerdate> |
|
|; |
|
if ($container eq 'pool') { |
|
$output .= qq|</problem> |
|
|; |
|
open(PROB,">$newdir/$id.problem"); |
|
print PROB $output; |
|
close PROB; |
|
} else { |
|
$output .= qq|</problem> |
|
|; |
|
open(PROB,">$newdir/$id.problem"); |
|
print PROB $output; |
|
close PROB; |
|
} |
|
} else { |
|
my $output; |
|
if ($container eq 'pool') { |
|
$output = qq|<problem> |
|
|; |
|; |
} else { |
$$totpageref ++; |
$output = qq|<problem> |
print PAGEFILE qq|<resource id="1" src="/res/$udom/$uname/$resdir/problems/$dirtitle/$allids[0].problem" type="start"></resource>|; |
|; |
if (@allids == 1) { |
} |
print PAGEFILE qq| |
$output .= qq|<startouttext />$$settings{$id}{text}\n|; |
<link from="1" to="2" index="1"></link> |
if ( defined($$settings{$id}{image}) ) { |
<resource id="2" src="" type="finish">\n|; |
if ( $$settings{$id}{style} eq 'embed' ) { |
|
$output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{image}" /><br />|; |
|
} else { |
} else { |
$output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{image}">Link to file</a><br />|; |
for (my $j=1; $j<@allids; $j++) { |
|
$curr_id = $j; |
|
$next_id = $curr_id + 1; |
|
print PAGEFILE qq| |
|
<link from="$curr_id" to="$next_id" index="$curr_id"></link> |
|
<resource id="$next_id" src="/res/$udom/$uname/$resdir/problems/$dirtitle/$allids[$j].problem"|; |
|
if ($next_id == @allids) { |
|
print PAGEFILE qq| type="finish"></resource>\n|; |
|
} else { |
|
print PAGEFILE qq|></resource>|; |
|
} |
|
} |
} |
} |
|
print PAGEFILE qq|</map>|; |
|
close(PAGEFILE); |
} |
} |
if ( defined($$settings{$id}{url}) ) { |
foreach my $id (@allids) { |
$output .= qq|<br /><a href="$$settings{$id}{url}">$$settings{$id}{name}</a><br />|; |
my $output = qq|<problem> |
} |
|; |
$output .= qq| |
$$totprobref ++; |
<endouttext />|; |
if ($$settings{$id}{class} eq "QUESTION_ESSAY") { |
if ($$settings{$id}{class} eq 'QUESTION_MULTIPLECHOICE') { |
$output .= qq|<startouttext />$$settings{$id}{text}<endouttext /> |
my $numfoils = @{$allanswers{$id}}; |
<essayresponse> |
$output .= qq| |
<textfield></textfield> |
<radiobuttonresponse max="$numfoils" randomize="yes"> |
</essayresponse> |
<foilgroup> |
<postanswerdate> |
|; |
$$settings{$id}{feedbackcorr} |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
</postanswerdate> |
$output .= " <foil name=\"foil".$k."\" value=\""; |
|; |
if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) { |
} else { |
$output .= "true\" location=\""; |
$output .= qq|<startouttext />$$settings{$id}{text}\n|; |
} else { |
if ( defined($$settings{$id}{image}) ) { |
$output .= "false\" location=\""; |
if ( $$settings{$id}{style} eq 'embed' ) { |
} |
$output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{image}" /><br />|; |
if (lc ($allanswers{$id}[$k]) =~ m/^\s?([Aa]ll)|([Nn]one)\sof\sthe\sabove\.?/) { |
|
$output .= "bottom\""; |
|
} else { |
|
$output .= "random\""; |
|
} |
|
$output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}; |
|
if ( defined($$settings{$id}{$allanswers{$id}[$k]}{image}) ) { |
|
if ( $$settings{$id}{$allanswers{$id}[$k]}{style} eq 'embed' ) { |
|
$output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{$allanswers{$id}[$k]}{image}" /><br />|; |
|
} else { |
} else { |
$output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{$allanswers{$id}[$k]}{image}" />Link to file</a><br/>|; |
$output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{image}">Link to file</a><br />|; |
} |
} |
} |
} |
$output .= qq|<endouttext /></foil>\n|; |
if ( defined($$settings{$id}{url}) ) { |
} |
$output .= qq|<br /><a href="$$settings{$id}{url}">$$settings{$id}{name}</a><br />|; |
chomp($output); |
} |
$output .= qq| |
$output .= qq| |
</foilgroup> |
<endouttext />|; |
</radiobuttonresponse> |
if ($$settings{$id}{class} eq 'QUESTION_MULTIPLECHOICE') { |
|; |
my $numfoils = @{$allanswers{$id}}; |
} elsif ($$settings{$id}{class} eq 'QUESTION_TRUEFALSE') { |
$output .= qq| |
my $numfoils = @{$allanswers{$id}}; |
<radiobuttonresponse max="$numfoils" randomize="yes"> |
# print "Number of foils is $numfoils\n"; |
<foilgroup> |
$output .= qq| |
|; |
|
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
|
$output .= " <foil name=\"foil".$k."\" value=\""; |
|
if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) { |
|
$output .= "true\" location=\""; |
|
} else { |
|
$output .= "false\" location=\""; |
|
} |
|
if (lc ($allanswers{$id}[$k]) =~ m/^\s?([Aa]ll)|([Nn]one)\sof\sthe\sabove\.?/) { |
|
$output .= "bottom\""; |
|
} else { |
|
$output .= "random\""; |
|
} |
|
$output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}; |
|
if ( defined($$settings{$id}{$allanswers{$id}[$k]}{image}) ) { |
|
if ( $$settings{$id}{$allanswers{$id}[$k]}{style} eq 'embed' ) { |
|
$output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{$allanswers{$id}[$k]}{image}" /><br />|; |
|
} else { |
|
$output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{$allanswers{$id}[$k]}{image}" />Link to file</a><br/>|; |
|
} |
|
} |
|
$output .= qq|<endouttext /></foil>\n|; |
|
} |
|
chomp($output); |
|
$output .= qq| |
|
</foilgroup> |
|
</radiobuttonresponse> |
|
|; |
|
} elsif ($$settings{$id}{class} eq 'QUESTION_TRUEFALSE') { |
|
my $numfoils = @{$allanswers{$id}}; |
|
$output .= qq| |
<radiobuttonresponse max="$numfoils" randomize="yes"> |
<radiobuttonresponse max="$numfoils" randomize="yes"> |
<foilgroup> |
<foilgroup> |
|; |
|; |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
$output .= " <foil name=\"foil".$k."\" value=\""; |
$output .= " <foil name=\"foil".$k."\" value=\""; |
if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) { |
if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) { |
$output .= "true\" location=\"random\""; |
$output .= "true\" location=\"random\""; |
} else { |
} else { |
$output .= "false\" location=\"random\""; |
$output .= "false\" location=\"random\""; |
} |
} |
$output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n"; |
$output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n"; |
} |
} |
chomp($output); |
chomp($output); |
$output .= qq| |
$output .= qq| |
</foilgroup> |
</foilgroup> |
</radiobuttonresponse> |
</radiobuttonresponse> |
|; |
|; |
} elsif ($$settings{$id}{class} eq 'QUESTION_MULTIPLEANSWER') { |
} elsif ($$settings{$id}{class} eq 'QUESTION_MULTIPLEANSWER') { |
my $numfoils = @{$allanswers{$id}}; |
my $numfoils = @{$allanswers{$id}}; |
# print "Number of foils is $numfoils\n"; |
$output .= qq| |
$output .= qq| |
|
<optionresponse max="$numfoils" randomize="yes"> |
<optionresponse max="$numfoils" randomize="yes"> |
<foilgroup options="('True','False')"> |
<foilgroup options="('True','False')"> |
|; |
|; |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
$output .= " <foil name=\"foil".$k."\" value=\""; |
$output .= " <foil name=\"foil".$k."\" value=\""; |
if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) { |
if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) { |
$output .= "True\""; |
$output .= "True\""; |
} else { |
} else { |
$output .= "False\""; |
$output .= "False\""; |
} |
} |
$output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n"; |
$output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n"; |
} |
} |
chomp($output); |
chomp($output); |
$output .= qq| |
$output .= qq| |
</foilgroup> |
</foilgroup> |
</radiobuttonresponse> |
</optionresponse> |
|; |
|; |
} elsif ($$settings{$id}{class} eq 'QUESTION_ORDER') { |
} elsif ($$settings{$id}{class} eq 'QUESTION_ORDER') { |
my $numfoils = @{$allanswers{$id}}; |
my $numfoils = @{$allanswers{$id}}; |
$output .= qq| |
$output .= qq| |
<rankresponse max="$numfoils" randomize="yes"> |
<rankresponse max="$numfoils" randomize="yes"> |
<foilgroup> |
<foilgroup> |
|; |
|; |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
$output .= " <foil location=\"random\" name=\"foil".$k."\" value=\"".$$settings{$id}{$allanswers{$id}[$k]}{order}."\"><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n"; |
$output .= " <foil location=\"random\" name=\"foil".$k."\" value=\"".$$settings{$id}{$allanswers{$id}[$k]}{order}."\"><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n"; |
} |
} |
chomp($output); |
chomp($output); |
$output .= qq| |
$output .= qq| |
</foilgroup> |
</foilgroup> |
</rankresponse> |
</rankresponse> |
|; |
|; |
} elsif ($$settings{$id}{class} eq 'QUESTION_FILLINBLANK') { |
} elsif ($$settings{$id}{class} eq 'QUESTION_FILLINBLANK') { |
my $numerical = 1; |
my $numerical = 1; |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
unless ($$settings{$id}{$allanswers{$id}[$k]}{text} =~ m/^\d+\.?\d*$/) { |
if ($$settings{$id}{$allanswers{$id}[$k]}{text} =~ m/([^\d\.]|\.\.)/) { |
$numerical = 0; |
$numerical = 0; |
} |
|
} |
|
if ($numerical) { |
|
my $numans; |
|
my $tol; |
|
if (@{$allanswers{$id}} == 1) { |
|
$tol = 5; |
|
$numans = $$settings{$id}{$allanswers{$id}[0]}{text}; |
|
} else { |
|
my $min = $$settings{$id}{$allanswers{$id}[0]}{text}; |
|
my $max = $$settings{$id}{$allanswers{$id}[0]}{text}; |
|
for (my $k=1; $k<@{$allanswers{$id}}; $k++) { |
|
if ($$settings{$id}{$allanswers{$id}[$k]}{text} <= $min) { |
|
$min = $$settings{$id}{$allanswers{$id}[$k]}{text}; |
|
} |
|
if ($$settings{$id}{$allanswers{$id}[$k]}{text} >= $max) { |
|
$max = $$settings{$id}{$allanswers{$id}[$k]}{text}; |
|
} |
} |
} |
} |
$numans = ($max + $min)/2; |
if ($numerical) { |
$tol = 100*($max - $min)/($numans*2); |
my $numans; |
} |
my $tol; |
$output .= qq| |
if (@{$allanswers{$id}} == 1) { |
|
$tol = 5; |
|
$numans = $$settings{$id}{$allanswers{$id}[0]}{text}; |
|
} else { |
|
my $min = $$settings{$id}{$allanswers{$id}[0]}{text}; |
|
my $max = $$settings{$id}{$allanswers{$id}[0]}{text}; |
|
for (my $k=1; $k<@{$allanswers{$id}}; $k++) { |
|
if ($$settings{$id}{$allanswers{$id}[$k]}{text} <= $min) { |
|
$min = $$settings{$id}{$allanswers{$id}[$k]}{text}; |
|
} |
|
if ($$settings{$id}{$allanswers{$id}[$k]}{text} >= $max) { |
|
$max = $$settings{$id}{$allanswers{$id}[$k]}{text}; |
|
} |
|
} |
|
$numans = ($max + $min)/2; |
|
$tol = 100*($max - $min)/($numans*2); |
|
} |
|
$output .= qq| |
<numericalresponse answer="$numans"> |
<numericalresponse answer="$numans"> |
<responseparam type="tolerance" default="$tol%" name="tol" description="Numerical Tolerance" /> |
<responseparam type="tolerance" default="$tol%" name="tol" description="Numerical Tolerance" /> |
<responseparam name="sig" type="int_range,0-16" default="0,15" description="Significant Figures" |
<responseparam name="sig" type="int_range,0-16" default="0,15" description="Significant Figures" |
/> |
/> |
<textline /> |
<textline /> |
</numericalresponse> |
</numericalresponse> |
|; |
|; |
} else { |
} else { |
if (@{$allanswers{$id}} == 1) { |
if (@{$allanswers{$id}} == 1) { |
$output .= qq| |
$output .= qq| |
<stringresponse answer="$$settings{$id}{$allanswers{$id}[0]}{text}" type="ci"> |
<stringresponse answer="$$settings{$id}{$allanswers{$id}[0]}{text}" type="ci"> |
<textline> |
<textline> |
</textline> |
</textline> |
</stringresponse> |
</stringresponse> |
|; |
|; |
} else { |
} else { |
my @answertext = (); |
my @answertext = (); |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
$$settings{$id}{$allanswers{$id}[$k]}{text} =~ s/\|/\|/g; |
$$settings{$id}{$allanswers{$id}[$k]}{text} =~ s/\|/\|/g; |
push @answertext, $$settings{$id}{$allanswers{$id}[$k]}{text}; |
push @answertext, $$settings{$id}{$allanswers{$id}[$k]}{text}; |
} |
} |
my $regexpans = join('|',@answertext); |
my $regexpans = join('|',@answertext); |
$regexpans = '/^('.$regexpans.')\b/'; |
$regexpans = '/^('.$regexpans.')\b/'; |
$output .= qq| |
$output .= qq| |
<stringresponse answer="$regexpans" type="re"> |
<stringresponse answer="$regexpans" type="re"> |
<textline> |
<textline> |
</textline> |
</textline> |
</stringresponse> |
</stringresponse> |
|; |
|; |
} |
} |
} |
} |
} elsif ($$settings{$id}{class} eq "QUESTION_MATCH") { |
} elsif ($$settings{$id}{class} eq "QUESTION_MATCH") { |
$output .= qq| |
$output .= qq| |
<matchresponse max="10" randomize="yes"> |
<matchresponse max="10" randomize="yes"> |
<foilgroup> |
<foilgroup> |
<itemgroup> |
<itemgroup> |
|; |
|; |
for (my $k=0; $k<@{$allchoices{$id}}; $k++) { |
for (my $k=0; $k<@{$allchoices{$id}}; $k++) { |
$output .= qq| |
$output .= qq| |
<item name="$allchoices{$id}[$k]"> |
<item name="$allchoices{$id}[$k]"> |
<startouttext />$$settings{$id}{$allchoices{$id}[$k]}{text}<endouttext /> |
<startouttext />$$settings{$id}{$allchoices{$id}[$k]}{text}<endouttext /> |
</item> |
</item> |
|; |
|; |
} |
} |
$output .= qq| |
$output .= qq| |
</itemgroup> |
</itemgroup> |
|; |
|; |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
for (my $k=0; $k<@{$allanswers{$id}}; $k++) { |
$output .= qq| |
$output .= qq| |
<foil location="random" value="$$settings{$id}{$allanswers{$id}[$k]}{choice_id}" name="$allanswers{$id}[$k]"> |
<foil location="random" value="$$settings{$id}{$allanswers{$id}[$k]}{choice_id}" name="$allanswers{$id}[$k]"> |
<startouttext />$$settings{$id}{$allanswers{$id}[$k]}{text}<endouttext /> |
<startouttext />$$settings{$id}{$allanswers{$id}[$k]}{text}<endouttext /> |
</foil> |
</foil> |
|; |
|; |
} |
} |
$output .= qq| |
$output .= qq| |
</foilgroup> |
</foilgroup> |
</matchresponse> |
</matchresponse> |
|; |
|
} |
|
if ($container eq 'pool') { |
|
$output .= qq|</problem> |
|
|; |
|
open(PROB,">$newdir/$id.problem"); |
|
print PROB $output; |
|
close PROB; |
|
} else { |
|
$output .= qq|</problem> |
|
|; |
|
open(PROB,">$newdir/$id.problem"); |
|
print PROB $output; |
|
close PROB; |
|
} |
|
|
|
} |
|
} |
|
} |
|
|
|
|
|
sub create_ess { |
|
my ($newdir,$qnid,$qsettings,$container) = @_; |
|
my $output; |
|
if ($container eq 'pool') { |
|
$output = qq|<problem> |
|
<startouttext />$$qsettings{text}<endouttext /> |
|
|; |
|
} else { |
|
$output = qq|<problem> |
|
<startouttext />$$qsettings{text}<endouttext /> |
|
|; |
|; |
} |
} |
$output .= qq| |
} |
<essayresponse> |
|
<textfield></textfield> |
|
</essayresponse> |
|
<postanswerdate> |
|
$$qsettings{feedbackcorr} |
|
</postanswerdate> |
|
|; |
|
if ($container eq 'pool') { |
|
$output .= qq|</problem> |
|
|; |
|
open(PROB,">$newdir/$qnid.problem"); |
|
print PROB $output; |
|
close PROB; |
|
} else { |
|
$output .= qq|</problem> |
$output .= qq|</problem> |
|; |
|; |
open(PROB,">$newdir/$qnid.problem"); |
open(PROB,">$newdir/$id.problem"); |
print PROB $output; |
print PROB $output; |
close PROB; |
close PROB; |
} |
} |
return; |
|
} |
} |
|
|
|
# ---------------------------------------------------------------- Process Blackboard Announcements |
sub process_announce { |
sub process_announce { |
my ($res,$docroot,$destdir,$settings) = @_; |
my ($res,$docroot,$destdir,$settings,$globalresref,$seqstem,$revitmref) = @_; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my @state = (); |
my @state = (); |
my $id; |
my @assess = (); |
my $p = HTML::Parser->new |
my $id; |
|
my $p = HTML::Parser->new |
( |
( |
xml_mode => 1, |
xml_mode => 1, |
start_h => |
start_h => |
Line 1447 sub process_announce {
|
Line 1932 sub process_announce {
|
if ("@state" eq "ANNOUNCEMENT TITLE") { |
if ("@state" eq "ANNOUNCEMENT TITLE") { |
$$settings{title} = $attr->{value}; |
$$settings{title} = $attr->{value}; |
$$settings{startassessment} = (); |
$$settings{startassessment} = (); |
# print "Title is $$settings{title}\n"; |
|
} elsif (@state eq "ANNOUNCEMENT DESCRIPTION FLAGS ISHTML") { |
} elsif (@state eq "ANNOUNCEMENT DESCRIPTION FLAGS ISHTML") { |
$$settings{ishtml} = $attr->{value}; |
$$settings{ishtml} = $attr->{value}; |
} elsif ("@state" eq "ANNOUNCEMENT DESCRIPTION FLAGS ISNEWLINELITERAL" ) { |
} elsif ("@state" eq "ANNOUNCEMENT DESCRIPTION FLAGS ISNEWLINELITERAL" ) { |
$$settings{isnewline} = $attr->{value}; |
$$settings{isnewline} = $attr->{value}; |
} elsif ("@state" eq "CONTENT ISPERMANENT" ) { |
} elsif ("@state" eq "ANNOUNCEMENT ISPERMANENT" ) { |
$$settings{ispermanent} = $attr->{value}; |
$$settings{ispermanent} = $attr->{value}; |
|
} elsif ("@state" eq "ANNOUNCEMENT DATES UPDATED") { |
|
$$settings{dates} = $attr->{value}; |
} elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT" ) { |
} elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT" ) { |
$id = $attr->{id}; |
$id = $attr->{id}; |
$$settings{startassessment}{$id} = (); |
%{$$settings{startassessment}{$id}} = (); |
|
push @assess,$id; |
} elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT ATTRIB" ) { |
} elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT ATTRIB" ) { |
my $key = $attr->{key}; |
my $key = $attr->{key}; |
$$settings{startassessment}{$id}{$key} = $attr->{value}; |
$$settings{startassessment}{$id}{$key} = $attr->{value}; |
Line 1466 sub process_announce {
|
Line 1953 sub process_announce {
|
[sub { |
[sub { |
my ($text) = @_; |
my ($text) = @_; |
if ("@state" eq "ANNOUNCEMENT DESCRIPTION TEXT") { |
if ("@state" eq "ANNOUNCEMENT DESCRIPTION TEXT") { |
$$settings{maindata}{text} = $text; |
$$settings{text} = $text; |
# print "TEXT $text\n"; |
|
} |
} |
}, "dtext"], |
}, "dtext"], |
end_h => |
end_h => |
Line 1476 sub process_announce {
|
Line 1962 sub process_announce {
|
pop @state; |
pop @state; |
}, "tagname"], |
}, "tagname"], |
); |
); |
$p->unbroken_text(1); |
$p->unbroken_text(1); |
$p->parse_file($xmlfile); |
$p->parse_file($xmlfile); |
$p->eof; |
$p->eof; |
|
|
|
if (defined($$settings{text})) { |
|
if ($$settings{ishtml} eq "false") { |
|
if ($$settings{isnewline} eq "true") { |
|
$$settings{text} =~ s#\n#<br/>#g; |
|
} |
|
} else { |
|
$$settings{text} = &HTML::Entities::decode($$settings{text}); |
|
} |
|
} |
|
|
|
if (@assess > 0) { |
|
foreach my $id (@assess) { |
|
$$settings{text} = "A $$settings{startassessment}{$id}{assessment_type}, entitled $$globalresref{$$settings{startassessment}{$id}{assessment_id}}{title} is available. Click <a href='$seqstem/$$revitmref{$$settings{startassessment}{$id}{assessment_id}}.sequence'>here</a> to enter the folder the contains the problems in this assessment."; |
|
} |
|
} |
|
|
|
open(FILE,">$destdir/resfiles/$res.html"); |
|
print FILE qq|<html> |
|
<head> |
|
<title>$$settings{title}</title> |
|
</head> |
|
<body bgcolor='#ffffff'> |
|
<table> |
|
<tr> |
|
<td bgcolor='#CCCCFF'>$$settings{title} - announcement date: $$settings{date}</td> |
|
</tr> |
|
</table> |
|
<br/> |
|
$$settings{text} |
|
|; |
|
print FILE qq| |
|
</body> |
|
</html>|; |
|
close(FILE); |
} |
} |
|
|
|
# ---------------------------------------------------------------- Process Blackboard Content |
sub process_content { |
sub process_content { |
my ($res,$docroot,$destdir,$settings,$dom,$user) = @_; |
my ($res,$docroot,$destdir,$settings,$dom,$user) = @_; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my $xmlfile = $docroot."/temp/".$res.".dat"; |
my $destresdir = $destdir; |
my $destresdir = $destdir; |
$destresdir =~ s|/home/$user/public_html/|/res/$dom/$user/|; |
$destresdir =~ s|/home/$user/public_html/|/res/$dom/$user/|; |
my $filecount = 0; |
my $filecount = 0; |
my @state; |
my @allrelfiles = (); |
@{$$settings{files}} = (); |
my @state; |
my $p = HTML::Parser->new |
@{$$settings{files}} = (); |
|
my $p = HTML::Parser->new |
( |
( |
xml_mode => 1, |
xml_mode => 1, |
start_h => |
start_h => |
[sub { |
[sub { |
my ($tagname, $attr) = @_; |
my ($tagname, $attr) = @_; |
push @state, $tagname; |
push @state, $tagname; |
if (@state eq "CONTENT MAINDATA") { |
if (@state eq "CONTENT MAINDATA") { |
Line 1510 sub process_content {
|
Line 2033 sub process_content {
|
$$settings{isfolder} = $attr->{value}; |
$$settings{isfolder} = $attr->{value}; |
} elsif ("@state" eq "CONTENT FLAGS LAUNCHINNEWWINDOW" ) { |
} elsif ("@state" eq "CONTENT FLAGS LAUNCHINNEWWINDOW" ) { |
$$settings{newwindow} = $attr->{value}; |
$$settings{newwindow} = $attr->{value}; |
} elsif ("@state" eq "CONTENT FILES") { |
|
# @{$$settings{files}} = (); |
|
} elsif ("@state" eq "CONTENT FILES FILEREF") { |
} elsif ("@state" eq "CONTENT FILES FILEREF") { |
%{$$settings{files}[$filecount]} = (); |
%{$$settings{files}[$filecount]} = (); |
%{$$settings{files}[$filecount]{registry}} = (); |
%{$$settings{files}[$filecount]{registry}} = (); |
} elsif ("@state" eq "CONTENT FILES FILEREF RELFILE" ) { |
} elsif ("@state" eq "CONTENT FILES FILEREF RELFILE" ) { |
$$settings{files}[$filecount]{'relfile'} = $attr->{value}; |
$$settings{files}[$filecount]{'relfile'} = $attr->{value}; |
|
push @allrelfiles, $attr->{value}; |
} elsif ("@state" eq "CONTENT FILES FILEREF MIMETYPE") { |
} elsif ("@state" eq "CONTENT FILES FILEREF MIMETYPE") { |
$$settings{files}[$filecount]{mimetype} = $attr->{value}; |
$$settings{files}[$filecount]{mimetype} = $attr->{value}; |
} elsif ("@state" eq "CONTENT FILES FILEREF CONTENTTYPE") { |
} elsif ("@state" eq "CONTENT FILES FILEREF CONTENTTYPE") { |
Line 1531 sub process_content {
|
Line 2053 sub process_content {
|
my $key = $attr->{key}; |
my $key = $attr->{key}; |
$$settings{files}[$filecount]{registry}{$key} = $attr->{value}; |
$$settings{files}[$filecount]{registry}{$key} = $attr->{value}; |
} |
} |
}, "tagname, attr"], |
}, "tagname, attr"], |
text_h => |
text_h => |
[sub { |
[sub { |
my ($text) = @_; |
my ($text) = @_; |
if ("@state" eq "CONTENT TITLE") { |
if ("@state" eq "CONTENT TITLE") { |
$$settings{title} = $text; |
$$settings{title} = $text; |
Line 1542 sub process_content {
|
Line 2064 sub process_content {
|
} elsif ("@state" eq "CONTENT FILES FILEREF REFTEXT") { |
} elsif ("@state" eq "CONTENT FILES FILEREF REFTEXT") { |
$$settings{files}[$filecount]{reftext} = $text; |
$$settings{files}[$filecount]{reftext} = $text; |
} |
} |
}, "dtext"], |
}, "dtext"], |
end_h => |
end_h => |
[sub { |
[sub { |
my ($tagname) = @_; |
my ($tagname) = @_; |
if ("@state" eq "CONTENT FILES FILEREF") { |
if ("@state" eq "CONTENT FILES FILEREF") { |
$filecount ++; |
$filecount ++; |
} |
} |
pop @state; |
pop @state; |
}, "tagname"], |
}, "tagname"], |
); |
); |
$p->unbroken_text(1); |
$p->unbroken_text(1); |
$p->parse_file($xmlfile); |
$p->parse_file($xmlfile); |
$p->eof; |
$p->eof; |
my $linktag = ''; |
my $linktag = ''; |
my $fontcol = ''; |
my $fontcol = ''; |
if (@{$$settings{files}} > 0) { |
if (@{$$settings{files}} > 0) { |
for (my $filecount=0; $filecount<@{$$settings{files}}; $filecount++) { |
for (my $filecount=0; $filecount<@{$$settings{files}}; $filecount++) { |
if ($$settings{files}[$filecount]{'fileaction'} eq 'embed') { |
if ($$settings{files}[$filecount]{'fileaction'} eq 'embed') { |
if ( $$settings{files}[$filecount]{reftext} =~ m#<\!\-\-\s_(\d+)\\_\s\-\-\>#) { |
if ( $$settings{files}[$filecount]{reftext} =~ m#<\!\-\-\s_(\d+)\\_\s\-\-\>#) { |
my $newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"/>|; |
my $newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"/>|; |
$$settings{maindata}{text} =~ s#<\!\-\-\s_/($1)\\_\s\-\-\>#$newtag#; |
$$settings{maindata}{text} =~ s#<\!\-\-\s_/($1)\\_\s\-\-\>#$newtag#; |
} elsif ( $$settings{files}[$filecount]{reftext} =~m#^_/(\d+)\\_$# ) { |
} elsif ( $$settings{files}[$filecount]{reftext} =~m#^_/(\d+)\\_$# ) { |
my $reftag = $1; |
my $reftag = $1; |
my $newtag; |
my $newtag; |
if ($$settings{files}[$filecount]{mimetype} =~ m/^image/) { |
if ($$settings{files}[$filecount]{mimetype} =~ m/^image/) { |
$newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|; |
$newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|; |
if ( defined($$settings{files}[$filecount]{registry}{alttext}) ) { |
if ( defined($$settings{files}[$filecount]{registry}{alttext}) ) { |
$newtag .= qq| alt="$$settings{files}[$filecount]{registry}{alttext}"|; |
$newtag .= qq| alt="$$settings{files}[$filecount]{registry}{alttext}"|; |
} |
} |
if ( defined($$settings{files}[$filecount]{registry}{alignment}) ) |
if ( defined($$settings{files}[$filecount]{registry}{alignment}) ) |
{ |
{ |
$newtag .= qq| align="$$settings{files}[$filecount]{registry}{alignment}"|; |
$newtag .= qq| align="$$settings{files}[$filecount]{registry}{alignment}"|; |
} |
} |
if ( defined($$settings{files}[$filecount]{registry}{border}) ) { |
if ( defined($$settings{files}[$filecount]{registry}{border}) ) { |
$newtag .= qq| border="$$settings{files}[$filecount]{registry}{border}"|; |
$newtag .= qq| border="$$settings{files}[$filecount]{registry}{border}"|; |
} |
} |
$newtag .= " />"; |
$newtag .= " />"; |
my $reftext = $$settings{files}[$filecount]{reftext}; |
my $reftext = $$settings{files}[$filecount]{reftext}; |
my $fname = $$settings{files}[$filecount]{'relfile'}; |
my $fname = $$settings{files}[$filecount]{'relfile'}; |
$$settings{maindata}{text} =~ s/<!\-\-\sCOMMENT\sBLOCK\sFOR\sEMBEDDED\sFILE:\s$fname[\s\n]+DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n]+//; |
$$settings{maindata}{text} =~ s/<!\-\-\sCOMMENT\sBLOCK\sFOR\sEMBEDDED\sFILE:\s$fname[\s\n]+DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n]+//; |
# $$settings{maindata}{text} =~ s/DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n]+//; |
# $$settings{maindata}{text} =~ s/DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n]+//; |
$$settings{maindata}{text} =~ s/Move\swhole\scomment\sto\schange\sfile\splacement\swithin\spage\.[\s\n]+//; |
$$settings{maindata}{text} =~ s/Move\swhole\scomment\sto\schange\sfile\splacement\swithin\spage\.[\s\n]+//; |
$$settings{maindata}{text} =~ s/_\/$reftag\\_/$newtag/; |
$$settings{maindata}{text} =~ s/_\/$reftag\\_/$newtag/; |
$$settings{maindata}{text} =~ s/END\sOF\sBLOCK\sON\sNEXT\sLINE[\s\n]+//; |
$$settings{maindata}{text} =~ s/END\sOF\sBLOCK\sON\sNEXT\sLINE[\s\n]+//; |
$$settings{maindata}{text} =~ s/\-\->//; |
$$settings{maindata}{text} =~ s/\-\->//; |
# $$settings{maindata}{text} =~ s/<!\-\-\sCOMMENT\sBLOCK\sFOR\sEMBEDDED\sFILE:\s$fname[\s\n]+DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n\]+_\/$reftag\\_[\s\n]+END\sOF\sBLOCK\sON\sNEXT\sLINE[\s\n\]+\-\->/$newtag/; |
# $$settings{maindata}{text} =~ s/<!\-\-\sCOMMENT\sBLOCK\sFOR\sEMBEDDED\sFILE:\s$fname[\s\n]+DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n\]+_\/$reftag\\_[\s\n]+END\sOF\sBLOCK\sON\sNEXT\sLINE[\s\n\]+\-\->/$newtag/; |
# print STDERR $$settings{maindata}{text}; |
# print STDERR $$settings{maindata}{text}; |
} |
} |
} else { |
} else { |
my $filename=$$settings{files}[$filecount]{'relfile'}; |
my $filename=$$settings{files}[$filecount]{'relfile'}; |
# print "File is $filename\n"; |
# print "File is $filename\n"; |
my $newfilename="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"; |
my $newfilename="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"; |
# print "New filename is $newfilename\n"; |
# print "New filename is $newfilename\n"; |
$$settings{maindata}{text} =~ s#(src|SRC|value)="$filename"#$1="$newfilename"#g; |
$$settings{maindata}{text} =~ s#(src|SRC|value)="$filename"#$1="$newfilename"#g; |
} |
} |
} elsif ($$settings{files}[$filecount]{fileaction} eq 'link') { |
} elsif ($$settings{files}[$filecount]{fileaction} eq 'link') { |
$linktag = qq|<a href="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|; |
unless (($$settings{files}[$filecount]{packageparent} ne '') && (grep/^$$settings{files}[$filecount]{packageparent}$/,@{$$settings{files}}) ) { |
if ($$settings{newwindow} eq "true") { |
$linktag .= qq|<a href="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|; |
$linktag .= qq| target="$res$filecount"|; |
if ($$settings{newwindow} eq "true") { |
} |
$linktag .= qq| target="$res$filecount"|; |
foreach my $entry (keys %{$$settings{files}[$filecount]{registry}}) { |
} |
$linktag .= qq| $entry="$$settings{files}[$filecount]{registry}{$entry}"|; |
foreach my $entry (keys %{$$settings{files}[$filecount]{registry}}) { |
} |
$linktag .= qq| $entry="$$settings{files}[$filecount]{registry}{$entry}"|; |
$linktag .= qq|>$$settings{files}[$filecount]{linkname}</a>|; |
} |
} elsif ($$settings{files}[$filecount]{fileaction} eq 'package') { |
$linktag .= qq|>$$settings{files}[$filecount]{linkname}</a><br/>\n|; |
|
} |
|
} elsif ($$settings{files}[$filecount]{fileaction} eq 'package') { |
# print "Found a package\n"; |
# print "Found a package\n"; |
} |
} |
} |
} |
} |
} |
if (defined($$settings{maindata}{textcolor})) { |
if (defined($$settings{maindata}{textcolor})) { |
$fontcol = qq|<font color="$$settings{maindata}{textcolor}">|; |
$fontcol = qq|<font color="$$settings{maindata}{textcolor}">|; |
} |
} |
if (defined($$settings{maindata}{text})) { |
if (defined($$settings{maindata}{text})) { |
if ($$settings{maindata}{ishtml} eq "false") { |
if ($$settings{maindata}{ishtml} eq "false") { |
if ($$settings{maindata}{isnewline} eq "true") { |
if ($$settings{maindata}{isnewline} eq "true") { |
$$settings{maindata}{text} =~ s#\n#<br/>#g; |
$$settings{maindata}{text} =~ s#\n#<br/>#g; |
} |
} |
} else { |
} else { |
$$settings{maindata}{text} = &HTML::Entities::decode($$settings{maindata}{text}); |
$$settings{maindata}{text} = &HTML::Entities::decode($$settings{maindata}{text}); |
} |
} |
} |
} |
|
|
open(FILE,">$destdir/resfiles/$res.html"); |
open(FILE,">$destdir/resfiles/$res.html"); |
print FILE qq|<html> |
print FILE qq|<html> |
<head> |
<head> |
<title>$$settings{title}</title> |
<title>$$settings{title}</title> |
</head> |
</head> |
<body bgcolor='#ffffff'> |
<body bgcolor='#ffffff'> |
$fontcol |
$fontcol |
|; |
|; |
unless ($$settings{title} eq '') { |
unless ($$settings{title} eq '') { |
print FILE qq|$$settings{title}<br/><br/>\n|; |
print FILE qq|$$settings{title}<br/><br/>\n|; |
} |
} |
print FILE qq| |
print FILE qq| |
$$settings{maindata}{text} |
$$settings{maindata}{text} |
$linktag|; |
$linktag|; |
if (defined($$settings{maindata}{textcolor})) { |
if (defined($$settings{maindata}{textcolor})) { |
print FILE qq|</font>|; |
print FILE qq|</font>|; |
} |
} |
print FILE qq| |
print FILE qq| |
|
</body> |
|
</html>|; |
|
close(FILE); |
|
} |
|
|
|
# ---------------------------------------------------------------- Expand ANGEL IMS package |
|
sub expand_angel { |
|
my ($r,$uname,$udom,$fn,$page,$bb_crs,$bb_cdom,$bb_handling) = @_; |
|
my @state = (); |
|
my @seq = "Top"; |
|
my $lastitem; |
|
my $itm = ''; |
|
my %resnum = (); |
|
my %revitm = (); |
|
my %title = (); |
|
my %filepath = (); |
|
my %contentscount = ("Top" => 0); |
|
my %contents = (); |
|
my %parentseq = (); |
|
my %file = (); |
|
my %type = (); |
|
my %href = (); |
|
my $identifier = ''; |
|
my %resinfo = (); |
|
my $numfolders = 0; |
|
my $numpages = 0; |
|
my $totseq = 0; |
|
my $totpage = 0; |
|
my $totquiz = 0; |
|
my $totsurv = 0; |
|
my $docroot = $ENV{'form.newdir'}; |
|
if (!-e "$docroot/temp") { |
|
mkdir "$docroot/temp"; |
|
} |
|
my $newdir = ''; |
|
if ($docroot =~ m|public_html/(.+)$|) { |
|
$newdir = $1; |
|
} |
|
my $dirname = "/res/$udom/$uname/$newdir"; |
|
my $zipfile = '/home/'.$uname.'/public_html'.$fn; |
|
if ($fn =~ m|\.zip$|i) { |
|
open(OUTPUT, "unzip -o $zipfile -d $docroot/temp 2> /dev/null |"); |
|
while (<OUTPUT>) { |
|
print "$_<br />"; |
|
} |
|
close(OUTPUT); |
|
} |
|
|
|
my $xmlfile = $docroot.'/temp/imsmanifest.xml'; |
|
my $p = HTML::Parser->new |
|
( |
|
xml_mode => 1, |
|
start_h => |
|
[sub { |
|
my ($tagname, $attr) = @_; |
|
push @state, $tagname; |
|
my $num = @state - 3; |
|
my $start = $num; |
|
my $statestr = ''; |
|
foreach (@state) { |
|
$statestr .= "$_ "; |
|
} |
|
if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq "organization") ) { |
|
my $searchstr = "manifest organizations organization"; |
|
while ($num > 0) { |
|
$searchstr .= " item"; |
|
$num --; |
|
} |
|
if (("@state" eq $searchstr) && (@state > 3)) { |
|
$itm = $attr->{identifier}; |
|
$contentscount{$itm} = 0; |
|
if ($attr->{identifierref} =~ m/^res(.+)$/) { |
|
$resnum{$itm} = $1; |
|
} |
|
$revitm{$resnum{$itm}} = $itm; |
|
if ($start > @seq) { |
|
unless ($lastitem eq '') { |
|
push @seq, $lastitem; |
|
unless ( defined($contents{$seq[-1]}) ) { |
|
@{$contents{$seq[-1]}} = (); |
|
} |
|
push @{$contents{$seq[-1]}},$itm; |
|
$parentseq{$itm} = $seq[-1]; |
|
} |
|
} |
|
elsif ($start < @seq) { |
|
my $diff = @seq - $start; |
|
while ($diff > 0) { |
|
pop @seq; |
|
$diff --; |
|
} |
|
if (@seq) { |
|
push @{$contents{$seq[-1]}}, $itm; |
|
} |
|
} else { |
|
push @{$contents{$seq[-1]}}, $itm; |
|
} |
|
my $path; |
|
if (@seq > 1) { |
|
$path = join(',',@seq); |
|
} elsif (@seq > 0) { |
|
$path = $seq[0]; |
|
} |
|
$filepath{$itm} = $path; |
|
$contentscount{$seq[-1]} ++; |
|
$lastitem = $itm; |
|
} |
|
} elsif ("@state" eq "manifest resources resource" ) { |
|
$identifier = $attr->{identifier}; |
|
$identifier = substr($identifier,3); |
|
if ($attr->{href} =~ m-^_assoc/$identifier/(.+)$-) { |
|
$file{$identifier} = $1; |
|
} |
|
@{$href{$identifier}} = (); |
|
} elsif ("@state" eq "manifest resources resource file") { |
|
if ($attr->{href} =~ m/^_assoc\\$identifier\\(.+)$/) { |
|
push @{$href{$identifier}},$1; |
|
} elsif ($attr->{href} =~ m/^Icons\\icon(\w+)\.gif/) { |
|
$type{$identifier} = $1; |
|
} |
|
} |
|
}, "tagname, attr"], |
|
text_h => |
|
[sub { |
|
my ($text) = @_; |
|
if ($state[0] eq "manifest" && $state[1] eq "organizations" && $state[2] eq "organization" && $state[-1] eq "title") { |
|
$title{$itm} = $text; |
|
} |
|
}, "dtext"], |
|
end_h => |
|
[sub { |
|
my ($tagname) = @_; |
|
pop @state; |
|
}, "tagname"], |
|
); |
|
$p->parse_file($xmlfile); |
|
$p->eof; |
|
|
|
my $topnum = 0; |
|
my $destdir = $docroot; |
|
if (!-e "$destdir") { |
|
mkdir("$destdir",0755); |
|
} |
|
if (!-e "$destdir/sequences") { |
|
mkdir("$destdir/sequences",0755); |
|
} |
|
if (!-e "$destdir/resfiles") { |
|
mkdir("$destdir/resfiles",0755); |
|
} |
|
if (!-e "$destdir/pages") { |
|
mkdir("$destdir/pages",0755); |
|
} |
|
if (!-e "$destdir/problems") { |
|
mkdir("$destdir/problems",0755); |
|
} |
|
foreach my $key (sort keys %href) { |
|
foreach my $file (@{$href{$key}}) { |
|
$file =~ s-\\-/-g; |
|
unless ($file eq 'pg'.$key.'.htm') { |
|
if (!-e "$destdir/resfiles/$key") { |
|
mkdir("$destdir/resfiles/$key",0755); |
|
} |
|
} |
|
my $filepath = $file; |
|
while ($filepath =~ m-(\w+)/(.+)-) { |
|
$filepath = $2; |
|
if (!-e "$destdir/resfiles/$key/$1") { |
|
mkdir("$destdir/resfiles/$key/$1",0755); |
|
} |
|
} |
|
unless ($file eq 'pg'.$key.'.htm') { |
|
system("cp $docroot/temp/_assoc/$key/$file $destdir/resfiles/$key/$file"); |
|
} |
|
} |
|
} |
|
|
|
# ANGEL types FILE FOLDER PAGE LINK MESSAGE FORM QUIZ BOARD DROPBOX IMS |
|
my $currboard = ''; |
|
my @boards = (); |
|
my %messages = (); |
|
my @timestamp = (); |
|
my %boardnum = (); |
|
my $board_id = time; |
|
my $board_count = 0; |
|
foreach my $key (sort keys %type) { |
|
if ($type{$key} eq "BOARD") { |
|
push @boards, $key; |
|
$boardnum{$revitm{$key}} = $board_count ; |
|
$currboard = $key; |
|
@{$messages{$key}} = (); |
|
$timestamp[$board_count] = $board_id; |
|
$board_id ++; |
|
$board_count ++; |
|
} elsif ($type{$key} eq "MESSAGE") { |
|
push @{$messages{$currboard}}, $key; |
|
} elsif ($type{$key} eq "PAGE" || $type{$key} eq "LINK") { |
|
%{$resinfo{$key}} = (); |
|
&angel_content($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname,$type{$key},$title{$revitm{$key}}); |
|
} elsif ($type{$key} eq "QUIZ") { |
|
%{$resinfo{$key}} = (); |
|
# &angel_assessment($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}}); |
|
} elsif ($type{$key} eq "FORM") { |
|
%{$resinfo{$key}} = (); |
|
# &angel_assessment($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}}); |
|
} elsif ($type{$key} eq "DROPBOX") { |
|
%{$resinfo{$key}} = (); |
|
} |
|
} |
|
|
|
my $longcrs = ''; |
|
if ($bb_crs =~ m/^(\d)(\d)(\d)/) { |
|
$longcrs = $1.'/'.$2.'/'.$3.'/'.$bb_crs; |
|
} |
|
for (my $i=0; $i<@boards; $i++) { |
|
my %msgidx = (); |
|
my $forumtext = ''; |
|
my $boardname = 'bulletinpage_'.$timestamp[$i]; |
|
my $forumfile = $docroot.'/temp/_assoc/'.$boards[$i].'/pg'.$boards[$i].'.htm'; |
|
my @state = (); |
|
my $p = HTML::Parser->new |
|
( |
|
xml_mode => 1, |
|
start_h => |
|
[sub { |
|
my ($tagname, $attr) = @_; |
|
push @state, $tagname; |
|
}, "tagname, attr"], |
|
text_h => |
|
[sub { |
|
my ($text) = @_; |
|
if ("@state" eq "html body div div") { |
|
$forumtext = $text; |
|
} |
|
}, "dtext"], |
|
end_h => |
|
[sub { |
|
my ($tagname) = @_; |
|
pop @state; |
|
}, "tagname"], |
|
); |
|
$p->parse_file($forumfile); |
|
$p->eof; |
|
|
|
my %boardinfo = ( |
|
'aaa_title' => $title{$revitm{$boards[$i]}}, |
|
'bbb_content' => $forumtext, |
|
'ccc_webreferences' => '', |
|
'uploaded.lastmodified' => time, |
|
); |
|
my $msgcount = 0; |
|
|
|
my $putresult = &Apache::lonnet::put($boardname,\%boardinfo,$bb_cdom,$bb_crs); |
|
print STDERR "putresult is $putresult for $boardname $bb_cdom $bb_crs\n"; |
|
if ($bb_handling eq 'importall') { |
|
foreach my $msg_id (@{$messages{$boards[$i]}}) { |
|
$msgcount ++; |
|
$msgidx{$msg_id} = $msgcount; |
|
my %contrib = ( |
|
'sendername' => 'NoName', |
|
'senderdomain' => $bb_cdom, |
|
'screenname' => '', |
|
'message' => $title{$revitm{$msg_id}} |
|
); |
|
unless ( $parentseq{$revitm{$msg_id}} eq $revitm{$boards[$i]} ) { |
|
unless ( $msgidx{$resnum{$parentseq{$revitm{$msg_id}}}} eq ''){ |
|
$contrib{replyto} = $msgidx{$resnum{$parentseq{$revitm{$msg_id}}}}; |
|
print STDERR "$msgidx{$resnum{$revitm{$msg_id}}} is replying to $msgidx{$resnum{$parentseq{$revitm{$msg_id}}}}\n"; |
|
} |
|
} |
|
if ( @{$href{$msg_id}} > 1 ) { |
|
my $newurl = ''; |
|
foreach my $file (@{$href{$msg_id}}) { |
|
unless ($file eq 'pg'.$msg_id.'.htm') { |
|
$newurl = $msg_id.$file; |
|
print STDERR "Msg is $msg_id, File is $file, newurl is $newurl\n"; |
|
unless ($longcrs eq '') { |
|
if (!-e "/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles") { |
|
mkdir("/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles",0755); |
|
} |
|
if (!-e "/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles/$newurl") { |
|
system("cp $destdir/resfiles/$msg_id/$file /home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles/$newurl"); |
|
} |
|
$contrib{attachmenturl} = '/uploaded/'.$bb_cdom.'/'.$bb_crs.'/'.$newurl; |
|
} |
|
} |
|
} |
|
} |
|
my $xmlfile = $docroot.'/temp/_assoc/'.$msg_id.'/'.$file{$msg_id}; |
|
&angel_message($msg_id,\%contrib,$xmlfile); |
|
unless ($file{$msg_id} eq '') { |
|
unlink($xmlfile); |
|
} |
|
my $symb = 'bulletin___'.$timestamp[$i].'___adm/wrapper/adm/'.$bb_cdom.'/'.$uname.'/'.$timestamp[$i].'/bulletinboard'; |
|
my $postresult = &addposting($symb,\%contrib,$bb_cdom,$bb_crs); |
|
} |
|
} |
|
} |
|
|
|
my @resources = sort keys %resnum; |
|
unshift @resources, "Top"; |
|
$resnum{'Top'} = 'toplevel'; |
|
$type{'toplevel'} = "FOLDER"; |
|
|
|
my %pagecount = (); |
|
my %pagecontents = (); |
|
my %pageflag = (); |
|
my %seqflag = (); |
|
my %seqcount = (); |
|
my %boardflag = (); |
|
my %boardcount = (); |
|
my %fileflag = (); |
|
my %filecount = (); |
|
|
|
foreach my $key (@resources) { |
|
$pageflag{$key} = 0; |
|
$seqflag{$key} = 0; |
|
$seqcount{$key} = 0; |
|
$pagecount{$key} = -1; |
|
$boardflag{$key} = 0; |
|
$boardcount{$key} = 0; |
|
$fileflag{$key} = 0; |
|
$filecount{$key} = 0; |
|
my $src =""; |
|
my $srcstem = "/res/$udom/$uname/$newdir"; |
|
my $next_id = 1; |
|
my $curr_id = 0; |
|
if ($type{$resnum{$key}} eq "FOLDER") { |
|
open(LOCFILE,">$destdir/sequences/$key.sequence"); |
|
print LOCFILE "<map>\n"; |
|
if ($contentscount{$key} == 0) { |
|
print LOCFILE qq|<resource id="1" src="" type="start"></resource> |
|
<link from="1" to="2" index="1"></link> |
|
<resource id="2" src="" type="finish"></resource>\n|; |
|
} else { |
|
if ($type{$resnum{$contents{$key}[0]}} eq "FOLDER") { |
|
$src = $srcstem.'/sequences/'.$contents{$key}[0].".sequence"; |
|
$pageflag{$key} = 0; |
|
$seqflag{$key} = 1; |
|
$seqcount{$key} ++; |
|
} elsif ($type{$resnum{$contents{$key}[0]}} eq "BOARD") { |
|
$src = '/adm/'.$bb_cdom.'/'.$uname.'/'.$timestamp[$boardnum{$resnum{$contents{$key}[0]}}].'/bulletinboard'; |
|
$pageflag{$key} = 0; |
|
$boardflag{$key} = 1; |
|
$boardcount{$key} ++; |
|
} elsif ($type{$resnum{$contents{$key}[0]}} eq "FILE") { |
|
foreach my $file (@{$href{$resnum{$contents{$key}[0]}}}) { |
|
unless ($file eq 'pg'.$resnum{$contents{$key}[0]}.'.htm') { |
|
$src = $srcstem.'/resfiles/'.$resnum{$contents{$key}[0]}.'/'.$file; |
|
} |
|
} |
|
$pageflag{$key} = 0; |
|
$fileflag{$key} = 1; |
|
} elsif ( ($type{$resnum{$contents{$key}[0]}} eq "PAGE") || ($type{$resnum{$contents{$key}[0]}} eq "LINK") ) { |
|
if ($pageflag{$key}) { |
|
if ($pagecount{key} == -1) { |
|
print STDERR "Array index is -1, we shouldnt be here\n"; |
|
} else { |
|
push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[0]; |
|
} |
|
} else { |
|
$pagecount{$key} ++; |
|
$src = $srcstem.'/pages/'.$key.'_'.$pagecount{$key}.'.page'; |
|
@{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[0]"); |
|
$seqflag{$key} = 0; |
|
} |
|
} |
|
unless ($pageflag{$key}) { |
|
print LOCFILE qq|<resource id="1" src="$src" title="$title{$contents{$key}[0]}" type="start"|; |
|
unless ($seqflag{$key} || $boardflag{$key} || $fileflag{$key}) { |
|
$pageflag{$key} = 1; |
|
} |
|
} |
|
if ($contentscount{$key} == 1) { |
|
print LOCFILE qq|></resource> |
|
<link from="1" to="2" index="1"></link> |
|
<resource id="2" src="" type="finish"></resource>\n|; |
|
} else { |
|
if ($contentscount{$key} > 2 ) { |
|
for (my $i=1; $i<$contentscount{$key}-1; $i++) { |
|
if ($type{$resnum{$contents{$key}[$i]}} eq "FOLDER") { |
|
$src = $srcstem.'/sequences/'.$contents{$key}[$i].".sequence"; |
|
$pageflag{$key} = 0; |
|
$seqflag{$key} = 1; |
|
$seqcount{$key} ++; |
|
} elsif ($type{$resnum{$contents{$key}[$i]}} eq "BOARD") { |
|
$src = '/adm/'.$bb_cdom.'/'.$uname.'/'.$timestamp[$boardnum{$resnum{$contents{$key}[$i]}}].'/bulletinboard'; |
|
$pageflag{$key} = 0; |
|
$boardflag{$key} = 1; |
|
$boardcount{$key} ++; |
|
} elsif ($type{$resnum{$contents{$key}[$i]}} eq "FILE") { |
|
foreach my $file (@{$href{$resnum{$contents{$key}[$i]}}}) { |
|
unless ($file eq 'pg'.$resnum{$contents{$key}[$i]}.'.htm') { |
|
$src = $srcstem.'/resfiles/'.$resnum{$contents{$key}[$i]}.'/'.$file; |
|
} |
|
} |
|
$pageflag{$key} = 0; |
|
$fileflag{$key} = 1; |
|
$filecount{$key} ++; |
|
} elsif ( ($type{$resnum{$contents{$key}[$i]}} eq "PAGE") || ($type{$resnum{$contents{$key}[$i]}} eq "LINK") ) { |
|
if ($pageflag{$key}) { |
|
if ($pagecount{$key} == -1) { |
|
print STDERR "array index is -1, we shouldnt be here\n"; |
|
} else { |
|
push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$i]; |
|
} |
|
} else { |
|
$pagecount{$key} ++; |
|
$src = $srcstem.'/pages/'.$key.'_'.$pagecount{$key}.'.page'; |
|
@{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$i]"); |
|
$seqflag{$key} = 0; |
|
} |
|
} |
|
unless ($pageflag{$key}) { |
|
$curr_id ++; |
|
$next_id ++; |
|
print LOCFILE qq|></resource> |
|
<link from="$curr_id" to="$next_id" index="$curr_id"></link> |
|
<resource id="$next_id" src="$src" title="$title{$contents{$key}[$i]}"|; |
|
unless ($seqflag{$key} || $boardflag{$key} || $fileflag{$key}) { |
|
$pageflag{$key} = 1; |
|
} |
|
} |
|
} |
|
} |
|
if ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "FOLDER") { |
|
$src = $srcstem.'/sequences/'.$contents{$key}[$contentscount{$key}-1].".sequence"; |
|
$pageflag{$key} = 0; |
|
$seqflag{$key} = 1; |
|
} elsif ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "BOARD") { |
|
$src = "/adm/$bb_cdom/$uname/$timestamp[$boardnum{$resnum{$contents{$key}[$contentscount{$key}-1]}}]/bulletinboard"; |
|
$pageflag{$key} = 0; |
|
$boardflag{$key} = 1; |
|
} elsif ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "FILE") { |
|
foreach my $file (@{$href{$resnum{$contents{$key}[$contentscount{$key}-1]}}}) { |
|
unless ($file eq 'pg'.$resnum{$contents{$key}[$contentscount{$key}-1]}.'.htm') { |
|
$src = $srcstem.'/resfiles/'.$resnum{$contents{$key}[$contentscount{$key}-1]}.'/'.$file; |
|
} |
|
} |
|
$pageflag{$key} = 0; |
|
$fileflag{$key} = 1; |
|
$filecount{$key} ++; |
|
} elsif ( ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "PAGE") || ($type{$resnum{$contents{$key}[$contentscount{$key}-1]}} eq "LINK") ) { |
|
if ($pageflag{$key}) { |
|
push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$contentscount{$key}-1]; |
|
} else { |
|
$pagecount{$key} ++; |
|
$src = $srcstem.'/pages/'.$key.'_'.$pagecount{$key}.'.page'; |
|
@{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$contentscount{$key}-1]"); |
|
} |
|
} |
|
if ($pageflag{$key}) { |
|
if ($seqcount{$key} + $pagecount{$key} + $boardcount{$key} + $filecount{$key} +1 == 1) { |
|
print LOCFILE qq|></resource> |
|
<link from="1" index="1" to="2"> |
|
<resource id ="2" src="" title="" type="finish"></resource>\n|; |
|
} else { |
|
print LOCFILE qq| type="finish"></resource>\n|; |
|
} |
|
} else { |
|
$curr_id ++; |
|
$next_id ++; |
|
print LOCFILE qq|></resource> |
|
<link from="$curr_id" to="$next_id" index="$curr_id"></link> |
|
<resource id="$next_id" src="$src" title="$title{$contents{$key}[$contentscount{$key}-1]}" type="finish"></resource>\n|; |
|
} |
|
} |
|
} |
|
print LOCFILE "</map>\n"; |
|
close(LOCFILE); |
|
$pagecount{$key} ++; |
|
$totpage += $pagecount{$key}; |
|
} |
|
$totseq += $seqcount{$key}; |
|
} |
|
|
|
foreach my $key (sort keys %pagecontents) { |
|
for (my $i=0; $i<@{$pagecontents{$key}}; $i++) { |
|
my $filestem = "/res/$udom/$uname/$newdir"; |
|
my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page'; |
|
open(PAGEFILE,">$filename"); |
|
print PAGEFILE qq|<map> |
|
<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][0]}/$resnum{$pagecontents{$key}[$i][0]}.html" id="1" type="start" title="$title{$pagecontents{$key}[$i][0]}"></resource> |
|
<link to="2" index="1" from="1">\n|; |
|
if (@{$pagecontents{$key}[$i]} == 1) { |
|
print PAGEFILE qq|<resource src="" id="2" type="finish"></resource>|; |
|
} elsif (@{$pagecontents{$key}[$i]} == 2) { |
|
print PAGEFILE qq|<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][1]}/$resnum{$pagecontents{$key}[$i][1]}.html" id="2" type="finish" title="$title{$pagecontents{$key}[$i][1]}"></resource>|; |
|
} else { |
|
for (my $j=1; $j<@{$pagecontents{$key}[$i]}-1; $j++) { |
|
my $curr_id = $j+1; |
|
my $next_id = $j+2; |
|
my $resource = $filestem.'/resfiles/'.$resnum{$pagecontents{$key}[$i][1]}.'/'.$resnum{$pagecontents{$key}[$i][$j]}.'.html'; |
|
print PAGEFILE qq|<resource src="$resource" id="$curr_id" title="$title{$pagecontents{$key}[$i][$j]}"></resource> |
|
<link to="$next_id" index="$curr_id" from="$curr_id">\n|; |
|
} |
|
my $final_id = @{$pagecontents{$key}[$i]}; |
|
print PAGEFILE qq|<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][-1]}/$resnum{$pagecontents{$key}[$i][-1]}.html" id="$final_id" type="finish" title="$title{$pagecontents{$key}[$i][-1]}"></resource>\n|; |
|
} |
|
print PAGEFILE "</map>"; |
|
close(PAGEFILE); |
|
} |
|
} |
|
system(" rm -r $docroot/temp"); # Need to add sanity checking |
|
return('ok',$totseq,$totpage,$board_count); |
|
} |
|
|
|
# ---------------------------------------------------------------- ANGEL content |
|
sub angel_content { |
|
my ($res,$docroot,$destdir,$settings,$dom,$user,$type,$title) = @_; |
|
my $xmlfile = $docroot.'/temp/_assoc/'.$res.'/pg'.$res.'.htm'; |
|
my $filecount = 0; |
|
my $firstline; |
|
my $lastline; |
|
my @buffer = (); |
|
my @state; |
|
@{$$settings{links}} = (); |
|
my $p = HTML::Parser->new |
|
( |
|
xml_mode => 1, |
|
start_h => |
|
[sub { |
|
my ($tagname, $attr) = @_; |
|
push @state, $tagname; |
|
}, "tagname, attr"], |
|
text_h => |
|
[sub { |
|
my ($text) = @_; |
|
if ("@state" eq "html body table tr td div small span") { |
|
$$settings{'subtitle'} = $text; |
|
} elsif ("@state" eq "html body div div") { |
|
$$settings{'text'} = $text; |
|
} elsif ("@state" eq "html body div div a") { |
|
push @{$$settings{'links'}}, $text; |
|
} |
|
}, "dtext"], |
|
end_h => |
|
[sub { |
|
my ($tagname) = @_; |
|
pop @state; |
|
}, "tagname"], |
|
); |
|
$p->parse_file($xmlfile); |
|
$p->eof; |
|
if ($type eq "PAGE") { |
|
open(FILE,"<$xmlfile"); |
|
@buffer = <FILE>; |
|
close(FILE); |
|
chomp(@buffer); |
|
$firstline = -1; |
|
$lastline = 0; |
|
for (my $i=0; $i<@buffer; $i++) { |
|
if (($firstline == -1) && ($buffer[$i] =~ m/<div\sclass="normalDiv"><div\sclass="normalSpan">/)) { |
|
$firstline = $i; |
|
$buffer[$i] = substr($buffer[$i],index($buffer[$i],'"normalSpan"')+13); |
|
} |
|
if (($firstline > -1) && ($buffer[$i] =~ m-<p></p></div></div>-)) { |
|
$buffer[$i] = substr($buffer[$i],0,index($buffer[$i],'<p></p></div></div>')); |
|
$lastline = $i; |
|
} |
|
} |
|
} |
|
if (!-e "$destdir/resfiles/$res") { |
|
mkdir("$destdir/resfiles/$res/",0755); |
|
} |
|
open(FILE,">$destdir/resfiles/$res/$res.html"); |
|
print FILE qq|<html> |
|
<head> |
|
<title>$title</title> |
|
</head> |
|
<body bgcolor='#ffffff'> |
|
|; |
|
unless ($title eq '') { |
|
print FILE qq|<b>$title</b><br/>\n|; |
|
} |
|
unless ($$settings{subtitle} eq '') { |
|
print FILE qq|$$settings{subtitle}<br/>\n|; |
|
} |
|
print FILE "<br/>\n"; |
|
if ($type eq "LINK") { |
|
foreach my $link (@{$$settings{links}}) { |
|
print FILE qq|<a href="$link">$link</a><br/>\n|; |
|
} |
|
} elsif ($type eq "PAGE") { |
|
if ($firstline > -1) { |
|
for (my $i=$firstline; $i<=$lastline; $i++) { |
|
print FILE "$buffer[$i]\n"; |
|
} |
|
} |
|
} |
|
print FILE qq| |
</body> |
</body> |
</html>|; |
</html>|; |
close(FILE); |
close(FILE); |
} |
} |
|
|
|
# ---------------------------------------------------------------- Process ANGEL message board messages |
|
sub angel_message { |
|
my ($msg_id,$contrib,$xmlfile) = @_; |
|
my @state = (); |
|
my $p = HTML::Parser->new |
|
( |
|
xml_mode => 1, |
|
start_h => |
|
[sub { |
|
my ($tagname, $attr) = @_; |
|
push @state, $tagname; |
|
}, "tagname, attr"], |
|
text_h => |
|
[sub { |
|
my ($text) = @_; |
|
if ("@state" eq "html body table tr td div small span") { |
|
$$contrib{'plainname'} = $text; |
|
} elsif ("@state" eq "html body div div") { |
|
$$contrib{'message'} .= '<br /><br />'.$text; |
|
} |
|
}, "dtext"], |
|
end_h => |
|
[sub { |
|
my ($tagname) = @_; |
|
pop @state; |
|
}, "tagname"], |
|
); |
|
$p->parse_file($xmlfile); |
|
$p->eof; |
|
} |
|
|
|
# ---------------------------------------------------------------- Get LON-CAPA Course Coordinator roles for this user |
|
sub get_ccroles { |
|
my ($uname,$dom,$crsentry) = @_; |
|
my %roles = (); |
|
unless ($uname eq '') { |
|
%roles = &Apache::lonnet::dump('roles',$dom,$uname); |
|
} |
|
my $iter = 0; |
|
my @codes = (); |
|
my %courses = (); |
|
my @crslist = (); |
|
my %descrip =(); |
|
foreach my $key (keys %roles ) { |
|
if ($key =~ m/^\/(\w+)\/(\w+)_cc$/) { |
|
my $cdom = $1; |
|
my $crs = $2; |
|
my $role_end = 0; |
|
my $role_start = 0; |
|
my $active_chk = 1; |
|
if ( $roles{$key} =~ m/^cc_(\d+)/ ) { |
|
$role_end = $1; |
|
if ( $roles{$key} =~ m/^cc_($role_end)_(\d+)$/ ) |
|
{ |
|
$role_start = $2; |
|
} |
|
} |
|
if ($role_start > 0) { |
|
if (time < $role_start) { |
|
$active_chk = 0; |
|
} |
|
} |
|
if ($role_end > 0) { |
|
if (time > $role_end) { |
|
$active_chk = 0; |
|
} |
|
} |
|
if ($active_chk) { |
|
my $currcode = ''; |
|
my %settings = &Apache::lonnet::get('environment',['internal.coursecode','description'],$cdom,$crs); |
|
if (defined($settings{'description'}) ) { |
|
$descrip{$crs} = $settings{'description'}; |
|
} else { |
|
$descrip{$crs} = 'Unknown'; |
|
} |
|
if (defined($settings{'internal.coursecode'}) ) { |
|
$currcode = $settings{'internal.coursecode'}; |
|
if ($currcode eq '') { |
|
$currcode = "____".$iter; |
|
$iter ++; |
|
} |
|
} else { |
|
$currcode = "____".$iter; |
|
$iter ++; |
|
} |
|
unless (grep/^$currcode$/,@codes) { |
|
push @codes,$currcode; |
|
@{$courses{$currcode}} = (); |
|
} |
|
push @{$courses{$currcode}}, $cdom.'/'.$crs; |
|
} |
|
} |
|
} |
|
foreach my $code (sort @codes) { |
|
foreach my $crsdom (@{$courses{$code}}) { |
|
my ($cdom,$crs) = split/\//,$crsdom; |
|
my $showcode = ''; |
|
unless ($code =~m/^____\d+$/) { $showcode = $code; } |
|
$$crsentry{$crsdom} = $showcode.':'.$descrip{$crs}; |
|
push @crslist, $crsdom; |
|
} |
|
} |
|
return @crslist; |
|
} |
|
|
|
|
# ---------------------------------------------------------------- Main Handler |
# ---------------------------------------------------------------- Main Handler |
sub handler { |
sub handler { |
my $r=shift; |
my $r=shift; |
Line 1701 sub handler {
|
Line 2918 sub handler {
|
|
|
if ($ENV{'form.phase'} eq 'three') { |
if ($ENV{'form.phase'} eq 'three') { |
$current_page = &display_control(); |
$current_page = &display_control(); |
my @PAGES = ('ChooseDir','Blackboard5','ANGEL','WebCT'); |
my @PAGES = ('ChooseDir','Confirmation'); |
$page_name = $PAGES[$current_page]; |
$page_name = $PAGES[$current_page]; |
|
|
if ($page_name eq 'ChooseDir') { |
if ($page_name eq 'ChooseDir') { |
&jscript_zero($fullpath,\$javascript); |
&jscript_zero($fullpath,\$javascript,$uname,$udom); |
} elsif ($page_name eq 'Confirmation') { |
} elsif ($page_name eq 'Confirmation') { |
&jscript_two(\$javascript,$uname); |
# &jscript_two(\$javascript,$uname); |
} |
} |
} elsif ($ENV{'form.phase'} eq 'two') { |
} elsif ($ENV{'form.phase'} eq 'two') { |
&jscript_zero($fullpath,\$javascript); |
&jscript_zero($fullpath,\$javascript,$uname,$udom); |
} |
} |
$r->print("<html><head><title>LON-CAPA Construction Space</title><script type=\"text/javascript\">\n//<!--\n$javascript\n// --></script>\n</head>"); |
$r->print("<html><head><title>LON-CAPA Construction Space</title><script type=\"text/javascript\">\n//<!--\n$javascript\n// --></script>\n</head>"); |
|
|
Line 1722 sub handler {
|
Line 2939 sub handler {
|
} |
} |
|
|
if ($ENV{'form.phase'} eq 'three') { |
if ($ENV{'form.phase'} eq 'three') { |
&display_zero ($r,$uname,$fn,$current_page) if $page_name eq 'ChooseDir'; |
my $bb_crs = ''; |
&expand_bb5 ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'Blackboard5'; |
my $bb_cdom = ''; |
&expand_angel ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'ANGEL'; |
my $bb_handling = ''; |
&expand_webct ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'WebCT'; |
my $announce_handling = 'ok'; |
|
my $source = $ENV{'form.source'}; |
|
if ( defined($ENV{'form.bb_crs'}) ) { |
|
($bb_cdom,$bb_crs) = split/\//,$ENV{'form.bb_crs'}; |
|
} |
|
if ( defined($ENV{'form.bb_handling'}) ) { |
|
$bb_handling = $ENV{'form.bb_handling'}; |
|
} |
|
my $users_crs = ''; |
|
my $users_cdom = ''; |
|
my $users_handling = ''; |
|
if ( defined($ENV{'form.user_crs'}) ) { |
|
($users_cdom,$users_crs) = split/\//,$ENV{'form.user_crs'}; |
|
} |
|
if ( defined($ENV{'form.user_handling'}) ) { |
|
$users_handling = $ENV{'form.user_handling'}; |
|
} |
|
my ($result,$totseq,$totpage,$totprob,$totboard,$totquiz,$totsurv); |
|
if ($page_name eq 'ChooseDir') { |
|
&display_zero ($r,$uname,$fn,$current_page,$fullpath); |
|
} elsif ($page_name eq 'Confirmation') { |
|
($result,$totseq,$totpage,$totboard,$totquiz,$totsurv,$totprob) = &expand_bb5 ($r,$uname,$udom,$fn,$current_page,$bb_crs,$bb_cdom,$bb_handling,$users_crs,$users_cdom,$users_handling,$announce_handling) if $source eq 'bb5'; |
|
($totseq,$totpage,$totboard) = &expand_angel ($result,$uname,$udom,$fn,$current_page,$bb_crs,$bb_cdom,$bb_handling) if $source eq 'angel'; |
|
&expand_webct ($r,$uname,$udom,$fn,$current_page) if $source eq 'webct'; |
|
} |
|
|
|
if ($result eq 'nozip') { |
|
$r->print("<font face='arial,helvetica,sans-serif'>Processing of your IMS package failed, because you did not upload a IMS content package compressed in zip format."); |
|
} elsif ($result eq 'nomanifest') { |
|
$r->print("<font face='arial,helvetica,sans-serif'>Processing of your IMS package failed, because the IMS content package did not contain an IMS manifest file ."); |
|
} else { |
|
$r->print("<h3>Step 3: Publish your new LON-CAPA materials</h3>"); |
|
if ($source eq 'bb5') { |
|
$r->print("<font face='arial,helvetica,sans-serif'>Your IMS package has been processed successfully. A total of $totseq sequences, $totpage pages, $totboard bulletin boards, $totquiz quizzes, $totsurv surveys and $totprob problems have been created.<br /><br />\n"); |
|
} elsif ($source eq 'angel') { |
|
$r->print("<font face='arial,helvetica,sans-serif'>Your IMS package has been processed successfully. A total of $totseq sequences, $totpage pages, and $totboard bulletin boards have been created.<br /><br />\n"); |
|
} |
|
} |
} elsif ($ENV{'form.phase'} eq 'two') { |
} elsif ($ENV{'form.phase'} eq 'two') { |
my $flag = &Apache::lonupload::phasetwo($r,$fn,$uname,$udom,'imsimport'); |
my $flag = &Apache::lonupload::phasetwo($r,$fn,$uname,$udom,'imsimport'); |
if ($flag eq 'ok') { |
if ($flag eq 'ok') { |
my $current_page = 0; |
my $current_page = 0; |
&display_zero($r,$uname,$fn,$current_page); |
&display_zero($r,$uname,$fn,$current_page,$fullpath); |
} |
} |
} else { |
} else { |
&Apache::lonupload::phaseone($r,$fn,$uname,$udom,'imsimport'); |
&Apache::lonupload::phaseone($r,$fn,$uname,$udom,'imsimport'); |