--- loncom/publisher/lonpublisher.pm 2003/09/24 19:38:18 1.135
+++ loncom/publisher/lonpublisher.pm 2003/12/22 22:09:06 1.149
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Publication Handler
#
-# $Id: lonpublisher.pm,v 1.135 2003/09/24 19:38:18 albertel Exp $
+# $Id: lonpublisher.pm,v 1.149 2003/12/22 22:09:06 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -25,24 +25,6 @@
#
# http://www.lon-capa.org/
#
-#
-# (TeX Content Handler
-#
-# 05/29/00,05/30,10/11 Gerd Kortemeyer)
-#
-# 11/28,11/29,11/30,12/01,12/02,12/04,12/23 Gerd Kortemeyer
-# 03/23 Guy Albertelli
-# 03/24,03/29,04/03 Gerd Kortemeyer
-# 05/03,05/05,05/07 Gerd Kortemeyer
-# 06/23,08/07,08/11,8/13,8/17,8/18,8/24,9/26,10/16 Gerd Kortemeyer
-# 12/04,12/05 Guy Albertelli
-# 12/05 Gerd Kortemeyer
-# 12/05 Guy Albertelli
-# 12/06,12/07 Gerd Kortemeyer
-# 12/25 Gerd Kortemeyer
-# YEAR=2002
-# 1/17 Gerd Kortemeyer
-#
###
###############################################################################
@@ -143,6 +125,7 @@ use Apache::lonnet();
use Apache::loncommon();
use Apache::lonmysql;
use Apache::lonlocal;
+use Apache::loncfile;
use vars qw(%metadatafields %metadatakeys);
my %addid;
@@ -180,46 +163,48 @@ nothing
#########################################
#########################################
+#
+# Modifies global %metadatafields %metadatakeys
+#
+
sub metaeval {
- my $metastring=shift;
+ my ($metastring,$prefix)=@_;
- my $parser=HTML::LCParser->new(\$metastring);
- my $token;
- while ($token=$parser->get_token) {
- if ($token->[0] eq 'S') {
- my $entry=$token->[1];
- my $unikey=$entry;
- if (defined($token->[2]->{'package'})) {
- $unikey.='_package_'.$token->[2]->{'package'};
- }
- if (defined($token->[2]->{'part'})) {
- $unikey.='_'.$token->[2]->{'part'};
- }
- if (defined($token->[2]->{'id'})) {
- $unikey.='_'.$token->[2]->{'id'};
- }
- if (defined($token->[2]->{'name'})) {
- $unikey.='_'.$token->[2]->{'name'};
- }
- foreach (@{$token->[3]}) {
- $metadatafields{$unikey.'.'.$_}=$token->[2]->{$_};
- if ($metadatakeys{$unikey}) {
- $metadatakeys{$unikey}.=','.$_;
- } else {
- $metadatakeys{$unikey}=$_;
- }
- }
- if ($metadatafields{$unikey}) {
- my $newentry=$parser->get_text('/'.$entry);
- unless (($metadatafields{$unikey}=~/\Q$newentry\E/) ||
- ($newentry eq '')) {
- $metadatafields{$unikey}.=', '.$newentry;
- }
- } else {
- $metadatafields{$unikey}=$parser->get_text('/'.$entry);
- }
- }
- }
+ my $parser=HTML::LCParser->new(\$metastring);
+ my $token;
+ while ($token=$parser->get_token) {
+ if ($token->[0] eq 'S') {
+ my $entry=$token->[1];
+ my $unikey=$entry;
+ if (defined($token->[2]->{'package'})) {
+ $unikey.='_package_'.$token->[2]->{'package'};
+ }
+ if (defined($token->[2]->{'part'})) {
+ $unikey.='_'.$token->[2]->{'part'};
+ }
+ if (defined($token->[2]->{'id'})) {
+ $unikey.='_'.$token->[2]->{'id'};
+ }
+ if (defined($token->[2]->{'name'})) {
+ $unikey.='_'.$token->[2]->{'name'};
+ }
+ foreach (@{$token->[3]}) {
+ $metadatafields{$unikey.'.'.$_}=$token->[2]->{$_};
+ if ($metadatakeys{$unikey}) {
+ $metadatakeys{$unikey}.=','.$_;
+ } else {
+ $metadatakeys{$unikey}=$_;
+ }
+ }
+ my $newentry=$parser->get_text('/'.$entry);
+ if ($entry eq 'customdistributionfile') {
+ $newentry=~s/^\s*//;
+ if ($newentry !~m|^/res|) { $newentry=$prefix.$newentry; }
+ }
+# actually store
+ $metadatafields{$unikey}=$newentry;
+ }
+ }
}
#########################################
@@ -260,19 +245,21 @@ XHTML text that indicates successful rea
#########################################
#########################################
sub metaread {
- my ($logfile,$fn)=@_;
+ my ($logfile,$fn,$prefix)=@_;
unless (-e $fn) {
print($logfile 'No file '.$fn."\n");
- return '
No file: '.$fn.'';
+ return '
'.&mt('No file').': '.
+ &Apache::loncfile::display($fn).'';
}
print($logfile 'Processing '.$fn."\n");
my $metastring;
{
- my $metafh=Apache::File->new($fn);
- $metastring=join('',<$metafh>);
+ my $metafh=Apache::File->new($fn);
+ $metastring=join('',<$metafh>);
}
- &metaeval($metastring);
- return '
Processed file: '.$fn.'';
+ &metaeval($metastring,$prefix);
+ return '
'.&mt('Processed file').': '.
+ &Apache::loncfile::display($fn).'';
}
#########################################
@@ -325,6 +312,9 @@ string which presents the form field (fo
#########################################
sub textfield {
my ($title,$name,$value)=@_;
+ $value=~s/^\s+//gs;
+ $value=~s/\s+$//gs;
+ $value=~s/\s+/ /gs;
$title=&mt($title);
my $uctitle=uc($title);
return "\n
$uctitle:".
@@ -619,7 +609,7 @@ sub fix_ids_and_indices {
join(', ',@duplicatedids));
if ($duplicateids) {
print $logfile "Duplicate ID(s) exist, ".join(', ',@duplicatedids)."\n";
- my $outstring='Unable to publish file, it contains duplicated ID(s), ID(s) need to be unique. The duplicated ID(s) are: '.join(', ',@duplicatedids).'';
+ my $outstring=''.&mt('Unable to publish file, it contains duplicated ID(s), ID(s) need to be unique. The duplicated ID(s) are').': '.join(', ',@duplicatedids).'';
return ($outstring,1);
}
if ($needsfixup) {
@@ -684,8 +674,15 @@ sub fix_ids_and_indices {
}
if ($lctag eq 'applet') {
my $codebase='';
- if (defined($parms{'codebase'})) {
- my $oldcodebase=$parms{'codebase'};
+ my $havecodebase=0;
+ foreach my $key (keys(%parms)) {
+ if (lc($key) eq 'codebase') {
+ $codebase=$parms{$key};
+ $havecodebase=1;
+ }
+ }
+ if ($havecodebase) {
+ my $oldcodebase=$codebase;
unless ($oldcodebase=~/\/$/) {
$oldcodebase.='/';
}
@@ -699,14 +696,13 @@ sub fix_ids_and_indices {
}
$allow{&absoluteurl($codebase,$target).'/*'}=1;
} else {
- foreach ('archive','code','object') {
- if (defined($parms{$_})) {
- my $oldurl=$parms{$_};
+ foreach my $key (keys(%parms)) {
+ if ($key =~ /(archive|code|object)/i) {
+ my $oldurl=$parms{$key};
my $newurl=&urlfixup($oldurl,$target);
$newurl=~s/\/[^\/]+$/\/\*/;
- print $logfile 'Allow: applet '.$_.':'.
- $oldurl.' allows '.
- $newurl."\n";
+ print $logfile 'Allow: applet '.lc($key).':'.
+ $oldurl.' allows '.$newurl."\n";
$allow{&absoluteurl($newurl,$target)}=1;
}
}
@@ -808,6 +804,26 @@ sub store_metadata {
return (undef,$status);
}
+
+# ============================================== Parse file itself for metadata
+#
+# parses a file with target meta, sets global %metadatafields %metadatakeys
+
+sub parseformeta {
+ my ($source,$style)=@_;
+ my $allmeta='';
+ if (($style eq 'ssi') || ($style eq 'prv')) {
+ my $dir=$source;
+ $dir=~s-/[^/]*$--;
+ my $file=$source;
+ $file=(split('/',$file))[-1];
+ $source=&Apache::lonnet::hreflocation($dir,$file);
+ $allmeta=&Apache::lonnet::ssi_body($source,('grade_target' => 'meta'));
+ &metaeval($allmeta);
+ }
+ return $allmeta;
+}
+
#########################################
#########################################
@@ -839,7 +855,7 @@ sub publish {
my %allow=();
unless ($logfile=Apache::File->new('>>'.$source.'.log')) {
- return ('No write permission to user directory, FAIL',1);
+ return (''.&mt('No write permission to user directory, FAIL').'',1);
}
print $logfile
"\n\n================= Publish ".localtime()." Phase One ================\n".$ENV{'user.name'}.'@'.$ENV{'user.domain'}."\n";
@@ -863,7 +879,7 @@ sub publish {
if ($error) { return ($outstring,$error); }
# ------------------------------------------------------------ Construct Allows
- $scrout.=' New parameters or stored values: '.$chparms.' '.&mt('New parameters or stored values').
+ ': '.$chparms.' Obsolete parameters or stored values: '.
- $chparms.' '.&mt('Obsolete parameters or stored values').': '.
+ $chparms.' '.
+ &mt('If this resource is in active use, student performance data from the previous version may become inaccessible.').'Dependencies
';
+ $scrout.=''.&mt('Dependencies').'
';
my $allowstr='';
foreach (sort(keys(%allow))) {
my $thisdep=$_;
@@ -881,7 +897,7 @@ sub publish {
if (
&Apache::lonnet::getfile($Apache::lonnet::perlvar{'lonDocRoot'}.'/'.
$thisdep.'.meta') eq '-1') {
- $scrout.= ' - Currently not available'.
+ $scrout.= ' - '.&mt('Currently not available').
'';
} else {
my %temphash=(&Apache::lonnet::declutter($target).'___'.
@@ -897,16 +913,20 @@ sub publish {
}
$outstring=~s/\n*(\<\/[^\>]+\>)\s*$/$allowstr\n$1\n/s;
+### FIXME: is this really what we want?
+# I dont' think so, to will corrupt any UTF-8 resources at least,
+# and any encoding other than ISO-8859-1 will probably break
#Encode any High ASCII characters
- $outstring=&HTML::Entities::encode($outstring,"\200-\377");
+ #$outstring=&HTML::Entities::encode($outstring,"\200-\377");
# ------------------------------------------------------------- Write modified.
{
my $org;
unless ($org=Apache::File->new('>'.$source)) {
print $logfile "No write permit to $source\n";
- return ('No write permission to '.$source.
- ', FAIL',1);
+ return (''.&mt('No write permission to').
+ ' '.$source.
+ ', '.&mt('FAIL').'',1);
}
print($org $outstring);
}
@@ -916,14 +936,15 @@ sub publish {
# -------------------------------------------- Initial step done, now metadata.
# --------------------------------------- Storage for metadata keys and fields.
-
+# these are globals
+#
%metadatafields=();
%metadatakeys=();
my %oldparmstores=();
unless ($batch) {
- $scrout.='Metadata Information ' .
+ $scrout.='
'.&mt('Metadata Information').' ' .
Apache::loncommon::help_open_topic("Metadata_Description")
. '
';
}
@@ -951,10 +972,16 @@ sub publish {
my $currentpath='/home/'.$cuname.'/';
+ my $prefix='../'x($#urlparts);
foreach (@urlparts) {
$currentpath.=$_.'/';
- $scrout.=&metaread($logfile,$currentpath.'default.meta');
+ $scrout.=&metaread($logfile,$currentpath.'default.meta',$prefix);
+ $prefix=~s|^\.\./||;
}
+# ----------------------------------------------------------- Parse file itself
+# read %metadatafields from file itself
+
+ $allmeta=&parseformeta($source,$style);
# ------------------- Clear out parameters and stores (there should not be any)
@@ -975,20 +1002,12 @@ sub publish {
delete $metadatafields{$_};
}
}
-
- }
-
-# -------------------------------------------------- Parse content for metadata
- if (($style eq 'ssi') || ($style eq 'prv')) {
- my $dir=$source;
- $dir=~s-/[^/]*$--;
- my $file=$source;
- $file=(split('/',$file))[-1];
- $source=&Apache::lonnet::hreflocation($dir,$file);
- $allmeta=&Apache::lonnet::ssi_body($source,('grade_target' => 'meta'));
+# ------------------------------------------ See if anything new in file itself
+
+ $allmeta=&parseformeta($source,$style);
+ }
- &metaeval($allmeta);
- }
+
# ---------------- Find and document discrepancies in the parameters and stores
my $chparms='';
@@ -1003,7 +1022,8 @@ sub publish {
}
}
if ($chparms) {
- $scrout.=''.&mt('Warning!').
+ '
';
}
# ------------------------------------------------------- Now have all metadata
@@ -1052,7 +1074,7 @@ sub publish {
unless ($batch) {
$scrout.=
'
-
-
+
+
ABSTRACT:".
+ "\n ".&mt('ABSTRACT').":".
"
".
'
$uctitle:". + '
'. + &textfield('Suggested Replacement for Obsolete File', + 'obsoletereplacement', + $metadatafields{'obsoletereplacement'}); } else { $scrout.=&hiddenfield('copyright','private'); } - return ($scrout.'',0); + return ($scrout.'',0); # ============================================================================= # BATCH MODE # @@ -1251,14 +1288,16 @@ sub phasetwo { if ($target=~/\_\_\_/) { $r->print( - 'Unsupported character combination "___" in filename, FAIL'); + ''.&mt('Unsupported character combination'). + ' "___" '.&mt('in filename, FAIL').''); return 0; } $distarget=~s/\/+/\//g; my $logfile; unless ($logfile=Apache::File->new('>>'.$source.'.log')) { $r->print( - 'No write permission to user directory, FAIL'); + ''. + &mt('No write permission to user directory, FAIL').''); return 0; } print $logfile @@ -1282,6 +1321,9 @@ sub phasetwo { $metadatafields{'copyright'}=$ENV{'form.copyright'}; $metadatafields{'customdistributionfile'}= $ENV{'form.customdistributionfile'}; + $metadatafields{'obsolete'}=$ENV{'form.obsolete'}; + $metadatafields{'obsoletereplacement'}= + $ENV{'form.obsoletereplacement'}; $metadatafields{'dependencies'}=$ENV{'form.dependencies'}; my $allkeywords=$ENV{'form.addkey'}; @@ -1296,12 +1338,22 @@ sub phasetwo { $allkeywords=~s/^\,//; $metadatafields{'keywords'}=$allkeywords; +# check if custom distribution file is specified + if ($metadatafields{'copyright'} eq 'custom') { + my $file=$metadatafields{'customdistributionfile'}; + unless ($file=~/\.rights$/) { + return + ''.&mt('No valid custom distribution rights file specified, FAIL'). + ''; + } + } { print $logfile "\nWrite metadata file for ".$source; my $mfh; unless ($mfh=Apache::File->new('>'.$source.'.meta')) { return - 'Could not write metadata, FAIL'; + ''.&mt('Could not write metadata, FAIL'). + ''; } foreach (sort keys %metadatafields) { unless ($_=~/\./) { @@ -1320,7 +1372,7 @@ sub phasetwo { .''.$tag.'>'; } } - $r->print('Wrote Metadata
'); + $r->print(''.&mt('Wrote Metadata').'
'); print $logfile "\nWrote metadata"; } @@ -1331,14 +1383,15 @@ sub phasetwo { unless ($metadatafields{'copyright'} eq 'priv') { my ($error,$success) = &store_metadata(\%metadatafields); if ($success) { - $r->print('Synchronized SQL metadata database
'); + $r->print(''.&mt('Synchronized SQL metadata database').'
'); print $logfile "\nSynchronized SQL metadata database"; } else { $r->print($error); print $logfile "\n".$error; } } else { - $r->print('Private Publication - did not synchronize database
'); + $r->print(''. + &mt('Private Publication - did not synchronize database').'
'); print $logfile "\nPrivate: Did not synchronize data into ". "SQL metadata database"; } @@ -1375,10 +1428,11 @@ sub phasetwo { if (copy($target,$copyfile)) { print $logfile "Copied old target to ".$copyfile."\n"; - $r->print('Copied old target file
'); + $r->print(''.&mt('Copied old target file').'
'); } else { print $logfile "Unable to write ".$copyfile.':'.$!."\n"; - return "Failed to copy old target, $!, FAIL"; + return "".&mt('Failed to copy old target'). + ", $!, ".&mt('FAIL').""; } # --------------------------------------------------------------- Copy Metadata @@ -1387,18 +1441,19 @@ sub phasetwo { if (copy($target.'.meta',$copyfile)) { print $logfile "Copied old target metadata to ".$copyfile."\n"; - $r->print('Copied old metadata
') + $r->print(''.&mt('Copied old metadata').'
') } else { print $logfile "Unable to write metadata ".$copyfile.':'.$!."\n"; if (-e $target.'.meta') { return - "Failed to write old metadata copy, $!, FAIL"; + "". +&mt('Failed to write old metadata copy').", $!, ".&mt('FAIL').""; } } } else { - $r->print('Initial version
'); + $r->print(''.&mt('Initial version').'
'); print $logfile "\nInitial version"; } @@ -1413,17 +1468,18 @@ sub phasetwo { $path.="/$parts[$count]"; if ((-e $path)!=1) { print $logfile "\nCreating directory ".$path; - $r->print('Created directory '.$parts[$count].'
'); + $r->print(''.&mt('Created directory').' '.$parts[$count].'
'); mkdir($path,0777); } } if (copy($source,$copyfile)) { print $logfile "\nCopied original source to ".$copyfile."\n"; - $r->print('Copied source file
'); + $r->print(''.&mt('Copied source file').'
'); } else { print $logfile "\nUnable to write ".$copyfile.':'.$!."\n"; - return "Failed to copy source, $!, FAIL"; + return "". + &mt('Failed to copy source').", $!, ".&mt('FAIL').""; } # --------------------------------------------------------------- Copy Metadata @@ -1432,18 +1488,18 @@ sub phasetwo { if (copy($source.'.meta',$copyfile)) { print $logfile "\nCopied original metadata to ".$copyfile."\n"; - $r->print('Copied metadata
'); + $r->print(''.&mt('Copied metadata').'
'); } else { print $logfile "\nUnable to write metadata ".$copyfile.':'.$!."\n"; return - "Failed to write metadata copy, $!, FAIL"; + "".&mt('Failed to write metadata copy').", $!, ".&mt('FAIL').""; } $r->rflush; # --------------------------------------------------- Send update notifications my @subscribed=&get_subscribed_hosts($target); foreach my $subhost (@subscribed) { - $r->print('Notifying host '.$subhost.':');$r->rflush; + $r->print('
'.&mt('Notifying host').' '.$subhost.':');$r->rflush; print $logfile "\nNotifying host ".$subhost.':'; my $reply=&Apache::lonnet::critical('update:'.$target,$subhost); $r->print($reply.'
Notifying host for metadata only '.$subhost.':');$r->rflush; + $r->print('
'. +&mt('Notifying host for metadata only').' '.$subhost.':');$r->rflush; print $logfile "\nNotifying host for metadata only ".$subhost.':'; my $reply=&Apache::lonnet::critical('update:'.$target.'.meta', $subhost); @@ -1466,7 +1523,7 @@ sub phasetwo { my %courses=&coursedependencies($target); my $now=time; foreach (keys %courses) { - $r->print('
Notifying course '.$_.':');$r->rflush; + $r->print('
'.&mt('Notifying course').' '.$_.':');$r->rflush; print $logfile "\nNotifying host ".$_.':'; my ($cdom,$cname)=split(/\_/,$_); my $reply=&Apache::lonnet::cput @@ -1488,11 +1545,14 @@ sub phasetwo { $r->print( '
'.&mt('Done').'
'; } ######################################### @@ -1512,17 +1572,15 @@ sub batchpublish { $thisdistarget=~s/^\Q$docroot\E//; - undef %metadatafields; - undef %metadatakeys; - %metadatafields=(); - %metadatakeys=(); - $srcfile=~/\.(\w+)$/; - my $thistype=$1; + %metadatafields=(); + %metadatakeys=(); + $srcfile=~/\.(\w+)$/; + my $thistype=$1; - my $thisembstyle=&Apache::loncommon::fileembstyle($thistype); + my $thisembstyle=&Apache::loncommon::fileembstyle($thistype); - $r->print('