Diff for /rat/lonratedt.pm between versions 1.10 and 1.110

version 1.10, 2002/05/11 23:23:01 version 1.110, 2014/02/26 18:52:13
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # (TeX Content Handler  
 #  
 # 05/29/00,05/30 Gerd Kortemeyer)  
 # 7/1,6/30 Gerd Kortemeyer  
   
 package Apache::lonratedt;  package Apache::lonratedt;
   
 use strict;  use strict;
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::lonratsrv;  use Apache::lonsequence();
   use Apache::loncommon();
 my @order=();  use Apache::lonlocal;
 my @resources=();  use LONCAPA::map();
   use File::Copy;
   use LONCAPA;
 # Mapread read maps into global arrays @links and @resources, determines status  use HTML::Entities();
 # sets @order - pointer to resources in right order  
 # sets @resources - array with the resources with correct idx  
 #  
 sub mapread {  
     my $fn=shift;  
   
     my @links;  
     undef @links;  
     undef @resources;  
     undef @order;  
   
     my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,'');  
     if ($errtext) { return ($errtext,2); }  
   
 # -------------------------------------------------------------------- Read map  
     foreach (split(/\<\&\>/,$outtext)) {  
  my ($command,$number,$content)=split(/\<\:\>/,$_);  
         if ($command eq 'objcont') {  
     $resources[$number]=$content;  
         }  
         if ($command eq 'objlinks') {  
             $links[$number]=$content;  
         }  
     }  
 # ------------------------------------------------------- Is this a linear map?  
     my @starters=();  
     my @endings=();  
     undef @starters;  
     undef @endings;  
   
     foreach (@links) {  
         if (defined($_)) {  
     my ($start,$end,$cond)=split(/\:/,$_);  
             if ((defined($starters[$start])) || (defined($endings[$end]))) {   
  return  
                  ('Map has branchings. Use advanced editor.',1);  
             }  
     $starters[$start]=1;  
     $endings[$end]=1;  
     if ($cond) {  
  return  
                  ('Map has conditions. Use advanced editor.',1);  
             }  
  }  
   
     }  
     for (my $i=0; $i<=$#resources; $i++) {  
         if (defined($resources[$i])) {  
     unless (($starters[$i]) || ($endings[$i])) {  
                 return  
  ('Map has unconnected resources. Use advanced editor.',1);  
             }  
         }  
     }  
   
 # -------------------------------------------------- This is a linear map, sort  
   
     my $startidx=0;  
     my $endidx=0;  
     for (my $i=0; $i<=$#resources; $i++) {  
         if (defined($resources[$i])) {  
             my ($title,$url,$ext,$type)=split(/\:/,$resources[$i]);  
     if ($type eq 'start') { $startidx=$i; }  
             if ($type eq 'finish') { $endidx=$i; }  
         }  
     }  
     my $k=0;  
     my $currentidx=$startidx;  
     $order[$k]=$currentidx;  
     for (my $i=0; $i<=$#resources; $i++) {  
         foreach (@links) {  
     my ($start,$end)=split(/\:/,$_);  
             if ($start==$currentidx) {  
  $currentidx=$end;  
                 $k++;  
                 $order[$k]=$currentidx;  
                 last;  
             }  
         }  
         if ($currentidx==$endidx) { last; }  
     }  
     return $errtext;  
 }  
   
 # --------------------------------------------------------- Build up RAT screen  # --------------------------------------------------------- Build up RAT screen
 sub ratedt {  sub ratedt {
   my ($r,$url)=@_;    my ($r,$url)=@_;
   $r->print(<<ENDDOCUMENT);    my %layout = ('border' => "0",
                   'rows'   => "1,250,*");
 <html>    my $js ='
 <head>  <script type="text/javascript">
 <script language="JavaScript">  
     var flag=0;      var flag=0;
 </script>  </script>';
 </head>  
 <frameset rows="1,50,*" border=0>  
 <frame name=server src="$url/loadonly/ratserver" noresize noscroll>  
 <frame name=code src="/adm/rat/code.html">  
 <frame name=mapout src="/adm/rat/map.html">  
 </frameset>  
 </html>  
   
     my $start_page = 
         &Apache::loncommon::start_page('Edit Sequence',$js,
        {'frameset'    => 1,
         'add_entries' => \%layout});
   
     my $end_page = 
         &Apache::loncommon::end_page({'frameset' => 1});
   
     $r->print(<<ENDDOCUMENT);
   $start_page
   <frame name="server" src="$url/loadonly/ratserver" noresize="noresize"
          noscroll="noscroll" />
   <frame name="code" src="$url/loadonly/adveditmenu" />
   <frame name="mapout" src="/adm/rat/map.html" />
   $end_page
 ENDDOCUMENT  ENDDOCUMENT
 }  }
   
