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