--- rat/lonratedt.pm 2002/09/02 15:27:08 1.35 +++ rat/lonratedt.pm 2014/02/26 18:52:13 1.110 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Edit Handler for RAT Maps # -# $Id: lonratedt.pm,v 1.35 2002/09/02 15:27:08 www Exp $ +# $Id: lonratedt.pm,v 1.110 2014/02/26 18:52:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,245 +25,46 @@ # # http://www.lon-capa.org/ # -# (TeX Content Handler -# -# 05/29/00,05/30 Gerd Kortemeyer) -# 7/1,6/30 Gerd Kortemeyer + package Apache::lonratedt; use strict; use Apache::Constants qw(:common); use Apache::lonnet; -use Apache::lonratsrv; -use Apache::lonsequence; -use Apache::loncommon; +use Apache::lonsequence(); +use Apache::loncommon(); +use Apache::lonlocal; +use LONCAPA::map(); use File::Copy; - -use vars qw(@order @resources); - - -# Mapread read maps into global arrays @links and @resources, determines status -# 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; - @resources=(''); - @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; - } - if ($command eq 'objparms') { - return('Map has resource parameters. Use advanced editor.',1); - } - } -# ------------------------------------------------------- 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=1; $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; -} - -# ---------------------------------------------- Read a map as well as possible -# Also used by the sequence handler -# Call lonsequence::attemptread to read from resource space -# -sub attemptread { - my $fn=shift; - - my @links; - undef @links; - my @theseres; - undef @theseres; - - my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,''); - if ($errtext) { return @theseres } - -# -------------------------------------------------------------------- Read map - foreach (split(/\<\&\>/,$outtext)) { - my ($command,$number,$content)=split(/\<\:\>/,$_); - if ($command eq 'objcont') { - $theseres[$number]=$content; - } - if ($command eq 'objlinks') { - $links[$number]=$content; - } - } - -# --------------------------------------------------------------- Sort, sort of - - my @objsort=(); - undef @objsort; - - my @data1=(); - my @data2=(); - undef @data1; - undef @data2; - - my $k; - my $kj; - my $j; - my $ij; - - for ($k=1;$k<=$#theseres;$k++) { - if (defined($theseres[$k])) { - $objsort[$#objsort+1]=$k; - } - } - - for ($k=1;$k<=$#links;$k++) { - if (defined($links[$k])) { - @data1=split(/\:/,$links[$k]); - $kj=-1; - for (my $j=0;$j<=$#objsort;$j++) { - if ((split(/\:/,$objsort[$j]))[0]==$data1[0]) { - $kj=$j; - } - } - if ($kj!=-1) { $objsort[$kj].=':'.$data1[1]; } - } - } - for ($k=0;$k<=$#objsort;$k++) { - for ($j=0;$j<=$#objsort;$j++) { - if ($k!=$j) { - @data1=split(/\:/,$objsort[$k]); - @data2=split(/\:/,$objsort[$j]); - my $dol=$#data1+1; - my $dtl=$#data2+1; - if ($dol+$dtl<1000) { - for ($kj=1;$kj<$dol;$kj++) { - if ($data1[$kj]==$data2[0]) { - for ($ij=1;$ij<$dtl;$ij++) { - $data1[$#data1+1]=$data2[$ij]; - } - } - } - for ($kj=1;$kj<$dtl;$kj++) { - if ($data2[$kj]==$data1[0]) { - for ($ij=1;$ij<$dol;$ij++) { - $data2[$#data2+1]=$data1[$ij]; - } - } - } - $objsort[$k]=join(':',@data1); - $objsort[$j]=join(':',@data2); - } - } - } - } -# ---------------------------------------------------------------- Now sort out - - @objsort=sort { - my @data1=split(/\:/,$a); - my @data2=split(/\:/,$b); - my $rvalue=0; - my $k; - for ($k=1;$k<=$#data1;$k++) { - if ($data1[$k]==$data2[0]) { $rvalue--; } - } - for ($k=1;$k<=$#data2;$k++) { - if ($data2[$k]==$data1[0]) { $rvalue++; } - } - if ($rvalue==0) { $rvalue=$#data2-$#data1; } - $rvalue; - } @objsort; - - my @outres=(); - undef @outres; - - for ($k=0;$k<=$#objsort;$k++) { - $outres[$k]=$theseres[(split(/\:/,$objsort[$k]))[0]]; - } - return @outres; -} +use LONCAPA; +use HTML::Entities(); # --------------------------------------------------------- Build up RAT screen sub ratedt { my ($r,$url)=@_; - $r->print(< - - - - - - - - - +'; + 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(< + + +$end_page ENDDOCUMENT } @@ -271,99 +72,36 @@ ENDDOCUMENT sub buttons { my $adv=shift; - my $output='
'; + my $output=''; if ($adv==1) { - $output.=''; + $output.= + '' + .&Apache::loncommon::help_open_topic( + 'Sequence_Advanced_Editor_Creation'); } else { unless ($adv==2) { - $output.=''; - } - $output.=''; - } - return $output.'

