File:  [LON-CAPA] / loncom / interface / lonsearchcat.pm
Revision 1.6: download - view: text, annotated - select for diffs
Thu Mar 8 20:54:53 2001 UTC (23 years, 2 months ago) by harris41
Branches: MAIN
CVS tags: HEAD
barely works -Scott

# The LearningOnline Network
# Search Catalog
#
# 03/08/2001 Scott Harrison
#
package Apache::lonsearchcat;

use strict;
use Apache::Constants qw(:common);
use Apache::lonnet();
use Apache::File();

my %language;
my $scrout;
my %metadatafields;
my %cprtag;
my %mimetag;

sub handler {
    my $r = shift;
    $r->content_type('text/html');
    $r->send_http_header;
    return OK if $r->header_only;

    %metadatafields=();

# ------------------------------------------------ First, check out environment
    $metadatafields{'owner'}=$ENV{'user.name'}.'@'.$ENV{'user.domain'};

    
    %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="";
    $scrout.=&searchphrasefield('Limit by title','title',
			'');

    $scrout.=&searchphrasefield('Limit by author','author',
			'');

    $scrout.=&searchphrasefield('Limit by subject','subject',
			'');

    $scrout.=&searchphrasefield('Limit by notes','notes',
			'');

    $scrout.=&searchphrasefield('Limit by abstract','abstract',
			'');

    $scrout.=&selectbox('Limit by MIME type','mime',
			'notxxx',%mimetag);

    $scrout.=&selectbox('Limit by language','language',
			'any',%language);
    
    $scrout.=<<CREATIONDATEEND;
<p>
<font color="#800000" face="helvetica"><b>LIMIT BY CREATION DATE RANGE:</b>
</font>
<br>
between:<select name="creationdatemonthstart">
<option value="01"> </option>
<option value="01">January</option>
<option value="02">February</option>
<option value="03">March</option>
<option value="04">April</option>
<option value="05">May</option>
<option value="06">June</option>
<option value="07">July</option>
<option value="08">August</option>
<option value="09">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="creationdatedaystart">
<option value="1"> </option>
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
<option value=4>4</option>
<option value=5>5</option>
<option value=6>6</option>
<option value=7>7</option>
<option value=8>8</option>
<option value=9>9</option>
<option value=10>10</option>
<option value=11>11</option>
<option value=12>12</option>
<option value=13>13</option>
<option value=14>14</option>
<option value=15>15</option>
<option value=16>16</option>
<option value=17>17</option>
<option value=18>18</option>
<option value=19>19</option>
<option value=20>20</option>
<option value=21>21</option>
<option value=22>22</option>
<option value=23>23</option>
<option value=24>24</option>
<option value=25>25</option>
<option value=26>26</option>
<option value=27>27</option>
<option value=28>28</option>
<option value=29>29</option>
<option value=30>30</option>
<option value=31>31</option>
</select>
<select name="creationdateyearstart">
<option value=1976> </option>
<option value=1976>1976</option>
<option value=1977>1977</option>
<option value=1978>1978</option>
<option value=1979>1979</option>
<option value=1980>1980</option>
<option value=1981>1981</option>
<option value=1982>1982</option>
<option value=1983>1983</option>
<option value=1984>1984</option>
<option value=1985>1985</option>
<option value=1986>1986</option>
<option value=1987>1987</option>
<option value=1988>1988</option>
<option value=1989>1989</option>
<option value=1990>1990</option>
<option value=1991>1991</option>
<option value=1992>1992</option>
<option value=1993>1993</option>
<option value=1994>1994</option>
<option value=1995>1995</option>
<option value=1996>1996</option>
<option value=1997>1997</option>
<option value=1998>1998</option>
<option value=1999>1999</option>
<option value=2000>2000</option>
<option value=2001>2001</option>
<option value=2002>2002</option>
<option value=2003>2003</option>
<option value=2004>2004</option>
<option value=2005>2005</option>
<option value=2006>2006</option>
<option value=2007>2007</option>
<option value=2008>2008</option>
<option value=2009>2009</option>
<option value=2010>2010</option>
<option value=2011>2011</option>
<option value=2012>2012</option>
<option value=2013>2013</option>
<option value=2014>2014</option>
<option value=2015>2015</option>
<option value=2016>2016</option>
<option value=2017>2017</option>
<option value=2018>2018</option>
<option value=2019>2019</option>
<option value=2020>2020</option>
<option value=2021>2021</option>
<option value=2022>2022</option>
<option value=2023>2023</option>
<option value=2024>2024</option>
<option value=2025>2025</option>
<option value=2026>2026</option>
<option value=2027>2027</option>
<option value=2028>2028</option>
<option value=2029>2029</option>
<option value=2030>2030</option>
<option value=2031>2031</option>
<option value=2032>2032</option>
<option value=2033>2033</option>
<option value=2034>2034</option>
<option value=2035>2035</option>
<option value=2036>2036</option>
<option value=2037>2037</option>
<option value=2038>2038</option>
<option value=2039>2039</option>
<option value=2040>2040</option>
<option value=2041>2041</option>
<option value=2042>2042</option>
<option value=2043>2043</option>
<option value=2044>2044</option>
<option value=2045>2045</option>
<option value=2046>2046</option>
<option value=2047>2047</option>
<option value=2048>2048</option>
<option value=2049>2049</option>
<option value=2050>2050</option>
<option value=2051>2051</option>
</select>
and:<select name="creationdatemonthend">
<option value="12"> </option>
<option value="01">January</option>
<option value="02">February</option>
<option value="03">March</option>
<option value="04">April</option>
<option value="05">May</option>
<option value="06">June</option>
<option value="07">July</option>
<option value="08">August</option>
<option value="09">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="creationdatedayend">
<option value=28> </option>
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
<option value=4>4</option>
<option value=5>5</option>
<option value=6>6</option>
<option value=7>7</option>
<option value=8>8</option>
<option value=9>9</option>
<option value=10>10</option>
<option value=11>11</option>
<option value=12>12</option>
<option value=13>13</option>
<option value=14>14</option>
<option value=15>15</option>
<option value=16>16</option>
<option value=17>17</option>
<option value=18>18</option>
<option value=19>19</option>
<option value=20>20</option>
<option value=21>21</option>
<option value=22>22</option>
<option value=23>23</option>
<option value=24>24</option>
<option value=25>25</option>
<option value=26>26</option>
<option value=27>27</option>
<option value=28>28</option>
<option value=29>29</option>
<option value=30>30</option>
<option value=31>31</option>
</select>
<select name="creationdateyearend">
<option value=2051> </option>
<option value=1976>1976</option>
<option value=1977>1977</option>
<option value=1978>1978</option>
<option value=1979>1979</option>
<option value=1980>1980</option>
<option value=1981>1981</option>
<option value=1982>1982</option>
<option value=1983>1983</option>
<option value=1984>1984</option>
<option value=1985>1985</option>
<option value=1986>1986</option>
<option value=1987>1987</option>
<option value=1988>1988</option>
<option value=1989>1989</option>
<option value=1990>1990</option>
<option value=1991>1991</option>
<option value=1992>1992</option>
<option value=1993>1993</option>
<option value=1994>1994</option>
<option value=1995>1995</option>
<option value=1996>1996</option>
<option value=1997>1997</option>
<option value=1998>1998</option>
<option value=1999>1999</option>
<option value=2000>2000</option>
<option value=2001>2001</option>
<option value=2002>2002</option>
<option value=2003>2003</option>
<option value=2004>2004</option>
<option value=2005>2005</option>
<option value=2006>2006</option>
<option value=2007>2007</option>
<option value=2008>2008</option>
<option value=2009>2009</option>
<option value=2010>2010</option>
<option value=2011>2011</option>
<option value=2012>2012</option>
<option value=2013>2013</option>
<option value=2014>2014</option>
<option value=2015>2015</option>
<option value=2016>2016</option>
<option value=2017>2017</option>
<option value=2018>2018</option>
<option value=2019>2019</option>
<option value=2020>2020</option>
<option value=2021>2021</option>
<option value=2022>2022</option>
<option value=2023>2023</option>
<option value=2024>2024</option>
<option value=2025>2025</option>
<option value=2026>2026</option>
<option value=2027>2027</option>
<option value=2028>2028</option>
<option value=2029>2029</option>
<option value=2030>2030</option>
<option value=2031>2031</option>
<option value=2032>2032</option>
<option value=2033>2033</option>
<option value=2034>2034</option>
<option value=2035>2035</option>
<option value=2036>2036</option>
<option value=2037>2037</option>
<option value=2038>2038</option>
<option value=2039>2039</option>
<option value=2040>2040</option>
<option value=2041>2041</option>
<option value=2042>2042</option>
<option value=2043>2043</option>
<option value=2044>2044</option>
<option value=2045>2045</option>
<option value=2046>2046</option>
<option value=2047>2047</option>
<option value=2048>2048</option>
<option value=2049>2049</option>
<option value=2050>2050</option>
<option value=2051>2051</option>
</select>
</p>
CREATIONDATEEND

    $scrout.=<<LASTREVISIONDATEEND;
<p>
<font color="#800000" face="helvetica"><b>LIMIT BY LAST REVISION DATE RANGE:
</b></font>
<br>between:<select name="lastrevisiondatemonthstart">
<option value="00"> </option>
<option value="01">January</option>
<option value="02">February</option>
<option value="03">March</option>
<option value="04">April</option>
<option value="05">May</option>
<option value="06">June</option>
<option value="07">July</option>
<option value="08">August</option>
<option value="09">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="lastrevisiondatedaystart">
<option value=1> </option>
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
<option value=4>4</option>
<option value=5>5</option>
<option value=6>6</option>
<option value=7>7</option>
<option value=8>8</option>
<option value=9>9</option>
<option value=10>10</option>
<option value=11>11</option>
<option value=12>12</option>
<option value=13>13</option>
<option value=14>14</option>
<option value=15>15</option>
<option value=16>16</option>
<option value=17>17</option>
<option value=18>18</option>
<option value=19>19</option>
<option value=20>20</option>
<option value=21>21</option>
<option value=22>22</option>
<option value=23>23</option>
<option value=24>24</option>
<option value=25>25</option>
<option value=26>26</option>
<option value=27>27</option>
<option value=28>28</option>
<option value=29>29</option>
<option value=30>30</option>
<option value=31>31</option>
</select>
<select name="lastrevisiondateyearstart">
<option value=1976> </option>
<option value=1976>1976</option>
<option value=1977>1977</option>
<option value=1978>1978</option>
<option value=1979>1979</option>
<option value=1980>1980</option>
<option value=1981>1981</option>
<option value=1982>1982</option>
<option value=1983>1983</option>
<option value=1984>1984</option>
<option value=1985>1985</option>
<option value=1986>1986</option>
<option value=1987>1987</option>
<option value=1988>1988</option>
<option value=1989>1989</option>
<option value=1990>1990</option>
<option value=1991>1991</option>
<option value=1992>1992</option>
<option value=1993>1993</option>
<option value=1994>1994</option>
<option value=1995>1995</option>
<option value=1996>1996</option>
<option value=1997>1997</option>
<option value=1998>1998</option>
<option value=1999>1999</option>
<option value=2000>2000</option>
<option value=2001>2001</option>
<option value=2002>2002</option>
<option value=2003>2003</option>
<option value=2004>2004</option>
<option value=2005>2005</option>
<option value=2006>2006</option>
<option value=2007>2007</option>
<option value=2008>2008</option>
<option value=2009>2009</option>
<option value=2010>2010</option>
<option value=2011>2011</option>
<option value=2012>2012</option>
<option value=2013>2013</option>
<option value=2014>2014</option>
<option value=2015>2015</option>
<option value=2016>2016</option>
<option value=2017>2017</option>
<option value=2018>2018</option>
<option value=2019>2019</option>
<option value=2020>2020</option>
<option value=2021>2021</option>
<option value=2022>2022</option>
<option value=2023>2023</option>
<option value=2024>2024</option>
<option value=2025>2025</option>
<option value=2026>2026</option>
<option value=2027>2027</option>
<option value=2028>2028</option>
<option value=2029>2029</option>
<option value=2030>2030</option>
<option value=2031>2031</option>
<option value=2032>2032</option>
<option value=2033>2033</option>
<option value=2034>2034</option>
<option value=2035>2035</option>
<option value=2036>2036</option>
<option value=2037>2037</option>
<option value=2038>2038</option>
<option value=2039>2039</option>
<option value=2040>2040</option>
<option value=2041>2041</option>
<option value=2042>2042</option>
<option value=2043>2043</option>
<option value=2044>2044</option>
<option value=2045>2045</option>
<option value=2046>2046</option>
<option value=2047>2047</option>
<option value=2048>2048</option>
<option value=2049>2049</option>
<option value=2050>2050</option>
<option value=2051>2051</option>
</select>
and:<select name="lastrevisiondatemonthend">
<option value="12"> </option>
<option value="01">January</option>
<option value="02">February</option>
<option value="03">March</option>
<option value="04">April</option>
<option value="05">May</option>
<option value="06">June</option>
<option value="07">July</option>
<option value="08">August</option>
<option value="09">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="lastrevisiondatedayend">
<option value=28> </option>
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
<option value=4>4</option>
<option value=5>5</option>
<option value=6>6</option>
<option value=7>7</option>
<option value=8>8</option>
<option value=9>9</option>
<option value=10>10</option>
<option value=11>11</option>
<option value=12>12</option>
<option value=13>13</option>
<option value=14>14</option>
<option value=15>15</option>
<option value=16>16</option>
<option value=17>17</option>
<option value=18>18</option>
<option value=19>19</option>
<option value=20>20</option>
<option value=21>21</option>
<option value=22>22</option>
<option value=23>23</option>
<option value=24>24</option>
<option value=25>25</option>
<option value=26>26</option>
<option value=27>27</option>
<option value=28>28</option>
<option value=29>29</option>
<option value=30>30</option>
<option value=31>31</option>
</select>
<select name="lastrevisiondateyearend">
<option value=2051> </option>
<option value=1976>1976</option>
<option value=1977>1977</option>
<option value=1978>1978</option>
<option value=1979>1979</option>
<option value=1980>1980</option>
<option value=1981>1981</option>
<option value=1982>1982</option>
<option value=1983>1983</option>
<option value=1984>1984</option>
<option value=1985>1985</option>
<option value=1986>1986</option>
<option value=1987>1987</option>
<option value=1988>1988</option>
<option value=1989>1989</option>
<option value=1990>1990</option>
<option value=1991>1991</option>
<option value=1992>1992</option>
<option value=1993>1993</option>
<option value=1994>1994</option>
<option value=1995>1995</option>
<option value=1996>1996</option>
<option value=1997>1997</option>
<option value=1998>1998</option>
<option value=1999>1999</option>
<option value=2000>2000</option>
<option value=2001>2001</option>
<option value=2002>2002</option>
<option value=2003>2003</option>
<option value=2004>2004</option>
<option value=2005>2005</option>
<option value=2006>2006</option>
<option value=2007>2007</option>
<option value=2008>2008</option>
<option value=2009>2009</option>
<option value=2010>2010</option>
<option value=2011>2011</option>
<option value=2012>2012</option>
<option value=2013>2013</option>
<option value=2014>2014</option>
<option value=2015>2015</option>
<option value=2016>2016</option>
<option value=2017>2017</option>
<option value=2018>2018</option>
<option value=2019>2019</option>
<option value=2020>2020</option>
<option value=2021>2021</option>
<option value=2022>2022</option>
<option value=2023>2023</option>
<option value=2024>2024</option>
<option value=2025>2025</option>
<option value=2026>2026</option>
<option value=2027>2027</option>
<option value=2028>2028</option>
<option value=2029>2029</option>
<option value=2030>2030</option>
<option value=2031>2031</option>
<option value=2032>2032</option>
<option value=2033>2033</option>
<option value=2034>2034</option>
<option value=2035>2035</option>
<option value=2036>2036</option>
<option value=2037>2037</option>
<option value=2038>2038</option>
<option value=2039>2039</option>
<option value=2040>2040</option>
<option value=2041>2041</option>
<option value=2042>2042</option>
<option value=2043>2043</option>
<option value=2044>2044</option>
<option value=2045>2045</option>
<option value=2046>2046</option>
<option value=2047>2047</option>
<option value=2048>2048</option>
<option value=2049>2049</option>
<option value=2050>2050</option>
<option value=2051>2051</option>
</select>
</p>
LASTREVISIONDATEEND

    $scrout.=&searchphrasefield('Limit by publisher/owner','owner',
			$metadatafields{'owner'});

    $scrout.=&selectbox('Limit by copyright/distribution','copyright',
			'any',%cprtag);

# ---------------------------------------------------------------- Print screen
    $r->print(<<ENDDOCUMENT);
<html>
<head>
<title>The LearningOnline Network with CAPA</title>
</head>
<body bgcolor="#FFFFFF">
<img align=right src=/adm/lonIcons/lonlogos.gif>
<h1>Search Catalog</h1>
<form method="post" action="/adm/searchcat">
<hr>
<h3>Basic Search</h3>
<p>
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.
<br>
<input type="text" name="basicexp">
<input type="checkbox" name="titleonly">
<font color="#800000">Title only</font>
<br>
<input type="submit" name="basicsubmit" value="SEARCH">
</p>
<hr>
<h3>Advanced Search</h3>
$scrout
<p>
<input type="submit" name="advancedsubmit" value="SEARCH">
</p>
</form>
</body>
</html>
ENDDOCUMENT
    return OK;
} 

