--- rat/lonpage.pm 2000/08/30 11:10:23 1.1
+++ rat/lonpage.pm 2000/09/15 20:03:48 1.5
@@ -4,7 +4,7 @@
# (TeX Content Handler
#
# 05/29/00,05/30 Gerd Kortemeyer)
-# 08/30 Gerd Kortemeyer
+# 08/30,08/31,09/06,09/14,09/15 Gerd Kortemeyer
package Apache::lonpage;
@@ -13,28 +13,102 @@ use Apache::Constants qw(:common :http);
use Apache::lonnet();
use GDBM_File;
+# -------------------------------------------------------------- Module Globals
+my %hash;
+my @rows;
+
+my %ssibody=();
+my %ssibgcolor=();
+my %ssitext=();
+my %ssilink=();
+my %ssivlink=();
+my %ssialink=();
+my %cellemb=();
+
+# ------------------------------------------------------------ Build page table
+
+sub tracetable {
+ my ($sofar,$rid,$beenhere)=@_;
+ my $further=$sofar;
+ unless ($beenhere=~/\&$rid\&/) {
+ $beenhere.=$rid.'&';
+
+ if (defined($hash{'is_map_'.$rid})) {
+ if ((defined($hash{'map_start_'.$hash{'src_'.$rid}})) &&
+ (defined($hash{'map_finish_'.$hash{'src_'.$rid}}))) {
+ my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}};
+ $sofar=
+ &tracetable($sofar,$hash{'map_start_'.$hash{'src_'.$rid}},
+ '&'.$frid.'&');
+ $sofar++;
+ if ($hash{'src_'.$frid}) {
+ my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$frid});
+ if (($brepriv eq '2') || ($brepriv eq 'F')) {
+ if (defined($rows[$sofar])) {
+ $rows[$sofar].='&'.$frid;
+ } else {
+ $rows[$sofar]=$frid;
+ }
+ }
+ }
+ }
+ } else {
+ $sofar++;
+ if ($hash{'src_'.$rid}) {
+ my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$rid});
+ if (($brepriv eq '2') || ($brepriv eq 'F')) {
+ if (defined($rows[$sofar])) {
+ $rows[$sofar].='&'.$rid;
+ } else {
+ $rows[$sofar]=$rid;
+ }
+ }
+ }
+ }
+
+ if (defined($hash{'to_'.$rid})) {
+ map {
+ my $now=&tracetable($sofar,$hash{'goesto_'.$_},$beenhere);
+ if ($now>$further) { $further=$now; }
+ } split(/\,/,$hash{'to_'.$rid});
+ }
+ }
+ return $further;
+}
+
+sub cell {
+ my ($r,$colspan,$rid)=@_;
+ $r->print('
print('>'.$ssibody{$rid});
+ } elsif ($cellemb{$rid} eq 'img') {
+ $r->print('>');
+ }
+ $r->print(' | ');
+}
+
# ================================================================ Main Handler
sub handler {
my $r=shift;
-# ----------------------------------------------------------- Set document type
-
- if ($ENV{'browser.mathml'}) {
- $r->content_type('text/xml');
- } else {
- $r->content_type('text/html');
- }
- $r->send_http_header;
+# ------------------------------------------- Set document type for header only
- return OK if $r->header_only;
+ if ($r->header_only) {
+ if ($ENV{'browser.mathml'}) {
+ $r->content_type('text/xml');
+ } else {
+ $r->content_type('text/html');
+ }
+ $r->send_http_header;
+ return OK;
+ }
my $requrl=$r->uri;
# ----------------------------------------------------------------- Tie db file
if ($ENV{'request.course.fn'}) {
my $fn=$ENV{'request.course.fn'};
if (-e "$fn.db") {
- my %hash;
if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) {
# ------------------------------------------------------------------- Hash tied
my $firstres=$hash{'map_start_'.$requrl};
@@ -42,11 +116,87 @@ sub handler {
if (($firstres) && ($lastres)) {
# ----------------------------------------------------------------- Render page
- $r->print("All is cool.
");
+ @rows=();
+ &tracetable(0,$firstres,'&'.$lastres.'&');
+ if ($hash{'src_'.$lastres}) {
+ my $brepriv=
+ &Apache::lonnet::allowed('bre',$hash{'src_'.$lastres});
+ if (($brepriv eq '2') || ($brepriv eq 'F')) {
+ $rows[$#rows+1]=''.$lastres;
+ }
+ }
+
+ my $i;
+ my $j;
+ my $maxcols=-1;
+
+# --------------------------------------------- Get SSI output, post parameters
+
+ for ($i=0;$i<=$#rows;$i++) {
+ if ($rows[$i]) {
+ my @colcont=split(/\&/,$rows[$i]);
+ $maxcols=$#colcont>$maxcols?$#colcont:$maxcols;
+ map {
+ my $src=$hash{'src_'.$_};
+ $src=~/\.(\w+)$/;
+ $cellemb{$_}=Apache::lonnet::fileembstyle($1);
+ if ($cellemb{$_} eq 'ssi') {
+# --------------------------------------------------------- This is an SSI cell
+ my $prefix=$_.'_';
+ my %posthash=('request.prefix' => $prefix);
+ map {
+ if ($_=~/^form.$prefix/) {
+ my $name=$_;
+ $name=~s/^form.$prefix//;
+ $posthash{$name}=$ENV{$_};
+ }
+ } keys %ENV;
+ my $output=Apache::lonnet::ssi($src,%posthash);
+
+ $ssibody{$_}=$output;
+
+# ---------------------------------------------------------------- End SSI cell
+ }
+ } @colcont;
+ }
+ }
+ if ($maxcols<0) {
+ $r->content_type('text/html');
+ $r->send_http_header;
+ $r->print('Empty page.');
+ } else {
+# ------------------------------------------------------------------ Build page
+ $maxcols++;
+ $r->content_type('text/html');
+ $r->send_http_header;
+ $r->print('');
+
+ $r->print('');
+ for ($i=0;$i<=$#rows;$i++) {
+ if ($rows[$i]) {
+ $r->print("\n");
+ my @colcont=split(/\&/,$rows[$i]);
+ my $avespan=int($maxcols/($#colcont+1));
+ my $lastspan=$maxcols-$avespan*$#colcont;
+ for ($j=0;$j<$#colcont;$j++) {
+ &cell($r,$avespan,$colcont[$j]);
+ }
+ &cell($r,$lastspan,$colcont[$#colcont]);
+ $r->print('
');
+ }
+ }
+ $r->print("\n
");
+
+ $r->print('');
+# -------------------------------------------------------------------- End page
+ }
# ------------------------------------------------------------- End render page
} else {
- $r->print("Page undefined.
");
+ $r->content_type('text/html');
+ $r->send_http_header;
+ $r->print('Page undefined.');
}
# ------------------------------------------------------------------ Untie hash
unless (untie(%hash)) {