'; -} - -# ----------------------------------------------------------- Paste into target -# modifies @order, @resources - -sub pastetarget { - my ($after,@which)=@_; - my @insertorder=(); - foreach (@which) { - if (defined($_)) { - my ($name,$url)=split(/\=/,$_); - $name=&Apache::lonnet::unescape($name); - $url=&Apache::lonnet::unescape($url); - if ($url) { - my $idx=$#resources+1; - $insertorder[$#insertorder+1]=$idx; - my $ext='false'; - if ($url=~/^http\:\/\//) { $ext='true'; } - $url=~s/\:/\:/g; - $resources[$idx]=$name.':'.$url.':'.$ext.':normal:res'; - } - } - } - my @oldorder=splice(@order,$after); - @order=(@order,@insertorder,@oldorder); -} - -# ------------------------------------------------ Get start and finish correct -# modifies @resources - -sub startfinish { - foreach (@order) { - my ($name,$url,$ext)=split(/\:/,$resources[$_]); - if ($url=~/http\&colon\:\/\//) { $ext='true'; } - $resources[$_]=$name.':'.$url.':'.$ext.':normal:res'; - } - my ($name,$url,$ext)=split(/\:/,$resources[$order[0]]); - $resources[$order[0]]=$name.':'.$url.':'.$ext.':start:res'; - if ($#order==0) { - $resources[$#resources+1]='::false'; - $order[1]=$#resources; - } - my ($name,$url,$ext)=split(/\:/,$resources[$order[$#order]]); - $resources[$order[$#order]]=$name.':'.$url.':'.$ext.':finish:res'; -} - -# ------------------------------------------------------------------- Store map - -sub storemap { - my $realfn=shift; - my $fn=$realfn; -# unless this is forced to work from the original file, use a temporary file -# instead - unless (shift) { - $fn=$realfn.'.tmp'; - unless (-e $fn) { - copy($realfn,$fn); - } - } -# store data either into tmp or real file - &startfinish(); - my $output='graphdef<:>no'; - my $k=1; - for (my $i=0; $i<=$#order; $i++) { - if (defined($resources[$order[$i]])) { - $output.='<&>objcont<:>'.$order[$i].'<:>'.$resources[$order[$i]]; - } - if (defined($order[$i+1])) { - if (defined($resources[$order[$i+1]])) { - $output.='<&>objlinks<:>'.$k.'<:>'. - $order[$i].':'.$order[$i+1].':0'; - $k++; - } - } + $output.= + '' + .&Apache::loncommon::help_open_topic( + 'Sequence_Simple_Editor_Creation') + .' '; + } + $output.= + '' + .&Apache::loncommon::help_open_topic( + 'Sequence_Advanced_Editor_Creation'); } - $output=~s/http\&colon\;\/\///g; - $ENV{'form.output'}=$output; - return - &Apache::lonratsrv::loadmap($fn,&Apache::lonratsrv::savemap($fn,'')); + return $output.''; } +# ----------------------------------------------------------------- Edit script sub editscript { my $mode=shift; + my $resurl= + &Apache::loncommon::escape_single(&Apache::loncommon::lastresurl()); return(<You are working with an unsaved version of your map.
'; - my ($errtext,$fatal)=&mapread($tmpfn,''); + '

' + .&mt('You are working with an unsaved version of your map.') + .'

'; + my ($errtext,$fatal)=&LONCAPA::map::mapread($tmpfn,''); } + $errtext = '

'.$errtext.'

