Annotation of loncom/publisher/lonpublisher.pm, revision 1.4

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Publication Handler
                      3: # 
                      4: # (TeX Content Handler
                      5: #
                      6: # 05/29/00,05/30,10/11 Gerd Kortemeyer)
                      7: #
1.4     ! www         8: # 11/28,11/29,11/30 Gerd Kortemeyer
1.1       www         9: 
                     10: package Apache::lonpublisher;
                     11: 
                     12: use strict;
                     13: use Apache::File;
1.2       www        14: use Apache::Constants qw(:common :http :methods);
                     15: use HTML::TokeParser;
1.4     ! www        16: use Apache::lonxml;
1.2       www        17: 
1.3       www        18: my %addid;
                     19: 
1.2       www        20: sub publish {
1.4     ! www        21: 
1.2       www        22:     my ($source,$target,$style)=@_;
                     23:     my $logfile;
1.4     ! www        24:     my $scrout='';
        !            25: 
1.2       www        26:     unless ($logfile=Apache::File->new('>>'.$source.'.log')) {
                     27: 	return 'No write permission to user directory, FAIL';
                     28:     }
                     29:     print $logfile 
                     30: "\n\n================== Publish ".localtime()." =================\n";
                     31: 
1.3       www        32:     if (($style eq 'ssi') || ($style eq 'rat')) {
                     33: # ------------------------------------------------------- This needs processing
1.4     ! www        34: 
        !            35: # ----------------------------------------------------------------- Backup Copy
1.3       www        36: 	my $copyfile=$source.'.save';
                     37:         {
                     38: 	    my $org=Apache::File->new($source);
                     39:             my $cop=Apache::File->new('>'.$copyfile);
                     40:             while (my $line=<$org>) { print $cop $line; }
                     41:         }
                     42:         if (-e $copyfile) {
                     43: 	    print $logfile "Copied original file to ".$copyfile."\n";
                     44:         } else {
1.4     ! www        45: 	    print $logfile "Unable to write backup ".$copyfile."\n";
1.3       www        46:             return "Failed to write backup copy, FAIL";
                     47:         }
1.4     ! www        48: # ------------------------------------------------------------- IDs and indices
        !            49: 
        !            50:         my $maxindex=10;
        !            51:         my $maxid=10;
        !            52:         my $content='';
        !            53:         my $needsfixup=0;
        !            54: 
        !            55:         {
        !            56:           my $org=Apache::File->new($source);
        !            57:           $content=join('',<$org>);
        !            58:         }
        !            59:         {
        !            60:           my $parser=HTML::TokeParser->new(\$content);
        !            61:           my $token;
        !            62:           while ($token=$parser->get_token) {
        !            63:               if ($token->[0] eq 'S') {
        !            64:                   my $counter;
        !            65: 		  if ($counter=$addid{$token->[1]}) {
        !            66: 		      if ($counter eq 'id') {
        !            67: 			  if (defined($token->[2]->{'id'})) {
        !            68:                              $maxid=
        !            69: 		       ($token->[2]->{'id'}>$maxid)?$token->[2]->{'id'}:$maxid;
        !            70: 			 } else {
        !            71:                              $needsfixup=1;
        !            72:                          }
        !            73:                       } else {
        !            74:  			  if (defined($token->[2]->{'index'})) {
        !            75:                              $maxindex=
        !            76: 	   ($token->[2]->{'index'}>$maxindex)?$token->[2]->{'index'}:$maxindex;
        !            77: 			  } else {
        !            78:                              $needsfixup=1;
        !            79: 			  }
        !            80: 		      }
        !            81: 		  }
        !            82:               }
        !            83:           }
        !            84:       }
        !            85:       if ($needsfixup) {
        !            86:           print $logfile "Needs ID and/or index fixup\n".
        !            87: 	        "Max ID   : $maxid (min 10)\n".
        !            88:                 "Max Index: $maxindex (min 10)\n";
        !            89: 
        !            90:           my $outstring='';
        !            91:           my $parser=HTML::TokeParser->new(\$content);
        !            92:           my $token;
        !            93:           while ($token=$parser->get_token) {
        !            94:               if ($token->[0] eq 'S') {
        !            95:                   my $counter;
        !            96: 		  if ($counter=$addid{$token->[1]}) {
        !            97: 		      if ($counter eq 'id') {
        !            98: 			  if (defined($token->[2]->{'id'})) {
        !            99: 			      $outstring.=$token->[4];
        !           100: 			  } else {
        !           101:                               $maxid++;
        !           102:                               my $thisid=' id="'.$maxid.'"';
        !           103: 			      my $fixup=$token->[4];
        !           104:                               $fixup=~s/(\<\w+)/$1$thisid/;
        !           105:                               $outstring.=$fixup;
        !           106:                               print $logfile 'ID: '.$fixup."\n";
        !           107:                           }
        !           108:                       } else {
        !           109:  			  if (defined($token->[2]->{'index'})) {
        !           110: 			      $outstring.=$token->[4];
        !           111: 			  } else {
        !           112:                               $maxindex++;
        !           113:                               my $thisindex=' index="'.$maxindex.'"';
        !           114: 			      my $fixup=$token->[4];
        !           115:                               $fixup=~s/(\<\w+)/$1$thisindex/;
        !           116:                               $outstring.=$fixup;
        !           117:                               print $logfile 'Index: '.$fixup."\n";
        !           118: 			  }
        !           119: 		      }
        !           120: 		  } else {
        !           121:                       $outstring.=$token->[4];
        !           122:                   }
        !           123:               } elsif ($token->[0] eq 'E') {
        !           124:                   $outstring.=$token->[2];
        !           125:               } else {
        !           126:                   $outstring.=$token->[1];
        !           127:               }
        !           128:           }
        !           129:         {
        !           130:           my $org;
        !           131:           unless ($org=Apache::File->new('>'.$source)) {
        !           132:              print $logfile "No write permit to $source\n";
        !           133:              return "No write permission to $source, FAIL";
        !           134: 	  }
        !           135:           print $org $outstring;
        !           136:         }
        !           137: 	  $content=$outstring;
        !           138:           print $logfile "End of ID and/or index fixup\n".
        !           139: 	        "Max ID   : $maxid (min 10)\n".
        !           140:                 "Max Index: $maxindex (min 10)\n";
        !           141:       } else {
        !           142: 	  print $logfile "Does not need ID and/or index fixup\n";
        !           143:       }
        !           144: # -------------------------------------------------- Parse content for metadata
        !           145: 
        !           146: 	my $allmeta=Apache::lonxml::xmlparse('meta',$content);
        !           147:         
        !           148:         $scrout=$allmeta;
1.3       www       149: 
                    150:     }
1.4     ! www       151:     return $scrout;
1.2       www       152: }
1.1       www       153: 
                    154: # ================================================================ Main Handler
                    155: 
                    156: sub handler {
                    157:   my $r=shift;
1.2       www       158: 
                    159:   if ($r->header_only) {
                    160:      $r->content_type('text/html');
                    161:      $r->send_http_header;
                    162:      return OK;
                    163:   }
                    164: 
                    165: # -------------------------------------------------------------- Check filename
                    166: 
                    167:   my $fn=$ENV{'form.filename'};
                    168: 
                    169:   unless ($fn) { 
                    170:      $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.
                    171:          ' trying to publish empty filename', $r->filename); 
                    172:      return HTTP_NOT_FOUND;
                    173:   } 