# --------------------------------------------------------- Various form fields

sub textfield {
    my ($title,$name,$value)=@_;
    return "\n<p><b>$title:</b><br>".
           '<input type=text name="'.$name.'" size=80 value="'.$value.'">';
}

sub searchphrasefield {
    my ($title,$name,$value)=@_;
    my $instruction=<<END;
Enter terms or phrases separated by search operators such
as AND or OR.
END
    my $uctitle=uc($title);
    return "\n<p><font color=\"#800000\" face=\"helvetica\"><b>$uctitle:</b>".
	   ":</FONT> $instruction<br>".
           '<input type=text name="'.$name.'" size=80 value="'.$value.'">';
}

sub selectbox {
    my ($title,$name,$value,%options)=@_;
    my $uctitle=uc($title);
    my $selout="\n<p><font color=\"#800000\" face=\"helvetica\"><b>$uctitle:".
	"</b></font><br>".'<select name="'.$name.'">';
    map {
        $selout.='<option value="'.$_.'"';
        if ($_ eq $value) { $selout.=' selected'; }
        $selout.='>'.$options{$_}.'</option>';
    } sort keys %options;
    return $selout.'</select>';
}

# --------------------------------------------------- Performing a basic search
sub basicsearch {
    my ($r,$expression)=@_;

    my $query=$expression;
#    $query="select * from metadata where concat(title,':\@:',author) like '\%Sci\%'";
    $query="select * from metadata where concat(title,\"    \",author) like '\%$expression\%'";
#    my $reply=&Apache::lonnet::reply("querysend:DESCRIBE metadata","msul3");
    my $reply=&Apache::lonnet::reply("querysend:$query",'msul3');
#    my $reply=&Apache::lonnet::reply('querysend:select * from metadata','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,$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;
<p>
<b>Title:</b> $title<br>
<b>Author(s):</b> $author<br>
<b>Subject:</b> $subject<br>
<b>Keyword(s):</b> <i>not available yet</i><br>
<b>Notes:</b> $notes<br>
<b>Abstract:</b> $shortabstract<br>
<b>MIME Type:</b> $mimetag{$mime}<br>
<b>Language:</b> $language{$lang}<br>
<b>Creation Date:</b> $creationdate<br>
<b>Last Revision Date:</b> $lastrevisiondate<br>
<b>Publisher/Owner:</b> $owner<br>
<b>Copyright/Distribution:</b> $copyright<br>
<b>Repository Location:</b> $hostname
</p>
END
}

    unless ($compiledresult) {
	$compiledresult="There were no results that matched your query";
    }

# Question... allow to ask question from this page, or click to
# search again?
    $r->print(<<RESULTS);
<html>
<head>
<title>The LearningOnline Network with CAPA</title>
</head>
<body bgcolor="#ffffff">
<img align=right src=/adm/lonIcons/lonlogos.gif>
<h1>Search Catalog</h1>
<form method="post" action="/adm/searchcat">
<hr>
<h3>Search Query</h3>
<p>
$expression
</p>
<h3>Search Results</h3>
$compiledresult
</body>
</html>
RESULTS

    return OK;
}

1;
__END__

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