--- rat/lonratsrv.pm 2001/05/03 13:18:49 1.10 +++ rat/lonratsrv.pm 2011/10/25 19:23:20 1.42 @@ -1,301 +1,89 @@ # The LearningOnline Network with CAPA # Server for RAT Maps # -# (Edit Handler for RAT Maps -# (TeX Content Handler +# $Id: lonratsrv.pm,v 1.42 2011/10/25 19:23:20 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/ # -# 05/29/00,05/30 Gerd Kortemeyer) -# 7/1 Gerd Kortemeyer) -# 7/1,7/3,7/4,7/7,7/8,7/10,7/26,10/2 Gerd Kortemeyer -# 4/30/2001 Scott Harrison -# 5/3 Gerd Kortemeyer + package Apache::lonratsrv; use strict; use Apache::Constants qw(:common); -use Apache::File; -use HTML::TokeParser; - - -# ------------------------------------------------------------- From RAT to XML +use LONCAPA(); +use LONCAPA::map(); -sub qtescape { - my $str=shift; - $str=~s/\&\#58\;/\:/g; - $str=~s/\&\#39\;/\'/g; - $str=~s/\&\#44\;/\,/g; - $str=~s/\"/\&\#34\;/g; - return $str; -} - -# ------------------------------------------------------------- From XML to RAT - -sub qtunescape { - my $str=shift; - $str=~s/\:/\&\#58\;/g; - $str=~s/\'/\&\#39\;/g; - $str=~s/\,/\&\#44\;/g; - $str=~s/\"/\&\#34\;/g; - return $str; -} - -# --------------------------------------------------------- Loads map from disk - -sub loadmap { - my ($fn,$errtext)=@_; - my $outstr=''; - my @content=(); - my @obj=(); - my @links=(); - if (-e $fn) { - { - my $fh=Apache::File->new($fn); - @content=<$fh>; - } - my $instr=join('',@content); - my $parser = HTML::TokeParser->new(\$instr); - my $token; - my $graphmode=0; - - $fn=~/\.(\w+)$/; - $outstr="mode<:>$1"; - - while ($token = $parser->get_token) { - if ($token->[0] eq 'S') { - if ($token->[1] eq 'map') { - $graphmode=($token->[2]->{'mode'} eq 'rat/graphical'); - } elsif ($token->[1] eq 'resource') { -# -------------------------------------------------------------------- Resource - $outstr.='<&>objcont'; - if ($token->[2]->{'id'}) { - $outstr.='<:>'.$token->[2]->{'id'}; - if ($obj[$token->[2]->{'id'}]==1) { - $errtext.='Error: multiple use of ID '. - $token->[2]->{'id'}.'. '; - } - $obj[$token->[2]->{'id'}]=1; - } else { - my $i=1; - while (($i<=$#obj) && ($obj[$i]!=0)) { $i++; } - $outstr.='<:>'.$i; - $obj[$i]=1; - } - $outstr.='<:>'; - $outstr.=qtunescape($token->[2]->{'title'}).":"; - $outstr.=qtunescape($token->[2]->{'src'}).":"; - if ($token->[2]->{'src'}=~/\/\//) { - $outstr.='true:'; - } else { - $outstr.='false:'; - } - if ($token->[2]->{'type'}) { - $outstr.=$token->[2]->{'type'}.':'; - } else { - $outstr.='normal:'; - } - $outstr.='res'; - } elsif ($token->[1] eq 'condition') { -# ------------------------------------------------------------------- Condition - $outstr.='<&>objcont'; - if ($token->[2]->{'id'}) { - $outstr.='<:>'.$token->[2]->{'id'}; - if ($obj[$token->[2]->{'id'}]==1) { - $errtext.='Error: multiple use of ID '. - $token->[2]->{'id'}.'. '; - } - $obj[$token->[2]->{'id'}]=1; - } else { - my $i=1; - while (($i<=$#obj) && ($obj[$i]!=0)) { $i++; } - $outstr.='<:>'.$i; - $obj[$i]=1; - } - $outstr.='<:>'; - $outstr.=qtunescape($token->[2]->{'value'}).':'; - if ($token->[2]->{'type'}) { - $outstr.=$token->[2]->{'type'}.':'; - } else { - $outstr.='normal:'; - } - $outstr.='cond'; - } elsif ($token->[1] eq 'link') { -# ----------------------------------------------------------------------- Links - $outstr.='<&>objlinks'; - - if ($token->[2]->{'index'}) { - if ($links[$token->[2]->{'index'}]) { - $errtext.='Error: multiple use of link index '. - $token->[2]->{'index'}.'. '; - } - $outstr.='<:>'.$token->[2]->{'index'}; - $links[$token->[2]->{'index'}]=1; - } else { - my $i=1; - while (($i<=$#links) && ($links[$i]==1)) { $i++; } - $outstr.='<:>'.$i; - $links[$i]=1; - } - - $outstr.='<:>'.$token->[2]->{'from'}. - ':'.$token->[2]->{'to'}; - if ($token->[2]->{'condition'}) { - $outstr.=':'.$token->[2]->{'condition'}; - } else { - $outstr.=':0'; - } - } elsif ($graphmode) { -# --------------------------------------------- All other tags (graphical only) - $outstr.='<&>'.$token->[1]; - if (defined($token->[2]->{'index'})) { - $outstr.='<:>'.$token->[2]->{'index'}; - if ($token->[1] eq 'obj') { - $obj[$token->[2]->{'index'}]=2; - } - } - $outstr.='<:>'.$token->[2]->{'value'}; - } - } - } - - } else { - $errtext.='Map not loaded: The file does not exist. '; - } - return($outstr,$errtext); -} - - -# ----------------------------------------------------------- Saves map to disk - -sub savemap { - my ($fn,$errtext)=@_; - if (($fn=~/\.sequence$/) || - ($fn=~/\.page$/)) { - -# ------------------------------------------------------------- Deal with input - my @tags=split(/<&>/,$ENV{'form.output'}); - my $outstr=''; - my $graphdef=0; - if ($tags[0] eq 'graphdef<:>yes') { - $outstr='<map mode="rat/graphical">'."\n"; - $graphdef=1; - } else { - $outstr="<map>\n"; - } - map { - my @parts=split(/<:>/,$_); - if ($parts[0] eq 'objcont') { - my @comp=split(/:/,$parts[$#parts]); -# --------------------------------------------------------------- Logical input - if ($comp[$#comp] eq 'res') { - $comp[0]=qtescape($comp[0]); - $comp[1]=qtescape($comp[1]); - if ($comp[2] eq 'true') { - if ($comp[1]!~/^http\:\/\//) { - $comp[1]='http://'.$comp[1]; - } - } else { - if ($comp[1]=~/^http\:\/\//) { - $comp[1]=~s/^http\:\/\/[^\/]*\//\//; - } - } - $outstr.='<resource id="'.$parts[1].'" src="' - .$comp[1].'"'; - - if (($comp[3] ne '') && ($comp[3] ne 'normal')) { - $outstr.=' type="'.$comp[3].'"'; - } - if ($comp[0] ne '') { - $outstr.=' title="'.$comp[0].'"'; - } - $outstr.="></resource>\n"; - } elsif ($comp[$#comp] eq 'cond') { - $outstr.='<condition id="'.$parts[1].'"'; - if (($comp[1] ne '') && ($comp[1] ne 'normal')) { - $outstr.=' type="'.$comp[1].'"'; - } - $outstr.=' value="'.qtescape($comp[0]).'"'; - $outstr.="></condition>\n"; - } - } elsif ($parts[0] eq 'objlinks') { - my @comp=split(/:/,$parts[$#parts]); - $outstr.='<link'; - $outstr.=' from="'.$comp[0].'"'; - $outstr.=' to="'.$comp[1].'"'; - if (($comp[2] ne '') && ($comp[2]!=0)) { - $outstr.=' condition="'.$comp[2].'"'; - } - $outstr.=' index="'.$parts[1].'"'; - $outstr.="></link>\n"; - } elsif (($parts[0] ne '') && ($graphdef)) { -# ------------------------------------------------------------- Graphical input - $outstr.='<'.$parts[0]; - if ($#parts==2) { - $outstr.=' index="'.$parts[1].'"'; - } - $outstr.=' value="'.qtescape($parts[$#parts]).'"></'. - $parts[0].">\n"; - } - } @tags; - $outstr.="</map>\n"; - { - my $fh; - if ($fh=Apache::File->new(">$fn")) { - print $fh $outstr; - $errtext.="Map saved as $fn. "; - } else { - $errtext.='Could not write file $fn. Map not saved. '; - } - } - } else { -# -------------------------------------------- Cannot write to that file, error - $errtext.='Map not saved: The specified path does not exist. '; - } - return $errtext; -} # ================================================================ 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 $url=$r->uri; - $url=~/\/(\w+)\/ratserver$/; + $url=~m{/(\w+)/ratserver$}; my $mode=$1; - $url=~s/\/loadonly\/ratserver$/\/save\/ratserver/; + $url=~s{/loadonly/ratserver$}{/save/ratserver}; my $fn=$r->filename; my $errtext=''; + my $infotext=''; my $outtext=''; if ($mode ne 'loadonly') { - $errtext=&savemap($fn,$errtext); + ($errtext,$infotext)=&LONCAPA::map::savemap($fn,$errtext); } - ($outtext,$errtext)=&loadmap($fn,$errtext); + ($outtext,$errtext,$infotext)=&LONCAPA::map::loadmap($fn,$errtext,$infotext); + + my $start_page = + &Apache::loncommon::start_page('Alert',undef, + {'only_body' => 1, + 'bgcolor' => '#FFFFFF',}); + my $end_page = + &Apache::loncommon::end_page(); $r->print(<<ENDDOCUMENT); -<html> -<body bgcolor="#FFFFFF"> -<form name=storage method=post action="$url"> -<input type=hidden name=output value="$outtext"> +$start_page +<form name="storage" method="post" action="$url"> +<input type="hidden" name="output" value="$outtext" /> </form> -<script> +<script type ="text/javascript"> parent.flag=1; </script> ENDDOCUMENT - if ($errtext ne '') { + if (($errtext ne '') || ($infotext ne '')) { $r->print(<<ENDSCRIPT); -<script> - alert("$errtext"); +<script type="text/javascript"> + alert("$infotext $errtext"); </script> ENDSCRIPT } - $r->print("</body>\n</html>\n"); + $r->print($end_page); return OK; } @@ -304,8 +92,20 @@ ENDSCRIPT __END__ +=head1 NAME +Apache::lonratsrv +=head1 SYNOPSIS +Handler that takes output from RAT and stores +it on disk. Handles the upper hidden frame of +the added window that comes up in RAT. (3 +frames come up in RAT server, code, and +output. This module handles server +connection.) +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. +=cut