#!/usr/bin/perl

$DICT = $ENV{'DICT'} || 'dict';
$QUERY = $ENV{'QUERY_STRING'} || $ARGV[0];
$SCRIPT_NAME = $ENV{'SCRIPT_NAME'} || $0;
$CGI = "file://$SCRIPT_NAME";
$CGI2 = "file:";
# $CGI2 = "file:///\$LIB/hlink.cgi?";
$SQUEEZE = 1;

if ($QUERY =~ /\=/) {
  for (split('&', $QUERY)) {
    ($v, $q) = split('=', $_, 2);
    $query{$v} = &form_decode($q); 
  }
} else {
  $QUERY =~ s/^word=//;
  $query{"word"} = &form_decode($QUERY);
}

if ((! $query{"word"}) && (! $query{"server"}) && (! $query{"dict"})) {
  print <<EOF;
Content-Type: text/html

<html>
<head><title>Dict</title></head>
<body>
<form action="$CGI">
<h2>Search dictionnary entry&nbsp;:</h2>
<table>
<tr><td>Word&nbsp;:<td><input name=word>
<tr><td>Server&nbsp;:<td><input name=server>
<tr><td>Dictionnary&nbsp;:<td><input name=dict>
<tr><td><td><input type=submit> <input type=reset>
</table>
</form>
</body>
</html>
EOF
  exit;
}

if ($query{"server"}) {
    $server = $query{"server"};
    $servercmd = "-h $server";
} else {
    $server = "";
    $servercmd = "";
}
if ($query{"word"}) {
    $word = $query{"word"};
    $wordcmd = "'$word'";
    if ($query{"dict"}) {
        $database = $query{"dict"};
        $databasecmd = "-d $database";
    } else {
        $database = "";
        $databasecmd = "";
    }
} else {
    $word = "";
    $wordcmd = "";
    if ($query{"dict"}) {
        $database = $query{"dict"};
        $databasecmd = "-i $database";
    } else {
        $database = "";
        $databasecmd = "-DSI";
    }
}
open(F, "$DICT $databasecmd $servercmd $wordcmd 2> /dev/null |");
$ok = 0;
undef $header;
$blank = -1;
while(<F>) {
  if (! defined($header)) {
    /^\s*$/ && next;
    $header = $_;
    $space = $header;
    chop $space;
    $space =~ s/\S.*//;
  } elsif ($_ eq $header) {		# delete header
    $blank = -1;
    next;
  }
  if ($SQUEEZE) {
    if (/^\s*$/) {
      $blank || $blank++;
      next;
    } elsif ($blank) {
      $blank > 0 && print "\n";
      $blank = 0;
    }
  }

  if (! $ok) {
    /^No/ && last;
    print <<EOF;
Content-Type: text/html

<html>
<head><title>Dictionnary entry : $word</title></head>
<body>
    <h1>Dictionnary entry : $word</h1>
<pre>
EOF
    print;
    $ok = 1;
    next;
  }

  # XXX : replace $1 with the dictionnary's database name
  #s@\[{([^}]*)}\]@[<a href="$CGI?word=&server=$server&dict=$1">$1</a>]@g;
  s@{([^}]*)}@<a href="$CGI?word=$1&server=$server&dict=$database">$1</a>@g;
  s@(http|ftp)://[\w.\-/~]+[\w/]@<a href="$&">$&</a>@g;
  s@(\W)(mailto:)?(\w[\w.\-]*\@\w[\w.\-]*\.[\w.\-]*\w)@$1<a href="mailto:$3">$2$3</a>@g;
  print;
}
close(F);
if (! $ok) {
  if ($query{'quit'}) {
    print STDERR "No dictionnary entry for word '$word' on server '$server' in dictionnary '$database'.\n";
    print <<EOF;
w3m-control: EXIT
EOF
    exit 1;
  }
  print <<EOF;
Content-Type: text/html

<html>
<head><title>Dictionnary entry : $word</title></head>
<body>
<pre>
<h1>$DICT $databasecmd $servercmd $wordcmd</h1>
<p>
 Query was   : $QUERY
 Word        : "$word" ($wordcmd)
 Server      : "$server" ($servercmd)
 Dictionnary : "$database" ($databasecmd)
<p>
 No dictionnary entry for <B>$word</B> on server <b>$server</b> in dictionnary <b>$database</b>.
<p>
 Command results :
EOF
open(F, "$DICT $databasecmd $servercmd $wordcmd 2>&1 |");
while(<F>) {
    print $_;
}
close(F);
}
print <<EOF;
</pre>
</body>
</html>
EOF

sub form_decode {
  local($_) = @_;
  s/\+/ /g;
  s/%([\da-f][\da-f])/pack('c', hex($1))/egi;
  return $_;
}