' if ($errtext); # ---------------------------------------------------------- Process form input - my @importselect=(); - my @targetselect=(); - undef @importselect; - undef @targetselect; - if (defined($ENV{'form.importsel'})) { - if (ref($ENV{'form.importsel'})) { - @importselect=sort(@{$ENV{'form.importsel'}}); - } else { - @importselect=($ENV{'form.importsel'}); - } - } - if (defined($ENV{'form.target'})) { - if (ref($ENV{'form.target'})) { - @targetselect=sort(@{$ENV{'form.target'}}); - } else { - @targetselect=($ENV{'form.target'}); - } - } + 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'}; + my $targetdetail=$env{'form.targetdetail'}; + my $importdetail=$env{'form.curimpdetail'}; # ---------------------------------------------------- Importing from groupsort - if (($ENV{'form.importdetail'}) && (!$ENV{'form.impfortarget'})) { + if (($env{'form.importdetail'}) && (!$env{'form.impfortarget'})) { $importdetail=''; - my @curimport=split(/\&/,$ENV{'form.curimpdetail'}); + my @curimport=split(/\&/,$env{'form.curimpdetail'}); my $lastsel; @@ -540,7 +280,7 @@ sub smpedt { } } - $importdetail.='&'.$ENV{'form.importdetail'}; + $importdetail.='&'.$env{'form.importdetail'}; for (my $i=$lastsel+1;$i<=$#curimport;$i++) { my ($name,$url)=split(/\=/,$curimport[$i]); @@ -552,12 +292,12 @@ sub smpedt { $importdetail=~s/^\&//; # ------------------------------------------------------------------- Clear all - } elsif ($ENV{'form.clear'}) { + } elsif ($env{'form.clear'}) { $importdetail=''; # ------------------------------------------------------------ Discard selected - } elsif ($ENV{'form.discard'}) { + } elsif ($env{'form.discard'}) { $importdetail=''; - my @curimport=split(/\&/,$ENV{'form.curimpdetail'}); + my @curimport=split(/\&/,$env{'form.curimpdetail'}); foreach (@importselect) { $curimport[$_]=''; } @@ -568,9 +308,9 @@ sub smpedt { } } # --------------------------------------------------------- Loading another map - } elsif ($ENV{'form.loadmap'}) { + } elsif ($env{'form.loadmap'}) { $importdetail=''; - my @curimport=split(/\&/,$ENV{'form.curimpdetail'}); + my @curimport=split(/\&/,$env{'form.curimpdetail'}); my $lastsel; @@ -588,11 +328,11 @@ sub smpedt { } foreach ( - &Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$ENV{'form.importmap'}))) { + &Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) { my ($name,$url)=split(/\:/,$_); if ($url) { - $importdetail.='&'.&Apache::lonnet::escape($name).'='. - &Apache::lonnet::escape($url); + $importdetail.='&'.&escape($name).'='. + &escape($url); } } @@ -606,19 +346,19 @@ sub smpedt { $importdetail=~s/^\&//; # ------------------------------------------------ Groupimport/search to target - } elsif ($ENV{'form.importdetail'}) { + } elsif ($env{'form.importdetail'}) { my $lastsel; if (defined($targetselect[-1])) { $lastsel=$targetselect[-1]; } else { - $lastsel=$#order+1; + $lastsel=$#LONCAPA::map::order+1; } - &pastetarget($lastsel,split(/\&/,$ENV{'form.importdetail'})); - &storemap(&Apache::lonnet::filelocation('',$url)); + &LONCAPA::map::pastetarget($lastsel,split(/\&/,$env{'form.importdetail'})); + &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url)); # ------------------------------------------------------------------------- Cut - } elsif (($ENV{'form.cut'}) || ($ENV{'form.copy'})) { + } elsif (($env{'form.cut'}) || ($env{'form.copy'})) { $importdetail=''; - my @curimport=split(/\&/,$ENV{'form.curimpdetail'}); + my @curimport=split(/\&/,$env{'form.curimpdetail'}); my $lastsel; @@ -636,10 +376,10 @@ sub smpedt { } foreach (@targetselect) { - my ($name,$url)=split(/\:/,$resources[$order[$_-1]]); + my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$LONCAPA::map::order[$_-1]]); if ($url) { - $importdetail.='&'.&Apache::lonnet::escape($name).'='. - &Apache::lonnet::escape($url); + $importdetail.='&'.&escape($name).'='. + &escape($url); } } @@ -652,35 +392,66 @@ sub smpedt { $importdetail=~s/\&+/\&/g; $importdetail=~s/^\&//; - if ($ENV{'form.cut'}) { + if ($env{'form.cut'}) { my @neworder=(); - for (my $i=0;$i<=$#order;$i++) { + for (my $i=0;$i<=$#LONCAPA::map::order;$i++) { my $include=1; foreach (@targetselect) { if ($_-1==$i) { $include=0; } } - if ($include) { $neworder[$#neworder+1]=$order[$i]; } + if ($include) { + $neworder[$#neworder+1]=$LONCAPA::map::order[$i]; + } else { + &LONCAPA::map::makezombie($LONCAPA::map::order[$i]); + } } - @order=@neworder; - &storemap(&Apache::lonnet::filelocation('',$url)); + @LONCAPA::map::order=@neworder; + &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url)); } # ----------------------------------------------------------------------- Paste - } elsif ($ENV{'form.paste'}) { + } elsif ($env{'form.paste'}) { my $lastsel; if (defined($targetselect[-1])) { $lastsel=$targetselect[-1]; } else { - $lastsel=$#order+1; + $lastsel=$#LONCAPA::map::order+1; } my @newsequence; - my @curimport=split(/\&/,$ENV{'form.curimpdetail'}); + my @curimport=split(/\&/,$env{'form.curimpdetail'}); foreach (@importselect) { $newsequence[$#newsequence+1]=$curimport[$_]; } - &pastetarget($lastsel,@newsequence); - &storemap(&Apache::lonnet::filelocation('',$url)); -# ------------------------------------------------ + &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 @@ -688,46 +459,67 @@ sub smpedt { $importdetail='&'.$importdetail; $importdetail=~s/^\&+/\&/; my $importwindow= - ''. + ''. join("\n",map { $idx++; if ($_) { my ($name,$url)=split(/\=/,$_); unless ($name) { $name=(split(/\//,$url))[-1]; } unless ($name) { $name='EMPTY'; } - ''; } } split(/\&/,$importdetail)); $idx=0; + $targetdetail=''; my $targetwindow= - ''. + ''. join("\n",map { - my ($name,$url)=split(/\:/,$resources[$_]); + my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$_]); unless ($name) { $name=(split(/\//,$url))[-1]; } unless ($name) { $name='EMPTY'; } - $targetdetail.='&'.&Apache::lonnet::escape($name).'='. - &Apache::lonnet::escape($url); + $name = &LONCAPA::map::qtescape($name); + $url = &LONCAPA::map::qtescape($url); + $targetdetail.='&'.&escape($name).'='. + &escape($url); $idx++; + $name = &HTML::Entities::encode($name,'\'"<>&'); ''; - } @order); + } @LONCAPA::map::order); # ----------------------------------------------------- Start simple RAT screen my $editscript=&editscript('simple'); - my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1); - $r->print(< - - - -$bodytag -$buttons -$errtext -

