--- rat/lonratedt.pm 2005/04/07 07:34:52 1.66 +++ rat/lonratedt.pm 2007/01/16 21:10:55 1.87 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Edit Handler for RAT Maps # -# $Id: lonratedt.pm,v 1.66 2005/04/07 07:34:52 albertel Exp $ +# $Id: lonratedt.pm,v 1.87 2007/01/16 21:10:55 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,7 +33,7 @@ package Apache::lonratedt; =head1 NAME -Apache::lonratedt: advanced resource assembly tool +Apache::lonratedt: simple resource assembly tool =head1 SYNOPSIS @@ -167,251 +167,42 @@ determined.> 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 @resparms); - - -# 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; - undef @resparms; - @resources=(''); - @order=(); - @resparms=(); - - 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') { - if ($resparms[$number]) { - $resparms[$number].='&&&'.$content; - } else { - $resparms[$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 - (&mt('Map has branchings. Use advanced editor.'),1); - } - $starters[$start]=1; - $endings[$end]=1; - if ($cond) { - return - (&mt('Map has conditions. Use advanced editor.'),1); - } - } - - } - for (my $i=1; $i<=$#resources; $i++) { - if (defined($resources[$i])) { - unless (($starters[$i]) || ($endings[$i])) { - return - (&mt('Map has unconnected resources. Use advanced editor.'),1); - } - } - } -# ---------------------------------------------- Did we just read an empty map? - if ($#resources<1) { - undef $resources[0]; - $resources[1]=':::start'; - $resources[2]=':::finish'; - } -# -------------------------------------------------- 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)=@_; - my $frameset = '