File:  [LON-CAPA] / loncom / imspackages / imsimport.pm
Revision 1.1: download - view: text, annotated - select for diffs
Tue Feb 10 23:36:32 2004 UTC (20 years, 4 months ago) by raeburn
Branches: MAIN
CVS tags: HEAD
Temporary place to store imsimport.pm. Version suitable for testing by developer community
will be stored in main loncom tree later.  Requires modified loncfile.pm and lonupload.pm.

    1: package Apache::imsimport;
    2: 
    3:   use strict;
    4:   use Apache::Constants qw(:common :http :methods);
    5:   use Apache::loncacc;
    6:   use Apache::loncommon();
    7:   use Apache::Log();
    8:   use Apache::lonnet;
    9:   use HTML::Parser;
   10:   use HTML::Entities();
   11:   use Apache::lonlocal;
   12:   use Apache::lonupload;
   13:   use File::Basename();                                                                                            
   14: # ---------------------------------------------------------------- Display Control
   15: sub display_control {
   16: # figure out what page we're on and where we're heading.
   17:     my $page = $ENV{'form.page'};
   18:     my $command = $ENV{'form.go'};
   19:     my $current_page = &calculate_page($page,$command);
   20:     return $current_page;
   21: }
   22:                                                                                              
   23: # CALCULATE THE CURRENT PAGE
   24: sub calculate_page($$) {
   25:     my ($prev,$dir) = @_;
   26:     return 0 if $prev eq '';    # start with first page
   27:     return $prev + 1 if $dir eq 'NextPage';
   28:     return $prev - 1 if $dir eq 'PreviousPage';
   29:     return $prev     if $dir eq 'ExitPage';
   30:     return 0 if $dir eq 'BackToStart';
   31: }
   32: 
   33: # ----------------------------------------------------------------  Jscript Zero
   34: sub jscript_zero {
   35:     my ($fullpath,$jsref) = @_;
   36:     my $source = '';
   37:     if (exists($ENV{'form.go'}) ) {
   38:         $source = $ENV{'form.go'};
   39:     }
   40:     $$jsref = <<"END_OF_ONE";
   41: function verify() {
   42:  if ((document.forms.dataForm.newdir.value == '')  || (!document.forms.dataForm.newdir.value)) {
   43:    alert("You must choose a destination directory for the import")
   44:    return false
   45:  }
   46:  if (document.forms.dataForm.source.selectedIndex == 0) {
   47:    alert("You must choose the Course Management System from which the IMS package was exported");
   48:    return false
   49:  } 
   50:  return true
   51: }
   52:                                                                                               
   53: function nextPage() {
   54:  if (verify()) {
   55:    document.forms.dataForm.go.value="NextPage"
   56:    document.forms.dataForm.submit()
   57:  }
   58: }
   59: 
   60: function createWin() {
   61:   document.dataForm.newdir.value = "";
   62:   newWindow = window.open("","CreateDir","HEIGHT=400,WIDTH=750,scrollbars=yes")
   63:   newWindow.document.open()
   64:   newWindow.document.write("<html><head><title>Create IMS import directory</title><meta http-equiv='pragma' content='no-cache'>\\n")
   65:   newWindow.document.write("</head><body bgcolor='#CCFFDD' topmargin='0' leftmargin='0' marginheight='0'marginwidth='0' rightmargin='0'>\\n")
   66:   newWindow.document.write("<img border='0' src='/adm/lonInterFace/author.jpg' alt='[Author Header]'>\\n")
   67:   newWindow.document.write("<table border='0' cellspacing='0' cellpadding='0' width='600' bgcolor='#CCFFDD'>\\n")
   68:   newWindow.document.write("<tr><td width='2'>&nbsp;</td><td width='3'>&nbsp;</td>\\n")
   69:   newWindow.document.write("<td><h3>Location: <tt>$fullpath</tt></h3><h3>New Directory</h3></td></tr>\\n")
   70:   newWindow.document.write("<tr><td width='2'>&nbsp;</td><td width='3'>&nbsp;</td>\\n")
   71:   newWindow.document.write("<td><form name='fileaction' action='/adm/cfile' method='post'>\\n")
   72:   newWindow.document.write("<font face='arial,helvetica,sans-serif'>Enter the name of the new directory where you will store the contents of your IMS package.<br /><br />")
   73:   newWindow.document.write("<input type='hidden' name='filename' value='$fullpath'>")
   74:   newWindow.document.write("<input type='hidden' name='action' value='newdir'>")
   75:   newWindow.document.write("<input type='hidden' name='callingmode' value='imsimport'>")
   76:   newWindow.document.write("$fullpath<input type='text' name='newfilename' value=''/>")
   77:   newWindow.document.write("<input type='button' value='Go' onClick='document.fileaction.submit();' />")
   78:   newWindow.document.write("</td></tr>\\n")
   79:   newWindow.document.write("</table></body></html>")
   80:   newWindow.document.close()
   81:   newWindow.focus()
   82: }
   83: END_OF_ONE
   84: 
   85: }
   86: 
   87: # ---------------------------------------------------------------- Display Zero
   88: sub display_zero {
   89:     my ($r,$uname,$fn,$page) = @_;
   90: 
   91:     $r->print(<<"END_OF_ONE");
   92:  <h3><font face='arial,helvetica,sans-serif'>Step 1: Selection of IMS package type and destination directory for the package contents</b>&nbsp;</font></h3>
   93: <form name="dataForm" method="post">
   94: <table border='0' bgcolor='#CCFFDD' cellspacing='0' cellpadding ='0' width='100%'>
   95:     <tr>
   96:      <td colspan='2'>
   97:       <table border='0' cellspacing='0' cellpadding='0'>
   98:        <tr>
   99:         <td colspan='2'  align='left'>&nbsp;
  100:         </td>
  101:        </tr>
  102:        <tr bgcolor='#ccddaa'>
  103:         <td width='30' align='top'>&nbsp;
  104:         </td>
  105:         <td width='100%' align='left'>&nbsp;&nbsp;
  106:          <font size='+1' face='arial,helvetica,sans-serif'><b>Specify the Course Management system used to create the package.</b></font>
  107:        </td>
  108:       </tr>
  109:       <tr>
  110:        <td colspan='2'>&nbsp;</td>
  111:       </tr>
  112:       <tr>
  113:        <td>&nbsp;</td>
  114:        <td>
  115:         <font face='Arial,Helvetica,sans-serif'>
  116: Please choose the CMS used to create your IMS content package.</font>
  117:        </td>
  118:       </tr>
  119:       <tr>
  120:        <td colspan='2'>&nbsp;</td>
  121:       </tr>
  122:       <tr>
  123:       <tr>
  124:        <td>&nbsp;</td>
  125:        <td>
  126:         <font face='Arial,Helvetica,sans-serif'>
  127:         <select name="source">
  128:          <option value='-1' selected="true">Please select
  129:          <option value='bb5'>Blackboard 4 or 5
  130:          <option value='bb6'>Blackboard 6
  131:          <option value='angel'>ANGEL
  132:          <option value='webct'>WebCT
  133:         </select>
  134:        </td>
  135:       </tr>
  136:       <tr>
  137:        <td colspan='2'>&nbsp;</td>
  138:       </tr>
  139:       <tr bgcolor='#ccddaa'>
  140:        <td width='30' align='top'>&nbsp;
  141:        </td>
  142:        <td width='100%' align='left'>&nbsp;&nbsp;
  143:         <font size='+1' face='arial,helvetica,sans-serif'><b>Create a directory where you will unpack your IMS package.</b></font>
  144:        </td>
  145:       </tr>
  146:       <tr>
  147:        <td colspan='2'>&nbsp;</td>
  148:       </tr>
  149:       <tr>
  150:        <td>&nbsp;</td>
  151:        <td>
  152:         <font face='Arial,Helvetica,sans-serif'>
  153: Please choose a destination LON-CAPA directory in which to store the contents of the IMS package file</font>
  154:        </td>
  155:       </tr>
  156:       <tr>
  157:        <td colspan='2'>&nbsp;</td>
  158:       </tr>
  159:       <tr>
  160:        <td>&nbsp;</td>
  161:        <td><input type="button" name="createdir" value="Create Directory" onClick="javascript:createWin()"><input type="hidden" name="newdir" value=""></td>
  162:       </tr>
  163:       <tr>
  164:        <td colspan='2'>&nbsp;</td>
  165:       </tr>
  166:       <tr>
  167:        <td>&nbsp;</td>
  168:        <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>
  169:       </tr>
  170:       <tr>
  171:        <td colspan='2'>
  172:           <input type='hidden' name="go" value="">
  173:           <input type="hidden" name="uploaduname" value="$uname">
  174:           <input type="hidden" name="filename" value="$fn">
  175:           <input type='hidden' name="page" value="$page">
  176:           <input type="hidden" name="phase" value="three">
  177:        </td>
  178:       </tr>
  179:       <tr>
  180:        <td colspan='2'>&nbsp;</td>
  181:       </tr>
  182:       <tr>
  183:        <td colspan='2'>
  184:         <table border='0' cellspacing='0' cellpadding='0' width="100%">
  185:          <tr>
  186:           <td align='left'>&nbsp;
  187:           </td>
  188:           <td align='right'>
  189:            <input type="button" name="nextpage" value="Continue to step 2" onClick="javascript:nextPage()">
  190:           </td>
  191:          </tr>
  192:         </table>
  193:        </td>
  194:       </tr>
  195:      </table>
  196:     </td>
  197:    </tr>
  198:   </table>
  199: </form>
  200: END_OF_ONE
  201: }
  202: 
  203: # ---------------------------------------------------------------- Display One
  204:                                                                                               
  205: sub expand_bb5 {
  206:     my ($r,$uname,$udom,$fn,$page) = @_;
  207:     my @state = ();
  208:     my @seq = "Top";
  209:     my $lastitem;
  210:     my %resnum = ();
  211:     my %title = ();
  212:     my %filepath = ();
  213:     my %contentscount = ('Top' => 0);
  214:     my %contents = ();
  215:     my %parentseq = ();
  216:     my %base = ();
  217:     my %file = ();
  218:     my %type = ();
  219:     my %href = ();
  220:     my $identifier = '';
  221:     my %resinfo = ();
  222:     my $numfolders = 0;
  223:     my $numpages = 0;
  224:     my $docroot = $ENV{'form.newdir'};
  225:     if (!-e "$docroot/temp") {
  226:         mkdir "$docroot/temp";
  227:     }
  228:     my $newdir = '';
  229:     if ($docroot =~ m|public_html/(.+)$|) {
  230:         $newdir = $1;
  231:     }
  232:     my $dirname = "/res/$udom/$uname/$newdir";
  233:     my $zipfile = '/home/'.$uname.'/public_html'.$fn;
  234:     if ($fn =~ m|\.zip$|i) {
  235:             open(OUTPUT, "unzip -o $zipfile -d $docroot/temp  2> /dev/null |");
  236:             while (<OUTPUT>) {
  237:                 print "$_<br />";
  238:             }
  239:             close(OUTPUT);
  240:     }
  241: 
  242:     my $xmlfile = $docroot.'/temp/imsmanifest.xml';
  243: #    print STDERR "XML file is $xmlfile\n";
  244:     my $p = HTML::Parser->new
  245:     (
  246:        xml_mode => 1,
  247:        start_h =>
  248:            [sub {
  249:                 my ($tagname, $attr) = @_;
  250:                 push @state, $tagname;
  251:                 my $num = @state - 3;
  252:                 my $start = $num;
  253:                 my $statestr = '';
  254:                 foreach (@state) {
  255:                   $statestr .= "$_ ";
  256:                 }
  257:                 if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq "tableofcontents") ) {
  258:                   my $searchstr = "manifest organizations tableofcontents";
  259:                   while ($num > 0) {
  260:                     $searchstr .= " item";
  261:                     $num --; 
  262:                   }
  263:                   if (("@state" eq $searchstr) && (@state > 3)) {
  264:                     my $itm = $attr->{identifier};
  265:                     $resnum{$itm} = $attr->{identifierref};
  266:                     $title{$itm} = $attr->{title};
  267:                     if ($start > @seq) {
  268:                         unless ($lastitem eq '') {
  269:                             push @seq, $lastitem;
  270:                             unless ( defined($contents{$seq[-1]}) ) {
  271:                                 @{$contents{$seq[-1]}} = ();
  272:                             }
  273:                             push @{$contents{$seq[-1]}},$itm;
  274:                             $parentseq{$itm} = $seq[-1]; 
  275:                         }
  276:                     }
  277:                     elsif ($start < @seq) {
  278:                       my $diff = @seq - $start;
  279:                       while ($diff > 0) {
  280:                         pop @seq;
  281:                         $diff --;
  282:                       }
  283:                       if (@seq) {
  284:                         push @{$contents{$seq[-1]}}, $itm;
  285:                       }
  286:                     } else {
  287:                        push @{$contents{$seq[-1]}}, $itm;
  288:                     }
  289:                     my $path;
  290:                     if (@seq > 1) {
  291:                       $path = join(',',@seq);
  292:                     } elsif (@seq > 0) {
  293:                       $path = $seq[0];
  294:                     }
  295:                     $filepath{$itm} = $path;
  296:                     $contentscount{$seq[-1]} ++;
  297:                     $lastitem = $itm;
  298:                   }
  299:                 } elsif ("@state" eq "manifest resources resource" ) {
  300:                     $identifier = $attr->{identifier};
  301:                     $base{$identifier} = $attr->{baseurl};                 
  302:                     $file{$identifier} = $attr->{file};
  303:                     $type{$identifier} = $attr->{type};
  304:                 } elsif ("@state" eq "manifest resources resource file") {
  305:                     push@{$href{$identifier}},$attr->{href};
  306:                 }
  307:            }, "tagname, attr"],
  308:         text_h =>
  309:             [sub {
  310:                 my ($text) = @_;
  311:               }, "dtext"],
  312:         end_h =>
  313:               [sub {
  314:                   my ($tagname) = @_;
  315:                   pop @state;
  316:                }, "tagname"],
  317:     );
  318: 
  319:     $p->parse_file($xmlfile);
  320:     $p->eof;
  321: 
  322:     my $topnum = 0;
  323:     my $destdir = $docroot;
  324: #    print STDERR "Destdir is $destdir\n";
  325:     if (!-e "$destdir") {
  326:         mkdir("$destdir",0755);
  327:     }
  328:     if (!-e "$destdir/sequences") {
  329:         mkdir("$destdir/sequences",0755);
  330:     }
  331:     if (!-e "$destdir/resfiles") {
  332:         mkdir("$destdir/resfiles",0755);
  333:     }
  334:     if (!-e "$destdir/pages") {
  335:         mkdir("$destdir/pages",0755);
  336:     }
  337:     if (!-e "$destdir/problems") {
  338:         mkdir("$destdir/problems",0755);
  339:     }
  340:     open(FILE,">$destdir/sequences/ims_import.sequence");
  341:     print FILE "<map>\n";
  342: 
  343:     foreach my $key (sort keys %href) {
  344:         foreach my $file (@{$href{$key}}) {
  345:             my $filepath = $file;
  346:             if (!-e "$destdir/resfiles/$key") { 
  347:                 mkdir("$destdir/resfiles/$key",0755);
  348:             } 
  349:             while ($filepath =~ m-(\w+)/(.+)-) {
  350:                 $filepath = $2;
  351:                 if (!-e "$destdir/resfiles/$key/$1") {
  352:                     mkdir("$destdir/resfiles/$key/$1",0755);
  353:                 }
  354:             }
  355:             system("cp $docroot/temp/$key/$file $destdir/resfiles/$key/$file");
  356:         }
  357:     }   
  358: 
  359:     foreach my $key (sort keys %type) {
  360:         if ($type{$key} eq "resource/x-bb-document") {
  361:             %{$resinfo{$key}} = ();
  362:             &process_content($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname);
  363:         } elsif ($type{$key} eq "resource/x-bb-staffinfo") {
  364:             %{$resinfo{$key}} = ();
  365:             &process_staff($key,$docroot,$destdir,\%{$resinfo{$key}});
  366:         } elsif ($type{$key} eq "resource/x-bb-externallink") {
  367:             %{$resinfo{$key}} = ();
  368:             &process_link($key,$docroot,$destdir,\%{$resinfo{$key}});
  369:         } elsif ($type{$key} eq "resource/x-bb-discussionboard") {
  370:             %{$resinfo{$key}} = ();
  371:             &process_db($key,$docroot,$destdir,\%{$resinfo{$key}});
  372:         } elsif ($type{$key} eq "resource/x-bb-announcement") {
  373:             %{$resinfo{$key}} = ();
  374:             &process_announce($key,$docroot,$destdir,\%{$resinfo{$key}});
  375:         } elsif ($type{$key} eq "assessment/x-bb-pool") {
  376:             %{$resinfo{$key}} = ();
  377:             &process_assessment($key,$docroot,'pool',$dirname,$destdir,\%{$resinfo{$key}});
  378:         } elsif ($type{$key} eq "assessment/x-bb-quiz") {
  379:             %{$resinfo{$key}} = ();
  380:             &process_assessment($key,$docroot,'quiz',$dirname,$destdir,\%{$resinfo{$key}});
  381:         } elsif ($type{$key} eq "assessment/x-bb-survey") {
  382:             %{$resinfo{$key}} = ();
  383:             &process_assessment($key,$docroot,'survey',$dirname,$destdir,\%{$resinfo{$key}});
  384:         } elsif ($type{$key} eq "assessment/x-bb-group") {
  385:             %{$resinfo{$key}} = ();
  386:             &process_group($key,$docroot,$destdir,\%{$resinfo{$key}});
  387:         } elsif ($type{$key} eq "resource/x-bb-user") {   
  388:             %{$resinfo{$key}} = ();
  389:             &process_user($key,$docroot,$destdir,\%{$resinfo{$key}});
  390:         }
  391:     }
  392: 
  393:     my $nextnum = 0;
  394:     open(TOPFILE,">$destdir/sequences/ims_import.sequence");
  395:     print TOPFILE "<map>\n";
  396:     my $fileopen = 0;
  397:     my $areakey;
  398:     my $areacount = 0;
  399:     my $lastentry = '';
  400:     my $notlastentry = '';
  401:     my %pagecount = ();
  402:     my %pagecontents = ();
  403:     my %pageflag = ();
  404:     my %seqflag = ();
  405:     my %seqcount = ();
  406: 
  407:     foreach my $key (sort keys %resnum) {
  408: #        print STDERR "$key $filepath{$key} $resnum{$key} $title{$key}\n";
  409:         $pageflag{$key} = 0;
  410:         $seqflag{$key} = 0;
  411:         $seqcount{$key} = 0;
  412:         $pagecount{$key} = -1;
  413:         if ($filepath{$key} eq 'Top') {
  414:             $topnum ++;
  415:             $nextnum = $topnum +1;
  416:             print TOPFILE qq|<resource id="$topnum" src="/res/$udom/$uname/$newdir/sequences/$key.sequence" title="$title{$key}"|;
  417:             if ($topnum == 1) {
  418:                 print TOPFILE qq| type="start"></resource>
  419: <link from="$topnum" to="$nextnum" index="$topnum"></link>\n|;
  420:                 if ($topnum == $contentscount{'Top'}) {
  421:                     print TOPFILE qq|<resource id="$nextnum" src="" type="finish"></resource>\n|;
  422:                 }
  423:             } else {
  424:                 if ($topnum == $contentscount{'Top'}) {
  425:                     print TOPFILE qq| type="finish"></resource>\n|;
  426:                 } else {
  427:                     print TOPFILE qq|></resource>
  428: <link from="$topnum" to="$nextnum" index="$topnum"></link>\n|;
  429:                 }
  430:             }
  431:             my $seqname = $title{$key};
  432:             $seqname =~ s/\s//g;
  433:             $seqname =~ tr/A-Z/a-z/;
  434:             if ($fileopen) {
  435:                 if ($areacount == 0) {
  436:                     print AREAFILE qq|<resource id="1" src="" type="start">
  437: <link from="1" to="2" index="1"></link>
  438: <resource id="2" src="" type="finish">\n|;
  439:                 } elsif ($areacount == 1) {
  440:                     print AREAFILE qq|<resource id="2" src="" type="finish">\n|;
  441:                 } else {
  442:                     print AREAFILE qq|$lastentry\n|;
  443:                 }
  444:                 print AREAFILE "</map>\n"; 
  445:                 close(AREAFILE);
  446:                 $fileopen = 0;
  447:             }
  448:             $areakey = $key;
  449:             @{$pagecontents{$areakey}} = ();
  450:             open(AREAFILE,">$destdir/sequences/$key.sequence");
  451:             print AREAFILE "<map>\n";
  452:             $fileopen = 1;
  453:             $areacount = 0;
  454:         } else {
  455:             if ($filepath{$key} eq "Top,$areakey") {
  456: #                print STDERR "$key $filepath{$key} $resnum{$key} $title{$key}\n";
  457:                 my $src = '';
  458:                 if ($areacount == 0) {
  459:                     if ($resinfo{$resnum{$key}}{'isfolder'} eq "true") {
  460:                         $src = 'sequences/'.$key.".sequence";
  461:                         $pageflag{$areakey} = 0;
  462:                         $seqflag{$areakey} = 1;
  463:                     } else {
  464:                         if ($pageflag{$areakey}) {
  465:                             push @{$pagecontents{$areakey}[$pagecount{$areakey}]},$key;
  466:                         } else {
  467:                             $pagecount{$areakey} ++;
  468:                             $src = 'pages/'.$areakey.'_'.$pagecount{$areakey}.'.page';
  469:                             @{$pagecontents{$areakey}[$pagecount{$areakey}]} = ("$key");
  470:                             $seqflag{$areakey} = 0;
  471:                         }
  472:                     }
  473:                     unless ($pageflag{$areakey}) {
  474:                         print AREAFILE qq|<resource id="1" src="/res/$udom/$uname/$newdir/$src" title="$title{$key}" type="start">
  475: <link from="1" to="2" index="1"></link>\n|;
  476:                         $areacount ++;
  477:                         $notlastentry = "";
  478:                         unless ($seqflag{$areakey}) {
  479:                             $pageflag{$areakey} = 1;
  480:                         }
  481:                     }
  482:                 } else {
  483:                     my $id = $areacount +1;
  484:                     my $nextid = $id +1;
  485:                     $areacount ++;
  486:                     if ($resinfo{$resnum{$key}}{'isfolder'} eq "true") {
  487:                         $src = 'sequences/'.$key.".sequence";
  488:                         $pageflag{$areakey} = 0;
  489:                         $seqflag{$areakey} = 1;
  490:                     } else {
  491:                         if ($pageflag{$areakey}) {
  492:                             push @{$pagecontents{$areakey}[$pagecount{$areakey}]},$key;
  493:                         } else {
  494:                             $pagecount{$areakey} ++ ;
  495:                             $src = 'pages/'.$areakey.'_'.$pagecount{$areakey}.'.page';
  496:                             @{$pagecontents{$areakey}[$pagecount{$areakey}]} = ("$key");
  497:                             $seqflag{$areakey} = 0;
  498:                         } 
  499:                     }
  500:                     unless ($pageflag{$areakey}) {
  501:                         print AREAFILE $notlastentry.qq|<resource id="$id" src="/res/$udom/$uname/$newdir/$src" title="$title{$key}" |;
  502:                         unless ($seqflag{$areakey}) {
  503:                             $pageflag{$areakey} = 1;
  504:                         }
  505:                     }
  506:                     $lastentry = qq|type="finish"></resource>|;
  507:                     $notlastentry = qq|></resource>
  508: <link from="$id" to="$nextid" index="$id"></link>\n|;
  509:                 }
  510:             }
  511:             my $src ="";
  512:             my $next_id = 1;
  513:             my $curr_id = 0;
  514:             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") ) {
  515: #   if ( ($type{$resnum{$key}} eq "resource/x-bb-staffinfo") && ($resinfo{$resnum{$key}}{'isfolder'} eq "true") ) {
  516: #      print "$key $filepath{$key} $resnum{$key} $title{$key}\n";
  517: #      print "Folder for item - $key - res - $resnum{$key}\n"; 
  518: #      print "$key, $contentscount{$key}\n";
  519: #      foreach (@{$contents{$key}}) {
  520: #          print "$key, $_\n";
  521: #      }
  522: #                print STDERR "Contents Count for $key is $contentscount{$key}\n";
  523:                 open(LOCFILE,">$destdir/sequences/$key.sequence");
  524:                 print LOCFILE "<map>\n";
  525:                 if ($contentscount{$key} == 0) {
  526:                     print LOCFILE qq|<resource id="1" src="" type="start"></resource>
  527: <link from="1" to="2" index="1"></link>
  528: <resource id="2" src="" type="finish"></resource>\n|;
  529:                 } else {
  530:                     if ($resinfo{$resnum{$contents{$key}[0]}}{'isfolder'} eq "true") {
  531:                         $src = 'sequences/'.$contents{$key}[0].".sequence";
  532:                         $pageflag{$key} = 0;
  533:                         $seqflag{$key} = 1;
  534:                         $seqcount{$key} ++;
  535:                     } else {
  536:                         if ($pageflag{$key}) {
  537:                             push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[0];
  538:                         } else {
  539:                             $pagecount{$key} ++;
  540:                             $src = 'pages/'.$key.'_'.$pagecount{$key}.'.page';
  541:                             @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[0]");
  542:                             $seqflag{$key} = 0;
  543:                         }
  544:                     }
  545:                     unless ($pageflag{$key}) {
  546:                         print LOCFILE qq|<resource id="1" src="/res/$udom/$uname/$newdir/$src" title="$title{$contents{$key}[0]}" type="start"|;
  547:                         unless ($seqflag{$key}) {
  548:                             $pageflag{$key} = 1;
  549:                         }
  550:                     }
  551:                     if ($contentscount{$key} == 1) {
  552: 		        print LOCFILE qq|></resource>
  553: <link from="1" to="2" index="1"></link>
  554: <resource id="2" src="" type="finish"></resource>\n|;
  555:                     } else {
  556:                         if ($contentscount{$key} > 2 ) { 
  557:                             for (my $i=1; $i<$contentscount{$key}-1; $i++) {
  558:                                 if ($resinfo{$resnum{$contents{$key}[$i]}}{'isfolder'} eq "true") {
  559:                                     $src = 'sequences/'.$contents{$key}[$i].".sequence";
  560:                                     $pageflag{$key} = 0;
  561:                                     $seqflag{$key} = 1;
  562:                                     $seqcount{$key} ++;
  563:                                 } else {
  564:                                     if ($pageflag{$key}) {
  565:                                         push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$i];
  566:                                     } else {
  567:                                         $pagecount{$key} ++;
  568:                                         $src = 'pages/'.$key.'_'.$pagecount{$key}.'.page';
  569:                                         @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$i]");
  570:                                         $seqflag{$key} = 0;
  571:                                     }
  572:                                 }
  573:                                 unless ($pageflag{$key}) {
  574:                                     $curr_id ++;
  575:                                     $next_id ++;
  576:                                     print LOCFILE qq|></resource>
  577: <link from="$curr_id" to="$next_id" index="$curr_id"></link>
  578: <resource id="$next_id" src="/res/$udom/$uname/$newdir/$src" title="$title{$contents{$key}[$i]}"|;
  579:                                     unless ($seqflag{$key}) {
  580:                                         $pageflag{$key} = 1;
  581:                                     }
  582:                                 }
  583:                             }
  584:                         }
  585:                         if ($resinfo{$resnum{$contents{$key}[$contentscount{$key}-1]}}{'isfolder'} eq "true") {
  586:                             $src = 'sequences/'.$contents{$key}[$contentscount{$key}-1].".sequence";
  587:                             $pageflag{$key} = 0;
  588:                             $seqflag{$key} = 1;
  589:                         } else {
  590:                             if ($pageflag{$key}) {
  591:                                 push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$contentscount{$key}-1];
  592:                             } else {
  593:                                 $pagecount{$key} ++;
  594:                                 $src = 'pages/'.$key.'_'.$pagecount{$key}.'.page';
  595:                                 @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$contentscount{$key}-1]");
  596:                             }
  597:                         }
  598:                         if ($pageflag{$key}) {
  599:                             if ($seqcount{$key} + $pagecount{$key} +1 == 1) {
  600:                                 print LOCFILE qq|></resource>
  601: <link from="1" index="1" to="2">
  602: <resource id ="2" src="" title="" type="finish"></resource>\n|;
  603:                             } else {
  604:                                 print LOCFILE qq| type="finish"></resource>\n|;
  605:                             }
  606:                             print STDERR "seqcount is $seqcount{$key}, pagecount is $pagecount{$key} for $key\n";
  607:                         } else {
  608:                             $curr_id ++;
  609:                             $next_id ++;
  610:                             print LOCFILE qq|></resource>
  611: <link from="$curr_id" to="$next_id" index="$curr_id"></link>
  612: <resource id="$next_id" src="/res/$udom/$uname/$newdir/$src" title="$title{$contents{$key}[$contentscount{$key}-1]}" type="finish"></resource>\n|;
  613:                         }
  614:                     }
  615:                 }
  616:                 print LOCFILE "</map>\n";
  617:                 close(LOCFILE);
  618:             }
  619:         }
  620:     }
  621:     print TOPFILE "</map>";
  622:     close(TOPFILE);
  623:     foreach my $key (sort keys %pagecontents) {
  624:         for (my $i=0; $i<@{$pagecontents{$key}}; $i++) {
  625:             my $filestem = "/res/$udom/$uname/$newdir";
  626:             my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page';
  627:             open(PAGEFILE,">$filename");
  628:             print PAGEFILE qq|<map>
  629: <resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][0]}.html" id="1" type="start" title="$title{$pagecontents{$key}[$i][0]}"></resource>
  630: <link to="2" index="1" from="1">\n|;
  631:             if (@{$pagecontents{$key}[$i]} == 1) {
  632:                 print PAGEFILE qq|<resource src="" id="2" type="finish"></resource>|;
  633:             } elsif (@{$pagecontents{$key}[$i]} == 2)  {
  634:                 print PAGEFILE qq|<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][1]}.html" id="2" type="finish" title="$title{$pagecontents{$key}[$i][1]}"></resource>|;
  635:             } else { 
  636:                 for (my $j=1; $j<@{$pagecontents{$key}[$i]}-1; $j++) {
  637:                     my $curr_id = $j+1;
  638:                     my $next_id = $j+2;
  639:                     my $resource = $filestem.'/resfiles/'.$resnum{$pagecontents{$key}[$i][$j]}.'.html';
  640:                     print PAGEFILE qq|<resource src="$resource" id="$curr_id" title="$title{$pagecontents{$key}[$i][$j]}"></resource>
  641: <link to="$next_id" index="$curr_id" from="$curr_id">\n|;
  642:                 }
  643:                 my $final_id = @{$pagecontents{$key}[$i]};
  644:                 print PAGEFILE qq|<resource src="$filestem/resfiles/$resnum{$pagecontents{$key}[$i][-1]}.html" id="$final_id" type="finish" title="$title{$pagecontents{$key}[$i][-1]}"></resource>\n|;
  645:             }
  646:             print PAGEFILE "</map>";
  647:             close(PAGEFILE);
  648:         }
  649:     }
  650:     system(" rm -r $docroot/temp");
  651: }
  652: 
  653: sub process_user {
  654:   my ($res,$docroot,$destdir,$settings) = @_;
  655:   my $xmlfile = $docroot."/temp/".$res.".dat";
  656:   my $filecount = 0;
  657:   my @state;
  658:   my $userid = '';
  659:   my $linknum = 0;
  660: 
  661:   my $p = HTML::Parser->new
  662:     (
  663:      xml_mode => 1,
  664:      start_h =>
  665:      [sub {
  666:         my ($tagname, $attr) = @_;
  667:         push @state, $tagname;
  668:         if (@state eq " USERS USER") {
  669:             $userid = $attr->{value};
  670:             %{$$$settings{$userid}} = ();
  671:             @{$$settings{$userid}{links}} = ();
  672:         } elsif (@state eq "USERS USER LOGINID") {  
  673:             $$settings{$userid}{loginid} = $attr->{value};
  674:         } elsif (@state eq "USERS USER PASSPHRASE") {  
  675:             $$settings{$userid}{passphrase} = $attr->{value};
  676:         } elsif ("@state" eq "USERS USER STUDENTID" ) {
  677:             $$settings{$userid}{studentid} = $attr->{value};
  678:         } elsif ("@state" eq "USERS USER NAMES FAMILY" ) {
  679:             $$settings{$userid}{family} = $attr->{value};
  680:         } elsif ("@state" eq "USERS USER NAMES GIVEN" ) {
  681:             $$settings{$userid}{given} = $attr->{value};
  682:         } elsif ("@state" eq "USERS USER ADDRESSES BUSINESS DATA EMAIL") {
  683:             $$settings{$userid}{email} = $attr->{value};
  684:         } elsif ("@state" eq "USERS USER USER_ROLE") {
  685:             $$settings{$userid}{user_role} = $attr->{value};
  686:         } elsif ("@state" eq "USERS USER FLAGS ISAVAILABLE") {
  687:             $$settings{$userid}{isavailable} = $attr->{value};
  688:         } elsif ("@state" eq "USERS USER PERSONALPAGE FILELIST IMAGE") {
  689:             $$settings{$userid}{image} = $attr->{value};
  690:         } elsif ( ($state[-2] eq "LINKLIST") && ($state[-1] eq "LINK") ) {
  691:             %{$$settings{$userid}{links}[$linknum]} = ();
  692:             $$settings{$userid}{links}[$linknum]{url} = $attr->{value};
  693:             $linknum ++;
  694:         }
  695:      }, "tagname, attr"],
  696:      text_h =>
  697:      [sub {
  698:         my ($text) = @_;
  699:         if ("@state" eq "USERS USER PERSONALPAGE TITLE") {
  700:             $$settings{$userid}{title} = $text;
  701:         } elsif ("@state" eq "USERS USER PERSONALPAGE DESCRIPTION") {
  702:             $$settings{$userid}{description} = $text;
  703:         } elsif (($state[-2] eq "LINK") && ($state[-1] eq "TITLE")) {
  704:             $$settings{$userid}{links}[$linknum]{title} = $text;
  705:         } elsif (($state[-3] eq "LINK") && ($state[-2] eq  "DESCRIPTION") && ($state[-1] eq "TEXT")) {
  706:             $$settings{$userid}{links}[$linknum]{text} = $text;
  707:         }
  708:       }, "dtext"],
  709:      end_h =>
  710:      [sub {
  711:         my ($tagname) = @_;
  712:         if (@state eq "USERS USER") {
  713:             $linknum = 0;
  714:         }
  715:         pop @state;
  716:      }, "tagname"],
  717:     );
  718:   $p->unbroken_text(1);
  719:   $p->parse_file($xmlfile);
  720:   $p->eof;
  721: }
  722: 
  723: sub process_group {  
  724:   my ($res,$docroot,$destdir,$settings) = @_;
  725:   my $xmlfile = $docroot."/".$res.".dat";
  726:   my $filecount = 0;
  727:   my @state;
  728:   my $grp;
  729: 
  730:   my $p = HTML::Parser->new
  731:     (
  732:      xml_mode => 1,
  733:      start_h =>
  734:      [sub {
  735:         my ($tagname, $attr) = @_;
  736:         push @state, $tagname;
  737:         if (@state eq "GROUPS GROUP") {
  738:             $grp = $attr->{id};
  739:         }        
  740:         if (@state eq "GROUPS GROUP TITLE") {
  741:             $$settings{$grp}{title} = $attr->{value};
  742:         } elsif (@state eq "GROUPS GROUP FLAGS ISAVAILABLE") {  
  743:             $$settings{$grp}{isavailable} = $attr->{value};
  744:         } elsif (@state eq "GROUPS GROUP FLAGS HASCHATROOM") {  
  745:             $$settings{$grp}{chat} = $attr->{value};
  746:         } elsif ("@state" eq "GROUPS GROUP FLAGS HASDISCUSSIONBOARD") {
  747:             $$settings{$grp}{discussion} = $attr->{value};
  748:         } elsif ("@state" eq "GROUPS GROUP FLAGS HASTRANSFERAREA") {
  749:             $$settings{$grp}{transfer} = $attr->{value};
  750:         } elsif ("@state" eq "GROUPS GROUP FLAGS ISPUBLIC") {
  751:             $$settings{$grp}{public} = $attr->{value};
  752:         }
  753:      }, "tagname, attr"],
  754:      text_h =>
  755:      [sub {
  756:         my ($text) = @_;
  757:         if ("@state" eq "GROUPS DESCRIPTION") {
  758:           $$settings{$grp}{description} = $text;
  759: #          print "Staff text is $text\n";
  760:         }
  761:       }, "dtext"],
  762:      end_h =>
  763:      [sub {
  764:         my ($tagname) = @_;
  765:         pop @state;
  766:      }, "tagname"],
  767:     );
  768:   $p->unbroken_text(1);
  769:   $p->parse_file($xmlfile);
  770:   $p->eof;
  771: }
  772: 
  773: sub process_staff {
  774:   my ($res,$docroot,$destdir,$settings) = @_;
  775:   my $xmlfile = $docroot."/temp/".$res.".dat";
  776:   my $filecount = 0;
  777:   my @state;
  778:   %{$$settings{name}} = ();
  779:   %{$$settings{office}} = ();  
  780: 
  781:   my $p = HTML::Parser->new
  782:     (
  783:      xml_mode => 1,
  784:      start_h =>
  785:      [sub {
  786:         my ($tagname, $attr) = @_;
  787:         push @state, $tagname;
  788:         if (@state eq "STAFFINFO TITLE") {
  789:             $$settings{title} = $attr->{value};
  790:         } elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") {  
  791:             $$settings{textcolor} = $attr->{value};
  792:         } elsif (@state eq "STAFFINFO BIOGRAPHY FLAGS ISHTML") {  
  793:             $$settings{ishtml} = $attr->{value};                               
  794:         } elsif ("@state" eq "STAFFINFO FLAGS ISAVAILABLE" ) {
  795:             $$settings{isavailable} = $attr->{value};
  796:         } elsif ("@state" eq "STAFFINFO FLAGS ISFOLDER" ) {
  797:             $$settings{isfolder} = $attr->{value};
  798:         } elsif ("@state" eq "STAFFINFO POSITION" ) {
  799:             $$settings{position} = $attr->{value};
  800:         } elsif ("@state" eq "STAFFINFO HOMEPAGE" ) {
  801:             $$settings{homepage} = $attr->{value};
  802:         } elsif ("@state" eq "STAFFINFO IMAGE") {
  803:             $$settings{image} = $attr->{value};
  804:         }
  805:      }, "tagname, attr"],
  806:      text_h =>
  807:      [sub {
  808:         my ($text) = @_;
  809:         if ("@state" eq "STAFFINFO BIOGRAPHY TEXT") {
  810:           $$settings{text} = $text;
  811: #          print "Staff text is $text\n";
  812:         } elsif ("@state" eq "STAFFINFO CONTACT PHONE") {
  813:           $$settings{phone} = $text;
  814:         } elsif ("@state" eq "STAFFINFO CONTACT EMAIL") {
  815:           $$settings{email} = $text;
  816:         } elsif ("@state" eq "STAFFINFO CONTACT NAME FORMALTITLE") {
  817:           $$settings{name}{formaltitle} = $text;
  818:         } elsif ("@state" eq "STAFFINFO CONTACT NAME FAMILY") {
  819:           $$settings{name}{family} = $text;
  820:         } elsif ("@state" eq "STAFFINFO CONTACT NAME GIVEN") {
  821:           $$settings{name}{given} = $text;
  822:         } elsif ("@state" eq "STAFFINFO CONTACT OFFICE HOURS") {
  823:           $$settings{office}{hours} = $text;
  824:         }  elsif ("@state" eq "STAFFINFO CONTACT OFFICE ADDRESS") {
  825:           $$settings{office}{address} = $text;
  826:         }        
  827:       }, "dtext"],
  828:      end_h =>
  829:      [sub {
  830:         my ($tagname) = @_;
  831:         pop @state;
  832:      }, "tagname"],
  833:     );
  834:   $p->unbroken_text(1);
  835:   $p->parse_file($xmlfile);
  836:   $p->eof;
  837: }
  838: 
  839: sub process_link {
  840:   my ($res,$docroot,$destdir,$settings) = @_;
  841:   my $xmlfile = $docroot."/temp/".$res.".dat";
  842:   my @state = ();
  843:   %{$$settings{name}} = ();
  844:   %{$$settings{office}} = ();  
  845: 
  846:   my $p = HTML::Parser->new
  847:     (
  848:      xml_mode => 1,
  849:      start_h =>
  850:      [sub {
  851:         my ($tagname, $attr) = @_;
  852:         push @state, $tagname;
  853:         if (@state eq "EXTERNALLINK TITLE") {
  854:             $$settings{title} = $attr->{value};
  855:         } elsif (@state eq "EXTERNALLINK TEXTCOLOR") {  
  856:             $$settings{textcolor} = $attr->{value};
  857:         } elsif (@state eq "EXTERNALLINK DESCRIPTION FLAGS ISHTML") {  
  858:             $$settings{ishtml} = $attr->{value};                               
  859:         } elsif ("@state" eq "EXTERNALLINKS FLAGS ISAVAILABLE" ) {
  860:             $$settings{isavailable} = $attr->{value};
  861:         } elsif ("@state" eq "EXTERNALLINKS FLAGS LAUNCHINNEWWINDOW" ) {
  862:             $$settings{newwindow} = $attr->{value};
  863:         } elsif ("@state" eq "EXTERNALLINKS FLAGS ISFOLDER" ) {
  864:             $$settings{isfolder} = $attr->{value};
  865:         } elsif ("@state" eq "EXTERNALLINKS POSITION" ) {
  866:             $$settings{position} = $attr->{value};
  867:         } elsif ("@state" eq "EXTERNALLINKS URL" ) {
  868:             $$settings{url} = $attr->{value};
  869:         }
  870:      }, "tagname, attr"],
  871:      text_h =>
  872:      [sub {
  873:         my ($text) = @_;
  874:         if ("@state" eq "EXTERNALLINKS DESCRIPTION TEXT") {
  875:           $$settings{text} = $text;
  876:         }
  877:       }, "dtext"],
  878:      end_h =>
  879:      [sub {
  880:         my ($tagname) = @_;
  881:         pop @state;
  882:      }, "tagname"],
  883:     );
  884:   $p->unbroken_text(1);
  885:   $p->parse_file($xmlfile);
  886:   $p->eof;
  887: }
  888: 
  889: sub process_db {
  890:   my ($res,$docroot,$destdir,$settings) = @_;
  891:   my $xmlfile = $docroot."/temp/".$res.".dat";
  892:   my @state = ();
  893:   my %threads; # all quotes, keyed by message ID
  894:   my $msg_id; # the current message ID
  895:   my %message; # the current message being accumulated for $msg_id
  896: 
  897:   my $p = HTML::Parser->new
  898:     (
  899:      xml_mode => 1,
  900:      start_h =>
  901:      [sub {
  902:         my ($tagname, $attr) = @_;
  903:         push @state, $tagname;
  904:         my $depth = 0;
  905:         my @seq = ();
  906:         if (@state eq "FORUM TITLE") {
  907:             $$settings{title} = $attr->{value};
  908:         } elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") {  
  909:             $$settings{textcolor} = $attr->{value};
  910:         } elsif (@state eq "FORUM DESCRIPTION FLAGS ISHTML") {  
  911:             $$settings{ishtml} = $attr->{value};
  912:         } elsif (@state eq "FORUM DESCRIPTION FLAGS ISNEWLINELITERAL") {  
  913:             $$settings{newline} = $attr->{value};
  914:         } elsif ("@state" eq "FORUM POSITION" ) {
  915:             $$settings{position} = $attr->{value};
  916:         } elsif ("@state" eq "FORUM FLAGS ISREADONLY") {
  917:             $$settings{isavailable} = $attr->{value};                                                      
  918:         } elsif ("@state" eq "FORUM FLAGS ISAVAILABLE" ) {
  919:             $$settings{isavailable} = $attr->{value};
  920:         } elsif ("@state" eq "FORUM FLAGS ALLOWANONYMOUSPOSTINGS" ) {
  921:             $$settings{isfolder} = $attr->{value};
  922:         } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) {
  923:             if ($state[@state-1] eq "MSG") {
  924:                 $depth = @state - 3;
  925:                 if ($depth > @seq) {
  926:                     unless ($msg_id eq '') {
  927:                         push @seq, $msg_id; 
  928:                     }
  929:                 }
  930:                 if ($depth < @seq) {
  931:                     pop @seq;
  932:                 }                
  933:                 $msg_id = $attr->{value};                
  934:                 %message = ();
  935:                 $message{depth} = $depth;
  936:                 if ($depth > 0) {
  937:                     $message{parent} = $seq[-1];
  938:                 } else {
  939:                     $message{parent} = "None";
  940:                 }
  941:             } elsif ($state[@state-1] eq "TITLE") {
  942:                 $message{title} = $attr->{value};
  943:             } elsif ( ( $state[@state-3] eq "MESSAGETEXT" ) && ( $state[@state-2] eq "FLAGS" ) && ( $state[@state-1] eq "ISHTML" ) ) {
  944:                 $message{ishtml} = $attr->{value};
  945:             } elsif ( ( $state[@state-3] eq "MESSAGETEXT" ) && ( $state[@state-2] eq "FLAGS" ) && ( $state[@state-1] eq "ISNEWLINELITERAL" ) ) {
  946:                 $message{newline} = $attr->{value};
  947:             } elsif ( ( $state[@state-2] eq "DATES" ) && ( $state[@state-1] eq "CREATED" ) ) {
  948:                 $message{created} = $attr->{value};
  949:             } elsif ( $state[@state-2] eq "FLAGS") {
  950:                 if ($state[@state-1] eq "ISANONYMOUS") {
  951:                     $message{isanonymous} =  $attr->{value};
  952:                 }
  953:             } elsif ( $state[@state-2] eq "USER" ) {
  954:                 if ($state[@state-1] eq "USERID") {
  955:                     $message{userid} =  $attr->{value};
  956:                 } elsif ($state[@state-1] eq "USERNAME") {
  957:                     $message{username} =  $attr->{value};
  958:                 } elsif ($state[@state-1] eq "EMAIL") {
  959:                     $message{email} =  $attr->{value};
  960:                 }          
  961:             } elsif ( ($state[@state-2] eq "FILELIST") && ($state[@state-2] eq "IMAGE") ) {
  962:                 $message{attachment} = $attr->{value};
  963:             }
  964:         }
  965:      }, "tagname, attr"],
  966:      text_h =>
  967:      [sub {
  968:         my ($text) = @_;
  969:         if ("@state" eq "FORUM DESCRIPTION TEXT") {
  970:             $$settings{text} = $text;
  971:         } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) {
  972:               if ( ($state[@state-2] eq "MESSAGETEXT") && ($state[@state-1] eq "TEXT") ){
  973:                   $message{text} = $text;
  974:               }
  975:         }
  976:       }, "dtext"],
  977:      end_h =>
  978:      [sub {
  979:         my ($tagname) = @_;
  980:         if ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) {
  981:             if ($state[@state-1] eq "MSG") {
  982:                 push @{$threads{$msg_id}}, { %message };
  983:             }
  984:         }
  985:         pop @state;
  986:      }, "tagname"],
  987:     );
  988:   $p->unbroken_text(1);
  989:   $p->parse_file($xmlfile);
  990:   $p->eof;
  991: }
  992: 
  993: sub process_assessment {
  994:   my ($res,$docroot,$container,$dirname,$destdir,$settings) = @_;
  995:   my $xmlfile = $docroot."/temp/".$res.".dat";
  996: #  print "XML file is $xmlfile\n";
  997:   my @state = ();
  998:   my @allids = ();
  999:   my %allanswers = ();
 1000:   my %allchoices = ();
 1001:   my $id; # the current question ID
 1002:   my $answer_id; # the current answer ID
 1003:   my %toptag = ( pool => 'POOL',
 1004:                  quiz => 'ASSESSMENT',
 1005:                  survey => 'ASSESSMENT'
 1006:                );
 1007: #  print "process_assessment is called, incoming: $res,$docroot,$container,$destdir\n";
 1008: 
 1009:   my $p = HTML::Parser->new
 1010:     (
 1011:      xml_mode => 1,
 1012:      start_h =>
 1013:      [sub {
 1014:         my ($tagname, $attr) = @_;
 1015:         push @state, $tagname;
 1016:         my $depth = 0;
 1017:         my @seq = ();
 1018:         my $class;
 1019:         my $state_str = join(" ",@state);
 1020: #        print "Current state is $state_str\n";
 1021:         if ($container eq "pool") {
 1022:             if ("@state" eq "POOL TITLE") {
 1023:                 $$settings{title} = $attr->{value};
 1024: #                print "Title is $attr->{value}\n";
 1025:             }
 1026:         } else {
 1027:             if ("@state" eq "ASSESSMENT TITLE") {  
 1028:                 $$settings{title} = $attr->{value};          
 1029:             } elsif ("@state" eq "ASSESSMENT FLAG" ) {
 1030:                 $$settings{isnewline} = $attr->{value};
 1031:             } elsif ("@state" eq "ASSESSMENT FLAGS ISAVAILABLE") {
 1032:                 $$settings{isavailable} = $attr->{value};
 1033:             } elsif ("@state" eq "ASSESSMENT FLAGS ISANONYMOUS" ) {
 1034:                 $$settings{isanonymous} = $attr->{id};
 1035:             } elsif ("@state" eq "ASSESSMENT FLAGS GIVE FEEDBACK" ) {
 1036:                 $$settings{feedback} = $attr->{id};        
 1037:             } elsif ("@state" eq "ASSESSMENT FLAGS SHOWCORRECT" ) {
 1038:                 $$settings{showcorrect} = $attr->{id};        
 1039:             } elsif ("@state" eq "ASSESSMENT FLAGS SHOWRESULTS" ) {
 1040:                 $$settings{showresults} = $attr->{id};        
 1041:             } elsif ("@state" eq "ASSESSMENT FLAGS ALLOWMULTIPLE" ) {
 1042:                 $$settings{allowmultiple} = $attr->{id};        
 1043:             } elsif ("@state" eq "ASSESSMENT ASSESSMENTTYPE" ) {
 1044:                 $$settings{type} = $attr->{id};        
 1045:             }
 1046:         }    
 1047:         if ("@state" eq "$toptag{$container} QUESTIONLIST QUESTION") {  
 1048:             $id = $attr->{id};
 1049:             push @allids, $id;
 1050:             %{$$settings{$id}} = ();
 1051:             @{$allanswers{$id}} = ();
 1052:             $$settings{$id}{class} = $attr->{class};
 1053:             unless ($container eq "pool") {
 1054:                 $$settings{$id}{points} = $attr->{points};
 1055:             }
 1056:             @{$$settings{$id}{correctanswer}} = ();                              
 1057:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[-1] =~ m/^QUESTION_(\w+)$/) ) {
 1058:             $id = $attr->{id};
 1059:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "FLAGS") && ($state[4] eq "ISHTML") ) {
 1060:             $$settings{$id}{html} = $attr->{value};
 1061:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "FLAGS") && ($state[4] eq "ISNEWLINELITERAL") ) {
 1062:             $$settings{$id}{newline} = $attr->{value};
 1063:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "IMAGE") ) {
 1064:             $$settings{$id}{image} = $attr->{value};
 1065:             $$settings{$id}{style} = $attr->{style};
 1066:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "URL") ) {
 1067:             $$settings{$id}{url} = $attr->{value};
 1068:             $$settings{$id}{name} = $attr->{name};
 1069:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[-1] eq "ANSWER") ) {
 1070:             $answer_id = $attr->{id};
 1071:             push @{$allanswers{$id}},$answer_id;
 1072:             %{$$settings{$id}{$answer_id}} = ();
 1073:             $$settings{$id}{$answer_id}{position} = $attr->{position};
 1074:             if ($$settings{$id}{class} eq 'QUESTION_MATCH') {
 1075:                 $$settings{$id}{$answer_id}{placement} = $attr->{placement};
 1076:                 $$settings{$id}{$answer_id}{type} = 'answer';
 1077:             }
 1078:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[-1] eq "CHOICE") ) {
 1079:             $answer_id = $attr->{id};
 1080:             push @{$allchoices{$id}},$answer_id; 
 1081:             %{$$settings{$id}{$answer_id}} = ();
 1082:             $$settings{$id}{$answer_id}{position} = $attr->{position};
 1083:             $$settings{$id}{$answer_id}{placement} = $attr->{placement};
 1084:             $$settings{$id}{$answer_id}{type} = 'choice';
 1085:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") && ($state[3] eq "IMAGE") ) {
 1086:             $$settings{$id}{$answer_id}{image} = $attr->{value};
 1087:             $$settings{$id}{$answer_id}{style} = $attr->{style};
 1088:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") && ($state[3] eq "URL") ) {
 1089:             $$settings{$id}{$answer_id}{url} = $attr->{value};
 1090:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "CHOICE") && ($state[3] eq "IMAGE") ) {
 1091:             $$settings{$id}{$answer_id}{image} = $attr->{value};
 1092:             $$settings{$id}{$answer_id}{style} = $attr->{style};
 1093:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "CHOICE") && ($state[3] eq "URL") ) {
 1094:             $$settings{$id}{$answer_id}{url} = $attr->{value};            
 1095:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "GRADABLE") && ($state[3] eq "CORRECTANSWER") ) {
 1096:             my $corr_answer = $attr->{answer_id};
 1097:             push @{$$settings{$id}{correctanswer}}, $corr_answer;
 1098: #            print "Answer $corr_answer for question $id is correct\n";       
 1099:             my $type = $1;
 1100:             if ($type eq 'TRUEFALSE') {
 1101:                 $$settings{$id}{$corr_answer}{answer_position} = $attr->{position};
 1102:             } elsif ($type eq 'ORDER') {
 1103:                 $$settings{$id}{$corr_answer}{order} = $attr->{order};
 1104:             } elsif ($type eq 'MATCH') {
 1105:                 $$settings{$id}{$corr_answer}{choice_id} = $attr->{choice_id};
 1106:             }
 1107:         }
 1108:      }, "tagname, attr"],
 1109:      text_h =>
 1110:      [sub {
 1111:         my ($text) = @_;
 1112:         unless ($container eq "pool") {        
 1113:             if ("@state" eq "ASSESSMENT DESCRIPTION TEXT") {
 1114:                 $$settings{description} = $text;
 1115:             } elsif ("@state" eq "ASSESSMENT INSTRUCTIONS ") {
 1116:                 $$settings{instructions}{text} = $text;
 1117:             }
 1118:         }
 1119:         if ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "BODY") && ($state[3] eq "TEXT") ) {
 1120:             $$settings{$id}{text} = $text;
 1121:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "ANSWER") && ($state[3] eq "TEXT") ) {
 1122:             $$settings{$id}{$answer_id}{text} = $text;
 1123:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "CHOICE") && ($state[3] eq "TEXT") ) {
 1124:             $$settings{$id}{$answer_id}{text} = $text;            
 1125:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "GRADABLE") && ($state[3] eq "FEEDBACK_WHEN_CORRECT") ) {
 1126:             $$settings{$id}{feedback_corr} = $text;
 1127:         } elsif ( ($state[0] eq $toptag{$container}) && ($state[1] =~ m/^QUESTION_(\w+)$/) && ($state[2] eq "GRADABLE") && ($state[3] eq "FEEDBACK_WHEN_INCORRECT") ) {
 1128:             $$settings{$id}{feedback_incorr} = $text;       
 1129:         }
 1130:       }, "dtext"],
 1131:      end_h =>
 1132:      [sub {
 1133:         my ($tagname) = @_;
 1134:         pop @state;
 1135:      }, "tagname"],
 1136:     );
 1137:   $p->unbroken_text(1);
 1138:   $p->parse_file($xmlfile);
 1139:   $p->eof;
 1140: 
 1141:   my $dirtitle = $$settings{'title'};
 1142:   $dirtitle =~ s/\W//g;
 1143:   $dirtitle .= '_'.$res;
 1144:   if (!-e "$destdir/problems/$dirtitle") {
 1145:       mkdir("$destdir/problems/$dirtitle",0755);
 1146:   }
 1147:   my $newdir = "$destdir/problems/$dirtitle";
 1148:   foreach my $id (@allids) {
 1149: #      print "Current ID is $id, type is $$settings{$id}{class} \n";
 1150:       if ($$settings{$id}{class} eq "QUESTION_ESSAY") {
 1151:           my $output;
 1152:           if ($container eq 'pool') {
 1153:               $output = qq|<problem>
 1154:  <startouttext />$$settings{$id}{text}<endouttext />
 1155: |;
 1156:           } else {
 1157:               $output = qq|<problem>
 1158:  <startouttext />$$settings{$id}{text}<endouttext />
 1159: |;
 1160:           }
 1161:           $output .= qq|
 1162:    <essayresponse>
 1163:    <textfield></textfield>
 1164:    </essayresponse>
 1165:    <postanswerdate>
 1166:    $$settings{$id}{feedbackcorr}
 1167:    </postanswerdate>
 1168: |;
 1169:           if ($container eq 'pool') {
 1170:               $output .= qq|</problem>
 1171:         |;
 1172:               open(PROB,">$newdir/$id.problem");
 1173:               print PROB $output;
 1174:               close PROB;
 1175:           } else {
 1176:               $output .= qq|</problem>
 1177:         |;
 1178:               open(PROB,">$newdir/$id.problem");
 1179:               print PROB $output;
 1180:               close PROB;
 1181:           }
 1182:       } else {
 1183:     my $output;
 1184:     if ($container eq 'pool') { 
 1185:         $output = qq|<problem>
 1186: |;
 1187:     } else {
 1188:         $output = qq|<problem>
 1189: |;
 1190:     }
 1191:     $output .= qq|<startouttext />$$settings{$id}{text}\n|;
 1192:     if ( defined($$settings{$id}{image}) ) { 
 1193:         if ( $$settings{$id}{style} eq 'embed' ) {
 1194:             $output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{image}" /><br />|;
 1195:         } else {
 1196:             $output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{image}">Link to file</a><br />|;
 1197:         }
 1198:     }
 1199:     if ( defined($$settings{$id}{url}) ) {
 1200:         $output .= qq|<br /><a href="$$settings{$id}{url}">$$settings{$id}{name}</a><br />|;
 1201:     }
 1202:     $output .= qq|
 1203: <endouttext />|;
 1204:     if ($$settings{$id}{class} eq 'QUESTION_MULTIPLECHOICE') {
 1205:         my $numfoils = @{$allanswers{$id}};
 1206:         $output .= qq|
 1207:    <radiobuttonresponse max="$numfoils" randomize="yes">
 1208:     <foilgroup>
 1209:         |;
 1210:         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
 1211:             $output .= "   <foil name=\"foil".$k."\" value=\"";
 1212:             if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) {
 1213:                 $output .= "true\" location=\"";
 1214:             } else {
 1215:                 $output .= "false\" location=\"";
 1216:             }
 1217:             if (lc ($allanswers{$id}[$k]) =~ m/^\s?([Aa]ll)|([Nn]one)\sof\sthe\sabove\.?/) {
 1218:                 $output .= "bottom\"";
 1219:             } else {
 1220:                 $output .= "random\"";
 1221:             }
 1222:             $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text};
 1223:             if ( defined($$settings{$id}{$allanswers{$id}[$k]}{image}) ) {
 1224:                 if ( $$settings{$id}{$allanswers{$id}[$k]}{style} eq 'embed' ) {
 1225:                     $output .= qq|<br /><img src="$dirname/resfiles/$res/$$settings{$id}{$allanswers{$id}[$k]}{image}" /><br />|;
 1226:                 } else {
 1227:                     $output .= qq|<br /><a href="$dirname/resfiles/$res/$$settings{$id}{$allanswers{$id}[$k]}{image}" />Link to file</a><br/>|;
 1228:                 }
 1229:             }
 1230:             $output .= qq|<endouttext /></foil>\n|;
 1231:         }
 1232:         chomp($output);
 1233:         $output .= qq|
 1234:     </foilgroup>
 1235:    </radiobuttonresponse>
 1236:   |;
 1237:     } elsif ($$settings{$id}{class} eq 'QUESTION_TRUEFALSE') {
 1238:         my $numfoils = @{$allanswers{$id}};
 1239: #        print "Number of foils is $numfoils\n";
 1240:         $output .= qq|
 1241:    <radiobuttonresponse max="$numfoils" randomize="yes">
 1242:     <foilgroup>
 1243:         |;
 1244:         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
 1245:             $output .= "   <foil name=\"foil".$k."\" value=\"";
 1246:             if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) {
 1247:                 $output .= "true\" location=\"random\"";
 1248:             } else {
 1249:                 $output .= "false\" location=\"random\"";
 1250:             }
 1251:             $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";
 1252:         }
 1253:         chomp($output);
 1254:         $output .= qq|
 1255:     </foilgroup>
 1256:    </radiobuttonresponse>
 1257:   |;
 1258:     } elsif ($$settings{$id}{class} eq 'QUESTION_MULTIPLEANSWER') {
 1259:         my $numfoils = @{$allanswers{$id}};
 1260: #        print "Number of foils is $numfoils\n";
 1261:         $output .= qq|
 1262:    <optionresponse max="$numfoils" randomize="yes">
 1263:     <foilgroup options="('True','False')">
 1264:         |;
 1265:         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
 1266:             $output .= "   <foil name=\"foil".$k."\" value=\"";
 1267:             if (grep/^$allanswers{$id}[$k]$/,@{$$settings{$id}{correctanswer}}) {
 1268:                 $output .= "True\"";
 1269:             } else {
 1270:                 $output .= "False\"";
 1271:             }
 1272:             $output .= "\><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";
 1273:         }
 1274:         chomp($output);
 1275:         $output .= qq|
 1276:     </foilgroup>
 1277:    </radiobuttonresponse>
 1278:   |;
 1279:     } elsif ($$settings{$id}{class} eq 'QUESTION_ORDER') {
 1280:         my $numfoils = @{$allanswers{$id}};
 1281:         $output .= qq|
 1282:    <rankresponse max="$numfoils" randomize="yes">
 1283:     <foilgroup>
 1284:         |;
 1285:         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
 1286:             $output .= "   <foil location=\"random\" name=\"foil".$k."\" value=\"".$$settings{$id}{$allanswers{$id}[$k]}{order}."\"><startouttext />".$$settings{$id}{$allanswers{$id}[$k]}{text}."<endouttext /></foil>\n";
 1287:         }
 1288:         chomp($output);
 1289:         $output .= qq|
 1290:     </foilgroup>
 1291:    </rankresponse>
 1292:         |;
 1293:     } elsif ($$settings{$id}{class} eq 'QUESTION_FILLINBLANK') {
 1294:         my $numerical = 1;
 1295:         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
 1296:             unless ($$settings{$id}{$allanswers{$id}[$k]}{text} =~ m/^\d+\.?\d*$/) {
 1297:                 $numerical = 0;
 1298:             }
 1299:         }
 1300:         if ($numerical) {
 1301:             my $numans;
 1302:             my $tol;
 1303:             if (@{$allanswers{$id}} == 1) {
 1304:                 $tol = 5;
 1305:                 $numans = $$settings{$id}{$allanswers{$id}[0]}{text};
 1306:             } else {
 1307:                 my $min = $$settings{$id}{$allanswers{$id}[0]}{text};
 1308:                 my $max = $$settings{$id}{$allanswers{$id}[0]}{text};
 1309:                 for (my $k=1; $k<@{$allanswers{$id}}; $k++) {
 1310:                     if ($$settings{$id}{$allanswers{$id}[$k]}{text} <= $min) {
 1311:                         $min = $$settings{$id}{$allanswers{$id}[$k]}{text};
 1312:                     }
 1313:                     if ($$settings{$id}{$allanswers{$id}[$k]}{text} >= $max) {
 1314:                         $max = $$settings{$id}{$allanswers{$id}[$k]}{text};
 1315:                     }
 1316:                 }
 1317:                 $numans = ($max + $min)/2;
 1318:                 $tol = 100*($max - $min)/($numans*2);
 1319:             }
 1320:             $output .= qq|
 1321: <numericalresponse answer="$numans">
 1322:         <responseparam type="tolerance" default="$tol%" name="tol" description="Numerical Tolerance" />
 1323:         <responseparam name="sig" type="int_range,0-16" default="0,15" description="Significant Figures"
 1324: />
 1325:         <textline />
 1326: </numericalresponse>
 1327:             |;
 1328:         } else {
 1329:             if (@{$allanswers{$id}} == 1) {
 1330:                 $output .= qq|
 1331: <stringresponse answer="$$settings{$id}{$allanswers{$id}[0]}{text}" type="ci">
 1332: <textline>
 1333: </textline>
 1334: </stringresponse>
 1335:             |;
 1336:             } else {
 1337:                 my @answertext = ();
 1338:                 for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
 1339:                     $$settings{$id}{$allanswers{$id}[$k]}{text} =~ s/\|/\|/g;
 1340:                     push @answertext, $$settings{$id}{$allanswers{$id}[$k]}{text};
 1341:                 }
 1342:                 my $regexpans = join('|',@answertext);
 1343:                 $regexpans = '/^('.$regexpans.')\b/';
 1344:                 $output .= qq|
 1345: <stringresponse answer="$regexpans" type="re">
 1346: <textline>
 1347: </textline>
 1348: </stringresponse>
 1349:             |;
 1350:             }
 1351:         }
 1352:     } elsif ($$settings{$id}{class} eq "QUESTION_MATCH") {
 1353:         $output .= qq|
 1354: <matchresponse max="10" randomize="yes">
 1355:     <foilgroup>
 1356:         <itemgroup>
 1357: |;
 1358:         for (my $k=0; $k<@{$allchoices{$id}}; $k++) {
 1359:             $output .= qq|
 1360: <item name="$allchoices{$id}[$k]">
 1361: <startouttext />$$settings{$id}{$allchoices{$id}[$k]}{text}<endouttext />
 1362: </item>
 1363:             |;
 1364:         }
 1365:         $output .= qq|
 1366:         </itemgroup>
 1367: |;
 1368:         for (my $k=0; $k<@{$allanswers{$id}}; $k++) {
 1369:             $output .= qq|
 1370: <foil location="random" value="$$settings{$id}{$allanswers{$id}[$k]}{choice_id}" name="$allanswers{$id}[$k]">
 1371: <startouttext />$$settings{$id}{$allanswers{$id}[$k]}{text}<endouttext />
 1372: </foil>
 1373:             |;
 1374:         }
 1375:         $output .= qq|
 1376:     </foilgroup>
 1377: </matchresponse>
 1378:         |;
 1379:     }
 1380:     if ($container eq 'pool') {
 1381:         $output .= qq|</problem>
 1382:         |;
 1383:         open(PROB,">$newdir/$id.problem");
 1384:         print PROB $output;
 1385:         close PROB;
 1386:     } else {
 1387:         $output .= qq|</problem>
 1388:         |;
 1389:         open(PROB,">$newdir/$id.problem");
 1390:         print PROB $output;
 1391:         close PROB;
 1392:     }
 1393: 
 1394:       }
 1395:   }
 1396: }
 1397: 
 1398: 
 1399: sub create_ess {
 1400:     my ($newdir,$qnid,$qsettings,$container) = @_;
 1401:     my $output;
 1402:     if ($container eq 'pool') {
 1403:         $output = qq|<problem>
 1404:  <startouttext />$$qsettings{text}<endouttext />
 1405: |;
 1406:     } else {
 1407:         $output = qq|<problem>
 1408:  <startouttext />$$qsettings{text}<endouttext />
 1409: |;
 1410:     }
 1411:     $output .= qq|
 1412:    <essayresponse>
 1413:    <textfield></textfield>
 1414:    </essayresponse>
 1415:    <postanswerdate>
 1416:    $$qsettings{feedbackcorr}
 1417:    </postanswerdate>
 1418: |;
 1419:     if ($container eq 'pool') {
 1420:         $output .= qq|</problem>
 1421:         |;
 1422:         open(PROB,">$newdir/$qnid.problem");
 1423:         print PROB $output;
 1424:         close PROB;
 1425:     } else {
 1426:         $output .= qq|</problem>
 1427:         |;
 1428:         open(PROB,">$newdir/$qnid.problem");
 1429:         print PROB $output;
 1430:         close PROB;
 1431:     }
 1432:     return;
 1433: }
 1434: 
 1435: sub process_announce {
 1436:   my ($res,$docroot,$destdir,$settings) = @_;
 1437:   my $xmlfile = $docroot."/temp/".$res.".dat";
 1438:   my @state = ();
 1439:   my $id;
 1440:   my $p = HTML::Parser->new
 1441:     (
 1442:      xml_mode => 1,
 1443:      start_h =>
 1444:      [sub {
 1445:         my ($tagname, $attr) = @_;
 1446:         push @state, $tagname;
 1447:         if ("@state" eq "ANNOUNCEMENT TITLE") {
 1448:             $$settings{title} = $attr->{value};
 1449:             $$settings{startassessment} = ();
 1450: #            print "Title is $$settings{title}\n";
 1451:         } elsif (@state eq "ANNOUNCEMENT DESCRIPTION FLAGS ISHTML") {  
 1452:             $$settings{ishtml} = $attr->{value};          
 1453:         } elsif ("@state" eq "ANNOUNCEMENT DESCRIPTION FLAGS ISNEWLINELITERAL" ) {
 1454:             $$settings{isnewline} = $attr->{value};
 1455:         } elsif ("@state" eq "CONTENT ISPERMANENT" ) {
 1456:             $$settings{ispermanent} = $attr->{value};
 1457:         } elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT" ) {
 1458:             $id = $attr->{id};
 1459:             $$settings{startassessment}{$id} = ();
 1460:         } elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT ATTRIB" ) {
 1461:             my $key = $attr->{key};
 1462:             $$settings{startassessment}{$id}{$key} = $attr->{value};
 1463:         }
 1464:      }, "tagname, attr"],
 1465:      text_h =>
 1466:      [sub {
 1467:         my ($text) = @_;
 1468:         if ("@state" eq "ANNOUNCEMENT DESCRIPTION TEXT") {
 1469:           $$settings{maindata}{text} = $text;
 1470: #          print "TEXT $text\n";
 1471:         }
 1472:       }, "dtext"],
 1473:      end_h =>
 1474:      [sub {
 1475:         my ($tagname) = @_;
 1476:         pop @state;
 1477:      }, "tagname"],
 1478:     );
 1479:   $p->unbroken_text(1);
 1480:   $p->parse_file($xmlfile);
 1481:   $p->eof;
 1482: }
 1483: 
 1484: sub process_content {
 1485:   my ($res,$docroot,$destdir,$settings,$dom,$user) = @_;
 1486:   my $xmlfile = $docroot."/temp/".$res.".dat";
 1487:   my $destresdir = $destdir;
 1488:   $destresdir =~ s|/home/$user/public_html/|/res/$dom/$user/|;
 1489:   my $filecount = 0;
 1490:   my @state;
 1491:   @{$$settings{files}} = (); 
 1492:   my $p = HTML::Parser->new
 1493:     (
 1494:      xml_mode => 1,
 1495:      start_h =>
 1496:      [sub {
 1497:         my ($tagname, $attr) = @_;
 1498:         push @state, $tagname;
 1499:         if (@state eq "CONTENT MAINDATA") {
 1500:             %{$$settings{maindata}} = ();
 1501:         } elsif (@state eq "CONTENT MAINDATA TEXTCOLOR") {
 1502:             $$settings{maindata}{color} = $attr->{value};
 1503:         } elsif (@state eq "CONTENT MAINDATA FLAGS ISHTML") {  
 1504:             $$settings{maindata}{ishtml} = $attr->{value}; 
 1505:         } elsif (@state eq "CONTENT MAINDATA FLAGS ISNEWLINELITERAL") {  
 1506:             $$settings{maindata}{isnewline} = $attr->{value};
 1507:         } elsif ("@state" eq "CONTENT FLAGS ISAVAILABLE" ) {
 1508:             $$settings{isavailable} = $attr->{value};
 1509:         } elsif ("@state" eq "CONTENT FLAGS ISFOLDER" ) {
 1510:             $$settings{isfolder} = $attr->{value};
 1511:         } elsif ("@state" eq "CONTENT FLAGS LAUNCHINNEWWINDOW" ) {
 1512:             $$settings{newwindow} = $attr->{value};
 1513:         } elsif ("@state" eq "CONTENT FILES") {
 1514: #            @{$$settings{files}} = ();
 1515:         } elsif ("@state" eq "CONTENT FILES FILEREF") {
 1516:             %{$$settings{files}[$filecount]} = ();
 1517:             %{$$settings{files}[$filecount]{registry}} = (); 
 1518:         } elsif ("@state" eq "CONTENT FILES FILEREF RELFILE" ) {
 1519:             $$settings{files}[$filecount]{'relfile'} = $attr->{value};
 1520:         } elsif ("@state" eq "CONTENT FILES FILEREF MIMETYPE") {
 1521:             $$settings{files}[$filecount]{mimetype} = $attr->{value};
 1522:         } elsif ("@state" eq "CONTENT FILES FILEREF CONTENTTYPE") {
 1523:             $$settings{files}[$filecount]{contenttype} = $attr->{value};
 1524:         } elsif ("@state" eq "CONTENT FILES FILEREF FILEACTION") {
 1525:             $$settings{files}[$filecount]{fileaction} = $attr->{value};
 1526:         } elsif ("@state" eq "CONTENT FILES FILEREF PACKAGEPARENT") {
 1527:             $$settings{files}[$filecount]{packageparent} = $attr->{value};
 1528:         } elsif ("@state" eq "CONTENT FILES FILEREF LINKNAME") {
 1529:             $$settings{files}[$filecount]{linkname} = $attr->{value};
 1530:         } elsif ("@state" eq "CONTENT FILES FILEREF REGISTRY REGISTRYENTRY") {
 1531:             my $key = $attr->{key};
 1532:             $$settings{files}[$filecount]{registry}{$key} = $attr->{value};
 1533:         }
 1534:      }, "tagname, attr"],
 1535:      text_h =>
 1536:      [sub {
 1537:         my ($text) = @_;
 1538:         if ("@state" eq "CONTENT TITLE") {
 1539:             $$settings{title} = $text;
 1540:         } elsif ("@state" eq "CONTENT MAINDATA TEXT") {
 1541:             $$settings{maindata}{text} = $text;
 1542:         }  elsif ("@state" eq "CONTENT FILES FILEREF REFTEXT") {
 1543:             $$settings{files}[$filecount]{reftext} = $text;
 1544:         }
 1545:       }, "dtext"],
 1546:      end_h =>
 1547:      [sub {
 1548:         my ($tagname) = @_;
 1549:         if ("@state" eq "CONTENT FILES FILEREF") {
 1550:             $filecount ++;
 1551:         }
 1552:         pop @state;
 1553:      }, "tagname"],
 1554:     );
 1555:   $p->unbroken_text(1);
 1556:   $p->parse_file($xmlfile);
 1557:   $p->eof;
 1558:   my $linktag = '';
 1559:   my $fontcol = '';
 1560:   if (@{$$settings{files}} > 0) {
 1561:       for (my $filecount=0;  $filecount<@{$$settings{files}}; $filecount++) {
 1562:           if ($$settings{files}[$filecount]{'fileaction'} eq 'embed') {
 1563:               if ( $$settings{files}[$filecount]{reftext} =~ m#<\!\-\-\s_(\d+)\\_\s\-\-\>#) { 
 1564:                   my $newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"/>|;
 1565:                   $$settings{maindata}{text} =~ s#<\!\-\-\s_/($1)\\_\s\-\-\>#$newtag#;
 1566:               } elsif ( $$settings{files}[$filecount]{reftext} =~m#^_/(\d+)\\_$# ) {
 1567:                   my $reftag = $1;
 1568:                   my $newtag;
 1569:                   if ($$settings{files}[$filecount]{mimetype} =~ m/^image/) {
 1570:                       $newtag = qq|<img src="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|;
 1571:                       if ( defined($$settings{files}[$filecount]{registry}{alttext}) ) {
 1572:                           $newtag .= qq| alt="$$settings{files}[$filecount]{registry}{alttext}"|;
 1573:                       }
 1574:                       if ( defined($$settings{files}[$filecount]{registry}{alignment}) )
 1575: {
 1576:                           $newtag .= qq| align="$$settings{files}[$filecount]{registry}{alignment}"|; 
 1577:                       }
 1578:                       if ( defined($$settings{files}[$filecount]{registry}{border}) ) {
 1579:                           $newtag .= qq| border="$$settings{files}[$filecount]{registry}{border}"|;
 1580:                       }
 1581:                       $newtag .= " />";
 1582:                       my $reftext =  $$settings{files}[$filecount]{reftext};
 1583:                       my $fname = $$settings{files}[$filecount]{'relfile'};
 1584:                       $$settings{maindata}{text} =~ s/<!\-\-\sCOMMENT\sBLOCK\sFOR\sEMBEDDED\sFILE:\s$fname[\s\n]+DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n]+//;
 1585: #                      $$settings{maindata}{text} =~ s/DO\sNOT\sEDIT\sTHIS\sCOMMENT\sBLOCK[\s\n]+//;
 1586:                       $$settings{maindata}{text} =~ s/Move\swhole\scomment\sto\schange\sfile\splacement\swithin\spage\.[\s\n]+//;
 1587:                       $$settings{maindata}{text} =~ s/_\/$reftag\\_/$newtag/;
 1588:                       $$settings{maindata}{text} =~ s/END\sOF\sBLOCK\sON\sNEXT\sLINE[\s\n]+//;
 1589:                       $$settings{maindata}{text} =~ s/\-\->//;
 1590: #                      $$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/;
 1591: #                      print STDERR $$settings{maindata}{text};
 1592:                   }
 1593:               } else {
 1594:                   my $filename=$$settings{files}[$filecount]{'relfile'};
 1595: #                  print "File is $filename\n";
 1596:                   my $newfilename="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}";
 1597: #                  print "New filename is $newfilename\n";
 1598:                   $$settings{maindata}{text} =~ s#(src|SRC|value)="$filename"#$1="$newfilename"#g;
 1599:               }
 1600:           } elsif ($$settings{files}[$filecount]{fileaction} eq 'link') {
 1601:               $linktag = qq|<a href="$destresdir/resfiles/$res/$$settings{files}[$filecount]{relfile}"|;
 1602:               if ($$settings{newwindow} eq "true") {
 1603:                   $linktag .= qq| target="$res$filecount"|;
 1604:               }
 1605:               foreach my $entry (keys %{$$settings{files}[$filecount]{registry}}) {
 1606:                   $linktag .= qq| $entry="$$settings{files}[$filecount]{registry}{$entry}"|;
 1607:               }
 1608:               $linktag .= qq|>$$settings{files}[$filecount]{linkname}</a>|;
 1609:           } elsif ($$settings{files}[$filecount]{fileaction} eq 'package') {
 1610: #              print "Found a package\n";
 1611:           }
 1612:       }
 1613:   }
 1614:   if (defined($$settings{maindata}{textcolor})) {
 1615:       $fontcol =  qq|<font color="$$settings{maindata}{textcolor}">|;
 1616:   }
 1617:   if (defined($$settings{maindata}{text})) {
 1618:       if ($$settings{maindata}{ishtml} eq "false") {
 1619:           if ($$settings{maindata}{isnewline} eq "true") {
 1620:               $$settings{maindata}{text} =~ s#\n#<br/>#g;
 1621:           }
 1622:       } else {
 1623:           $$settings{maindata}{text} = &HTML::Entities::decode($$settings{maindata}{text});
 1624:       }
 1625:   }
 1626: 
 1627:   open(FILE,">$destdir/resfiles/$res.html");
 1628:   print FILE qq|<html>
 1629: <head>
 1630: <title>$$settings{title}</title>
 1631: </head>
 1632: <body bgcolor='#ffffff'>
 1633: $fontcol
 1634:   |;
 1635:   unless ($$settings{title} eq '') { 
 1636:       print FILE qq|$$settings{title}<br/><br/>\n|;
 1637:   }
 1638:   print FILE qq|
 1639: $$settings{maindata}{text}
 1640: $linktag|;
 1641:   if (defined($$settings{maindata}{textcolor})) {
 1642:       print FILE qq|</font>|;
 1643:   }
 1644:   print FILE qq|
 1645:   </body>
 1646:  </html>|;
 1647:   close(FILE);
 1648: }
 1649: 
 1650: 
 1651:                                                                                              
 1652: # ---------------------------------------------------------------- Main Handler
 1653: sub handler {
 1654:     my $r=shift;
 1655:     my $uname;
 1656:     my $udom;
 1657:     my $javascript = '';
 1658:     my $page_name = '';
 1659:     my $current_page = '';
 1660:     my $loadentries = '';
 1661:     my $qcount = '';
 1662: #
 1663: # phase two: re-attach user
 1664: #
 1665:     if ($ENV{'form.uploaduname'}) {
 1666:         $ENV{'form.filename'}='/priv/'.$ENV{'form.uploaduname'}.'/'.
 1667:             $ENV{'form.filename'};
 1668:     }
 1669:     ($uname,$udom)=
 1670:         &Apache::loncacc::constructaccess($ENV{'form.filename'},
 1671:                                           $r->dir_config('lonDefDomain'));
 1672:     unless (($uname) && ($udom)) {
 1673:         $r->log_reason($uname.' at '.$udom.
 1674:                        ' trying to publish file '.$ENV{'form.filename'}.
 1675:                        ' - not authorized',
 1676:                        $r->filename);
 1677:         return HTTP_NOT_ACCEPTABLE;
 1678:     }
 1679:                                                                                              
 1680:     my $fn;
 1681:     if ($ENV{'form.filename'}) {
 1682:         $fn=$ENV{'form.filename'};
 1683:         $fn=~s/^http\:\/\/[^\/]+\///;
 1684:         $fn=~s/^\///;
 1685:         $fn=~s/(\~|priv\/)(\w+)//;
 1686:         $fn=~s/\/+/\//g;
 1687:     } else {
 1688:         $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.
 1689:                        ' unspecified filename for upload', $r->filename);
 1690:         return HTTP_NOT_FOUND;
 1691:     }
 1692:     my $pathname = &File::Basename::dirname($fn);
 1693:     my $fullpath = '/priv/'.$uname.$pathname;
 1694:     unless ($pathname eq '/') {
 1695:         $fullpath .= '/';
 1696:     }
 1697:     my $loadentries = '';
 1698: # ----------------------------------------------------------- Start page output
 1699:     &Apache::loncommon::content_type($r,'text/html');
 1700:     $r->send_http_header;
 1701:                                                                                              
 1702:     if ($ENV{'form.phase'} eq 'three') {
 1703:         $current_page = &display_control();
 1704:         my @PAGES = ('ChooseDir','Blackboard5','ANGEL','WebCT');
 1705:         $page_name = $PAGES[$current_page];
 1706:         
 1707:         if ($page_name eq 'ChooseDir') {
 1708:             &jscript_zero($fullpath,\$javascript);
 1709:         } elsif ($page_name eq 'Confirmation') {
 1710:             &jscript_two(\$javascript,$uname);
 1711:         }
 1712:     } elsif ($ENV{'form.phase'} eq 'two') {
 1713:         &jscript_zero($fullpath,\$javascript);
 1714:     }
 1715:     $r->print("<html><head><title>LON-CAPA Construction Space</title><script type=\"text/javascript\">\n//<!--\n$javascript\n// --></script>\n</head>");
 1716:                                                                                              
 1717:     $r->print(&Apache::loncommon::bodytag('Upload IMS package to Construction Space',undef,$loadentries));
 1718:                                                                                              
 1719:     if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})) {
 1720:         $r->print('<h3><font color=red>'.&mt('Co-Author').': '.$uname.
 1721:                   &mt(' at ').$udom.'</font></h3>');
 1722:     }
 1723:                                                                                              
 1724:     if ($ENV{'form.phase'} eq 'three') {
 1725:         &display_zero ($r,$uname,$fn,$current_page) if $page_name eq 'ChooseDir';
 1726:         &expand_bb5 ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'Blackboard5';
 1727:         &expand_angel ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'ANGEL';
 1728:         &expand_webct ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'WebCT';
 1729: 
 1730:     } elsif ($ENV{'form.phase'} eq 'two') {
 1731:         my $flag = &Apache::lonupload::phasetwo($r,$fn,$uname,$udom,'imsimport');
 1732:         if ($flag eq 'ok') {
 1733:             my $current_page = 0;
 1734:             &display_zero($r,$uname,$fn,$current_page);
 1735:         }
 1736:     } else {
 1737:         &Apache::lonupload::phaseone($r,$fn,$uname,$udom,'imsimport');
 1738:     }
 1739:     $r->print('</body></html>');
 1740:     return OK;
 1741: }
 1742: 1;
 1743: __END__

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>