$url

-
- + 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]',''.$url.''); + $r->print(< + + + + - + - + - -
Import
$lt{'ta'}  Target
$filetext
- - -after selected -
- -
- - - + + +$lt{'as'} +
+ +
+ + +
  - - -after selected -
$targetmsg - - - + + + + +$lt{'as'} +
+ + + +
+ + +
-Cut selected
-

-


-Copy selected
-

-


-Paste after selected
- +$lt{'cs'}
+ +
+$lt{'ps'}
+ +
+$lt{'pas'}
+
+
- - - - + + + + - +$end_page ENDSMPHEAD } # ----------------------------------------------------------------- No such dir sub nodir { my ($r,$dir)=@_; - $dir=~s/^\/home\/\w+\/public\_html//; - $r->print(< - -

No such directory: $dir

- - -ENDNODIR + my $londocroot = $r->dir_config('lonDocRoot'); + my ($path) = ($dir =~ m{^\Q$londocroot\E?(/priv/[^/]+/[^/]+/)}); + $dir=~s{^\Q$londocroot/priv/\E[^/]+/[^/]+}{}; + my $brcrum = [{'href' => &Apache::loncommon::authorspace($path), + 'text' => 'Authoring Space'}]; +# {'href' => '', +# 'text' => 'No such directory'}]; + $r->print(&Apache::loncommon::start_page('Authoring Space', + undef, + {'bread_crumbs' => $brcrum,}) + .&Apache::loncommon::head_subbox( + &Apache::loncommon::CSTR_pageheader()) + .'