Line 151  ENDDOCUMENT Line 72  ENDDOCUMENT
   
 sub buttons {  sub buttons {
     my $adv=shift;      my $adv=shift;
     my $output='<form method=post>';           my $output='<form method="post" action="">';     
     if ($adv==1) {      if ($adv==1) {
  $output.='<input type=submit name=forceadv value="Edit">';          $output.=
               '<input type="submit" name="forceadv"'
              .' value="'.&mt('Edit').'" />'
              .&Apache::loncommon::help_open_topic(
                   'Sequence_Advanced_Editor_Creation');
     } else {      } else {
         unless ($adv==2) {          unless ($adv==2) {
            $output.='<input type=submit name=forcesmp value="Simple Edit">';             $output.=
                  '<input type="submit" name="forcesmp"'
                 .' value="'.&mt('Simple Edit').'" />'
                 .&Apache::loncommon::help_open_topic(
                      'Sequence_Simple_Editor_Creation')
                 .' ';
         }          }
  $output.='<input type=submit name=forceadv value="Advanced Edit">';          $output.=
               '<input type="submit" name="forceadv"'
              .' value="'.&mt('Advanced Edit').'" />'
              .&Apache::loncommon::help_open_topic(
                   'Sequence_Advanced_Editor_Creation');
     }      }
     return $output.'</form><hr>';      return $output.'</form>';
 }  }
   
 sub smpedt {  # ----------------------------------------------------------------- Edit script
    my ($r,$errtext)=@_;  sub editscript {
    my $buttons=&buttons(2);      my $mode=shift;
 # ----------------------------------------------------- Start simple RAT screen      my $resurl=
    $r->print(<<ENDSMPHEAD);   &Apache::loncommon::escape_single(&Apache::loncommon::lastresurl());
 <html>      return(<<ENDSCRIPT);
 <head>  
 <script>  
 var srch;  var srch;
 var srchflag=-1; // 1 means currently open  var srchflag=-1; // 1 means currently open
                  // 0 means closed (but has been open)                   // 0 means closed (but has been open)
Line 211  function srchclose() { Line 143  function srchclose() {
   
 // -------------------------------------------------------- Open indexer window  // -------------------------------------------------------- Open indexer window
 function idxopen(mode) {  function idxopen(mode) {
    var options="scrollbars=1,resizable=1,menubar=0";     var options="scrollbars=1,resizable=1,menubar=0,location=1,toolbar=1";
    idxmode=mode;     idxmode=mode;
    idxflag=1;     idxflag=1;
    idx=open("/res/?launch=1&mode=simple&catalogmode="+mode,"idxout",options);     idx=open('$resurl/?inhibitmenu=yes&launch=1&mode=$mode&catalogmode='+mode,'idxout',options);
      idx.focus();
   }
   
   // ------------------------------------------------------ Open groupsort window
   function groupopen(url,recover) {
      var options="scrollbars=1,resizable=1,menubar=0";
      idxflag=1;
      idx=open("/adm/groupsort?inhibitmenu=yes&mode=$mode&recover="+recover+"&readfile="+url,"idxout",options);
    idx.focus();     idx.focus();
 }  }
   
Line 223  function srchopen(mode) { Line 163  function srchopen(mode) {
    var options="scrollbars=1,resizable=1,menubar=0";     var options="scrollbars=1,resizable=1,menubar=0";
    srchmode=mode;     srchmode=mode;
    srchflag=1;     srchflag=1;
    srch=open("/adm/searchcat?launch=1&mode=simple&catalogmode="+mode,"srchout",options);     srch=open("/adm/searchcat?inhibitmenu=yes&launch=1&mode=$mode&catalogmode="+mode,"srchout",options);
    srch.focus();     srch.focus();
 }  }
 // ----------------------------------------------------- launch indexer browser  // ----------------------------------------------------- launch indexer browser
 function groupsearch() {  function groupsearch() {
    srchcheck('groupsearch');     srchcheck('import');
 }  }
   
 function groupimport() {  function groupimport() {
    idxcheck('groupimport');     idxcheck('import');
 }  }
   
 // ------------------------------------------------------- Do srch status check  // ------------------------------------------------------- Do srch status check
 function srchcheck(mode) {  function srchcheck(mode) {
    if (!srch || srch.closed || srchmode!=mode) {     if (!srch || srch.closed || srchmode!=mode) {
Line 249  function idxcheck(mode) { Line 190  function idxcheck(mode) {
    }     }
    idx.focus();     idx.focus();
 }  }
 </script>  
 </head>                   
 <body bgcolor='#FFFFFF'>  
 $buttons  
 <font color=red>$errtext</font>  
 <a href="javascript:groupsearch()">Group Search</a>  
 <a href="javascript:groupimport()">Group Import</a>  
   
 ENDSMPHEAD  
   
     $r->print(      var editbrowser;
       '<input type=submit name=forcesmp value="Store"></form></body></html>');      function openbrowser(formname,elementname,only,omit) {
           var url = '$resurl/?';
           if (editbrowser == null) {
               url += 'launch=1&';
           }
           url += 'inhibitmenu=yes&';
           url += 'catalogmode=interactive&';
           url += 'mode=edit&';
           url += 'form=' + formname + '&';
           if (only != null) {
               url += 'only=' + only + '&';
           } 
           if (omit != null) {
               url += 'omit=' + omit + '&';
           }
           url += 'element=' + elementname + '';
           var title = 'Browser';
           var options = 'scrollbars=1,resizable=1,menubar=0,toolbar=1,location=1';
           options += ',width=700,height=600';
           editbrowser = open(url,title,options,'1');
           editbrowser.focus();
       }
   ENDSCRIPT
   }
   # ------------------------------------------------------- Simple edit processor
   
   sub smpedt {
      my ($r,$url,$errtext)=@_;
      my $tmpfn=&Apache::lonnet::filelocation('',$url).'.tmp';
      my $targetmsg='';
      if ($env{'form.save'}) {
          copy($tmpfn,&Apache::lonnet::filelocation('',$url));
          unlink($tmpfn);
          my ($errtext,$fatal)=
      &LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$url),'');
          unless ($fatal) {
      $targetmsg=&Apache::lonhtmlcommon::confirm_success(&mt('Saved'));
          } else {
      $targetmsg=&Apache::lonhtmlcommon::confirm_success(
                             &mt('An error occurred while saving.'),1);
          }
      }
      if ($env{'form.revert'}) {
          $targetmsg=&Apache::lonhtmlcommon::confirm_success(&mt('Reverted'));
          unlink($tmpfn);
          my ($errtext,$fatal)=
      &LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$url),'');
      }
      $targetmsg = &Apache::loncommon::confirmwrapper($targetmsg) if ($targetmsg);
      if (-e $tmpfn) {
         $targetmsg=
           '<p class="LC_warning">'
          .&mt('You are working with an unsaved version of your map.')
          .'</p>';
         my ($errtext,$fatal)=&LONCAPA::map::mapread($tmpfn,'');
      }
      $errtext = '<p class="LC_error">'.$errtext.'</p>' if ($errtext);
   # ---------------------------------------------------------- Process form input
   
      my @importselect=&Apache::loncommon::get_env_multiple('form.importsel');
      my @targetselect=&Apache::loncommon::get_env_multiple('form.target');
   # ============================================================ Process commands
   
      my $targetdetail=$env{'form.targetdetail'};
      my $importdetail=$env{'form.curimpdetail'};
   
   # ---------------------------------------------------- Importing from groupsort
      if (($env{'form.importdetail'}) && (!$env{'form.impfortarget'})) {
   
          $importdetail='';
          my @curimport=split(/\&/,$env{'form.curimpdetail'});
   
          my $lastsel;
   
          if (defined($importselect[-1])) {
      $lastsel=$importselect[-1];
          } else {
              $lastsel=$#curimport;
          }
   
          for (my $i=0;$i<=$lastsel;$i++) {
              my ($name,$url)=split(/\=/,$curimport[$i]);
              if ($url) {
                 $importdetail.='&'.$name.'='.$url;
      }
          }
   
         $importdetail.='&'.$env{'form.importdetail'};
   
          for (my $i=$lastsel+1;$i<=$#curimport;$i++) {
              my ($name,$url)=split(/\=/,$curimport[$i]);
              if ($url) {
                 $importdetail.='&'.$name.'='.$url;
     }
          }
          $importdetail=~s/\&+/\&/g;
          $importdetail=~s/^\&//;
   
   # ------------------------------------------------------------------- Clear all
      } elsif ($env{'form.clear'}) {
          $importdetail='';
   # ------------------------------------------------------------ Discard selected
      } elsif ($env{'form.discard'}) {
          $importdetail='';
          my @curimport=split(/\&/,$env{'form.curimpdetail'});
          foreach (@importselect) {
      $curimport[$_]='';
          }
          for (my $i=0;$i<=$#curimport;$i++) {
              my ($name,$url)=split(/\=/,$curimport[$i]);
              if ($url) {
                 $importdetail.='&'.$name.'='.$url;
      }
          }
   # --------------------------------------------------------- Loading another map
      } elsif ($env{'form.loadmap'}) {
          $importdetail='';
          my @curimport=split(/\&/,$env{'form.curimpdetail'});
   
          my $lastsel;
   
          if (defined($importselect[-1])) {
      $lastsel=$importselect[-1];
          } else {
              $lastsel=$#curimport;
          }
   
          for (my $i=0;$i<=$lastsel;$i++) {
              my ($name,$url)=split(/\=/,$curimport[$i]);
              if ($url) {
                 $importdetail.='&'.$name.'='.$url;
      }
          }
   
          foreach (
       &Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
      my ($name,$url)=split(/\:/,$_);
              if ($url) {
                 $importdetail.='&'.&escape($name).'='.
            &escape($url);
     }
          }
   
          for (my $i=$lastsel+1;$i<=$#curimport;$i++) {
              my ($name,$url)=split(/\=/,$curimport[$i]);
              if ($url) {
                 $importdetail.='&'.$name.'='.$url;
     }
          }
          $importdetail=~s/\&+/\&/g;
          $importdetail=~s/^\&//;
   
   # ------------------------------------------------ Groupimport/search to target
      } elsif ($env{'form.importdetail'}) {
          my $lastsel;
          if (defined($targetselect[-1])) {
      $lastsel=$targetselect[-1];
          } else {
              $lastsel=$#LONCAPA::map::order+1;
          }
          &LONCAPA::map::pastetarget($lastsel,split(/\&/,$env{'form.importdetail'}));
          &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
   # ------------------------------------------------------------------------- Cut
      } elsif (($env{'form.cut'}) || ($env{'form.copy'})) {
          $importdetail='';
          my @curimport=split(/\&/,$env{'form.curimpdetail'});
   
          my $lastsel;
   
          if (defined($importselect[-1])) {
      $lastsel=$importselect[-1];
          } else {
              $lastsel=$#curimport;
          }
   
          for (my $i=0;$i<=$lastsel;$i++) {
              my ($name,$url)=split(/\=/,$curimport[$i]);
              if ($url) {
                 $importdetail.='&'.$name.'='.$url;
      }
          }
   
          foreach (@targetselect) {
      my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$LONCAPA::map::order[$_-1]]);
              if ($url) {
                 $importdetail.='&'.&escape($name).'='.
            &escape($url);
     }
          }
   
          for (my $i=$lastsel+1;$i<=$#curimport;$i++) {
              my ($name,$url)=split(/\=/,$curimport[$i]);
              if ($url) {
                 $importdetail.='&'.$name.'='.$url;
     }
          }
          $importdetail=~s/\&+/\&/g;
          $importdetail=~s/^\&//;
   
          if ($env{'form.cut'}) {
              my @neworder=();
              for (my $i=0;$i<=$#LONCAPA::map::order;$i++) {
                  my $include=1;
                  foreach (@targetselect) {
      if ($_-1==$i) { $include=0; }
                  }
                  if ($include) { 
      $neworder[$#neworder+1]=$LONCAPA::map::order[$i]; 
          } else {
      &LONCAPA::map::makezombie($LONCAPA::map::order[$i]);
          }
              }
              @LONCAPA::map::order=@neworder;
              &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));      
          }
   
   # ----------------------------------------------------------------------- Paste
      } elsif ($env{'form.paste'}) {
          my $lastsel;
          if (defined($targetselect[-1])) {
      $lastsel=$targetselect[-1];
          } else {
              $lastsel=$#LONCAPA::map::order+1;
          }
          my @newsequence;
          my @curimport=split(/\&/,$env{'form.curimpdetail'});
          foreach (@importselect) {
             $newsequence[$#newsequence+1]=$curimport[$_];
          }
          &LONCAPA::map::pastetarget($lastsel,@newsequence);
          &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
   # -------------------------------------------------------------------- Move up 
      } elsif ($env{'form.moveup'}) {
          foreach (sort @targetselect) {
              if ($_-1>0) {
                 my $movethis=$LONCAPA::map::order[$_-1];
                 $LONCAPA::map::order[$_-1]=$LONCAPA::map::order[$_-2];
                 $LONCAPA::map::order[$_-2]=$movethis;
     }
          }
          &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
   # ------------------------------------------------------------------ Move down
      } elsif ($env{'form.movedown'}) {
          foreach (reverse sort @targetselect) {
              if ($_-1<$#LONCAPA::map::order) {
                 my $movethis=$LONCAPA::map::order[$_-1];
                 $LONCAPA::map::order[$_-1]=$LONCAPA::map::order[$_];
                 $LONCAPA::map::order[$_]=$movethis;
      }
          }
          &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
   # --------------------------------------------------------------------- Rename
      } elsif ($env{'form.renameres'}) {
          my $residx=$LONCAPA::map::order[$env{'form.renameidx'}-1];
          my ($name,@resrest)=split(/\:/,$LONCAPA::map::resources[$residx]);
          $name=$env{'form.renametitle'};
          $name=~s/\:/\&colon\;/g;
          $LONCAPA::map::resources[$residx]=$name.':'.join(':',@resrest);
          &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
      }
   # ------------------------------------------------------------ Assemble windows
      
      my $idx=-1;
      $importdetail='&'.$importdetail;
      $importdetail=~s/^\&+/\&/;
      my $importwindow=
          '<option value="-1"> ---- '.&mt('Import and Paste Area').' ---- </option>'.
        join("\n",map {
          $idx++;
          if ($_) { 
             my ($name,$url)=split(/\=/,$_);
             unless ($name) { $name=(split(/\//,$url))[-1]; }
             unless ($name) { $name='EMPTY'; }
             '<option value="'.$idx.'">'.&unescape($name).
                                       '</option>';
         }
      } split(/\&/,$importdetail));
   
      $idx=0;
      $targetdetail='';
      my $targetwindow=       
          '<option value="0"> ------- '.&mt('Target Edit Map').' ------- </option>'.
        join("\n",map { 
          my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$_]);
          unless ($name) {  $name=(split(/\//,$url))[-1]; }
          unless ($name) { $name='EMPTY'; }
          $name = &LONCAPA::map::qtescape($name);
          $url  = &LONCAPA::map::qtescape($url);
          $targetdetail.='&'.&escape($name).'='.
                     &escape($url);
          $idx++;
          $name = &HTML::Entities::encode($name,'\'"<>&');
          '<option value="'.$idx.'">'.$name.'</option>';
      } @LONCAPA::map::order);
   
   # ----------------------------------------------------- Start simple RAT screen
      my $editscript=&editscript('simple');
   
      my %lt=&Apache::lonlocal::texthash(
         'sm' => 'Select Map',
         'sa' => 'Save',
         'nt' => 'New Title',
         'se' => 'Search',
         'im' => 'Import',
                                         'wl' => 'Import from Stored Links',
         'vi' => 'View',
         'lm' => 'Load Map',
         'ds' => 'Discard Selected',
         'ca' => 'Clear All',
         'ta' => 'Temporary Assembly Workspace',
         'rv' => 'Revert to Last Saved',
                                         'sa' => 'Save',
                                         'mu' => 'Move Up',
                                         'md' => 'Move Down',
                                         're' => 'Rename',
                                         'as' => 'after selected',
                                         'cs' => 'Cut selected',
                                         'ps' => 'Copy selected',
                                         'pas' => 'Paste after selected',
                                         'reco' => 'Recover Deleted'
         );
      my $js=&Apache::lonhtmlcommon::scripttag("
      $editscript
   
      function openview(entry) {
          var url=unescape((entry.split('='))[1]);
          var parts=new Array;
          if (url) { open(url,'cat'); }
      }
   
      function viewtarget() {
          openview((document.forms.simpleedit.targetdetail.value.split('&'))
                   [document.forms.simpleedit.target.selectedIndex]);
      }
   
      function viewimport() {
          openview((document.forms.simpleedit.curimpdetail.value.split('&'))
                   [document.forms.simpleedit.importsel.selectedIndex]);
      }
   
      function renametarget() {
          var selidx=document.forms.simpleedit.target.selectedIndex;
          var entry=(document.forms.simpleedit.targetdetail.value.split('&'))
                   [selidx];
          var oldname=unescape((entry.split('='))[0]);
          newtitle=prompt('$lt{'nt'}',oldname);
          if (newtitle) {
              document.forms.simpleedit.renameres.value=1;
              document.forms.simpleedit.renameidx.value=selidx;
              document.forms.simpleedit.renametitle.value=newtitle;
      document.forms.simpleedit.submit();
          }
      }
   ");
   
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb({
           text  => 'Authoring Space',
           href  => &Apache::loncommon::authorspace($url),
           faq   => 6,
           bug   => 'RAT',
           help  => 'Sequence_Simple_Editor_Creation',});
       &Apache::lonhtmlcommon::add_breadcrumb({
           text  => 'RAT',
           title => 'Resource Assembly Tool',
           href  => '',});
       &Apache::lonhtmlcommon::add_breadcrumb({
           text  => 'Editor',
           title => 'Simple Editor',
           href  => '',});
   
       # Breadcrumbs are included by &start_page
       my $start_page = &Apache::loncommon::start_page('Authoring Space',$js)
                       .&Apache::loncommon::head_subbox(
                            &Apache::loncommon::CSTR_pageheader()
                           .&buttons(2));
       my $end_page = &Apache::loncommon::end_page();
   
       my $filetext = &mt('File: [_1]','<span class="LC_filename">'.$url.'</span>');
       $r->print(<<ENDSMPHEAD);
   $start_page
   $targetmsg
   $errtext
   <form name="simpleedit" method="post" action="">
   <input type="hidden" name="forcesmp" value="1" />
   <input type="hidden" name="renameres" value="0" />
   <input type="hidden" name="renametitle" value="" />
   <input type="hidden" name="renameidx" value="0" />
   <table>
       <tr><th width="40%">$lt{'ta'}</th>
   <th>&nbsp;</th>
   <th width="40%">$filetext</th></tr>
   <tr><td bgcolor="#FFFFCC">
   <input type="button" onclick="javascript:groupsearch()" value="$lt{'se'}" />
   <input type="button" onclick="javascript:groupimport();" value="$lt{'im'}" />
   $lt{'as'}
   <hr />
   <input type="text" size="20" name="importmap" />
   <input type="button" 
   onclick="javascript:openbrowser('simpleedit','importmap','sequence,page','')"
   value="$lt{'sm'}" /><input type="submit" name="loadmap" value="$lt{'lm'}" /><hr />
   <input type="submit" name="discard" value="$lt{'ds'}" />
   <input type="submit" name="clear" value="$lt{'ca'}" />
   <input type="button" onclick="javascript:viewimport()" value="$lt{'vi'}" />
   
       </td><td>&nbsp;</td><td bgcolor="#FFFFCC">
   
   <input type="button" onclick=
   "javascript:impfortarget.value=1;groupsearch()" value="$lt{'se'}" />
   <input type="button" onclick=
   "javascript:impfortarget.value=1;groupimport();" value="$lt{'im'}" />
   <input type="button" onclick=
   "javascript:impfortarget.value=1;open_StoredLinks_Import('simple');" value="$lt{'wl'}" />
   <input type="button" onclick=
   "javascript:impfortarget.value=1;groupopen('$url',1);" value="$lt{'reco'}" />
   $lt{'as'}
   <hr />
   <input type="submit" name="moveup" value="$lt{'mu'}" />
   <input type="submit" name="movedown" value="$lt{'md'}" />
   <input type="button" onclick="javascript:renametarget()" value="$lt{'re'}" />
   <hr />
   <input type="submit" name="revert" value="$lt{'rv'}" />
   <input type="submit" name="save" value="$lt{'sa'}" />
   <input type="button" onclick="javascript:viewtarget()" value="$lt{'vi'}" />
   </td></tr>
   
   <tr><td bgcolor="#FFFFCC"><select name="importsel" size="10" multiple="multiple">
   $importwindow
   </select>
   </td>
   <td bgcolor="#FFFFAA" align="center">
   $lt{'cs'}<br />
   <input type="submit" name="cut" value="&lt;&lt;&lt;" />
   <hr />
   $lt{'ps'}<br />
   <input type="submit" name="copy" value="&lt;--" />
   <hr />
   $lt{'pas'}<br />
   <input type="submit" name="paste" value="--&gt;" />
   </td>
   <td bgcolor="#FFFFCC"><select name="target" size="10" multiple="multiple">
   $targetwindow
   </select>
   </td></tr>
   </table>
   <input type="hidden" name="importdetail" value="" />
   <input type="hidden" name="curimpdetail" value="$importdetail" />
   <input type="hidden" name="targetdetail" value="$targetdetail" />
   <input type="hidden" name="impfortarget" value="0" />
   </form>
   $end_page
   ENDSMPHEAD
 }  }
   
   # ----------------------------------------------------------------- No such dir
 sub nodir {  sub nodir {
    my ($r,$dir)=@_;     my ($r,$dir)=@_;
    $dir=~s/^\/home\/\w+\/public\_html//;     my $londocroot = $r->dir_config('lonDocRoot');
    $r->print(<<ENDNODIR);     my ($path) = ($dir =~ m{^\Q$londocroot\E?(/priv/[^/]+/[^/]+/)});
 <html>     $dir=~s{^\Q$londocroot/priv/\E[^/]+/[^/]+}{};
 <body bgcolor='#FFFFFF'>     my $brcrum = [{'href' => &Apache::loncommon::authorspace($path),
 <h1>No such directory: $dir</h1>                    'text' => 'Authoring Space'}];
 </body>  #                 {'href' => '',
 </html>  #                  'text' => 'No such directory'}];
 ENDNODIR     $r->print(&Apache::loncommon::start_page('Authoring Space',
                                               undef,
                                               {'bread_crumbs' => $brcrum,})
               .&Apache::loncommon::head_subbox(
                    &Apache::loncommon::CSTR_pageheader())
               .'<p class="LC_error">'
               .&mt('No such directory: [_1]','<span class="LC_filename">'.$dir.'</span>'
               .'</p>'
               .&Apache::loncommon::end_page())
      );
 }  }
   
 # ---------------------------------------------------------------- View Handler  # ---------------------------------------------------------------- View Handler
   
 sub viewmap {  sub viewmap {
     my ($r,$adv,$errtext)=@_;      my ($r,$url,$adv,$errtext)=@_;
     $r->print('<html><body bgcolor="#FFFFFF">'.&buttons($adv));  
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb({
           text  => 'Authoring Space',
           href  => &Apache::loncommon::authorspace($url),
           faq   => 6,
           bug   => 'RAT',
           help  => 'Sequence_Simple_Editor_Creation',});
       &Apache::lonhtmlcommon::add_breadcrumb({
           text  => 'RAT',
           title => 'Resource Assembly Tool',
           href  => '',});
   
       # Breadcrumbs are included by &start_page
       $r->print(&Apache::loncommon::start_page('Edit Content of a Map')
                .&Apache::loncommon::head_subbox(
                     &Apache::loncommon::CSTR_pageheader()
                    .&buttons($adv))
       );
     if ($errtext) {      if ($errtext) {
  $r->print($errtext.'<hr>');   $r->print('<div class="LC_error">'
                    .$errtext
                    .'</div>'
                    .'<hr />'
           );
       }
       my $idx=0;
       $r->print('<p><span class="LC_filename">'.$url.'</span></p>');
       if ($adv) {
    $r->print('<p class="LC_warning">'
                    .&mt('Map contents are not shown in order.')
                    .'</p><br />'
           );
     }      }
     foreach (@resources) {      $r->print(&Apache::loncommon::start_data_table()
                .&Apache::loncommon::start_data_table_header_row()
                .'<th>'.&mt('Type').'</th>'
                .'<th>'.&mt('Title in map').'</th>'
                .'<th>'.&mt('Filename of resource').'</th>'
                .'<th>'.&mt('Link to published resource').'</th>'
                .'<th>'.&mt('Link to resource in Authoring Space').'</th>'
                .&Apache::loncommon::end_data_table_header_row()
       );
       foreach (&LONCAPA::map::attemptread(&Apache::lonnet::filelocation('',$url))) {
  if (defined($_)) {   if (defined($_)) {
     my ($title,$url)=split(/\:/,$_);              $idx++;
             $title=~s/\&colon\;/\:/g;      my ($title,$url,$cond)=split(/\:/,$_);
             $url=~s/\&colon\;/\:/g;      if ($cond eq 'cond') { next; }
             unless ($title) { $title='<i>Unknown</i>'; }              $title= &LONCAPA::map::qtescape($title);
               $url  = &LONCAPA::map::qtescape($url);
               unless ($title) { $title=(split(/\//,$url))[-1] };
               unless ($title) { $title='<i>'.&mt('Empty').'</i>'; }
               my $resurl = $url;
               my $resfilepath = $Apache::lonnet::perlvar{'lonDocRoot'}.$resurl;
               my $filename; 
               if ($resurl =~ m#/([^/]+)$#) {
                   $filename = $1;
               }
               my $cstrurl = $resurl;
               $cstrurl =~ s{^/res/}{/priv/};
               $r->print(&Apache::loncommon::start_data_table_row()
                        .'<td>'
                        .'<img src="'.&Apache::loncommon::icon($resfilepath).'" alt="" />'
                        .'</td>'
                        .'<td>'
                        .&HTML::Entities::encode(&LONCAPA::map::qtescape($title))
                        .'</td>'
                        .'<td>'.$filename.'</td>'
                        .'<td>'
               );
             if ($url) {              if ($url) {
  $r->print('<a href="'.&Apache::lonratsrv::qtescape($url).'">');   $r->print('<a href="'.$resurl.'">'.&mt('Resource space').'</a>');
               } else {
                   $r->print('&nbsp;');
             }              }
             $r->print(&Apache::lonratsrv::qtescape($title));              $r->print('</td><td>');
             if ($url) { $r->print('</a>'); }              if ($url) {
             $r->print('<br>');                 $r->print('<a href="'.$cstrurl.'">'.
                            &mt('Authoring space').'</a>');
               } else {
                   $r->print('&nbsp;');
               }
               $r->print('</td>'
                        .&Apache::loncommon::end_data_table_row()
               );
         }          }
     }      }
     $r->print('</body></html>');      $r->print(&Apache::loncommon::end_data_table());
       $r->print(&Apache::loncommon::end_page());
 }  }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
   my $r=shift;    my $r=shift;
   $r->content_type('text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
   
   return OK if $r->header_only;    return OK if $r->header_only;
     my $target = $env{'form.grade_target'};
     if ($target eq 'meta') {
         &Apache::loncommon::content_type($r,'text/html');
         $r->send_http_header;
         return OK;
     }
     
   my $url=$r->uri;    my $url=$r->uri;
   my $fn=&Apache::lonnet::filelocation('',$url);    my $fn=&Apache::lonnet::filelocation('',$url);
   
Line 321  sub handler { Line 791  sub handler {
 # ------------------------------------------- Determine which tools can be used  # ------------------------------------------- Determine which tools can be used
   my $adv=0;    my $adv=0;
   
   unless ($ENV{'form.forcesmp'}) {    unless ($env{'form.forcesmp'}) {
      if ($ENV{'form.forceadv'}) {       if ($env{'form.forceadv'}) {
         $adv=1;          $adv=1;
      } elsif (my $fh=Apache::File->new($fn)) {       } elsif (my $fh=Apache::File->new($fn)) {
  my $allmap=join('',<$fh>);   my $allmap=join('',<$fh>);
Line 334  sub handler { Line 804  sub handler {
   my $fatal=0;    my $fatal=0;
   
 # -------------------------------------------------------------------- Load map  # -------------------------------------------------------------------- Load map
   ($errtext,$fatal)=&mapread($fn,$errtext);    ($errtext,$fatal)=&LONCAPA::map::mapread($fn,$errtext);
   
   if ($fatal==1) { $adv=1; }    if ($fatal==1) { $adv=1; }
   
 # ----------------------------------- adv==1 now means "graphical MUST be used"  # ----------------------------------- adv==1 now means "graphical MUST be used"
   
   if ($ENV{'form.forceadv'}) {    if ($env{'form.forceadv'}) {
       &ratedt($r,$url);        &ratedt($r,$url);
   } elsif ($ENV{'form.forcesmp'}) {    } elsif ($env{'form.forcesmp'}) {
       &smpedt($r,$errtext);        &smpedt($r,$url,$errtext);
   } else {    } else {
       &viewmap($r,$adv,$errtext);        &viewmap($r,$url,$adv,$errtext);
   }    }
   return OK;    return OK;
 }  }
Line 355  __END__ Line 825  __END__
   
   
   
   =pod
   
   =head1 NAME
   
   Apache::lonratedt: simple resource assembly tool
   
   =head1 SYNOPSIS
   
   lonratedt provides the routines and the handler for the Advanced
       Resource Assembly Tool (RAT), and ties the various pieces together
       with Javascript.
   
   =head1 OVERVIEW
   
   =head2 Map Representation
   
   =begin latex
   
   %
   \begin{figure}
   \begin{center}\includegraphics[%
     width=0.55\paperwidth,bb = 0 0 200 100, draft, type=eps]{Map_Example}\end{center}
   
   
   \caption{\label{Map_In_Advanced_Editor}Example of a Map in the Advanced Editor}
   \end{figure}
   %
   \begin{figure}
   \begin{lyxcode}
   <map>
   
   ~~<resource~id=\char`\"{}1\char`\"{}
   
   ~~~~src=\char`\"{}/res/msu/korte/phy231welcome.html\char`\"{}
   
   ~~~~type=\char`\"{}start\char`\"{}
   
   ~~~~title=\char`\"{}Start\char`\"{}>
   
   ~~~~</resource>
   
   ~~<resource~id=\char`\"{}2\char`\"{}
   
   ~~~~src=\char`\"{}\char`\"{}~type=\char`\"{}finish\char`\"{}
   
   ~~~~title=\char`\"{}Finish\char`\"{}>
   
   ~~~~</resource>
   
   ~~<resource~id=\char`\"{}6\char`\"{}
   
   ~~~~src=\char`\"{}/res/msu/korte/tests/units.problem\char`\"{}
   
   ~~~~type=\char`\"{}mandatory\char`\"{}
   
   ~~~~title=\char`\"{}Physical~Units~Test\char`\"{}>
   
   ~~~~</resource>
   
   ~~<resource~id=\char`\"{}9\char`\"{}
   
   ~~~~src=\char`\"{}/res/msu/korte/chapters/onedim.sequence\char`\"{}
   
   ~~~~title=\char`\"{}Motion~in~One~Dimension\char`\"{}>
   
   ~~~~</resource>
   
   ~~<resource~id=\char`\"{}11\char`\"{}
   
   ~~~~src=\char`\"{}/res/msu/bauer/bridges/units.sequence\char`\"{}
   
   ~~~~title=\char`\"{}Physical~Units~Refresher\char`\"{}>
   
   ~~~~</resource>
   
   ~~<condition~id=\char`\"{}19\char`\"{}
   
   ~~~~type=\char`\"{}stop\char`\"{}
   
   ~~~~value=\char`\"{}user.assessments{[}this./res/msu/korte/tests/units.problem{]}.status=solved\char`\"{}>
   
   ~~~~</condition>
   
   ~~<link~from=\char`\"{}1\char`\"{}~to=\char`\"{}6\char`\"{}></link>
   
   ~~<link~from=\char`\"{}6\char`\"{}~to=\char`\"{}9\char`\"{}~condition=\char`\"{}19\char`\"{}></link>
   
   ~~<link~from=\char`\"{}6\char`\"{}~to=\char`\"{}11\char`\"{}></link>
   
   ~~<link~from=\char`\"{}11\char`\"{}~to=\char`\"{}6\char`\"{}></link>
   
   ~~</map>
   \end{lyxcode}
   
   \caption{\label{XML}XML for Map in Figure \ref{Map_In_Advanced_Editor}}
   \end{figure}
   
   =end latex
   
   Fig. "XML for Map in Figure" shows the XML representation of the
   resource map shown in Fig. "Example of a Map in the Advanced Editor",
   which is the format in which maps are stored. In the figure, however,
   additional graphical map layout information generated by the Advanced
   Resource Assembly Tool is not displayed. This graphical information is
   optional to re-generate the same graphical layout when the map is
   brought up again in the Resource Assembly Tool, and is not needed for
   any other system functionality.
   
   Maps can be generated by tools other than the Resource Assembly
   Tool. In particular, an author might have some other representation of
   a course sequence, which can be converted into a map using scripts. If
   this map then were to be brought up in the Resource Assembly Tool, the
   Tool would automatically generate a graphical layout for it. Each
   entry of the map (resources, conditions and links) is stored in a
   separate tag.
   
   Resources and conditionsX<conditions> have to have unique ID
   numbers. These numbers are automatically generated by the Resource
   Assembly Tool when the entry is first created, or added to the entries
   when a map generated outside the Resource Assembly Tool is first
   retrieved. They can also be assigned by custom scripts or added in by
   hand.
   
   In the XML example, entry 1 is the start resource of the map. When
   this map is accessed, the source (src) URL of this tag will be the
   first resource rendered. Entry 2 is the finish resource of this
   map. This resource will be the last resource in the sequence of
   resources. Entry 6 is a problem resource with the given URL and title,
   as well as the priority "mandatory". Entry 19 is a condition, which is
   used by the link between entries 6, the problem, and 9, a
   sequence. I<The final syntax for conditions has not yet been
   determined.>
   
   =cut
   
   
   

Removed from v.1.10  
changed lines
  Added in v.1.110


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