1.4     ! www       174: 
        !           175:   unless ($ENV{'user.home'} eq $r->dir_config('lonHostID')) {
        !           176:      $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.
        !           177:          ' trying to publish file '.$ENV{'form.filename'}.
        !           178:          ' ('.$fn.') - not homeserver ('.$ENV{'user.home'}.')', 
        !           179:          $r->filename); 
        !           180:      return HTTP_NOT_ACCEPTABLE;
        !           181:   }
1.2       www       182: 
                    183:   $fn=~s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;
                    184: 
                    185:   my $targetdir='';
                    186:   my $docroot=$r->dir_config('lonDocRoot'); 
                    187:   if ($1 ne $ENV{'user.name'}) {
                    188:      $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.
                    189:          ' trying to publish unowned file '.$ENV{'form.filename'}.
                    190:          ' ('.$fn.')', 
                    191:          $r->filename); 
                    192:      return HTTP_NOT_ACCEPTABLE;
                    193:   } else {
                    194:       $targetdir=$docroot.'/res/'.$ENV{'user.domain'};
                    195:   }
                    196:                                  
                    197:   
                    198:   unless (-e $fn) { 
                    199:      $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.
                    200:          ' trying to publish non-existing file '.$ENV{'form.filename'}.
                    201:          ' ('.$fn.')', 
                    202:          $r->filename); 
                    203:      return HTTP_NOT_FOUND;
                    204:   } 
                    205: 
                    206: # --------------------------------- File is there and owned, init lookup tables
                    207: 
1.3       www       208:   %addid=();
                    209: 
                    210:   {
                    211:       my $fh=Apache::File->new($r->dir_config('lonTabDir').'/addid.tab');
                    212:       while (<$fh>=~/(\w+)\s+(\w+)/) {
                    213:           $addid{$1}=$2;
                    214:       }
                    215:   }
1.2       www       216: # ----------------------------------------------------------- Start page output
                    217: 
1.1       www       218:   $r->content_type('text/html');
                    219:   $r->send_http_header;
                    220: 
                    221:   $r->print('<html><head><title>LON-CAPA Publishing</title></head>');
                    222:   $r->print('<body bgcolor="#FFFFFF">');
1.2       www       223:   my $thisfn=$fn;
                    224:    
                    225: # ------------------------------------------------------------- Individual file
                    226:   {
                    227:       $thisfn=~/\.(\w+)$/;
                    228:       my $thistype=$1;
                    229:       my $thisembstyle=&Apache::lonnet::fileembstyle($thistype);
                    230: 
                    231:       my $thistarget=$thisfn;
                    232:       
                    233:       $thistarget=~s/^\/home/$targetdir/;
                    234:       $thistarget=~s/\/public\_html//;
                    235: 
                    236:       my $thisdistarget=$thistarget;
                    237:       $thisdistarget=~s/^$docroot//;
                    238: 
                    239:       my $thisdisfn=$thisfn;
                    240:       $thisdisfn=~s/^\/home\/$ENV{'user.name'}\/public_html\///;
                    241: 
                    242:       $r->print('<h2>Publishing '.
                    243:         &Apache::lonnet::filedescription($thistype).' <tt>'.
                    244:         $thisdisfn.'</tt></h2><b>Target:</b> <tt>'.$thisdistarget.'</tt><p>');
                    245: 
                    246: # ------------ We are publishing from $thisfn to $thistarget with $thisembstyle
                    247: 
                    248:       $r->print('<b>Result:</b> '.&publish($thisfn,$thistarget,$thisembstyle));
                    249:       
                    250:   }  
                    251: 
1.1       www       252:   $r->print('</body></html>');
                    253: 
                    254:   return OK;
                    255: }
                    256: 
                    257: 1;
                    258: __END__
                    259: 
                    260: 
                    261: 
                    262: 
                    263: 
                    264: 
                    265: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>