' + .&mt('No such directory: [_1]',''.$dir.'' + .'

' + .&Apache::loncommon::end_page()) + ); } # ---------------------------------------------------------------- View Handler sub viewmap { my ($r,$url,$adv,$errtext)=@_; - $r->print(''. - &Apache::loncommon::bodytag('Edit Content of a Map'). - &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) { - $r->print($errtext.'
'); + $r->print('
' + .$errtext + .'
' + .'
' + ); } my $idx=0; - $r->print('

'.$url.'

'); - foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) { + $r->print('

'.$url.'

'); + if ($adv) { + $r->print('

' + .&mt('Map contents are not shown in order.') + .'


' + ); + } + $r->print(&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.&mt('Type').'' + .''.&mt('Title in map').'' + .''.&mt('Filename of resource').'' + .''.&mt('Link to published resource').'' + .''.&mt('Link to resource in Authoring Space').'' + .&Apache::loncommon::end_data_table_header_row() + ); + foreach (&LONCAPA::map::attemptread(&Apache::lonnet::filelocation('',$url))) { if (defined($_)) { $idx++; - my ($title,$url)=split(/\:/,$_); - $title=~s/\&colon\;/\:/g; - $url=~s/\&colon\;/\:/g; + my ($title,$url,$cond)=split(/\:/,$_); + if ($cond eq 'cond') { next; } + $title= &LONCAPA::map::qtescape($title); + $url = &LONCAPA::map::qtescape($url); unless ($title) { $title=(split(/\//,$url))[-1] }; - unless ($title) { $title='Empty'; } + unless ($title) { $title=''.&mt('Empty').''; } + 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() + .'' + .'' + .'' + .'' + .&HTML::Entities::encode(&LONCAPA::map::qtescape($title)) + .'' + .''.$filename.'' + .'' + ); if ($url) { - $r->print(''); + $r->print(''.&mt('Resource space').''); + } else { + $r->print(' '); } - $r->print(&Apache::lonratsrv::qtescape($title)); - if ($url) { $r->print(''); } - $r->print('
'); + $r->print(''); + if ($url) { + $r->print(''. + &mt('Authoring space').''); + } else { + $r->print(' '); + } + $r->print('' + .&Apache::loncommon::end_data_table_row() + ); } } - $r->print(''); + $r->print(&Apache::loncommon::end_data_table()); + $r->print(&Apache::loncommon::end_page()); } # ================================================================ Main Handler sub handler { my $r=shift; - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; 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 $fn=&Apache::lonnet::filelocation('',$url); @@ -871,8 +791,8 @@ sub handler { # ------------------------------------------- Determine which tools can be used my $adv=0; - unless ($ENV{'form.forcesmp'}) { - if ($ENV{'form.forceadv'}) { + unless ($env{'form.forcesmp'}) { + if ($env{'form.forceadv'}) { $adv=1; } elsif (my $fh=Apache::File->new($fn)) { my $allmap=join('',<$fh>); @@ -884,15 +804,15 @@ sub handler { my $fatal=0; # -------------------------------------------------------------------- Load map - ($errtext,$fatal)=&mapread($fn,$errtext); + ($errtext,$fatal)=&LONCAPA::map::mapread($fn,$errtext); if ($fatal==1) { $adv=1; } # ----------------------------------- adv==1 now means "graphical MUST be used" - if ($ENV{'form.forceadv'}) { + if ($env{'form.forceadv'}) { &ratedt($r,$url); - } elsif ($ENV{'form.forcesmp'}) { + } elsif ($env{'form.forcesmp'}) { &smpedt($r,$url,$errtext); } else { &viewmap($r,$url,$adv,$errtext); @@ -905,7 +825,140 @@ __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} + + +~~ + +~~~~ + +~~ + +~~~~ + +~~ + +~~~~ + +~~ + +~~~~ + +~~ + +~~~~ + +~~ + +~~~~ + +~~ + +~~ + +~~ + +~~ + +~~ +\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 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 +=cut 500 Internal Server Error

Internal Server Error

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

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

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