# The LearningOnline Network with CAPA # Edit Handler for RAT Maps # # $Id: lonratedt.pm,v 1.11 2002/05/13 14:33:50 www Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # 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; my @order=(); my @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; 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 sub ratedt { my ($r,$url)=@_; $r->print(< ENDDOCUMENT } # ---------------------------------------------------------------- Make buttons sub buttons { my $adv=shift; my $output='
'; if ($adv==1) { $output.=''; } else { unless ($adv==2) { $output.=''; } $output.=''; } return $output.'

'; } sub smpedt { my ($r,$errtext)=@_; my $buttons=&buttons(2); my $targetwindow=join("\n",map { my ($name)=split(/\:/,$resources[$_]); unless ($name) { $name='UNKNOWN'; } ''; } @order); # ----------------------------------------------------- Start simple RAT screen $r->print(< $buttons $errtext
Import Target
Group Search Group Import   

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

No such directory: $dir

ENDNODIR } # ---------------------------------------------------------------- View Handler sub viewmap { my ($r,$adv,$errtext)=@_; $r->print(''.&buttons($adv)); if ($errtext) { $r->print($errtext.'
'); } foreach (@resources) { if (defined($_)) { my ($title,$url)=split(/\:/,$_); $title=~s/\&colon\;/\:/g; $url=~s/\&colon\;/\:/g; unless ($title) { $title='Unknown'; } if ($url) { $r->print(''); } $r->print(&Apache::lonratsrv::qtescape($title)); if ($url) { $r->print(''); } $r->print('
'); } } $r->print(''); } # ================================================================ Main Handler sub handler { my $r=shift; $r->content_type('text/html'); $r->send_http_header; return OK if $r->header_only; my $url=$r->uri; my $fn=&Apache::lonnet::filelocation('',$url); my ($dir)=($fn=~/^(.+)\/[^\/]+$/); unless (-e $dir) { &nodir($r,$dir); return OK; } # ------------------------------------------- Determine which tools can be used my $adv=0; unless ($ENV{'form.forcesmp'}) { if ($ENV{'form.forceadv'}) { $adv=1; } elsif (my $fh=Apache::File->new($fn)) { my $allmap=join('',<$fh>); $adv=($allmap=~/\]+mode\s*\=\s*(\'|\")rat/is); } } my $errtext=''; my $fatal=0; # -------------------------------------------------------------------- Load map ($errtext,$fatal)=&mapread($fn,$errtext); if ($fatal==1) { $adv=1; } # ----------------------------------- adv==1 now means "graphical MUST be used" if ($ENV{'form.forceadv'}) { &ratedt($r,$url); } elsif ($ENV{'form.forcesmp'}) { &smpedt($r,$errtext); } else { &viewmap($r,$adv,$errtext); } return OK; } 1; __END__