--- loncom/interface/lonsearchcat.pm 2001/01/03 16:20:59 1.1 +++ loncom/interface/lonsearchcat.pm 2001/03/15 13:23:15 1.11 @@ -1,41 +1,537 @@ # The LearningOnline Network # Search Catalog # -# (Internal Server Error Handler -# -# (Login Screen -# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14, -# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer) -# -# 3/1/1 Gerd Kortemeyer) -# -# 3/1 Gerd Kortemeyer +# 03/08/2001 Scott Harrison # package Apache::lonsearchcat; use strict; use Apache::Constants qw(:common); +use Apache::lonnet(); +use Apache::File(); +use CGI qw(:standard); + +my %language; +my $scrout; +my %metadatafields; +my %cprtag; +my %mimetag; sub handler { my $r = shift; + +# -------------------------------------- see if called from an interactive mode + map { + my ($name, $value) = split(/=/,$_); + $value =~ tr/+/ /; + $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; + if ($name eq 'catalogmode') { + $ENV{'form.'.$name}=$value; + } + } (split(/&/,$ENV{'QUERY_STRING'})); + $r->content_type('text/html'); $r->send_http_header; return OK if $r->header_only; -# --------------------------------------------------- Print login screen header + %metadatafields=(); + + my $hidden=''; + $hidden=< +END + +# ------------------------------------------------ First, check out environment + $metadatafields{'owner'}=$ENV{'user.name'}.'@'.$ENV{'user.domain'}; + +# --------------------------------- Compute various listings of metadata values + + %language=(); + $language{'any'}='Any language'; + { + my $fh=Apache::File->new($r->dir_config('lonTabDir').'/language.tab'); + map { + $_=~/(\w+)\s+([\w\s\-]+)/; + $language{$1}=$2; + } <$fh>; + } + + %cprtag=(); + $cprtag{'any'}='Any copyright/distribution'; + { + my $fh=Apache::File->new($r->dir_config('lonIncludes').'/copyright.tab'); + map { + $_=~/(\w+)\s+([\w\s\-]+)/; + $cprtag{$1}=$2; + } <$fh>; + } + + %mimetag=(); + $mimetag{'any'}='Any type'; + { + my $fh=Apache::File->new($r->dir_config('lonTabDir').'/filetypes.tab'); + map { + $_=~/(\w+)\s+(\w+)\s+([\w\s\-]+)/; + $mimetag{$1}=".$1 $3"; + } <$fh>; + } + + if ($ENV{'form.basicsubmit'} eq 'SEARCH') { + return &basicsearch($r,$ENV{'form.basicexp'}); + } + + $scrout=''; # building a part of screen output + $scrout.=&searchphrasefield('Limit by title','title', + $ENV{'form.title'}); + + $scrout.=&searchphrasefield('Limit by author','author', + $ENV{'form.author'}); + + $scrout.=&searchphrasefield('Limit by subject','subject', + $ENV{'form.subject'}); + + $scrout.=&searchphrasefield('Limit by keywords','keywords', + $ENV{'form.keywords'}); + + $scrout.=&searchphrasefield('Limit by URL','url', + $ENV{'form.url'}); + + $scrout.=&searchphrasefield('Limit by version','version', + $ENV{'form.version'}); + + $scrout.=&searchphrasefield('Limit by notes','notes', + $ENV{'form.notes'}); + + $scrout.=&searchphrasefield('Limit by abstract','abstract', + $ENV{'form.abstract'}); + + $ENV{'form.mime'}='notxxx' unless length($ENV{'form.mime'}); + $scrout.=&selectbox('Limit by MIME type','mime', + $ENV{'form.mime'},%mimetag); + + $ENV{'form.language'}='any' unless length($ENV{'form.language'}); + + $scrout.=&selectbox('Limit by language','language', + $ENV{'form.language'},%language); + + +# ------------------------------------------------ Compute date selection boxes + $scrout.=< +LIMIT BY CREATION DATE RANGE: + +
+between: +CREATIONDATESTART + $scrout.=&dateboxes('creationdatestart',1,1,1976, + $ENV{'form.creationdatestart_month'}, + $ENV{'form.creationdatestart_day'}, + $ENV{'form.creationdatestart_year'}, + ); + $scrout.=< +LIMIT BY LAST REVISION DATE RANGE: + +
between: +LASTREVISIONDATESTART + $scrout.=&dateboxes('lastrevisiondatestart',1,1,1976, + $ENV{'form.lastrevisiondatestart_month'}, + $ENV{'form.lastrevisiondatestart_day'}, + $ENV{'form.lastrevisiondatestart_year'}, + ); + $scrout.=<print(< The LearningOnline Network with CAPA +

Search Catalog

- +
+$hidden +
+

Basic Search

+

+Enter terms or phrases separated by search operators +such as AND or OR then press SEARCH below. Terms should be specific +to the title, author, subject, notes, or abstract information associated +with a resource. +
+ENDDOCUMENT + $r->print(&simpletextfield('basicexp',$ENV{'form.basicexp'})); + $r->print(' '); + $r->print(&simplecheckbox('titleonly',$ENV{'form.titleonly'})); + $r->print('Title only '); + $r->print(&simplecheckbox('allversions',$ENV{'form.allversions'})); + $r->print(<Search historic archives +
+ + + +

+
+

Advanced Search

+$scrout +

+ + + +

+
ENDDOCUMENT return OK; } +# --------------------------------------------------------- Various form fields + +sub textfield { + my ($title,$name,$value)=@_; + return "\n

$title:
". + ''; +} + +sub simpletextfield { + my ($name,$value)=@_; + return ''; +} + +sub simplecheckbox { + my ($name,$value)=@_; + my $checked=''; + $checked="CHECKED" if $value eq 'on'; + return ''; +} + +sub searchphrasefield { + my ($title,$name,$value)=@_; + my $instruction=<$uctitle:". + " $instruction
". + ''; +} + +sub dateboxes { + my ($name,$defaultmonth,$defaultday,$defaultyear, + $currentmonth,$currentday,$currentyear)=@_; + ($defaultmonth,$defaultday,$defaultyear)=('','',''); + my $month=< + + + + + + + + + + + + + + +END + $month=~s/(\"$currentmonth\")/$1 SELECTED/ if length($currentmonth); + my $day=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +END + $day=~s/(\"$currentday\")/$1 SELECTED/ if length($currentday); + my $year=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +END + $year=~s/(\"$currentyear\")/$1 SELECTED/ if length($currentyear); + return "$month$day$year"; +} + +sub selectbox { + my ($title,$name,$value,%options)=@_; + my $uctitle=uc($title); + my $selout="\n

$uctitle:". + "
".''; +} + +# --------------------------------------------------- Performing a basic search +sub basicsearch { + my ($r,$expression)=@_; + + my $query=$expression; + $query="select * from metadata where concat(title,\" \",author) like '\%$expression\%'"; + my $reply=&Apache::lonnet::reply("querysend:$query",'msul3'); + + my @results; + + my $replyfile=''; + $reply=~/^([\.\w]+)$/; # must do since 'use strict' checks for tainting + $replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1; + $reply=~/(.*?)\_/; + my $hostname=$1; + + { + while (1) { + last if -e $replyfile; + sleep 1; + } + # QUESTION: how should I handle this error condition.. + # I'm sure there is syntax elsewhere I can use.. + my $fh=Apache::File->new($replyfile) or + ($r->print('file cannot be opened') and return OK); + @results=<$fh>; + } + + my $compiledresult=''; + + foreach my $result (@results) { + my ($title,$author,$subject,$url,$keywords,$version, + $notes,$abstract,$mime,$lang, + $creationdate,$lastrevisiondate,$owner,$copyright + )=map {&Apache::lonnet::unescape($_)} (split(/\,/,$result)); + my $shortabstract=$abstract; + $shortabstract=substr($abstract,0,200) if length($abstract)>200; + $compiledresult.=< +END + $compiledresult.=< + +
+END + $compiledresult.=<URL: $url
+Title: $title
+Author(s): $author
+Subject: $subject
+Keyword(s): $keywords
+Notes: $notes
+Abstract: $shortabstract
+MIME Type: $mimetag{$mime}
+Language: $language{$lang}
+Creation Date: $creationdate
+Last Revision Date: $lastrevisiondate
+Publisher/Owner: $owner
+Copyright/Distribution: $copyright
+Repository Location: $hostname +

+END +} + + unless ($compiledresult) { + $compiledresult="There were no results that matched your query"; + } + + # make query information persistent to allow for subsequent revision + my $persistent=''; + map { + if (/^form\./ && !/submit/) { + my $name=$_; + my $key=$name; + $name=~s/^form\.//; + $persistent.=< +END + } + } (keys %ENV); + + $r->print(< + +The LearningOnline Network with CAPA +BEGINNING + $r->print(< + function select_data(title,url) { + changeTitle(title); + changeURL(url); + } + function changeTitle(val) { + if (opener.inf.document.forms.resinfo.elements.t) { + opener.inf.document.forms.resinfo.elements.t.value=val; + } + } + function changeURL(val) { + if (opener.inf.document.forms.resinfo.elements.u) { + opener.inf.document.forms.resinfo.elements.u.value=val; + } + } + +SCRIPT + $r->print(< + + +

Search Catalog

+
+ + +$persistent +
+

Search Query

+

+Basic search: $expression +

+

Search Results

+$compiledresult + + +RESULTS + + return OK; +} + 1; __END__