#!/usr/bin/perl
# design:
# Man skall kunna söka (fritext/fält) och få upp en lista med resultat
# Man skall kunna klicka på ett av listelementen och
# få ett resultat i form av en mall (listnamn.out).
#
$1
#
# In: DO LISTNAME NR SEARCH COLUMN TPLT
#
require "config.dat";
$mviewurl = "mview.cgi";
use lib '.';
require "cgi-lib.pl";
print "Content-type: text/html\n\n";
&ReadParse();
($listname=$in{LISTNAME}) =~ s/(.*):(.*)/$2/;
if ($in{'NR'}) { &browse }
elsif ($in{'EXTRACT'} || $in{'STR'}) { &listmatch }
else { &searchpage }
sub searchpage {
open(DATA,"$rootdir/lib/" . $in{'LISTNAME'} . ".preform") || &printbegin("Search $listname");
while() {print}
close(DATA);
print "\n";
&printend;
}
sub listmatch {
&readdatabase(1);
&printbegin("Searchresult");
$url = "$mviewurl?" . &urlenv();
$url =~ s/&STR=[^&]*//;
print " ";
if (not $in{'STR'}) {
$regstr="1";
foreach $i (0..$in{'EXTRACT'}-1) {
$n="regnr$i";
$in{$n} =~ s/([\+\?\.\*\(\)\[\]\{\}\\])/\\$1/g;
$in{$n} =~ s/["']//g;
foreach (split(/ /,$in{$n})) {
$regstr = "($regstr && (\$_ =~ /\\b$_/i))" }
}
$in{'STR'} = $regstr;
}
@words = ($in{'STR'} =~ m?\$_ =~ /\\b([^/]*)/?g);
# print "Sökning på - ";
# grep(s/(\w*)\|(\w*)/$1 ELLER $2/g,@words);
# foreach (@words) { $out .= "$_ OCH "; }
# $out =~ s/OCH $//;
#OA print "$out - gav följande resultat: \n";
printsearchlog(@words);
&extract;
&sort;
&printcompact;
&printend();
}
sub printcompact {
print "\n";
foreach (@data) {
@dat=split(/;/,$_);
print "$dat[2] \n";
}
print " \n";
print "Please, try again. No Match.\n" unless (@data);
}
sub extract {
local(@match);
foreach (@data) {
if (eval($in{'STR'}) && (! m/^[^;]*;;/)) { push(@match,$_) }
}
@data = @match;
}
sub sort {
local(@sortarr);local(@sorted);
foreach (@data) {
@dat=split(/;/,$_);
push(@sortarr,"$dat[2]###$_");
}
@data = sort @sortarr;
foreach(@data) {
($key,$data)=split(/###/,$_);
push(@sorted,$data);
}
@data=@sorted;
}
sub browse {
&readdatabase(1);
&extract;
&sort();
foreach $i (0..$#data)
{
if ($data[$i] =~ /^$in{'NR'};/) { $hit=$i; $jepp++;}
}
$next=$data[($hit+1) % ($#data+1)] if (@data);
$pre =$data[($hit+$#data) % ($#data+1)] if (@data);
printtemplate($data[$hit],$pre,$next);
}
#################
# MODULE: printtemplate
#################
# DESCRIPTION: Prints the specified string inside a template
# IN: The string,the previous hit, the next hit
# OUT:
# BUGS:
#################
sub printtemplate
{
open(DATA,"$rootdir/lib/" . $in{'LISTNAME'} . $in{'TPLT'} . ".out")
|| print "No!\n";
@dat = split(/;/,$_[0]);
@pre = split(/;/,$_[1]);
$preurl=" ";
@next = split(/;/,$_[2]);
$nexturl=" ";
$upurl = " ";
$out = "";
while() {
if (/^%(.*)/) {
$subrules{"\$out =~ $1"}++ }
else {
if(/\$(\d+)/) {
$no=$1;
if ($dat[$no]) {
s/#(.*)\$$no(.*)#|\$$no/$1$dat[$no]$2/;
}
else {
s/#.*#|\$$no//;
}
}
$out .= $_;
}
}
close(DATA);
$out =~ s/\$pre/$preurl/goi;
$out =~ s/\$next/$nexturl/goi;
$out =~ s/\$up/$upurl/goi;
foreach (%subrules) {
eval($_);
}
print $out;
}
#################
# MODULE: readdatabase
#################
# DESCRIPTION: Read the file that contins the data.
# IN: 1 - read data too 0 - read only head
# OUT: $head, $title, $headers, @data
# BUGS:
#################
sub readdatabase
{
@data=();
@orderdef = ();
@sortby = ();
@compactdef = ();
@firstsearch = ();
@fieldsearch = ();
open(DATA,"$rootdir/lib/" . $in{'LISTNAME'} . ".csv") || print "noooo\n";
while () {
chop;
if (/^#(.*)/) { # Modechange
if ($1 eq "TITLE") { $inputmode = $1; }
elsif ($1 eq "FIRSTSEARCH") { $inputmode= $1; }
elsif ($1 eq "FIELDSEARCH") { $inputmode= $1; }
elsif ($1 eq "SHORTCUTS") { $inputmode= $1; }
elsif ($1 eq "COMPACTLIST") { $inputmode= $1; }
elsif ($1 eq "HEADDEF") { $inputmode= $1; }
elsif ($1 eq "SORTBY") { $inputmode= $1; }
elsif ($1 eq "INFO") { $inputmode= $1; }
elsif ($1 eq "ADMIN") { $inputmode= $1; }
elsif ($1 eq "ADMINEMAIL") { $inputmode= $1; }
elsif ($1 eq "HEADNAME") { $inputmode= $1; }
elsif ($1 eq "NODELETE") { $nodelete=1; }
elsif ($1 eq "ORDER") { $inputmode= $1; }
elsif ($1 eq "DATA") { $inputmode= $1; }
else { die "Error in datafile...$in{'LISTNAME'}"; }
}
else {
if ($inputmode eq "DATA" && $_[0] eq 0) { last} # terminate...
push(@data,$_) if ($inputmode eq "DATA");
$title = $_ if ($inputmode eq "TITLE");
$admin = $_ if ($inputmode eq "ADMIN");
$adminemail = $_ if ($inputmode eq "ADMINEMAIL");
$headers = $_ if ($inputmode eq "HEADNAME");
$headdef = $_ if ($inputmode eq "HEADDEF");
if ($inputmode eq "SHORTCUTS") {
($reg,$label) = split(/\+\+\+/,$_);
$shortcuts{$label} = $reg; }
push(@sortby,$_) if ($inputmode eq "SORTBY");
push(@compactdef,$_) if ($inputmode eq "COMPACTLIST");
push(@orderdef,$_) if ($inputmode eq "ORDER");
push(@firstsearch,$_) if ($inputmode eq "FIRSTSEARCH");
push(@fieldsearch,$_) if ($inputmode eq "FIELDSEARCH");
push(@infolines,$_) if ($inputmode eq "INFO");
}
}
@headlist = split(/;/,$headers);
@headtypelist = split(/;/,$headdef);
close(DATA);
&read_personal_env($in{'LISTNAME'}) if ($_[1]);
}
### readdatabase
#################
# MODULE: urlenv
#################
# DESCRIPTION: To inherit the Environment variables through an url.
# IN:
# OUT: A string ready to put in an url
# BUGS:
#################
sub urlenv {
$url="LISTNAME=" . &urlclean($in{'LISTNAME'});
$url = $url . "&STR=" . &urlclean($in{'STR'});
$url = $url . "&TPLT=" . &urlclean($in{'TPLT'});
}
### urlenv
#################
# MODULE: formenv
#################
# DESCRIPTION: To inherit the Environment variables through
# hidden variables i a form.
# IN:
# OUT: A string ready to put in a form
# BUGS:
#################
sub formenv {
return
" \n";
}
### formenv
#################
# MODULE: urlclean
#################
# DESCRIPTION: return a proper url-verision of the string
# IN: string
# OUT: string
# BUGS:
#################
sub urlclean {
local($tmp) = $_[0];
$tmp =~ s/(\W)/sprintf("%%%02x",unpack("C",$1))/ge;
$tmp =~ s/%20/\+/g;
return $tmp;
}
### urlclean
sub printbegin {
print "c-pageguide - $_[0] \n";
print "\n";
print "$_[0] \n";
}
sub printend {
print "\n";
}
sub printsearchlog {
($sec,$min,$hou,$day,$mon,$ye)= localtime(time);
open(DATA,">>$rootdir/lib/" . $in{'LISTNAME'} . ".log") || print "no log\n";
print DATA "@_ <-> $ENV{'REMOTE_HOST'} [$day/",$mon+1,"-$ye]\n";
close(DATA);
}